CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_9_patch3/src/EventFilter/EcalTBRawToDigi/src/CamacTBDataFormatter.cc

Go to the documentation of this file.
00001 /*  
00002  *
00003  *  \author G. Franzoni
00004  *
00005  */
00006 
00007 #include "CamacTBDataFormatter.h"
00008 
00009 
00010 
00011 // pro-memo:
00012 // "ff" = 1 Byte
00013 // 64 bits = 8 Bytes = 16 hex carachters
00014 // for now: event is  ( 114 words x 32 bits ) = 448 Bytes
00015 // size of unsigned long = 4 Bytes. Thus, 1 (32 bit) word = 1 (unsigned long) 
00016 
00017 struct hodo_fibre_index 
00018 {
00019   int nfiber;
00020   int ndet;
00021 };
00022 
00023 // nHodoscopes = 2; nFibres = 64 
00024 const static struct hodo_fibre_index hodoFiberMap[2][64] = {
00025   { // Hodo 0
00026     // unit 1A
00027     {23,44}, {29,47}, {31,48}, {21,43},
00028     { 5,35}, {15,40}, { 7,36}, {13,39},
00029     { 1,33}, {11,38}, { 3,34}, { 9,37},
00030     { 6, 3}, {16, 8}, { 8, 4}, {14, 7},
00031     // unit 1C
00032     {17,41}, {19,42}, {27,46}, {25,45},
00033     {32,16}, {22,11}, {24,12}, {30,15},
00034     {12, 6}, { 2, 1}, { 4, 2}, {10, 5},
00035     {28,14}, {18, 9}, {20,10}, {26,13},
00036     // unit 2A
00037     {54,27}, {56,28}, {64,32}, {62,31},
00038     {49,57}, {59,62}, {51,58}, {57,61},
00039     {53,59}, {63,64}, {55,60}, {61,63},
00040     {45,55}, {39,52}, {37,51}, {47,56},
00041     // unit 2C
00042     {34,17}, {42,21}, {44,22}, {36,18},
00043     {50,25}, {60,30}, {58,29}, {52,26},
00044     {38,19}, {40,20}, {48,24}, {46,23},
00045     {41,53}, {35,50}, {33,49}, {43,54}
00046   },
00047   { // Hodo 1
00048     // unit 1A
00049     {31,48}, {29,47}, {23,44}, {21,43},
00050     { 5,35}, { 7,36}, {15,40}, {13,39},
00051     { 1,33}, { 3,34}, {11,38}, { 9,37},
00052     { 6, 3}, { 8, 4}, {16, 8}, {14, 7},
00053     // unit 1C
00054     {17,41}, {27,46}, {19,42}, {25,45},
00055     {24,12}, {22,11}, {32,16}, {30,15},
00056     { 4, 2}, { 2, 1}, {12, 6}, {10, 5},
00057     {20,10}, {18, 9}, {28,14}, {26,13},
00058     // unit 2A
00059     {54,27}, {64,32}, {56,28}, {62,31},
00060     {49,57}, {51,58}, {59,62}, {57,61},
00061     {53,59}, {55,60}, {63,64}, {61,63},
00062     {45,55}, {47,56}, {37,51}, {39,52},
00063     // unit 2C
00064     {34,17}, {42,21}, {36,18}, {44,22},
00065     {50,25}, {52,26}, {58,29}, {60,30},
00066     {38,19}, {48,24}, {40,20}, {46,23},
00067     {41,53}, {43,54}, {33,49}, {35,50}
00068   }
00069 };
00070 
00071 
00072 
00073 CamacTBDataFormatter::CamacTBDataFormatter () {
00074   nWordsPerEvent = 148;
00075 }
00076 
00077 
00078 
00079 void CamacTBDataFormatter::interpretRawData( const FEDRawData & fedData, 
00080                                              EcalTBEventHeader& tbEventHeader,
00081                                              EcalTBHodoscopeRawInfo& hodoRaw,
00082                                              EcalTBTDCRawInfo& tdcRawInfo )
00083 {
00084   
00085 
00086   const unsigned long * buffer = ( reinterpret_cast<unsigned long*>(const_cast<unsigned char*> ( fedData.data())));
00087   int fedLenght                        = fedData.size(); // in Bytes
00088   
00089   // check ultimate fed size and strip off fed-header and -trailer
00090   if (fedLenght != (nWordsPerEvent *4) )
00091     {
00092       edm::LogError("CamacTBDataFormatter") << "CamacTBData has size "  <<  fedLenght
00093                                        <<" Bytes as opposed to expected " 
00094                                        << (nWordsPerEvent *4)
00095                                        << ". Returning.";
00096       return;
00097     }
00098 
00099   
00100   
00101   unsigned long a=1; // used to extract an 8 Bytes word from fed 
00102   unsigned long b=1; // used to manipulate the 8 Bytes word and get what needed
00103 
00104   // initializing array of statuses
00105   for (int wordNumber=0; wordNumber<nWordsPerEvent; wordNumber++)
00106     { statusWords[wordNumber ] = true;}
00107 
00108   //  for (int wordNumber=0; wordNumber<nWordsPerEvent; wordNumber++)
00109   //    { checkStatus( buffer[wordNumber],  wordNumber);}
00110   
00111   //   for (int wordNumber=0; wordNumber<nWordsPerEvent; wordNumber++)
00112   //     {
00113   //       if (! statusWords[wordNumber])
00114   //    {
00115   //      edm::LogError("CamacTBDataFormatter") << "bad status in some of the event words; returning;";   
00116   //    }
00117   //     }
00118   
00119   
00120 
00121   int wordCounter =0;
00122   wordCounter +=4;
00123 
00124 
00125   // read first word
00126   a = buffer[wordCounter];wordCounter++;
00127   LogDebug("CamacTBDataFormatter") << "\n\nword:\t" << a;
00128   
00129   b = (a& 0xff000000);
00130   b = b >> 24;
00131   LogDebug("CamacTBDataFormatter") << "format  ver:\t" << b;
00132 
00133   b = (a& 0xff0000);
00134   b = b >> 16;
00135   LogDebug("CamacTBDataFormatter") << "major:\t" << b;
00136 
00137   b = (a& 0xff00);
00138   b = b >> 8;
00139   LogDebug("CamacTBDataFormatter") << "minor:\t" << b;
00140 
00141   a = buffer[wordCounter];wordCounter++;
00142   LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a;
00143   LogDebug("CamacTBDataFormatter") << "time stamp secs: "<<a;
00144 
00145   a = buffer[wordCounter];wordCounter++;
00146   LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a;
00147   LogDebug("CamacTBDataFormatter") << "time stamp musecs: " <<a;
00148 
00149 
00150   a = buffer[wordCounter];wordCounter++;
00151   LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a;
00152   b = (a& 0xffffff);
00153   LogDebug("CamacTBDataFormatter") << "LV1A: "<< b;
00154   int lv1 = b;
00155 
00156   a = buffer[wordCounter];wordCounter++;
00157   LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a;
00158   b = (a& 0xffff0000);
00159   b = b >> 16;
00160   LogDebug("CamacTBDataFormatter") << "run number: "<< b;
00161   int run = b;
00162   b = (a& 0xffff);
00163   LogDebug("CamacTBDataFormatter") << "spill number: "<< b;
00164   int spill = b;
00165 
00166   a = buffer[wordCounter];wordCounter++;
00167   b = (a& 0xffff);
00168   LogDebug("CamacTBDataFormatter") << "event number in spill: "<< b;
00169 
00170   a = buffer[wordCounter];wordCounter++;
00171   b = (a& 0xffffff);
00172   LogDebug("CamacTBDataFormatter") << "internal event number: "<< b;
00173 
00174   a = buffer[wordCounter];wordCounter++;
00175   LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a;
00176   b = (a& 0xffff0000);
00177   b = b >> 16;
00178   LogDebug("CamacTBDataFormatter") << "vme errors: "<< b;
00179   b = (a& 0xffff);
00180   LogDebug("CamacTBDataFormatter") << "camac errors: "<< b;
00181 
00182   a = buffer[wordCounter];wordCounter++;
00183   LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a;
00184   b = a;
00185   LogDebug("CamacTBDataFormatter") << "extended (32 bits) run number: "<< b;
00186 
00187   // skip 1 reserved words
00188   wordCounter +=1;
00189 
00190   /**********************************
00191   // acessing the hodoscope block
00192   **********************************/
00193 
00194   // getting 16 words buffer and checking words statuses
00195   unsigned long bufferHodo[16]; 
00196   bool hodoAreGood = true;
00197   for (int hodo=0; hodo<16; hodo++)
00198     {
00199       hodoAreGood = hodoAreGood && checkStatus(buffer[wordCounter], wordCounter);
00200 
00201       a                 = buffer[wordCounter];
00202       bufferHodo[hodo]  = buffer[wordCounter];
00203       wordCounter++;
00204             
00205       b = (a& 0xffffff);
00206       LogDebug("CamacTBDataFormatter") << "hodo: " << hodo << "\t: " << b;
00207     }
00208 
00209   hodoRaw.setPlanes(0);
00210   // unpacking the hodo data
00211   if (hodoAreGood){
00212   for (int iplane=0; iplane<nHodoPlanes; iplane++) 
00213     {         
00214       int detType = 1;       // new mapping for electronics channels  
00215                
00216       for (int fiber=0; fiber<nHodoFibers; fiber++) { hodoHits[iplane][fiber] = 0; }            
00217                
00218       int ch=0;
00219       
00220       // loop on [4-24bits words] = 1 plane 
00221       for(int j=0; j<hodoRawLen; j++) 
00222         {
00223           int word=  bufferHodo[  j+iplane*hodoRawLen  ]  &0xffff;
00224           for(int i=1; i<0x10000; i<<=1) 
00225             {
00226               if ( word & i ) 
00227                 {
00228                   // map electronics channel to No of fibre
00229                   hodoHits[iplane][ hodoFiberMap[detType][ch].nfiber - 1]++;
00230                 }
00231               ch ++;
00232             }
00233         } 
00234     }
00235 
00236   
00237   // building the hodo infos (returning decoded hodoscope hits information)
00238   hodoRaw.setPlanes((unsigned int)nHodoPlanes);
00239   for (int ipl = 0; ipl < nHodoPlanes; ipl++) 
00240     {             
00241       EcalTBHodoscopePlaneRawHits theHodoPlane;
00242       theHodoPlane.setChannels((unsigned int)nHodoFibers);
00243       for (int fib = 0; fib < nHodoFibers; fib++){ theHodoPlane.setHit((unsigned int)fib, (bool)hodoHits[ipl][fib]); }
00244       hodoRaw.setPlane((unsigned int)ipl, theHodoPlane);
00245     }
00246   }
00247   else
00248     {
00249       edm::LogWarning("CamacTBDataFormatter") << "hodoscope block has hardware problems or is partly unused at LV1: "
00250                                          << lv1 << " spill: " << spill 
00251                                          << "run: " << run 
00252                                          << ". Skipping digi.";
00253     }
00254   
00255   
00256 
00257 
00258 
00259   /**********************************
00260   // acessing the scalers block
00261   **********************************/
00262 
00263   // getting 72 words buffer and checking words statuses
00264 
00265   scalers_.clear();
00266   scalers_.reserve(36);
00267   
00268   bool scalersAreGood = true;
00269   for (int scaler=0; scaler<72; scaler++)
00270     {
00271       scalersAreGood = scalersAreGood && checkStatus(buffer[wordCounter], wordCounter);
00272 
00273       a = buffer[wordCounter];      wordCounter++;
00274       b = (a& 0xffffff);
00275       LogDebug("CamacTBDataFormatter") << "scaler: " << scaler << "\t: " << b;
00276 
00277       // filling vector container with scalers words
00278       if ( (scaler%2)==0 ) scalers_.push_back(b);
00279     }
00280   if (scalersAreGood){
00281     tbEventHeader.setScalers (scalers_);  
00282   }
00283   else
00284     {
00285       edm::LogWarning("CamacTBDataFormatter") << "scalers block has hardware problems  or is partly unused at LV1: "
00286                                          << lv1 << " spill: " << spill 
00287                                          << "run: " << run;
00288     }
00289   
00290 
00291 
00292 
00293 
00294   /**********************************
00295   // acessing the fingers block
00296   **********************************/
00297 
00298   LogDebug("CamacTBDataFormatter") <<"\n";
00299   bool fingersAreGood = true;
00300   for (int finger=0; finger<2; finger++)
00301     {
00302       fingersAreGood = fingersAreGood && checkStatus(buffer[wordCounter], wordCounter);
00303 
00304       a = buffer[wordCounter];      wordCounter++;
00305       b = (a& 0xffffff);
00306       LogDebug("CamacTBDataFormatter") << "finger: " << finger << "\t: " << b;
00307     }
00308   if (fingersAreGood){
00309     ;  }
00310   else
00311     {
00312       edm::LogWarning("CamacTBDataFormatter") << "fingers block has hardware problems  or is partly unused at LV1: "
00313                                          << lv1 << " spill: " << spill 
00314                                          << "run: " << run;
00315     }
00316   
00317 
00318 
00319 
00320   /**********************************
00321   // acessing the multi stop TDC block
00322   **********************************/
00323 
00324   a = buffer[wordCounter];      wordCounter++;
00325   LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a;
00326   b = (a& 0x000000ff);
00327   LogDebug("CamacTBDataFormatter") << "number of words used in multi stop TDC words: "<< b;
00328   
00329   int numberTDCwords = b;
00330   numberTDCwords = 16;
00331   bool multiStopTDCIsGood = true;
00332   for (int tdc=0; tdc< numberTDCwords ; tdc++)
00333     {
00334       multiStopTDCIsGood =  multiStopTDCIsGood && checkStatus(buffer[wordCounter], wordCounter);
00335 
00336       a = buffer[wordCounter];      wordCounter++;
00337       b =a;
00338       LogDebug("CamacTBDataFormatter") << "tdc: " << tdc << "\t: " << b;
00339     }
00340   if ( multiStopTDCIsGood ){
00341     ;  }
00342   else
00343     {
00344       edm::LogWarning("CamacTBDataFormatter") << "multi stop TDC block has hardware problems or is partly unused at LV1: "
00345                                          << lv1 << " spill: " << spill 
00346                                          << "run: " << run;
00347     }
00348   
00349   // skip the unused words in multi stop TDC block
00350   wordCounter += (16 - numberTDCwords);
00351 
00352   
00353 
00354   
00355   /**********************************
00356   // acessing table in position bit
00357   **********************************/
00358   a = buffer[wordCounter];      wordCounter++;
00359   b = (a & 0x00000001);  //1= table is in position; 0=table is moving
00360   bool tableIsMoving;
00361   if ( b ){
00362     LogDebug("CamacTBDataFormatter") << " table is in position.";
00363     tableIsMoving = false;
00364   }
00365   else
00366     {
00367     LogDebug("CamacTBDataFormatter") << " table is moving.";
00368     tableIsMoving = true;
00369     }
00370   tbEventHeader.setTableIsMoving( tableIsMoving );
00371 
00372 
00373   wordCounter += 3;
00374 
00375   
00376   
00377   /**********************************
00378    // acessing ADC block
00379    **********************************/
00380   // skip 10 reserved words
00381   wordCounter += 10;
00382   bool ADCIsGood = true;
00383 //  ADCIsGood =  ADCIsGood && checkStatus(buffer[wordCounter], wordCounter);
00384   ADCIsGood = checkStatus(buffer[wordCounter], wordCounter);
00385   a = buffer[wordCounter];      wordCounter++;  // NOT read out
00386   b = (a&0x00ffffff);
00387   LogDebug("CamacTBDataFormatter") << "ADC word1: " << a << "\t ADC2: " << b << " word is: " << (wordCounter-1);
00388 //  ADCIsGood = true;
00389 //  ADCIsGood = ADCIsGood && checkStatus(buffer[wordCounter], wordCounter);
00390   ADCIsGood = checkStatus(buffer[wordCounter], wordCounter);
00391   a = buffer[wordCounter];      wordCounter++;  // read out
00392   b = (a&0xffffff);
00393   LogDebug("CamacTBDataFormatter") << "ADC word2, adc channel 11, ampli S6: " << a << "\t ADC2: " << b;
00394   if (ADCIsGood) tbEventHeader.setS6ADC ( b ) ;
00395   else tbEventHeader.setS6ADC ( -1 ) ;
00396 
00397   
00398   /**********************************
00399    // acessing TDC block
00400    **********************************/
00401   // skip 6 reserved words
00402   wordCounter += 6;
00403   ADCIsGood && checkStatus(buffer[wordCounter], wordCounter);
00404   a = buffer[wordCounter];      wordCounter++;
00405   b = (a & 0xfffff);
00406   LogDebug("CamacTBDataFormatter") << "TDC word1: " << a << "\t TDC2: " << b;
00407   ADCIsGood && checkStatus(buffer[wordCounter], wordCounter);
00408   a = buffer[wordCounter];      wordCounter++;
00409   b = (a & 0xfffff);
00410   LogDebug("CamacTBDataFormatter") << "TDC word2: (ext_val_trig - LHC_clock) " 
00411                                    << a << "\t (ext_val_trig - LHC_clock): "
00412                                    << b;
00413   
00414   tdcRawInfo.setSize(1);
00415   int sampleNumber =1;
00416   EcalTBTDCSample theTdc(sampleNumber, b);
00417   tdcRawInfo.setSample(0, theTdc);
00418 
00419 
00420   a = buffer[wordCounter];      wordCounter++;
00421   LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a;
00422   b = a;
00423   LogDebug("CamacTBDataFormatter") << "last word of event: "<< b;
00424 
00425 
00426 }
00427 
00428 
00429 
00430 
00431 
00432 
00433 
00434 
00435 // given a data word with 8 msb as status, checks status
00436 
00437 bool CamacTBDataFormatter::checkStatus(unsigned long word, int wordNumber){
00438   
00439 
00440   if ( wordNumber < 1 || wordNumber > nWordsPerEvent)
00441     { 
00442       edm::LogWarning("CamacTBDataFormatter::checkStatus") << "checking word number: "
00443                                                     <<  wordNumber << " which is out of allowed range (" 
00444                                                     << nWordsPerEvent << ")";
00445       return false;
00446     }
00447 
00448   bool isOk = true;
00449 
00450   if  (word & 0x80000000) // daq item not used
00451     { 
00452       edm::LogWarning("CamacTBDataFormatter::checkStatus") << "daq item not used at word: "<<  wordNumber;
00453       statusWords[wordNumber -1] = false;      
00454       isOk = false;
00455     }
00456   
00457   if (word & 0x40000000) // vme error on data
00458     { 
00459       edm::LogWarning("CamacTBDataFormatter::checkStatus") << "vme error on word: "<<  wordNumber;
00460       statusWords[wordNumber -1] = false;      
00461       isOk = false;
00462     }
00463     
00464   if (word & 0x20000000) // vme error on status
00465     { 
00466       edm::LogWarning("CamacTBDataFormatter::checkStatus") << "vme status error at word: "<<  wordNumber;
00467       statusWords[wordNumber -1] = false;      
00468       isOk = false;
00469     }
00470     
00471   if (word & 0x10000000) // camac error (no X)
00472     { 
00473       edm::LogWarning("CamacTBDataFormatter::checkStatus") << "camac error (no X) at word: "<<  wordNumber;
00474       statusWords[wordNumber -1] = false;      
00475       isOk = false;
00476     }
00477     
00478   if (word & 0x08000000) // camac error (no Q)
00479     { 
00480       edm::LogWarning("CamacTBDataFormatter::checkStatus") << "camac error (no Q) at word: "<<  wordNumber;
00481       statusWords[wordNumber -1] = false;      
00482       isOk = false;
00483     }
00484   
00485   // camac error check not done on purpose from Aug 8, to speed up Camac communication. This bit status is now ignored.
00486   //  if (word & 0x04000000) // no camac check error
00487   //    { 
00488   //edm::LogWarning("CamacTBDataFormatter::checkStatus") << "no camac check error at word: "<<  wordNumber;
00489   //statusWords[wordNumber -1] = false;      
00490   //isOk = false;
00491   //    }
00492   
00493   return isOk;
00494 
00495 }