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


The documentation for this class was generated from the following files:
Generated on Mon Jun 11 16:58:42 2012 for MicromegasFramework by  doxygen 1.4.7