00001
00002
00003 #include "parser/Centaure.hh"
00004 #include "parser/AcquisitionParser.hh"
00005
00006 #include "event/Event.hh"
00007
00008 #include "geometry/Detector.hh"
00009 #include "geometry/Chamber.hh"
00010
00011 #include "tools/MicroException.hh"
00012 #include "tools/Toolbox.hh"
00013 #include "tools/SteerDesc.hh"
00014 #include "tools/Log.hh"
00015
00016 #include <cstdio>
00017 #include <iostream>
00018 #include <iomanip>
00019
00020
00021
00022 #define bigTolittle Toolbox::bigTolittle
00023
00024
00025 using namespace std;
00026
00027
00028 Centaure::Centaure(Run& aRun, FILE *aFile, ui32 lastEventId) : AcquisitionParser(aRun, aFile, lastEventId)
00029 {
00030
00031 newConfig =true;
00032 globalTriggerCounter = 1;
00033 }
00034
00035
00036 Centaure::~Centaure()
00037 {
00038
00039 }
00040
00041 int Centaure::getNextEvent(Event& event)
00042 {
00043 if ( newConfig == true)
00044 {
00045 newConfig = false;
00046 return NEW_CONFIG;
00047 }
00048 Detector& aDet = run.getDetector();
00049
00050
00051 ui32 totalGassiplex96 = 0;
00052
00053
00054 totalGassiplex96 = aDet.getNumberOfGaziplex96();
00055
00056
00057
00058
00059
00060 ui16 readValue = 0;
00061 ui16 eventLength = 0;
00062 ui32 centaureEvtId =0;
00063 ui64 value = 0;
00064
00065 ui64 timestamp = 0;
00066
00067
00068 i32 eventId = 0;
00069
00070 ui32 nbHiChannels[totalGassiplex96];
00071 i32 nEvents = lastEventId ;
00072 double GoodRate = 0.0;
00073 ui32 checklength=0;
00074
00075
00076
00077
00078 bool finish = false;
00079
00080 checklength=0;
00081
00082 fread(&readValue,sizeof(i16),1,inputFile);
00083 centaureEvtId = bigTolittle(readValue);
00084 nEvents++;
00085
00086 eventId = nEvents;
00087
00088 fread(&readValue,sizeof(i16),1,inputFile);
00089 eventLength = bigTolittle(readValue);
00090
00091 if ( centaureEvtId == 0 && eventLength == 0 )
00092 {
00093 return LAST_FILE_EVENT;
00094 }
00095
00096 else
00097 {
00098
00099
00100
00101
00102
00103
00104
00105
00106 const ChamberMap_t &chambers = aDet.getChambers();
00107 for (ChamberMap_t::const_iterator iter=chambers.begin(); iter!=chambers.end(); iter++)
00108 {
00109 Chamber& chamber = *(*iter).second;
00110
00111
00112 for ( ui32 jj = 0; jj < chamber.getNumberOfGassiplexBoards(); jj++ )
00113 {
00114
00115 fread(&readValue,sizeof(i16),1,inputFile);
00116 nbHiChannels[jj] = 1023 & bigTolittle(readValue);
00117 checklength += nbHiChannels[jj];
00118
00119
00120
00121
00122
00123 for ( ui32 j = 0 ; j < nbHiChannels[jj] ; j++ )
00124 {
00125
00126
00127 fread(&readValue,sizeof(i16),1,inputFile);
00128 readValue = bigTolittle(readValue);
00129
00130 value = ( readValue << 16) ;
00131
00132 fread(&readValue,sizeof(i16),1,inputFile);
00133 readValue = bigTolittle(readValue);
00134
00135
00136 value = value + readValue;
00137
00138 ui16 channelData = value & Toolbox::MASK_CHANNEL_DATA;
00139 ui16 channelNumber = ( ( value & Toolbox::MASK_CHANNEL_NUMBER) >> 12 ) & Toolbox::MASK_12BIT;
00140
00141
00142 if ( chamber.getType() == GASSIPLEXCHAMBER4 )
00143 {
00144 channelNumber = channelNumber + 96*jj ;
00145 }
00146
00147 i16 channelValue = channelData;
00148 if (channelValue>2000)
00149 {
00150 channelValue=channelValue-4096;
00151 }
00152
00153 i16 channelNumber2 = channelNumber ;
00154
00155
00156
00157 try
00158 {
00159 const Channel& channel = chamber.getChannelById(channelNumber);
00160
00161
00162
00163
00164 i32 digitalValue = 0;
00165 ChannelHit *chHit =new ChannelHit(channel,digitalValue, channelValue) ;
00166 event.insertHit(chamber,chHit);
00167 }
00168 catch ( MicroException &e)
00169 {
00170 FILE_LOG(logERROR) << "---------------" << "Chamber->id=["<< chamber.getId() << "], channelNuber[" << channelNumber << "]" << e.getMessage() << endl;
00171 }
00172
00173 }
00174 }
00175 }
00176
00177
00178 checklength=checklength*2+3+4+totalGassiplex96;
00179 FILE_LOG(logDEBUG) <<" checklength: " << checklength<< endl;
00180 FILE_LOG(logDEBUG) <<" eventLength: " << eventLength<< endl;
00181 FILE_LOG(logDEBUG) <<" totalGassiplex96: " << totalGassiplex96<< endl;
00182
00183 if (checklength != eventLength)
00184 {
00185 FILE_LOG(logERROR) << "CRAP EVENT checklength != eventLength: NOTHING CAN BE DONE!" << endl;
00186 FILE_LOG(logERROR) << "totalGassiplex96[" << totalGassiplex96 << "]" << endl;
00187 }
00188 else
00189 {
00190
00191 fread(&readValue,sizeof(i16),1,inputFile);
00192 readValue = bigTolittle(readValue);
00193 timestamp = ((i64) readValue<<48);
00194 fread(&readValue,sizeof(i16),1,inputFile);
00195 readValue = bigTolittle(readValue);
00196 timestamp =timestamp+ ((i64) readValue<<32);
00197 fread(&readValue,sizeof(i16),1,inputFile);
00198 readValue = bigTolittle(readValue);
00199 timestamp =timestamp+ ((i64) readValue<<16);
00200 fread(&readValue,sizeof(i16),1,inputFile);
00201 readValue = bigTolittle(readValue);
00202 timestamp =timestamp+(i64) readValue;
00203 timestamp = timestamp - TIMEREF_OFFSET ;
00204
00205 }
00206
00207
00208 fread(&readValue,sizeof(i16),1,inputFile);
00209 if ( readValue != 0xffff )
00210 {
00211 FILE_LOG(logDEBUG) << "ERROR last code event != 0xffff: "<< readValue << endl;
00212 return EVENT_ERROR;
00213 }
00214 else
00215 {
00216 FILE_LOG(logDEBUG) << "last code event == 0xffff -> reconstruction successfull"<< endl;
00217
00218 event.setTimeStamp(timestamp);
00219 event.setId(eventId);
00220 event.setGlobalTriggerCounter(globalTriggerCounter);
00221 event.setDifTriggerCounter(globalTriggerCounter++);
00222
00223
00224 }
00225 }
00226 lastEventId = eventId;
00227 return EVENT_CORRECT;
00228 }