Hardroc2LabviewReader Class Reference

#include <Hardroc2LabviewReader.hh>

Inheritance diagram for Hardroc2LabviewReader:

Inheritance graph
[legend]
Collaboration diagram for Hardroc2LabviewReader:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 Hardroc2LabviewReader (Run &aRun, FILE *aFile, ui32 lastEventId)
 ~Hardroc2LabviewReader ()
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 Hardroc2LabviewReader.hh.


Constructor & Destructor Documentation

Hardroc2LabviewReader::Hardroc2LabviewReader ( Run aRun,
FILE *  aFile,
ui32  lastEventId 
)

Definition at line 48 of file Hardroc2LabviewReader.cpp.

00048                                                                                      : Hardroc2Reader(aRun, aFile, lastEventId)
00049 {
00050   FILE_LOG(logDEBUG1) << "--Hardroc2LabviewReader constructor()"<< endl;
00051   reset();
00052 }

Hardroc2LabviewReader::~Hardroc2LabviewReader (  ) 

Definition at line 55 of file Hardroc2LabviewReader.cpp.

00056 {
00057   FILE_LOG(logDEBUG1)<< "----Hardroc2LabviewReader destructor"<< endl;
00058 }


Member Function Documentation

static const char* Hardroc2LabviewReader::type ( const int  subtype = 0  )  [inline, static]

Reimplemented from Hardroc2Reader.

Definition at line 31 of file Hardroc2LabviewReader.hh.

Referenced by main().

00031 { return LABVIEWHR2; };

int Hardroc2LabviewReader::getScData (  )  [virtual]

Implements Hardroc2Reader.

Definition at line 66 of file Hardroc2LabviewReader.cpp.

Referenced by getNextEvent().

00066                                      {
00067   unsigned int data;
00068   display(+1);
00069   FILE_LOG(logDEBUG) << " Slow Control data header B1 found" << endl;
00070 
00071 
00072   int scHRNumber = 24;
00073 
00074   difId=1; // in case of dataFormat = 7 Difid is not in data file
00075         ui16 dataFormat = run.getDataFormat();
00076   if ( dataFormat == 1 || dataFormat == 10)
00077   {
00078       bool findA1 = false;
00079       difId = getData(1);
00080                   display(+1);
00081       FILE_LOG(logDEBUG) << "--- difId[" << difId << "] config ---" << endl;
00082 
00083      if ( dataFormat == 10)
00084                  {
00085                                  Dif& dif = run.getDetector().getDifById(difId);
00086                                  dif.setDifFirmware(getData(2));
00087                                  display(+2);
00088          FILE_LOG(logINFO) << "-------- difFirmware[0x" << hex << dif.getDifFirmware() << "]" << endl;
00089 
00090                                  dif.setDifConfig (getData(1));
00091                                  display(+1);
00092          FILE_LOG(logINFO) << "-------- difConfig[0x" << hex <<  dif.getDifConfig() << "]" << endl;
00093 
00094                                  dif.setAsicType(getData(1));
00095                                  display(+1);
00096          FILE_LOG(logINFO) << "-------- asicType[0x" << dif.getAsicType() << "]" << endl;
00097 
00098                                  dif.setAsu1Id(getData(1));
00099                                  display(+1);
00100          FILE_LOG(logINFO) << "-------- asu1Id[0x" << dif.getAsu1Id() << "]" << endl;
00101 
00102                                  dif.setAsu2Id (getData(1));
00103                                  display(+1);
00104          FILE_LOG(logINFO) << "-------- asu2Id[0x" << dif.getAsu2Id() << "]" << endl;
00105       }
00106       scHRNumber = getData(1);
00107       FILE_LOG(logINFO) << "NB chip configuration[" << scHRNumber << "]" << endl;
00108     
00109       for ( int nbChip = 0 ; (nbChip < scHRNumber) & findA1 == false   ; nbChip++)
00110       {
00111           unsigned char *buf = initGetBits(1, false);
00112           if ( !buf)
00113           {
00114             FILE_LOG(logERROR) << "  malloc error while getting SC buffer" << endl;
00115             break;
00116           }
00117     
00118           // Search A1 Header
00119           int foo = getBits(8);
00120           if (  foo == 0xa1)
00121           {
00122               findA1 = true;
00123               finishGetBits();
00124               FILE_LOG(logDEBUG1) << "Header A1 found" << endl;
00125           }
00126           else
00127           {
00128               unsigned char *buf = initGetBits(108, false);
00129     
00130     
00131               FILE_LOG(logDEBUG) << "------------------- Config chip [" << nbChip << "]" << endl;
00132     
00133     
00134               getBits(16);
00135               //FILE_LOG(logDEBUG) << "En 1-4[" << BinOut(en,4) <<"]" << endl;
00136     
00137               ui32 dac_2 = getBits(10);
00138               FILE_LOG(logDEBUG) << "dac_2[" << BinOut(dac_2,10) <<"]"  << dec<< dac_2 << "]" << endl;
00139     
00140               ui32 dac_1 = getBits(10);
00141               FILE_LOG(logDEBUG) << "dac_1[" << BinOut(dac_1,10) <<"]" << dec<< dac_1  << "]" <<  endl;
00142     
00143               ui32 dac_0 = getBits(10);
00144               FILE_LOG(logDEBUG) << "dac_0[" << BinOut(dac_0,10) <<"]" << dec<< dac_0  << "]" <<  endl;
00145     
00146               ui16 chipId = getBits(8);
00147               // Warning Haeder bits are inverted !!!
00148               ui16 result = 0;
00149               int mask = 1;
00150               for ( int bit = 0 ; bit <= 8; bit++ )
00151               {
00152                       result = result + ((( chipId & mask ) >> (bit) )  << (7-bit) );
00153                       mask = mask * 2;
00154               }
00155               chipId = result;
00156               FILE_LOG(logDEBUG) << "header chip id: [" << BinOut(chipId,8) <<"]=0x" << hex<< chipId  << "]" <<  endl;
00157     
00158              // FILE_LOG(logDEBUG) << "validTrig 53-84[" << BinOut(validTrig,32) <<"]" << endl;
00159              //getBits(24);
00160     
00161               finishGetBits();
00162     
00163     
00164               // Store config information to Hardroc2Chip
00165     
00166               const Detector &detector = run.getDetector();
00167               try
00168               {
00169                   Dif& dif = detector.getDifById(difId);
00170                   try {
00171                           Hardroc2Chip& chip = dynamic_cast<Hardroc2Chip &> (dif.getChipById(chipId));
00172                           FILE_LOG(logDEBUG1) << " Hardroc2 slow control for chip " << chipId << " et Dif "  << difId << "  configuration set: " <<    endl;
00173                           chip.setThresholdDac_0(dac_0);
00174                           chip.setThresholdDac_1(dac_1);
00175                           chip.setThresholdDac_1(dac_2);
00176                   }
00177                   catch ( ...  )
00178                   {
00179                   }
00180               }
00181               catch ( MicroException e )
00182               {
00183                   FILE_LOG(logINFO) << " Hardroc2 slow control for chip " << chipId << " et Dif "  << difId << "  configuration: " <<   e.getMessage() << endl;
00184     
00185               }
00186           }
00187           
00188       } // end for nbChip
00189     
00190           if ( ! findA1) {
00191               unsigned char *buf = initGetBits(1, false);
00192               if ( !buf)
00193               {
00194                 FILE_LOG(logERROR) << "  malloc error while getting SC buffer" << endl;
00195                 exit ( -1);
00196               }
00197               // Verify A1 Header
00198               int foo = getBits(8);
00199               finishGetBits();
00200 
00201               FILE_LOG(logDEBUG) << "Herader[" << foo <<"]" << endl;
00202               if ( foo != 0xa1)
00203               {
00204                   FILE_LOG(logERROR) << "  Header A1 not found" << endl;
00205                   exit (-1);
00206               }
00207               FILE_LOG(logDEBUG1) << "Header A1 found" << endl;
00208           }
00209     
00210     } //end if format == 1
00211 
00212     else {  // other format not Slow control available
00213         bool findA1 = false;
00214         while ( ! findA1 )
00215         {
00216             unsigned char *buf = initGetBits(1, false);
00217             if ( !buf)
00218             {
00219                 FILE_LOG(logERROR) << "  malloc error while getting SC buffer" << endl;
00220                 exit ( -1);
00221             }
00222             // Verify A1 Header
00223             int foo = getBits(8);
00224             finishGetBits();
00225             if ( foo == 0xA1 )
00226             {
00227                 findA1 = true;
00228                 FILE_LOG(logDEBUG1) << "Header A1 found" << endl;
00229             }
00230         }
00231     }
00232 
00233     return(1);
00234 } // Hardroc2LabviewReader.getScData

int Hardroc2LabviewReader::getNextEvent ( Event eventToFill  )  [virtual]

Implements Hardroc2Reader.

Definition at line 444 of file Hardroc2LabviewReader.cpp.

00444                                                     {
00445   // Start data reconstruction
00446   Level(0);
00447 
00448         ui16 dataFormat = run.getDataFormat();
00449 
00450   if (dataFormat == 0) {
00451     // first read of the file
00452     bcIdDifAbsOrgMap.clear();
00453     // read file header
00454     dataFormat = getData(1);
00455     if ( dataFormat == 0x10  ) { dataFormat = 0xa; }
00456                 run.setDataFormat(dataFormat);
00457 
00458 
00459     if (fileError == EOF) {
00460       FILE_LOG(logERROR) << "parsing file[" << inputFile << "]  - error " << errno << ":" << strerror(errno) << endl;
00461       reset();
00462       return(LAST_FILE_EVENT);
00463     }
00464     display(+1);
00465     FILE_LOG(logINFO) << "  HARDROC2 LABVIEW DATA FORMAT  : " << dataFormat << endl;
00466 
00467     if (dataFormat != 7 && dataFormat != 1 && dataFormat != 10) {
00468       // unknown format
00469       FILE_LOG(logERROR) << " HARDROC2 LABVIEW data format  " << dataFormat << " is not implemented" << endl;
00470       reset();
00471       return(LAST_FILE_EVENT);
00472     }
00473 
00474         if ( dataFormat == 10)
00475         {
00476                 run.setDaqSoftware( getData(1));
00477                 display(+1);
00478                 FILE_LOG(logINFO) << "  DAQ software version  : " << run.getDaqSoftware() << endl;
00479 
00480                 run.setCccFirmware(getData(1));
00481                 display(+1);
00482         FILE_LOG(logINFO) << "  ccc firware  : " << run.getCccFirmware() << endl;
00483         }
00484 
00485     globalTime = getData(4)    ; // labview time is second since 1 janv 1970 and globalTime milli second
00486     FILE_LOG(logDEBUG1) << "globalTime in second:[" << globalTime << "]" <<  endl;
00487     globalTime *= 1000;
00488     FILE_LOG(logDEBUG1) << "globalTime in millisecond:[" << globalTime << "]" <<  endl;
00489     FILE_LOG(logDEBUG) << "  Global timestamp(hex) [" << hex << globalTime << "]" << endl;
00490     
00491 
00492 
00493     if (fileError == EOF) {
00494       FILE_LOG(logDEBUG) << "  END OF DATA FILE" << endl;
00495       reset();
00496       return(LAST_FILE_EVENT);
00497     }
00498     FILE_LOG(logDEBUG) << run.getDetector() << endl;
00499     display(-1);
00500     return NEW_CONFIG;
00501   }
00502 
00503 
00504   // loops until a non-empty event has been found
00505   //for (unsigned int nbHits = 0; !nbHits; ) {
00506         bool eventFound = false;
00507         while (! eventFound)
00508                 {
00509         // look for a global data header and process corresponding data
00510         unsigned int globalHeader = getData(1);
00511         if (fileError == EOF) {
00512           FILE_LOG(logDEBUG) << "  END OF DATA FILE" << endl;
00513           reset();
00514           return(LAST_FILE_EVENT);
00515         }
00516         FILE_LOG(logDEBUG) << "globalHeader:["<< hex  << globalHeader << "]" << endl;
00517         if (globalHeader == 0xB1) {
00518           // slow control data
00519           getScData();
00520         }
00521         else if (globalHeader == 0xB0) {
00522           // acquisition data
00523           //nbHits = getAcqData(event);
00524           getAcqData(event);
00525                   eventFound = true;
00526         }
00527         else {
00528           display();
00529          FILE_LOG(logERROR) << "  parsing file error. global header error : " << hex << globalHeader << dec << endl;
00530         }
00531         }
00532   //} // for (nbHits)
00533 
00534   return EVENT_CORRECT;
00535 }

int Hardroc2LabviewReader::getAcqData ( Event event  )  [virtual]

Implements Hardroc2Reader.

Definition at line 238 of file Hardroc2LabviewReader.cpp.

Referenced by getNextEvent().

00238                                                   {
00239   unsigned int nbHits = 0;
00240 
00241   display(+1);
00242   FILE_LOG(logDEBUG) << " global header B0 found" << endl;
00243 
00244   this->setComputeCrcFlag(true);
00245   crc->compute(0xB0);
00246 
00247   // reset the data for the block
00248 //  bcId_AbsOrg = -1;
00249   bcId_Abs = 0; // max. 48 bits
00250   bcId_Dif = 0;
00251   // the following data is repeated one time for each Dif which has sent data
00252   difId = getData(1);
00253   difTriggerCounter = getData(4);
00254   acqTriggerCounter = getData(4);  // trigger counter version >= 4
00255   globalTriggerCounter = getData(4);
00256   ui64 bcIdHigh = getData(2);
00257   ui64 bcIdLow = getData(4);
00258   bcId_Abs = (bcIdHigh << 32) + bcIdLow;
00259   FILE_LOG(logDEBUG1) << "bcId_Abs[" <<bcId_Abs <<  endl;
00260   bcId_Dif = getData(3);
00261 
00262   bcId_AbsOrg =  getbcIdAbsOrg(difId, bcId_Abs);
00263   display();
00264 
00265   // the bcTime in milliseconds
00266   i64 bcTime = ((bcId_Abs - bcId_AbsOrg) * bcPeriod) / 1000;
00267   // the reading time in milliseconds
00268   i64 readTime = globalTime + bcTime;
00269 
00270   FILE_LOG(logDEBUG)   << "  START EVENT ------------- time " << readTime << " ms" << endl;
00271   FILE_LOG(logDEBUG)   << "    bc time               " << bcTime << " ms" << endl;
00272   FILE_LOG(logDEBUG)   << "    DIF Id                0x" << hex << (int)difId << dec << endl;
00273   FILE_LOG(logDEBUG)   << "    DIF trigger counter   " << difTriggerCounter << endl;
00274   FILE_LOG(logDEBUG) << "      ACQ trigger counter   " << acqTriggerCounter << endl;
00275   FILE_LOG(logDEBUG)   << "    total trigger counter " << globalTriggerCounter << endl;
00276   FILE_LOG(logDEBUG) << "    absolute bcId         " << bcId_Abs - bcId_AbsOrg << endl;
00277         event.setDifTriggerCounter(difTriggerCounter);
00278         event.setGlobalTriggerCounter(globalTriggerCounter);
00279 
00280   // end of global header
00281 
00282   bool difFound = false;
00283   Detector &detector = run.getDetector();
00284   { const ChamberMap_t &chambers = detector.getChambers();
00285     for (ChamberMap_t::const_iterator it = chambers.begin(); it != chambers.end(); ++it) {
00286       try {
00287         Chamber& chamber = *(it->second);
00288         const BoardMap_t& boards = chamber.getBoardsByDifId(difId);
00289       }
00290       catch (...) {
00291         // any error case - try next chamber
00292         continue;
00293       }
00294 
00295       // the DIF has been found in a chamber. Process all data and continue
00296       difFound = true;
00297       break;
00298     } // for
00299     if (!difFound) {
00300       FILE_LOG(logERROR) << "    No dif found with Id 0x" << hex << difId << dec << endl;
00301     }
00302   }
00303 
00304   for (bool finish = false; !finish; ) {
00305     int delimiter = 0;
00306 
00307     display();
00308     for (; delimiter != 0xA0 && delimiter != 0xB4; ) {
00309       // seek for first data frame header (0xB4)
00310       delimiter = getData(1);
00311       if (fileError == EOF) {
00312         delimiter = 0;
00313         break;
00314       }
00315       if (delimiter == 0xA3)
00316         FILE_LOG(logERROR) << "    frame trailer A3 found -- should not" << endl;
00317     }
00318     if (delimiter == 0x00) {
00319       FILE_LOG(logERROR) << "  end of file -- should not" << endl;
00320       break;
00321     }
00322     if (delimiter == 0xA0) {
00323       this->setComputeCrcFlag(false);
00324       unsigned short CRC_check = getData(2);
00325       FILE_LOG(logDEBUG) << hex << " Compute CRC[" << crc->getCrc() << "]" <<  endl;
00326       FILE_LOG(logDEBUG) << hex << " Received CRC[" << CRC_check << "]" <<  endl;
00327 
00328       if ( CRC_check != crc->getCrc() ) 
00329       {
00330         FILE_LOG(logERROR) << " CRC Error " << endl;
00331         exit(-1);
00332       }
00333       display(-1);
00334       FILE_LOG(logDEBUG) << " global trailer A0 found" << endl;
00335       break;
00336     }
00337     display(+1);
00338     FILE_LOG(logDEBUG) << "   frame header B4 found" << endl;
00339 
00340     int chipId = -1;
00341     for (; ; ) {
00342       chipId = getData(1);
00343       if (fileError == EOF) {
00344         finish = true;
00345         FILE_LOG(logINFO) << "    end of file found -- should not" << endl;
00346         break;
00347       }
00348       if (chipId == 0x00) {
00349         // dummy null bytes
00350         continue;
00351       }
00352       else if (chipId == 0xA3) {
00353         display(-1);
00354         FILE_LOG(logDEBUG) << "   frame trailer A3 found" << endl;
00355         break;
00356       }
00357       else if (chipId == 0xA0) {
00358         finish = true;
00359         display(-1);
00360         FILE_LOG(logERROR) << "    global trailer A0 found -- should not" << endl;
00361         int CRC_check = getData(1);
00362         break;
00363       }
00364       else if (chipId == 0xC3) {
00365         display(-1);
00366         FILE_LOG(logERROR) << "    frame trailer C3 found - error occured during data transfer" << endl;
00367         break;
00368       }
00369 
00370       // bcId from hardroc chip is counted as Gray code
00371       bcId_Hit = grayToBinary(getData(3));
00372       // event time in milliseconds
00373       eventTime = readTime + (((bcId_Dif - bcId_Hit) * bcPeriod) / 1000);
00374 
00375       /*
00376       Pour de ce qui est de skiper les lignes avec BCID Hardroc a 0 ou 1, ceci est valable
00377 pour les HR1 et HR2, seulement pour les fichiers venant de XDAQ. C'est a
00378 dire que lors des calibrations avec LABVIEW, pas besoin de les supprimer.
00379 Guillaume Vouters: 18 septembre 2009
00380       //  skip lines where bcId is < 2 (most of the time, data is corrupted)
00381       if (bcId_Hit <= 1) {
00382         FILE_LOG(logDEBUG) << "      skip data (bcIdHit = " << (int)bcId_Hit << ")" << endl;
00383         SkippedBcId++;
00384 
00385         for (int chNum = 48; chNum >= 0; chNum -= 16) {
00386           unsigned int data4 = getData(4); // lit 4 bytes => 8 char => 16 canaux
00387         }
00388       else {
00389       }*/
00390         // not on first line and bcId OK : get and check data
00391         if (difFound) {
00392           FILE_LOG(logDEBUG) << "      chip Id               0x" << hex << (int)chipId << dec << endl;
00393           FILE_LOG(logDEBUG) << "      bcId Hardroc          " << (int)bcId_Hit << endl;
00394           FILE_LOG(logDEBUG) << "      event time            " << eventTime << endl;
00395       //  }
00396 
00397         // trigger data for 64 channels : 1 bit trigger1, 1 bit trigger0 for each channel from 63 downto 0.
00398         // this makes 2-bit values which should not give bit 1 without bit 0
00399         for (int chNum = 48; chNum >= 0; chNum -= 16) {
00400           unsigned int data4 = getData(4); // lit 4 bytes => 8 char => 16 canaux
00401 
00402           if (difFound) {
00403             for (int index = 0; index < 16; index++) {
00404               // sur les 16 canaux, recupere les donnees canal par canal
00405               int trigger = (data4 >> ((15 - index) * 2)) & 0x03; // 2 bits
00406               // store new event data if any
00407               if (trigger) {
00408                 nbHits += newHit(event, detector, trigger, index + chNum, chipId, difId);
00409               }
00410             } // for (index)
00411           }
00412         } // for (chNum)
00413       }
00414       display();
00415     } // for(;;)
00416 
00417   } // for (;;)
00418   display(-1);
00419 
00420         if (true)
00421         {
00422     // CREATE EVENT for current Run
00423       
00424     event.setTimeStamp(globalTime + ((bcId_AbsOrg /1000000 * bcPeriod) )  );  // globalTime -> millisecond and bcId_AbsOrg * bcPeriod -> nano second
00425     event.setId(++lastEventId);
00426 
00427     FILE_LOG(logDEBUG) << "  STORE EVENT " << lastEventId << ", " << nbHits << " hits" << endl;
00428   }
00429   else
00430     FILE_LOG(logDEBUG) << "  EMPTY EVENT" << endl;
00431 
00432 
00433   if (SkippedBcId) {
00434     FILE_LOG(logWARNING) << "    skipped " << SkippedBcId << " data because of bad bcId" << endl;
00435     SkippedBcId = 0;
00436   }
00437 
00438   return(nbHits);
00439 } // Hardroc2LabviewReader.getAcqData


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