#include <CamacTBDataFormatter.h>
Public Member Functions | |
CamacTBDataFormatter () | |
void | interpretRawData (const FEDRawData &data, EcalTBEventHeader &tbEventHeader, EcalTBHodoscopeRawInfo &hodoRaw, EcalTBTDCRawInfo &tdcRawInfo) |
virtual | ~CamacTBDataFormatter () |
Private Member Functions | |
bool | checkStatus (unsigned long word, int wordNumber) |
Private Attributes | |
int | hodoAll [nHodoPlanes *nHodoFibers] |
int | hodoHits [nHodoPlanes][nHodoFibers] |
int | nHodoHits [nHodoPlanes] |
int | nWordsPerEvent |
std::vector< int > | scalers_ |
bool | statusWords [148+4] |
Static Private Attributes | |
static const int | hodoRawLen = 4 |
static const int | nHodoFibers = 64 |
static const int | nHodoPlanes = 4 |
static const int | nHodoscopes = 2 |
Definition at line 28 of file CamacTBDataFormatter.h.
CamacTBDataFormatter::CamacTBDataFormatter | ( | ) |
Definition at line 73 of file CamacTBDataFormatter.cc.
References nWordsPerEvent.
{ nWordsPerEvent = 148; }
virtual CamacTBDataFormatter::~CamacTBDataFormatter | ( | ) | [inline, virtual] |
Definition at line 33 of file CamacTBDataFormatter.h.
References LogDebug.
{LogDebug("EcalTBRawToDigi") << "@SUB=CamacTBDataFormatter" << "\n"; };
bool CamacTBDataFormatter::checkStatus | ( | unsigned long | word, |
int | wordNumber | ||
) | [private] |
Definition at line 438 of file CamacTBDataFormatter.cc.
References nWordsPerEvent, and statusWords.
Referenced by interpretRawData().
{ if ( wordNumber < 1 || wordNumber > nWordsPerEvent) { edm::LogWarning("CamacTBDataFormatter::checkStatus") << "checking word number: " << wordNumber << " which is out of allowed range (" << nWordsPerEvent << ")"; return false; } bool isOk = true; if (word & 0x80000000) // daq item not used { edm::LogWarning("CamacTBDataFormatter::checkStatus") << "daq item not used at word: "<< wordNumber; statusWords[wordNumber -1] = false; isOk = false; } if (word & 0x40000000) // vme error on data { edm::LogWarning("CamacTBDataFormatter::checkStatus") << "vme error on word: "<< wordNumber; statusWords[wordNumber -1] = false; isOk = false; } if (word & 0x20000000) // vme error on status { edm::LogWarning("CamacTBDataFormatter::checkStatus") << "vme status error at word: "<< wordNumber; statusWords[wordNumber -1] = false; isOk = false; } if (word & 0x10000000) // camac error (no X) { edm::LogWarning("CamacTBDataFormatter::checkStatus") << "camac error (no X) at word: "<< wordNumber; statusWords[wordNumber -1] = false; isOk = false; } if (word & 0x08000000) // camac error (no Q) { edm::LogWarning("CamacTBDataFormatter::checkStatus") << "camac error (no Q) at word: "<< wordNumber; statusWords[wordNumber -1] = false; isOk = false; } // camac error check not done on purpose from Aug 8, to speed up Camac communication. This bit status is now ignored. // if (word & 0x04000000) // no camac check error // { //edm::LogWarning("CamacTBDataFormatter::checkStatus") << "no camac check error at word: "<< wordNumber; //statusWords[wordNumber -1] = false; //isOk = false; // } return isOk; }
void CamacTBDataFormatter::interpretRawData | ( | const FEDRawData & | data, |
EcalTBEventHeader & | tbEventHeader, | ||
EcalTBHodoscopeRawInfo & | hodoRaw, | ||
EcalTBTDCRawInfo & | tdcRawInfo | ||
) |
Definition at line 79 of file CamacTBDataFormatter.cc.
References a, b, checkStatus(), FEDRawData::data(), hodoHits, hodoRawLen, i, j, LogDebug, hodo_fibre_index::nfiber, nHodoFibers, nHodoPlanes, nWordsPerEvent, CrabTask::run, scalers_, EcalTBHodoscopePlaneRawHits::setChannels(), EcalTBHodoscopePlaneRawHits::setHit(), EcalTBHodoscopeRawInfo::setPlane(), EcalTBHodoscopeRawInfo::setPlanes(), EcalTBEventHeader::setS6ADC(), EcalTBTDCRawInfo::setSample(), EcalTBEventHeader::setScalers(), EcalTBTDCRawInfo::setSize(), EcalTBEventHeader::setTableIsMoving(), FEDRawData::size(), and statusWords.
Referenced by EcalDCCTB07UnpackingModule::produce(), and EcalDCCTBUnpackingModule::produce().
{ const unsigned long * buffer = ( reinterpret_cast<unsigned long*>(const_cast<unsigned char*> ( fedData.data()))); int fedLenght = fedData.size(); // in Bytes // check ultimate fed size and strip off fed-header and -trailer if (fedLenght != (nWordsPerEvent *4) ) { edm::LogError("CamacTBDataFormatter") << "CamacTBData has size " << fedLenght <<" Bytes as opposed to expected " << (nWordsPerEvent *4) << ". Returning."; return; } unsigned long a=1; // used to extract an 8 Bytes word from fed unsigned long b=1; // used to manipulate the 8 Bytes word and get what needed // initializing array of statuses for (int wordNumber=0; wordNumber<nWordsPerEvent; wordNumber++) { statusWords[wordNumber ] = true;} // for (int wordNumber=0; wordNumber<nWordsPerEvent; wordNumber++) // { checkStatus( buffer[wordNumber], wordNumber);} // for (int wordNumber=0; wordNumber<nWordsPerEvent; wordNumber++) // { // if (! statusWords[wordNumber]) // { // edm::LogError("CamacTBDataFormatter") << "bad status in some of the event words; returning;"; // } // } int wordCounter =0; wordCounter +=4; // read first word a = buffer[wordCounter];wordCounter++; LogDebug("CamacTBDataFormatter") << "\n\nword:\t" << a; b = (a& 0xff000000); b = b >> 24; LogDebug("CamacTBDataFormatter") << "format ver:\t" << b; b = (a& 0xff0000); b = b >> 16; LogDebug("CamacTBDataFormatter") << "major:\t" << b; b = (a& 0xff00); b = b >> 8; LogDebug("CamacTBDataFormatter") << "minor:\t" << b; a = buffer[wordCounter];wordCounter++; LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a; LogDebug("CamacTBDataFormatter") << "time stamp secs: "<<a; a = buffer[wordCounter];wordCounter++; LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a; LogDebug("CamacTBDataFormatter") << "time stamp musecs: " <<a; a = buffer[wordCounter];wordCounter++; LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a; b = (a& 0xffffff); LogDebug("CamacTBDataFormatter") << "LV1A: "<< b; int lv1 = b; a = buffer[wordCounter];wordCounter++; LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a; b = (a& 0xffff0000); b = b >> 16; LogDebug("CamacTBDataFormatter") << "run number: "<< b; int run = b; b = (a& 0xffff); LogDebug("CamacTBDataFormatter") << "spill number: "<< b; int spill = b; a = buffer[wordCounter];wordCounter++; b = (a& 0xffff); LogDebug("CamacTBDataFormatter") << "event number in spill: "<< b; a = buffer[wordCounter];wordCounter++; b = (a& 0xffffff); LogDebug("CamacTBDataFormatter") << "internal event number: "<< b; a = buffer[wordCounter];wordCounter++; LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a; b = (a& 0xffff0000); b = b >> 16; LogDebug("CamacTBDataFormatter") << "vme errors: "<< b; b = (a& 0xffff); LogDebug("CamacTBDataFormatter") << "camac errors: "<< b; a = buffer[wordCounter];wordCounter++; LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a; b = a; LogDebug("CamacTBDataFormatter") << "extended (32 bits) run number: "<< b; // skip 1 reserved words wordCounter +=1; /********************************** // acessing the hodoscope block **********************************/ // getting 16 words buffer and checking words statuses unsigned long bufferHodo[16]; bool hodoAreGood = true; for (int hodo=0; hodo<16; hodo++) { hodoAreGood = hodoAreGood && checkStatus(buffer[wordCounter], wordCounter); a = buffer[wordCounter]; bufferHodo[hodo] = buffer[wordCounter]; wordCounter++; b = (a& 0xffffff); LogDebug("CamacTBDataFormatter") << "hodo: " << hodo << "\t: " << b; } hodoRaw.setPlanes(0); // unpacking the hodo data if (hodoAreGood){ for (int iplane=0; iplane<nHodoPlanes; iplane++) { int detType = 1; // new mapping for electronics channels for (int fiber=0; fiber<nHodoFibers; fiber++) { hodoHits[iplane][fiber] = 0; } int ch=0; // loop on [4-24bits words] = 1 plane for(int j=0; j<hodoRawLen; j++) { int word= bufferHodo[ j+iplane*hodoRawLen ] &0xffff; for(int i=1; i<0x10000; i<<=1) { if ( word & i ) { // map electronics channel to No of fibre hodoHits[iplane][ hodoFiberMap[detType][ch].nfiber - 1]++; } ch ++; } } } // building the hodo infos (returning decoded hodoscope hits information) hodoRaw.setPlanes((unsigned int)nHodoPlanes); for (int ipl = 0; ipl < nHodoPlanes; ipl++) { EcalTBHodoscopePlaneRawHits theHodoPlane; theHodoPlane.setChannels((unsigned int)nHodoFibers); for (int fib = 0; fib < nHodoFibers; fib++){ theHodoPlane.setHit((unsigned int)fib, (bool)hodoHits[ipl][fib]); } hodoRaw.setPlane((unsigned int)ipl, theHodoPlane); } } else { edm::LogWarning("CamacTBDataFormatter") << "hodoscope block has hardware problems or is partly unused at LV1: " << lv1 << " spill: " << spill << "run: " << run << ". Skipping digi."; } /********************************** // acessing the scalers block **********************************/ // getting 72 words buffer and checking words statuses scalers_.clear(); scalers_.reserve(36); bool scalersAreGood = true; for (int scaler=0; scaler<72; scaler++) { scalersAreGood = scalersAreGood && checkStatus(buffer[wordCounter], wordCounter); a = buffer[wordCounter]; wordCounter++; b = (a& 0xffffff); LogDebug("CamacTBDataFormatter") << "scaler: " << scaler << "\t: " << b; // filling vector container with scalers words if ( (scaler%2)==0 ) scalers_.push_back(b); } if (scalersAreGood){ tbEventHeader.setScalers (scalers_); } else { edm::LogWarning("CamacTBDataFormatter") << "scalers block has hardware problems or is partly unused at LV1: " << lv1 << " spill: " << spill << "run: " << run; } /********************************** // acessing the fingers block **********************************/ LogDebug("CamacTBDataFormatter") <<"\n"; bool fingersAreGood = true; for (int finger=0; finger<2; finger++) { fingersAreGood = fingersAreGood && checkStatus(buffer[wordCounter], wordCounter); a = buffer[wordCounter]; wordCounter++; b = (a& 0xffffff); LogDebug("CamacTBDataFormatter") << "finger: " << finger << "\t: " << b; } if (fingersAreGood){ ; } else { edm::LogWarning("CamacTBDataFormatter") << "fingers block has hardware problems or is partly unused at LV1: " << lv1 << " spill: " << spill << "run: " << run; } /********************************** // acessing the multi stop TDC block **********************************/ a = buffer[wordCounter]; wordCounter++; LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a; b = (a& 0x000000ff); LogDebug("CamacTBDataFormatter") << "number of words used in multi stop TDC words: "<< b; int numberTDCwords = b; numberTDCwords = 16; bool multiStopTDCIsGood = true; for (int tdc=0; tdc< numberTDCwords ; tdc++) { multiStopTDCIsGood = multiStopTDCIsGood && checkStatus(buffer[wordCounter], wordCounter); a = buffer[wordCounter]; wordCounter++; b =a; LogDebug("CamacTBDataFormatter") << "tdc: " << tdc << "\t: " << b; } if ( multiStopTDCIsGood ){ ; } else { edm::LogWarning("CamacTBDataFormatter") << "multi stop TDC block has hardware problems or is partly unused at LV1: " << lv1 << " spill: " << spill << "run: " << run; } // skip the unused words in multi stop TDC block wordCounter += (16 - numberTDCwords); /********************************** // acessing table in position bit **********************************/ a = buffer[wordCounter]; wordCounter++; b = (a & 0x00000001); //1= table is in position; 0=table is moving bool tableIsMoving; if ( b ){ LogDebug("CamacTBDataFormatter") << " table is in position."; tableIsMoving = false; } else { LogDebug("CamacTBDataFormatter") << " table is moving."; tableIsMoving = true; } tbEventHeader.setTableIsMoving( tableIsMoving ); wordCounter += 3; /********************************** // acessing ADC block **********************************/ // skip 10 reserved words wordCounter += 10; bool ADCIsGood = true; // ADCIsGood = ADCIsGood && checkStatus(buffer[wordCounter], wordCounter); ADCIsGood = checkStatus(buffer[wordCounter], wordCounter); a = buffer[wordCounter]; wordCounter++; // NOT read out b = (a&0x00ffffff); LogDebug("CamacTBDataFormatter") << "ADC word1: " << a << "\t ADC2: " << b << " word is: " << (wordCounter-1); // ADCIsGood = true; // ADCIsGood = ADCIsGood && checkStatus(buffer[wordCounter], wordCounter); ADCIsGood = checkStatus(buffer[wordCounter], wordCounter); a = buffer[wordCounter]; wordCounter++; // read out b = (a&0xffffff); LogDebug("CamacTBDataFormatter") << "ADC word2, adc channel 11, ampli S6: " << a << "\t ADC2: " << b; if (ADCIsGood) tbEventHeader.setS6ADC ( b ) ; else tbEventHeader.setS6ADC ( -1 ) ; /********************************** // acessing TDC block **********************************/ // skip 6 reserved words wordCounter += 6; bool TDCIsGood = true; TDCIsGood = ADCIsGood && checkStatus(buffer[wordCounter], wordCounter); a = buffer[wordCounter]; wordCounter++; b = (a & 0xfffff); LogDebug("CamacTBDataFormatter") << "TDC word1: " << a << "\t TDC2: " << b; TDCIsGood = ADCIsGood && checkStatus(buffer[wordCounter], wordCounter); a = buffer[wordCounter]; wordCounter++; b = (a & 0xfffff); LogDebug("CamacTBDataFormatter") << "TDC word2: (ext_val_trig - LHC_clock) " << a << "\t (ext_val_trig - LHC_clock): " << b; tdcRawInfo.setSize(1); int sampleNumber =1; EcalTBTDCSample theTdc(sampleNumber, b); tdcRawInfo.setSample(0, theTdc); a = buffer[wordCounter]; wordCounter++; LogDebug("CamacTBDataFormatter") << "\n\n word:\t" << a; b = a; LogDebug("CamacTBDataFormatter") << "last word of event: "<< b; }
int CamacTBDataFormatter::hodoAll[nHodoPlanes *nHodoFibers] [private] |
Definition at line 60 of file CamacTBDataFormatter.h.
int CamacTBDataFormatter::hodoHits[nHodoPlanes][nHodoFibers] [private] |
Definition at line 59 of file CamacTBDataFormatter.h.
Referenced by interpretRawData().
const int CamacTBDataFormatter::hodoRawLen = 4 [static, private] |
Definition at line 56 of file CamacTBDataFormatter.h.
Referenced by interpretRawData().
const int CamacTBDataFormatter::nHodoFibers = 64 [static, private] |
Definition at line 53 of file CamacTBDataFormatter.h.
Referenced by interpretRawData().
int CamacTBDataFormatter::nHodoHits[nHodoPlanes] [private] |
Definition at line 58 of file CamacTBDataFormatter.h.
const int CamacTBDataFormatter::nHodoPlanes = 4 [static, private] |
Definition at line 55 of file CamacTBDataFormatter.h.
Referenced by interpretRawData().
const int CamacTBDataFormatter::nHodoscopes = 2 [static, private] |
Definition at line 54 of file CamacTBDataFormatter.h.
int CamacTBDataFormatter::nWordsPerEvent [private] |
Definition at line 51 of file CamacTBDataFormatter.h.
Referenced by CamacTBDataFormatter(), checkStatus(), and interpretRawData().
std::vector<int> CamacTBDataFormatter::scalers_ [private] |
Definition at line 63 of file CamacTBDataFormatter.h.
Referenced by interpretRawData().
bool CamacTBDataFormatter::statusWords[148+4] [private] |
Definition at line 61 of file CamacTBDataFormatter.h.
Referenced by checkStatus(), and interpretRawData().