// ----------------------------------------------------------------------------- // ----- TTrbUnpackTof source file ----- // ----- ----- // ----- created by C. Simon on 2014-03-08 ----- // ----- ----- // ----- based on TMbsUnpackTof by P.-A. Loizeau ----- // ----- https://subversion.gsi.de/fairroot/cbmroot/development/ploizeau/ ----- // ----- main/unpack/tof/TMbsUnpackTof.cxx ----- // ----- revision 21787, 2013-09-20 ----- // ----------------------------------------------------------------------------- #include "TTrbUnpackTof.h" // Parameter header #include "TMbsUnpackTofPar.h" #include "TofDef.h" #include "TofTrbTdcDef.h" // Iterator #include "HadaqTrbIterator.h" // Subunpacker header #include "TTofTrbTdcUnpacker.h" // Output object #include "TTofTrbTdcBoard.h" // ROOT headers #include "TClonesArray.h" #include "TROOT.h" #include "TH1.h" // FairRoot headers #include "FairRunOnline.h" #include "FairLogger.h" #include "FairRuntimeDb.h" ClassImp(TTrbUnpackTof) TTrbUnpackTof::TTrbUnpackTof( Short_t type, Short_t subType, Short_t procId, Short_t subCrate, Short_t control) : FairUnpack( type, subType, procId, subCrate, control), fMbsUnpackPar(0), fiNbEvents(0), fuInDataTrbSebNb(0), fuActiveTrbTdcNb(0) { LOG(INFO)<<"**** TTrbUnpackTof: Call TTrbUnpackTof()..."<nextEvent(); if( 0 == tCurrentEvent ) { LOG(ERROR)<<"Bad HADAQ raw event. Skip whole MBS subevent."<GetDataError() ) { LOG(WARNING)<<"Error bit set in at least one HADAQ raw subevent!"<GetSize()<<" B"<GetDecoding())<GetId())<GetSeqNr()<GetDate()>>16), 1+((tCurrentEvent->GetDate()&0xff00)>>8), ((tCurrentEvent->GetDate()&0xff)) )<GetTime()>>16), ((tCurrentEvent->GetTime()&0xff00)>>8), ((tCurrentEvent->GetTime()&0xff)) )<GetRunNr()<GetPaddedSize()-tCurrentEvent->GetSize() <<" B"<GetPaddedSize() ) { LOG(WARNING)<GetPaddedSize(), uNb1ByteWords) <nextSubevent() ) { LOG(DEBUG)<<"Getting HADAQ raw subevent in HADAQ raw event..."<currSubevent(); UInt_t uSubeventId = tCurrentSubevent->GetId() & 0xffff; uNbSubevents++; Bool_t bKnownSubevent = ( -1 < fMbsUnpackPar->GetTrbSebIndex( uSubeventId ) ); UInt_t uNbRegisteredFpgas = 0; UInt_t uNbActiveFpgas = 0; if( bKnownSubevent ) { uNbRegisteredFpgas = fMbsUnpackPar->GetInDataFpgaNbPerTrbSeb( uSubeventId ); uNbActiveFpgas = fMbsUnpackPar->GetActiveTdcNbPerTrbSep( uSubeventId ); fTrbSubeventSize[ fMbsUnpackPar->GetTrbSebIndex( uSubeventId ) ]->Fill( tCurrentSubevent->GetSize()/1000 ); } if( tCurrentSubevent->GetDataError() || (tCurrentSubevent->GetErrBits() != 0x00000001) ) { LOG(WARNING)<GetSize()<<" B"<GetDecoding())<GetTrigNr()>>8)<GetTrigType())<GetTrigNr()&0xff)<GetPaddedSize()-tCurrentSubevent->GetSize() <<" B"<GetNrOfDataWords(); if( 0 == uNbSubsubeventDataWords ) { LOG(WARNING)<Data(uSubsubeventDataIndex); uSubsubeventSource = uSubsubeventData & 0xffff; UInt_t uSubsubeventLength = (uSubsubeventData >> 16) & 0xffff; Bool_t bKnownSubsubevent = fMbsUnpackPar->IsTrbFpgaInData(uSubsubeventSource); UInt_t uMotherBoardId = 0xffff; Bool_t bUnpack = kFALSE; if( bKnownSubsubevent ) { uMotherBoardId = fMbsUnpackPar->GetTrbSebAddrForFpga(uSubsubeventSource); bUnpack = ( -1 < fMbsUnpackPar->GetActiveTrbTdcIndex(uSubsubeventSource) ); } LOG(DEBUG)<>12) ) { uNbSubsubevents++; LOG(DEBUG)<<"====================================="<Data(uSubsubeventDataIndex+1)>>16)&0xff)<IsLogNeeded(DEBUG2)) { for(UInt_t uWord = uSubsubeventDataIndex; uWord <= uSubsubeventDataIndex+uSubsubeventLength; uWord++) { LOG(DEBUG2)<Data(uWord))<GetActiveTrbTdcIndex( uSubsubeventSource ) ]->Fill( uSubsubeventLength ); fTrbTdcProcessStatus[ fMbsUnpackPar->GetActiveTrbTdcIndex( uSubsubeventSource ) ]->Fill( fTrbTdcUnpacker->ProcessData( tCurrentSubevent, uSubsubeventDataIndex ) ); } } else { LOG(DEBUG)<IsLogNeeded(DEBUG2)) { for(UInt_t uWord = uSubsubeventDataIndex; uWord <= uSubsubeventDataIndex+uSubsubeventLength; uWord++) { LOG(DEBUG2)<Data(uWord))<>12) ) { uNbSubsubevents++; LOG(DEBUG)<<"====================================="<Data(uSubsubeventDataIndex))<Data(uHubSubeventDataIndex); UInt_t uHubSubeventSource = uHubSubeventData & 0xffff; UInt_t uHubSubeventLength = (uHubSubeventData >> 16) & 0xffff; Bool_t bKnownHubSubevent = fMbsUnpackPar->IsTrbFpgaInData(uHubSubeventSource); if( bKnownHubSubevent && bKnownSubsubevent ) { uMotherBoardId = fMbsUnpackPar->GetTrbSebAddrForFpga(uHubSubeventSource); bUnpack = ( -1 < fMbsUnpackPar->GetActiveTrbTdcIndex(uHubSubeventSource) ); } LOG(DEBUG)<>12) ) { uNbSubsubevents++; LOG(DEBUG)<<"====================================="<Data(uHubSubeventDataIndex+1)>>16)&0xff)<IsLogNeeded(DEBUG2)) { for(UInt_t uWord = uHubSubeventDataIndex; uWord <= uHubSubeventDataIndex+uHubSubeventLength; uWord++) { LOG(DEBUG2)<Data(uWord))<GetActiveTrbTdcIndex( uHubSubeventSource ) ]->Fill( uHubSubeventLength ); fTrbTdcProcessStatus[ fMbsUnpackPar->GetActiveTrbTdcIndex( uHubSubeventSource ) ]->Fill( fTrbTdcUnpacker->ProcessData( tCurrentSubevent, uHubSubeventDataIndex ) ); } } else { LOG(DEBUG)<IsLogNeeded(DEBUG2)) { for(UInt_t uWord = uHubSubeventDataIndex; uWord <= uHubSubeventDataIndex+uHubSubeventLength; uWord++) { LOG(DEBUG2)<Data(uWord))<>12) ) { uNbSubsubevents++; LOG(DEBUG)<<"====================================="<IsLogNeeded(DEBUG2)) { for(UInt_t uWord = uHubSubeventDataIndex; uWord <= uHubSubeventDataIndex+uHubSubeventLength; uWord++) { LOG(DEBUG2)<Data(uWord))<IsLogNeeded(DEBUG2)) { for(UInt_t uWord = uHubSubeventDataIndex; uWord <= uHubSubeventDataIndex+uHubSubeventLength; uWord++) { LOG(DEBUG2)<Data(uWord))<IsLogNeeded(DEBUG2)) { for(UInt_t uWord = uHubSubeventDataIndex; uWord <= uHubSubeventDataIndex+uHubSubeventLength; uWord++) { LOG(DEBUG2)<Data(uWord))<>12) ) { uNbSubsubevents++; UInt_t uTrigStatus = tCurrentSubevent->Data(uSubsubeventDataIndex+1) & 0xffff; UInt_t uNbInputCh = (tCurrentSubevent->Data(uSubsubeventDataIndex+1) >> 16) & 0xf; UInt_t uNbTrigCh = (tCurrentSubevent->Data(uSubsubeventDataIndex+1) >> 20) & 0x1f; Bool_t bIncludeLastIdle = (tCurrentSubevent->Data(uSubsubeventDataIndex+1) >> 25) & 0x1; Bool_t bIncludeCounters = (tCurrentSubevent->Data(uSubsubeventDataIndex+1) >> 26) & 0x1; Bool_t bIncludeTimestamp = (tCurrentSubevent->Data(uSubsubeventDataIndex+1) >> 27) & 0x1; UInt_t uExtTrigFlag = (tCurrentSubevent->Data(uSubsubeventDataIndex+1) >> 28) & 0x3; Bool_t bIncludeMbsSync = kFALSE; UInt_t uMbsSync = 0xffffff; Bool_t bMbsSyncError = kFALSE; UInt_t uNbCtsWords = uNbInputCh*2 +uNbTrigCh*2 +bIncludeLastIdle*2 +bIncludeCounters*3 +bIncludeTimestamp*1; if( 0x1 == uExtTrigFlag ) { bIncludeMbsSync = kTRUE; uMbsSync = tCurrentSubevent->Data(uSubsubeventDataIndex+2+uNbCtsWords) & 0xffffff; bMbsSyncError = tCurrentSubevent->Data(uSubsubeventDataIndex+2+uNbCtsWords) & 0x80000000; } LOG(DEBUG)<<"====================================="<IsLogNeeded(DEBUG2)) { for(UInt_t uWord = uSubsubeventDataIndex; uWord <= uSubsubeventDataIndex+uSubsubeventLength; uWord++) { LOG(DEBUG2)<Data(uWord))<IsLogNeeded(DEBUG2)) { for(UInt_t uWord = uSubsubeventDataIndex; uWord <= uSubsubeventDataIndex+uSubsubeventLength; uWord++) { LOG(DEBUG2)<Data(uWord))<IsLogNeeded(DEBUG2)) { for(UInt_t uWord = uSubsubeventDataIndex; uWord <= uSubsubeventDataIndex+uSubsubeventLength; uWord++) { LOG(DEBUG2)<Data(uWord))<GetActiveTrbSebNb())<GetRuntimeDb(); fMbsUnpackPar = (TMbsUnpackTofPar *) (rtdb->getContainer("TMbsUnpackTofPar")); if( 0 == fMbsUnpackPar ) return kFALSE; fMbsUnpackPar->printParams(); fuInDataTrbSebNb = fMbsUnpackPar->GetActiveTrbSebNb(); fuActiveTrbTdcNb = fMbsUnpackPar->GetNbActiveBoards( tofMbs::trbtdc ); return kTRUE; } Bool_t TTrbUnpackTof::CreateSubunpackers() { LOG(INFO)<<"**** TTrbUnpackTof: Call CreateSubunpackers()..."<Register( "TofTrbTdc","TofUnpack", fTrbTdcBoardCollection, fMbsUnpackPar->WriteDataInCbmOut() ); return kTRUE; } Bool_t TTrbUnpackTof::ClearOutput() { LOG(DEBUG)<<"**** TTrbUnpackTof: Call ClearOutput()..."<Clear("C"); return kTRUE; } void TTrbUnpackTof::CreateHistograms() { LOG(DEBUG)<<"**** TTrbUnpackTof: Call CreateHistograms()..."<cd(); TH1* hTemp = 0; for( Int_t iTrbSeb = 0; iTrbSeb < fuInDataTrbSebNb; iTrbSeb++ ) { UInt_t uTrbNetAddress = fMbsUnpackPar->GetTrbSebAddr(iTrbSeb); hTemp = new TH1I( Form("tof_trb_size_subevent_%03d", iTrbSeb), Form("data sent by TRB-SEB 0x%0.4x", uTrbNetAddress), 65, 0, 65); fTrbSubeventSize.push_back( hTemp ); } for( Int_t iTrbTdc = 0; iTrbTdc < fuActiveTrbTdcNb; iTrbTdc++) { UInt_t uTrbNetAddress = fMbsUnpackPar->GetActiveTrbTdcAddr(iTrbTdc); hTemp = new TH1I( Form("tof_trb_words_tdc_%03d", iTrbTdc), Form("words sent by TRB-TDC 0x%0.4x", uTrbNetAddress), 800, 0, 800); fTrbTdcWords.push_back( hTemp ); hTemp = new TH1I( Form("tof_trb_process_status_tdc_%03d", iTrbTdc), Form("data processing status of TRB-TDC 0x%0.4x", uTrbNetAddress), trbtdc::process_StatusMessages, 0, trbtdc::process_StatusMessages); fTrbTdcProcessStatus.push_back( hTemp ); } gDirectory->cd( oldir->GetPath() ); } void TTrbUnpackTof::WriteHistograms() { LOG(DEBUG)<<"**** TTrbUnpackTof: Call WriteHistograms()..."<Write(); } for( Int_t iTrbTdc = 0; iTrbTdc < fuActiveTrbTdcNb; iTrbTdc++) { fTrbTdcWords[iTrbTdc]->Write(); fTrbTdcProcessStatus[iTrbTdc]->Write(); } gDirectory->cd( oldir->GetPath() ); tHist->Close(); delete tHist; }