#include <Hardroc2XdaqReader.hh>
Inheritance diagram for Hardroc2XdaqReader:
Public Member Functions | |
Hardroc2XdaqReader (Run &aRun, FILE *aFile, ui32 lastEventId) | |
~Hardroc2XdaqReader () | |
int | getScData () |
int | getNextEvent (Event &eventToFill) |
int | getAcqData (Event &event) |
Static Public Member Functions | |
static const char * | type (const int subtype=0) |
Definition at line 27 of file Hardroc2XdaqReader.hh.
Hardroc2XdaqReader::Hardroc2XdaqReader | ( | Run & | aRun, | |
FILE * | aFile, | |||
ui32 | lastEventId | |||
) |
Definition at line 47 of file Hardroc2XdaqReader.cpp.
00047 : Hardroc2Reader(aRun, aFile, lastEventId) 00048 { 00049 FILE_LOG(logDEBUG1) << "--Hardroc2XdaqReader constructor()"<< endl; 00050 reset(); 00051 }
Hardroc2XdaqReader::~Hardroc2XdaqReader | ( | ) |
static const char* Hardroc2XdaqReader::type | ( | const int | subtype = 0 |
) | [inline, static] |
Reimplemented from Hardroc2Reader.
Definition at line 31 of file Hardroc2XdaqReader.hh.
Referenced by main().
00031 { return CROSSDAQHR2; };
int Hardroc2XdaqReader::getScData | ( | ) | [virtual] |
Implements Hardroc2Reader.
Definition at line 61 of file Hardroc2XdaqReader.cpp.
Referenced by getNextEvent().
00061 { 00062 unsigned int data; 00063 display(+1); 00064 FILE_LOG(logDEBUG) << " Slow Control data header B1 found" << endl; 00065 00066 int trop = 0; 00067 while ( getData(1) != 0xA1) 00068 { 00069 display(); 00070 trop++; 00071 } 00072 display(); 00073 FILE_LOG(logDEBUG) << "Il y a un [" << dec << trop << "] bytes depuis B1 0xA1 " << endl; 00074 data = 0xA1; 00075 00076 00077 display(-1); 00078 if (data != 0xA1) 00079 FILE_LOG(logERROR) << " parsing file error : Slow control trailer 0xA1 not found [" << hex << data << dec << "]" << endl; 00080 00081 return(1); 00082 } // Hardroc2XdaqReader.getScData
int Hardroc2XdaqReader::getNextEvent | ( | Event & | eventToFill | ) | [virtual] |
Implements Hardroc2Reader.
Definition at line 270 of file Hardroc2XdaqReader.cpp.
00270 { 00271 // Start data reconstruction 00272 Level(0); 00273 00274 FILE_LOG(logDEBUG) << "DEBUG A1"<< endl; 00275 ui16 dataFormat = run.getDataFormat(); 00276 if (dataFormat == 0) { 00277 FILE_LOG(logDEBUG) << "DEBUG A2"<< endl; 00278 // first read of the file 00279 bcIdDifAbsOrgMap.clear(); 00280 // read file header 00281 dataFormat = getData(1); 00282 if (fileError == EOF) { 00283 FILE_LOG(logERROR) << "parsing file[" << inputFile << "] - error " << errno << ":" << strerror(errno) << endl; 00284 reset(); 00285 return(LAST_FILE_EVENT); 00286 } 00287 display(+1); 00288 FILE_LOG(logINFO) << " HARDROC2 DIF VHDL data format : " << dataFormat << endl; 00289 00290 if (dataFormat != 7 ) { 00291 // unknown format 00292 FILE_LOG(logERROR) << " HARDROC2 DIF VHDL data format " << dataFormat << " is not implemented" << endl; 00293 reset(); 00294 return(LAST_FILE_EVENT); 00295 } 00296 run.setDataFormat(dataFormat); 00297 00298 00299 FILE_LOG(logDEBUG) << run.getDetector() << endl; 00300 display(-1); 00301 return NEW_CONFIG; 00302 } 00303 00304 00305 // loops until a non-empty event has been found 00306 for (unsigned int nbHits = 0; !nbHits; ) { 00307 00308 // look for a global data header and process corresponding data 00309 unsigned int globalHeader = getData(1); 00310 if (fileError == EOF) { 00311 FILE_LOG(logINFO) << " END OF DATA FILE" << endl; 00312 reset(); 00313 return(LAST_FILE_EVENT); 00314 } 00315 FILE_LOG(logDEBUG) << "globalHeader:["<< hex << globalHeader << "]" << endl; 00316 if (globalHeader == 0xB1) { 00317 // slow control data 00318 getScData(); 00319 } 00320 else if (globalHeader == 0xB0) { 00321 // acquisition data 00322 nbHits = getAcqData(event); 00323 } 00324 else { 00325 display(); 00326 FILE_LOG(logERROR) << " parsing file error. global header error : " << hex << globalHeader << dec << endl; 00327 } 00328 } // for (nbHits) 00329 00330 return EVENT_CORRECT; 00331 }
int Hardroc2XdaqReader::getAcqData | ( | Event & | event | ) | [virtual] |
Implements Hardroc2Reader.
Definition at line 86 of file Hardroc2XdaqReader.cpp.
Referenced by getNextEvent().
00086 { 00087 unsigned int nbHits = 0; 00088 00089 display(+1); 00090 FILE_LOG(logDEBUG) << " global header B0 found" << endl; 00091 00092 // reset the data for the block 00093 // bcId_AbsOrg = -1; 00094 bcId_Abs = 0; // max. 48 bits 00095 bcId_Dif = 0; 00096 // the following data is repeated one time for each Dif which has sent data 00097 difId = getData(1); 00098 difTriggerCounter = getData(4); 00099 acqTriggerCounter = getData(4); // trigger counter version >= 4 00100 globalTriggerCounter = getData(4); 00101 ui64 bcIdHigh = getData(2); 00102 ui64 bcIdLow = getData(4); 00103 bcId_Abs = (bcIdHigh << 32) + bcIdLow; 00104 bcId_Dif = getData(3); 00105 00106 bcId_AbsOrg = getbcIdAbsOrg(difId, bcId_Abs); 00107 FILE_LOG(logDEBUG1) << " bcId_AbsOrg [" << bcId_AbsOrg << "[" << endl; 00108 display(); 00109 00110 // the bcTime in milliseconds 00111 i64 bcTime = ((bcId_Abs - bcId_AbsOrg) * bcPeriod) / 1000; 00112 // the reading time in milliseconds 00113 i64 readTime = globalTime + bcTime; 00114 00115 FILE_LOG(logDEBUG) << " START EVENT ------------- time " << readTime << " ms" << endl; 00116 FILE_LOG(logDEBUG) << " bc time " << bcTime << " ms" << endl; 00117 FILE_LOG(logDEBUG) << " DIF Id 0x" << hex << (int)difId << dec << endl; 00118 FILE_LOG(logDEBUG) << " DIF trigger counter " << difTriggerCounter << endl; 00119 FILE_LOG(logDEBUG) << " ACQ trigger counter " << acqTriggerCounter << endl; 00120 FILE_LOG(logDEBUG) << " total trigger counter " << globalTriggerCounter << endl; 00121 FILE_LOG(logDEBUG) << " absolute bcId " << bcId_Abs - bcId_AbsOrg << endl; 00122 // end of global header 00123 00124 bool difFound = false; 00125 Detector &detector = run.getDetector(); 00126 { const ChamberMap_t &chambers = detector.getChambers(); 00127 for (ChamberMap_t::const_iterator it = chambers.begin(); it != chambers.end(); ++it) { 00128 try { 00129 Chamber& chamber = *(it->second); 00130 const BoardMap_t& boards = chamber.getBoardsByDifId(difId); 00131 } 00132 catch (...) { 00133 // any error case - try next chamber 00134 continue; 00135 } 00136 00137 // the DIF has been found in a chamber. Process all data and continue 00138 difFound = true; 00139 break; 00140 } // for 00141 if (!difFound) { 00142 FILE_LOG(logERROR) << " No dif found with Id 0x" << hex << difId << dec << endl; 00143 } 00144 } 00145 00146 for (bool finish = false; !finish; ) { 00147 int delimiter = 0; 00148 00149 display(); 00150 for (; delimiter != 0xA0 && delimiter != 0xB4; ) { 00151 // seek for first data frame header (0xB4) 00152 delimiter = getData(1); 00153 if (fileError == EOF) { 00154 delimiter = 0; 00155 break; 00156 } 00157 if (delimiter == 0xA3) 00158 FILE_LOG(logERROR) << " frame trailer A3 found -- should not" << endl; 00159 } 00160 if (delimiter == 0x00) { 00161 FILE_LOG(logERROR) << " end of file -- should not" << endl; 00162 break; 00163 } 00164 if (delimiter == 0xA0) { 00165 unsigned short CRC_check = getData(2); 00166 display(-1); 00167 FILE_LOG(logDEBUG) << " global trailer A0 found" << endl; 00168 break; 00169 } 00170 display(+1); 00171 FILE_LOG(logDEBUG) << " frame header B4 found" << endl; 00172 00173 int chipId = -1; 00174 for (; ; ) { 00175 chipId = getData(1); 00176 if (fileError == EOF) { 00177 finish = true; 00178 FILE_LOG(logINFO) << " end of file found -- should not" << endl; 00179 break; 00180 } 00181 if (chipId == 0x00) { 00182 // dummy null bytes 00183 continue; 00184 } 00185 else if (chipId == 0xA3) { 00186 display(-1); 00187 FILE_LOG(logDEBUG) << " frame trailer A3 found" << endl; 00188 break; 00189 } 00190 else if (chipId == 0xA0) { 00191 finish = true; 00192 display(-1); 00193 FILE_LOG(logERROR) << " global trailer A0 found -- should not" << endl; 00194 int CRC_check = getData(1); 00195 break; 00196 } 00197 else if (chipId == 0xC3) { 00198 display(-1); 00199 FILE_LOG(logERROR) << " frame trailer C3 found - error occured during data transfer" << endl; 00200 break; 00201 } 00202 00203 // bcId from hardroc chip is counted as Gray code 00204 bcId_Hit = grayToBinary(getData(3)); 00205 // event time in milliseconds 00206 eventTime = readTime + (((bcId_Dif - bcId_Hit) * bcPeriod) / 1000); 00207 00208 // skip lines where bcId is < 2 (most of the time, data is corrupted) 00209 if (bcId_Hit <= 1) { 00210 FILE_LOG(logDEBUG) << " skip data (bcIdHit = " << (int)bcId_Hit << ")" << endl; 00211 SkippedBcId++; 00212 00213 for (int chNum = 48; chNum >= 0; chNum -= 16) { 00214 unsigned int data4 = getData(4); // lit 4 bytes => 8 char => 16 canaux 00215 } 00216 } 00217 else { 00218 // not on first line and bcId OK : get and check data 00219 if (difFound) { 00220 FILE_LOG(logDEBUG) << " chip Id 0x" << hex << (int)chipId << dec << endl; 00221 FILE_LOG(logDEBUG) << " bcId Hardroc " << (int)bcId_Hit << endl; 00222 FILE_LOG(logDEBUG) << " event time " << eventTime << endl; 00223 } 00224 00225 // trigger data for 64 channels : 1 bit trigger1, 1 bit trigger0 for each channel from 63 downto 0. 00226 // this makes 2-bit values which should not give bit 1 without bit 0 00227 for (int chNum = 48; chNum >= 0; chNum -= 16) { 00228 unsigned int data4 = getData(4); // lit 4 bytes => 8 char => 16 canaux 00229 00230 if (difFound) { 00231 for (int index = 0; index < 16; index++) { 00232 // sur les 16 canaux, recupere les donnees canal par canal 00233 int trigger = (data4 >> ((15 - index) * 2)) & 0x03; // 2 bits 00234 // store new event data if any 00235 if (trigger) { 00236 nbHits += newHit(event, detector, trigger, index + chNum, chipId, difId); 00237 } 00238 } // for (index) 00239 } 00240 } // for (chNum) 00241 } 00242 display(); 00243 } // for(;;) 00244 00245 } // for (;;) 00246 display(-1); 00247 00248 if (nbHits) { 00249 // CREATE EVENT for current Run 00250 event.setTimeStamp(globalTime + (bcId_AbsOrg * bcPeriod) / 1000); 00251 00252 event.setId(++lastEventId); 00253 FILE_LOG(logDEBUG1) << " STORE EVENT " << lastEventId << ", " << nbHits << " hits" << endl; 00254 } 00255 else 00256 FILE_LOG(logDEBUG) << " EMPTY EVENT" << endl; 00257 00258 00259 if (SkippedBcId) { 00260 FILE_LOG(logWARNING) << " skipped " << SkippedBcId << " data because of bad bcId" << endl; 00261 SkippedBcId = 0; 00262 } 00263 00264 return(nbHits); 00265 } // Hardroc2XdaqReader.getAcqData