00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <stdio.h>
00024 #include <errno.h>
00025
00026 #include "parser/Hardroc2XdaqReader.hh"
00027 #include "parser/AcquisitionParser.hh"
00028
00029 #include "event/Event.hh"
00030
00031 #include "geometry/Chamber.hh"
00032 #include "geometry/Dif.hh"
00033 #include "geometry/Hardroc2Chip.hh"
00034 #include "geometry/Detector.hh"
00035
00036 #include "tools/Toolbox.hh"
00037 #include "tools/SteerDesc.hh"
00038 #include "tools/MicroException.hh"
00039 #include "tools/Log.hh"
00040
00041 #include <iostream>
00042 #include <iomanip>
00043
00044 using namespace std;
00045
00046
00047 Hardroc2XdaqReader::Hardroc2XdaqReader(Run& aRun, FILE *aFile, ui32 lastEventId) : Hardroc2Reader(aRun, aFile, lastEventId)
00048 {
00049 FILE_LOG(logDEBUG1) << "--Hardroc2XdaqReader constructor()"<< endl;
00050 reset();
00051 }
00052
00053
00054 Hardroc2XdaqReader::~Hardroc2XdaqReader()
00055 {
00056 FILE_LOG(logDEBUG1)<< "----Hardroc2XdaqReader destructor"<< endl;
00057 }
00058
00059
00060
00061 int Hardroc2XdaqReader::getScData() {
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 }
00083
00084
00085
00086 int Hardroc2XdaqReader::getAcqData(Event& event) {
00087 unsigned int nbHits = 0;
00088
00089 display(+1);
00090 FILE_LOG(logDEBUG) << " global header B0 found" << endl;
00091
00092
00093
00094 bcId_Abs = 0;
00095 bcId_Dif = 0;
00096
00097 difId = getData(1);
00098 difTriggerCounter = getData(4);
00099 acqTriggerCounter = getData(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
00111 i64 bcTime = ((bcId_Abs - bcId_AbsOrg) * bcPeriod) / 1000;
00112
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
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
00134 continue;
00135 }
00136
00137
00138 difFound = true;
00139 break;
00140 }
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
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
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
00204 bcId_Hit = grayToBinary(getData(3));
00205
00206 eventTime = readTime + (((bcId_Dif - bcId_Hit) * bcPeriod) / 1000);
00207
00208
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);
00215 }
00216 }
00217 else {
00218
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
00226
00227 for (int chNum = 48; chNum >= 0; chNum -= 16) {
00228 unsigned int data4 = getData(4);
00229
00230 if (difFound) {
00231 for (int index = 0; index < 16; index++) {
00232
00233 int trigger = (data4 >> ((15 - index) * 2)) & 0x03;
00234
00235 if (trigger) {
00236 nbHits += newHit(event, detector, trigger, index + chNum, chipId, difId);
00237 }
00238 }
00239 }
00240 }
00241 }
00242 display();
00243 }
00244
00245 }
00246 display(-1);
00247
00248 if (nbHits) {
00249
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 }
00266
00267
00268
00269
00270 int Hardroc2XdaqReader::getNextEvent(Event& event) {
00271
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
00279 bcIdDifAbsOrgMap.clear();
00280
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
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
00306 for (unsigned int nbHits = 0; !nbHits; ) {
00307
00308
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
00318 getScData();
00319 }
00320 else if (globalHeader == 0xB0) {
00321
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 }
00329
00330 return EVENT_CORRECT;
00331 }