Hardroc2XdaqReader Class Reference

#include <Hardroc2XdaqReader.hh>

Inheritance diagram for Hardroc2XdaqReader:

Inheritance graph
[legend]
Collaboration diagram for Hardroc2XdaqReader:

Collaboration graph
[legend]
List of all members.

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)

Detailed Description

CLASS DATAREADER //

Definition at line 27 of file Hardroc2XdaqReader.hh.


Constructor & Destructor Documentation

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 (  ) 

Definition at line 54 of file Hardroc2XdaqReader.cpp.

00055 {
00056   FILE_LOG(logDEBUG1)<< "----Hardroc2XdaqReader destructor"<< endl;
00057 }


Member Function Documentation

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 286 of file Hardroc2XdaqReader.cpp.

00286                                                  {
00287   // Start data reconstruction
00288   Level(0);
00289 
00290 FILE_LOG(logDEBUG) << "DEBUG A1"<< endl;
00291         ui16 dataFormat = run.getDataFormat();
00292   if (dataFormat == 0) {
00293 FILE_LOG(logDEBUG) << "DEBUG A2"<< endl;
00294     // first read of the file
00295     bcIdDifAbsOrgMap.clear();
00296     // read file header
00297     dataFormat = getData(1);
00298     if (fileError == EOF) {
00299       FILE_LOG(logERROR) << "parsing file[" << inputFile << "]  - error " << errno << ":" << strerror(errno) << endl;
00300       reset();
00301       return(LAST_FILE_EVENT);
00302     }
00303     display(+1);
00304     FILE_LOG(logINFO) << "  HARDROC2 DIF VHDL  data format : " << dataFormat << endl;
00305 
00306     if (dataFormat != 7 ) {
00307       // unknown format
00308       FILE_LOG(logERROR) << " HARDROC2 DIF VHDL  data format " << dataFormat << " is not implemented" << endl;
00309       reset();
00310       return(LAST_FILE_EVENT);
00311     }
00312     run.setDataFormat(dataFormat);
00313 
00314 
00315     FILE_LOG(logDEBUG) << run.getDetector() << endl;
00316     display(-1);
00317     return NEW_CONFIG;
00318   }
00319 
00320 
00321   // loops until a non-empty event has been found
00322   for (unsigned int nbHits = 0; !nbHits; ) {
00323 
00324     // look for a global data header and process corresponding data
00325     unsigned int globalHeader = getData(1);
00326     if (fileError == EOF) {
00327       FILE_LOG(logINFO) << "  END OF DATA FILE" << endl;
00328       reset();
00329       return(LAST_FILE_EVENT);
00330     }
00331 FILE_LOG(logDEBUG) << "globalHeader:["<< hex  << globalHeader << "]" << endl;
00332     if (globalHeader == 0xB1) {
00333       // slow control data
00334       getScData();
00335     }
00336     else if (globalHeader == 0xB0) {
00337       // acquisition data
00338       nbHits = getAcqData(event);
00339     }
00340     else {
00341       display();
00342       FILE_LOG(logERROR) << "  parsing file error. global header error : " << hex << globalHeader << dec << endl;
00343     }
00344   } // for (nbHits)
00345 
00346   return EVENT_CORRECT;
00347 }

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 
00091   this->setComputeCrcFlag(true);
00092   crc->compute(0xB0);
00093 
00094 
00095   FILE_LOG(logDEBUG) << " global header B0 found" << endl;
00096 
00097   // reset the data for the block
00098 //  bcId_AbsOrg = -1;
00099   bcId_Abs = 0; // max. 48 bits
00100   bcId_Dif = 0;
00101   // the following data is repeated one time for each Dif which has sent data
00102   difId = getData(1);
00103   difTriggerCounter = getData(4);
00104   acqTriggerCounter = getData(4);  // trigger counter version >= 4
00105   globalTriggerCounter = getData(4);
00106   ui64 bcIdHigh = getData(2);
00107   ui64 bcIdLow = getData(4);
00108   bcId_Abs = (bcIdHigh << 32) + bcIdLow;
00109   bcId_Dif = getData(3);
00110 
00111   bcId_AbsOrg = getbcIdAbsOrg(difId, bcId_Abs);
00112   FILE_LOG(logDEBUG1)   << " bcId_AbsOrg  [" << bcId_AbsOrg << "[" << endl;
00113   display();
00114 
00115   // the bcTime in milliseconds
00116   i64 bcTime = ((bcId_Abs - bcId_AbsOrg) * bcPeriod) / 1000;
00117   // the reading time in milliseconds
00118   i64 readTime = globalTime + bcTime;
00119 
00120   FILE_LOG(logDEBUG)   << "  START EVENT ------------- time " << readTime << " ms" << endl;
00121   FILE_LOG(logDEBUG)   << "    bc time               " << bcTime << " ms" << endl;
00122   FILE_LOG(logDEBUG)   << "    DIF Id                0x" << hex << (int)difId << dec << endl;
00123   FILE_LOG(logDEBUG)   << "    DIF trigger counter   " << difTriggerCounter << endl;
00124   FILE_LOG(logDEBUG) << "    ACQ trigger counter   " << acqTriggerCounter << endl;
00125   FILE_LOG(logDEBUG)   << "    total trigger counter " << globalTriggerCounter << endl;
00126   FILE_LOG(logDEBUG) << "    absolute bcId         " << bcId_Abs - bcId_AbsOrg << endl;
00127   // end of global header
00128 
00129   bool difFound = false;
00130   Detector &detector = run.getDetector();
00131   { const ChamberMap_t &chambers = detector.getChambers();
00132     for (ChamberMap_t::const_iterator it = chambers.begin(); it != chambers.end(); ++it) {
00133       try {
00134         Chamber& chamber = *(it->second);
00135         const BoardMap_t& boards = chamber.getBoardsByDifId(difId);
00136       }
00137       catch (...) {
00138         // any error case - try next chamber
00139         continue;
00140       }
00141 
00142       // the DIF has been found in a chamber. Process all data and continue
00143       difFound = true;
00144       break;
00145     } // for
00146     if (!difFound) {
00147       FILE_LOG(logERROR) << "    No dif found with Id 0x" << hex << difId << dec << endl;
00148     }
00149   }
00150 
00151   for (bool finish = false; !finish; ) {
00152     int delimiter = 0;
00153 
00154     display();
00155     for (; delimiter != 0xA0 && delimiter != 0xB4; ) {
00156       // seek for first data frame header (0xB4)
00157       delimiter = getData(1);
00158       if (fileError == EOF) {
00159         delimiter = 0;
00160         break;
00161       }
00162       if (delimiter == 0xA3)
00163         FILE_LOG(logERROR) << "    frame trailer A3 found -- should not" << endl;
00164     }
00165     if (delimiter == 0x00) {
00166       FILE_LOG(logERROR) << "  end of file -- should not" << endl;
00167       break;
00168     }
00169     if (delimiter == 0xA0) {
00170       this->setComputeCrcFlag(false);
00171       unsigned short CRC_check = getData(2);
00172       FILE_LOG(logDEBUG) << hex << " Compute CRC[" << crc->getCrc() << "]" <<  endl;
00173       FILE_LOG(logDEBUG) << hex << " Received CRC[" << CRC_check << "]" <<  endl;
00174       if ( CRC_check != crc->getCrc() )
00175       {
00176         FILE_LOG(logERROR)  << " CRC Error for event id " <<  lastEventId
00177                             <<  " Compute CRC[" << crc->getCrc()
00178                             << "] Received CRC[" << CRC_check << "]" <<  endl ;
00179         event.setCrcIsCorrect(false);
00180         event.setValidFlag(CRC_ERROR);
00181       }
00182       display(-1);
00183       FILE_LOG(logDEBUG) << " global trailer A0 found" << endl;
00184       break;
00185     }
00186     display(+1);
00187     FILE_LOG(logDEBUG) << "   frame header B4 found" << endl;
00188 
00189     int chipId = -1;
00190     for (; ; ) {
00191       chipId = getData(1);
00192       if (fileError == EOF) {
00193         finish = true;
00194         FILE_LOG(logINFO) << "    end of file found -- should not" << endl;
00195         break;
00196       }
00197       if (chipId == 0x00) {
00198         // dummy null bytes
00199         continue;
00200       }
00201       else if (chipId == 0xA3) {
00202         display(-1);
00203         FILE_LOG(logDEBUG) << "   frame trailer A3 found" << endl;
00204         break;
00205       }
00206       else if (chipId == 0xA0) {
00207         finish = true;
00208         display(-1);
00209         FILE_LOG(logERROR) << "    global trailer A0 found -- should not" << endl;
00210         int CRC_check = getData(1);
00211         break;
00212       }
00213       else if (chipId == 0xC3) {
00214         display(-1);
00215         FILE_LOG(logERROR) << "    frame trailer C3 found - error occured during data transfer" << endl;
00216         break;
00217       }
00218 
00219       // bcId from hardroc chip is counted as Gray code
00220       bcId_Hit = grayToBinary(getData(3));
00221       // event time in milliseconds
00222       eventTime = readTime + (((bcId_Dif - bcId_Hit) * bcPeriod) / 1000);
00223 
00224       //  skip lines where bcId is < 2 (most of the time, data is corrupted)
00225       if (bcId_Hit <= 1) {
00226         FILE_LOG(logDEBUG) << "      skip data (bcIdHit = " << (int)bcId_Hit << ")" << endl;
00227         SkippedBcId++;
00228 
00229         for (int chNum = 48; chNum >= 0; chNum -= 16) {
00230           unsigned int data4 = getData(4); // lit 4 bytes => 8 char => 16 canaux
00231         }
00232       }
00233       else {
00234         // not on first line and bcId OK : get and check data
00235         if (difFound) {
00236           FILE_LOG(logDEBUG) << "      chip Id               0x" << hex << (int)chipId << dec << endl;
00237           FILE_LOG(logDEBUG) << "      bcId Hardroc          " << (int)bcId_Hit << endl;
00238           FILE_LOG(logDEBUG) << "      event time            " << eventTime << endl;
00239         }
00240 
00241         // trigger data for 64 channels : 1 bit trigger1, 1 bit trigger0 for each channel from 63 downto 0.
00242         // this makes 2-bit values which should not give bit 1 without bit 0
00243         for (int chNum = 48; chNum >= 0; chNum -= 16) {
00244           unsigned int data4 = getData(4); // lit 4 bytes => 8 char => 16 canaux
00245 
00246           if (difFound) {
00247             for (int index = 0; index < 16; index++) {
00248               // sur les 16 canaux, recupere les donnees canal par canal
00249               int trigger = (data4 >> ((15 - index) * 2)) & 0x03; // 2 bits
00250               // store new event data if any
00251               if (trigger) {
00252                 nbHits += newHit(event, detector, trigger, index + chNum, chipId, difId);
00253               }
00254             } // for (index)
00255           }
00256         } // for (chNum)
00257       }
00258       display();
00259     } // for(;;)
00260 
00261   } // for (;;)
00262   display(-1);
00263 
00264   if (nbHits) {
00265     // CREATE EVENT for current Run
00266     event.setTimeStamp(globalTime + (bcId_AbsOrg * bcPeriod) / 1000);
00267 
00268     event.setId(++lastEventId);
00269     FILE_LOG(logDEBUG1) << "  STORE EVENT " << lastEventId << ", " << nbHits << " hits" << endl;
00270   }
00271   else
00272     FILE_LOG(logDEBUG) << "  EMPTY EVENT" << endl;
00273 
00274 
00275   if (SkippedBcId) {
00276     FILE_LOG(logWARNING) << "    skipped " << SkippedBcId << " data because of bad bcId" << endl;
00277     SkippedBcId = 0;
00278   }
00279 
00280   return(nbHits);
00281 } // Hardroc2XdaqReader.getAcqData


The documentation for this class was generated from the following files:
Generated on Mon Jan 7 13:18:37 2013 for MicromegasFramework by  doxygen 1.4.7