// ----------------------------------------------------------------------------- // ----- TTofTrbTdcUnpacker source file ----- // ----- ----- // ----- created by C. Simon on 2014-04-03 ----- // ----- ----- // ----- based on TTofVftxUnpacker by P.-A. Loizeau ----- // ----- https://subversion.gsi.de/fairroot/cbmroot/development/ploizeau/ ----- // ----- main/unpack/tof/tdc/vftx/TTofVftxUnpacker.cxx ----- // ----- revision 20754, 2013-07-17 ----- // ----------------------------------------------------------------------------- #include "TTofTrbTdcUnpacker.h" // Parameter header #include "TMbsUnpackTofPar.h" // Output data objects #include "TTofTrbTdcBoard.h" // Defines #include "TofDef.h" #include "TofTdcDef.h" // TDC iterator #include "HadaqTdcIterator.h" // ROOT #include "TClonesArray.h" #include "TH1.h" #include "TROOT.h" // FairRoot #include "FairRootManager.h" #include "FairLogger.h" ClassImp(TTofTrbTdcUnpacker) TTofTrbTdcUnpacker::TTofTrbTdcUnpacker( TMbsUnpackTofPar * parIn ): fParUnpack( parIn ), fuNbActiveTrbTdc( parIn->GetNbActiveBoards( tofMbs::trbtdc ) ), fTrbTdcBoardCollection(0) { LOG(INFO)<<"**** TTofTrbTdcUnpacker: Call TTofTrbTdcUnpacker()..."<GetObject("TofTrbTdc"); if(0 == fTrbTdcBoardCollection) { LOG(WARNING)<<"TTofTrbTdcUnpacker::TTofTrbTdcUnpacker : no TOF TRB-TDC array! "<Data(uTdcDataIndex); UInt_t uTdcAddress = uTdcData & 0xffff; UInt_t uNbTdcDataWords = (uTdcData >> 16) & 0xffff; Int_t iTdcBoardIndex = fParUnpack->GetActiveTrbTdcIndex( uTdcAddress ); TTofTrbTdcBoard* tTrbTdcBoard = (TTofTrbTdcBoard*) fTrbTdcBoardCollection->ConstructedAt( iTdcBoardIndex ); UInt_t uTdcWordCount = 0; hadaq::TdcIterator tTrbTdcIterator = hadaq::TdcIterator(); tTrbTdcIterator.assign(tSubevent, uTdcDataIndex+1, uNbTdcDataWords); hadaq::TdcMessage& tTrbTdcMessage = tTrbTdcIterator.msg(); Bool_t bPreviousIsEpoch = kFALSE; UInt_t uPreviousChannel = 0; while ( tTrbTdcIterator.next() ) { uTdcWordCount++; if( 1 == uTdcWordCount ) { if ( tTrbTdcMessage.isHeaderMsg() ) { tTrbTdcBoard->SetTriggerCode(tTrbTdcMessage.getHeaderTrig()); if( tTrbTdcMessage.getHeaderErr() ) { tTrbTdcBoard->SetChannelFifoIssue(); } } else { LOG(ERROR)<= tTrbTdcMessage.getTimeTmFine() ) { ( tTrbTdcBoard->GetRefChannelData() ).SetData( tTrbTdcMessage.getTimeChannel(), tTrbTdcMessage.getTimeTmFine(), ( UInt_t )( tTrbTdcIterator.getMsgStamp() & ( trbtdc::kiCoarseCounterSize-1 ) ), 0, tTrbTdcMessage.getTimeEdge() ); ( tTrbTdcBoard->GetRefChannelData() ).SetEpoch( tTrbTdcIterator.getCurEpoch() ); ( tTrbTdcBoard->GetRefChannelData() ).SetFullCoarseTime( tTrbTdcIterator.getMsgStamp() ); tTrbTdcBoard->SetTriggerTime( ( tTrbTdcBoard->GetRefChannelData() ).GetCoarseTime() ); } else { LOG(ERROR)<GetChannelNb() < uChNumber ) ) { LOG(ERROR)<AddData( tValidHit ); continue; } break; } case trbtdc::message_Epoch: LOG(DEBUG3)<GetChannelNb() < uChNumber ) ) { LOG(ERROR)<AddData( tValidHit ); continue; } break; } case trbtdc::message_Epoch: bPreviousIsEpoch = kTRUE; continue; break; default: continue; break; } } } tTrbTdcBoard->SortData(); LOG(DEBUG)<cd(); // <= To prevent histos from being sucked in by the param file of the TRootManager ! TH1* hTemp = 0; fTrbTdcChannelFineTime.resize( fuNbActiveTrbTdc ); fTrbTdcChannelCoarseTime.resize( fuNbActiveTrbTdc ); for( Int_t iBoardIndex = 0; iBoardIndex < fuNbActiveTrbTdc; iBoardIndex++) { UInt_t uTrbNetAddress = fParUnpack->GetActiveTrbTdcAddr(iBoardIndex); // Board specific histograms hTemp = new TH1I( Form("tof_%s_ch_occ_%03d", toftdc::ksTdcHistName[ toftdc::trb ].Data(), iBoardIndex), Form("Channel occupancy in TRB-TDC #%03d (0x%0.4x)", iBoardIndex, uTrbNetAddress), trbtdc::kuNbChan+1, 0.0, trbtdc::kuNbChan+1 ); fTrbTdcChannelOccupancy.push_back( hTemp ); hTemp = new TH1I( Form("tof_%s_ch_highft_%03d", toftdc::ksTdcHistName[ toftdc::trb ].Data(), iBoardIndex), Form("Fine time overshoot in TRB-TDC #%03d (0x%0.4x)", iBoardIndex, uTrbNetAddress), trbtdc::kuNbChan+1, 0.0, trbtdc::kuNbChan+1 ); fTrbTdcChannelFineTimeOvershoot.push_back( hTemp ); hTemp = new TH1I( Form("tof_%s_ch_unproc_%03d", toftdc::ksTdcHistName[ toftdc::trb ].Data(), iBoardIndex), Form("Unprocessed hits in TRB-TDC #%03d (0x%0.4x)", iBoardIndex, uTrbNetAddress), trbtdc::kuNbChan+1, 0.0, trbtdc::kuNbChan+1 ); fTrbTdcChannelUnprocessedHits.push_back( hTemp ); // Reference Channel specific histograms hTemp = new TH1I( Form("tof_%s_ft_b%03d_ref", toftdc::ksTdcHistName[ toftdc::trb ].Data(), iBoardIndex), Form("Counts per fine-time bin for reference channel on TRB-TDC #%03d (0x%0.4x)", iBoardIndex, uTrbNetAddress), trbtdc::kiFineCounterSize, -0.5, trbtdc::kiFineCounterSize - 0.5 ); (fTrbTdcChannelFineTime[iBoardIndex]).push_back( hTemp ); hTemp = new TH1I( Form("tof_%s_ct_b%03d_ref", toftdc::ksTdcHistName[ toftdc::trb ].Data(), iBoardIndex), Form("Counts per coarse-time bin for reference channel on TRB-TDC #%03d (0x%0.4x)", iBoardIndex, uTrbNetAddress), trbtdc::kiCoarseCounterSize/1024/512, -0.5, trbtdc::kiCoarseCounterSize/1024/512 - 0.5 ); // TODO: remove hard coding (fTrbTdcChannelCoarseTime[iBoardIndex]).push_back( hTemp ); for( Int_t iChannelIndex = 0; iChannelIndex < trbtdc::kuNbChan; iChannelIndex++) { // Channel specific histograms hTemp = new TH1I( Form("tof_%s_ft_b%03d_ch%03d", toftdc::ksTdcHistName[ toftdc::trb ].Data(), iBoardIndex, iChannelIndex), Form("Counts per fine-time bin for channel %3d on TRB-TDC #%03d (0x%0.4x)", iChannelIndex, iBoardIndex, uTrbNetAddress), trbtdc::kiFineCounterSize, -0.5, trbtdc::kiFineCounterSize - 0.5 ); (fTrbTdcChannelFineTime[iBoardIndex]).push_back( hTemp ); hTemp = new TH1I( Form("tof_%s_ct_b%03d_ch%03d", toftdc::ksTdcHistName[ toftdc::trb ].Data(), iBoardIndex, iChannelIndex), Form("Counts per coarse-time bin for channel %3d on TRB-TDC #%03d (0x%0.4x)", iChannelIndex, iBoardIndex, uTrbNetAddress), trbtdc::kiCoarseCounterSize/1024/512, -0.5, trbtdc::kiCoarseCounterSize/1024/512 - 0.5 ); // TODO: remove hard coding (fTrbTdcChannelCoarseTime[iBoardIndex]).push_back( hTemp ); } } gDirectory->cd( oldir->GetPath() ); // <= To prevent histos from being sucked in by the param file of the TRootManager! } void TTofTrbTdcUnpacker::FillHistos() { LOG(DEBUG)<<"**** TTofTrbTdcUnpacker: Call FillHistos()..."<GetActiveTrbTdcAddr(iBoardIndex); tTrbTdcBoard = (TTofTrbTdcBoard*) fTrbTdcBoardCollection->ConstructedAt(iBoardIndex); // Loop over regular channels for( Int_t iDataIndex = 0; iDataIndex < tTrbTdcBoard->GetDataNb() ; iDataIndex++ ) { TTofTrbTdcData data = tTrbTdcBoard->GetData( iDataIndex ); TString sTemp = Form( " TTofTrbTdcUnpacker::FillHistos: Addr 0x%0.4x Board #%03d Data #%04d Chan %3d CT %7d FT %7d", uTrbNetAddress, iBoardIndex, iDataIndex, data.GetChannel()+1, data.GetCoarseTime(), data.GetFineTime() ); LOG(DEBUG2)<Fill( data.GetChannel() + 1 ); if( trbtdc::time_FineTimeBitMask == data.GetFineTime() ) { fTrbTdcChannelUnprocessedHits[iBoardIndex]->Fill( data.GetChannel() + 1 ); } if( trbtdc::kuHighestReasonableFineTimeBin < data.GetFineTime() ) { fTrbTdcChannelFineTimeOvershoot[iBoardIndex]->Fill( data.GetChannel() + 1 ); } fTrbTdcChannelFineTime[iBoardIndex][ data.GetChannel() +1 ]->Fill( data.GetFineTime() ); fTrbTdcChannelCoarseTime[iBoardIndex][ data.GetChannel() +1 ]->Fill( data.GetCoarseTime()%2048 ); } // Consider the respective reference channel fTrbTdcChannelOccupancy[iBoardIndex]->Fill(0); if( trbtdc::time_FineTimeBitMask == ( tTrbTdcBoard->GetRefChannelData() ).GetFineTime() ) { fTrbTdcChannelUnprocessedHits[iBoardIndex]->Fill(0); } if( trbtdc::kuHighestReasonableFineTimeBin < ( tTrbTdcBoard->GetRefChannelData() ).GetFineTime() ) { fTrbTdcChannelFineTimeOvershoot[iBoardIndex]->Fill(0); } fTrbTdcChannelFineTime[iBoardIndex][0]->Fill( ( tTrbTdcBoard->GetRefChannelData() ).GetFineTime() ); fTrbTdcChannelCoarseTime[iBoardIndex][0]->Fill( ( tTrbTdcBoard->GetRefChannelData() ).GetCoarseTime()%2048 ); } } void TTofTrbTdcUnpacker::WriteHistos( TDirectory* inDir) { LOG(INFO)<<"**** TTofTrbTdcUnpacker: Call WriteHistos()..."<mkdir( Form( "Unp_%s_%03d", toftdc::ksTdcHistName[ toftdc::trb ].Data(), iBoardIndex) ); cdTrbTdcUnp[iBoardIndex]->cd(); // make the "Unp..." directory the current directory fTrbTdcChannelOccupancy[iBoardIndex]->Write(); fTrbTdcChannelFineTimeOvershoot[iBoardIndex]->Write(); fTrbTdcChannelUnprocessedHits[iBoardIndex]->Write(); for( Int_t iChannelIndex = 0; iChannelIndex <= trbtdc::kuNbChan; iChannelIndex++) { fTrbTdcChannelFineTime[iBoardIndex][iChannelIndex]->Write(); fTrbTdcChannelCoarseTime[iBoardIndex][iChannelIndex]->Write(); } } } void TTofTrbTdcUnpacker::DeleteHistos() { LOG(INFO)<<"**** TTofTrbTdcUnpacker: Call DeleteHistos()..."<