// ------------------------------------------------------------------ // ----- TMbsUnpackTof ----- // ----- Created 05/07/2013 by P.-A. Loizeau ----- // ------------------------------------------------------------------ #include "TMbsUnpackTof.h" // SubEvent ProcId from ROC library #include "commons.h" // General MBS headers #include "TofVmeDef.h" #include "TMbsUnpackTofPar.h" // ToF specific headers #include "TTofScomUnpacker.h" #include "TTofScalerBoard.h" #include "TTofVftxUnpacker.h" #include "TTofVftxBoard.h" #include "TTofTdcBoard.h" // ROOT headers #include "TClonesArray.h" #include "TFile.h" #include "TDatime.h" #include "TROOT.h" #include "TDirectory.h" // FAIR headers #include "FairLogger.h" //#include "FairRootManager.h" #include "FairRunAna.h" #include "FairRuntimeDb.h" TMbsUnpackTof::TMbsUnpackTof() : FairUnpack( 10, 1, roc::proc_COSY_Nov11, 1, 9 ), fiVerbosity(0), fMbsUnpackPar(0), fiNbEvents(0), fiFirstEventNumber(0), fiLastEventNumber(0) { } TMbsUnpackTof::TMbsUnpackTof( Int_t verbose ) : FairUnpack( 10, 1, roc::proc_COSY_Nov11, 1, 9 ), fiVerbosity(verbose), fMbsUnpackPar(0), fiNbEvents(0), fiFirstEventNumber(0), fiLastEventNumber(0) { LOG(INFO)<<"**** TMbsUnpackTof: instance created "<GetNbActiveBoards( tofVme::scalormu ) ) delete fScomUnp; if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::vftx ) ) delete fVftxUnp; } // -------------------------------------------------- // FairUnpack specific functions Bool_t TMbsUnpackTof::Init() { LOG(INFO)<<"**** TMbsUnpackTof: Init Params "<GetBoardsNumber() ]; Int_t iTagLen[ fMbsUnpackPar->GetBoardsNumber() ]; for(Int_t iBoard = 0; iBoard < fMbsUnpackPar->GetBoardsNumber(); iBoard++) { iTagPos[iBoard] = 0; iTagLen[iBoard] = 0; } // for(Int_t iBoard = 0; iBoard < fMbsUnpackPar->GetBoardsNumber(); iBoard++) Int_t iLastTag = -1; if( 11 > fiNbEvents ) LOG(INFO)<<"TMbsUnpackTof::ProcessSubevent => Event "<GetBoardsNumber(); iBoard++ ) if( kTRUE == fMbsUnpackPar->IsActive( iBoard ) ) if ((*plTag == fMbsUnpackPar->GetBoardTag( iBoard )) && (fMbsUnpackPar->GetBoardTag( iBoard )!=0)) { if (iLastTag>=0) { // If a tag was already found: // length of corresponding data is nb words since it was found iTagLen[iLastTag] = pData - iTagPos[iLastTag]; iLastTag = -1; } // if (iLastTag>=0) if (iTagPos[iBoard]==0) { if( 11 > fiNbEvents ) LOG(INFO)<<"Found board "<GetBoardTag( iBoard )>>32, (fMbsUnpackPar->GetBoardTag( iBoard )&0xFFFFFFFF) )<<" at word "< size "< FORMAT ERROR found tag " <GetBoardTag( iBoard )>>32, fMbsUnpackPar->GetBoardTag( iBoard ) )<<" twice in event "<>32, (*plTag)&0xFFFFFFFF )<GetBoardTag( iBoard )) && (fMbsUnpackPar->GetBoardTag( iBoard )!=0)) if( kFALSE == bFound ) pData++; } // for (UInt_t uCurrWord = 0; uCurrWord < uNbWords; ++uCurrWord) // if t east one TAG found: end of corresponding data is end of subevent if (iLastTag>=0) iTagLen[iLastTag] = pData - iTagPos[iLastTag]; // Actually process data in different Unpackers: for( UInt_t uBoard=0; uBoard < fMbsUnpackPar->GetBoardsNumber(); uBoard++ ) if( 0 < iTagPos[uBoard] ) { LOG(DEBUG)<<"TMbsUnpackTof::ProcessSubevent => TAG "<GetBoardType( uBoard )<GetBoardType( uBoard ) ) { case tofVme::caenV1290: break; case tofVme::vftx: fVftxUnp->ProcessVFTX( fMbsUnpackPar->GetGlobalToActiveInd( uBoard ), (UInt_t*) iTagPos[uBoard], iTagLen[uBoard]); break; case tofVme::trb3: break; case tofVme::get4: break; case tofVme::triglog: break; case tofVme::scalormu: fScomUnp->ProcessScom( fMbsUnpackPar->GetGlobalToActiveInd( uBoard ), (UInt_t*) iTagPos[uBoard], iTagLen[uBoard]); // Scaler Or Multiplicity break; case tofVme::undef: default: LOG(WARNING)<<"TMbsUnpackTof::ProcessSubevent => Unknown board type " <GetBoardType( uBoard ) <<"!!!!" <GetBoardType( uBoard ) ) } // if (iTagPos[iBoard]) /* if (iTagPos[VME__ID_1182] && iTagLen[VME__ID_1182]) Process1182(0, iTagPos[VME__ID_1182], iTagLen[VME__ID_1182]); // 1182 if (iTagPos[VME__ID_1183] && iTagLen[VME__ID_1183]) Process1182(1, iTagPos[VME__ID_1183], iTagLen[VME__ID_1183]); // 1183 for (int tdc=VME__ID_TDC1;tdc<=VME__ID_TDC8;tdc++) if (iTagPos[tdc] && iTagLen[tdc]) Process1290(tdc-VME__ID_TDC1, iTagPos[tdc], iTagLen[tdc]); // all TDCs for (int qdc=VME__ID_QDC1;qdc<=VME__ID_QDC2;qdc++) if (iTagPos[qdc] && iTagLen[qdc]) Process965(qdc-VME__ID_QDC1, iTagPos[qdc], iTagLen[qdc]); // all QDCs if (iTagPos[VME__ID_QFW] && iTagLen[VME__ID_QFW]) ProcessQFW((uint32_t*)iTagPos[VME__ID_QFW], iTagLen[VME__ID_QFW]); // QFW */ fiNbEvents++; LOG(DEBUG)<<"MBS unpacked!"<FinishScom(); return kTRUE; } // ------------------------------------------------------------------ Bool_t TMbsUnpackTof::InitParameters() { // Get Base Container FairRun* ana = FairRun::Instance(); FairRuntimeDb* rtdb=ana->GetRuntimeDb(); // Unpacker parameter fMbsUnpackPar = (TMbsUnpackTofPar*) (rtdb->getContainer("TMbsUnpackTofPar")); if( 0 == fMbsUnpackPar ) return kFALSE; // rtdb->initContainers( ana->GetRunId() ); fMbsUnpackPar->printParams(); return kTRUE; } // ------------------------------------------------------------------ Bool_t TMbsUnpackTof::CreateHistogramms() { TDirectory * oldir = gDirectory; // <= To prevent histos from being sucked in by the param file of the TRootManager! gROOT->cd(); // <= To prevent histos from being sucked in by the param file of the TRootManager! if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::scalormu ) ) fScomUnp->CreateHistos(); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::vftx ) ) fVftxUnp->CreateHistos(); gDirectory->cd( oldir->GetPath() ); // <= To prevent histos from being sucked in by the param file of the TRootManager! return kTRUE; } Bool_t TMbsUnpackTof::FillHistograms() { if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::scalormu ) ) fScomUnp->FillHistos(); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::vftx ) ) fVftxUnp->FillHistos(); return kTRUE; } void TMbsUnpackTof::WriteHistogramms() { TDirectory * oldir = gDirectory; TFile *fHist; if( 1 == fMbsUnpackPar->GetNbActiveBoards( tofVme::triglog ) ) fHist = new TFile("./tofMbsUnp.hst.root","UPDATE"); else fHist = new TFile("./tofMbsUnp.hst.root","RECREATE"); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::scalormu ) ) fScomUnp->WriteHistos( fHist ); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::vftx ) ) fVftxUnp->WriteHistos( fHist ); gDirectory->cd( oldir->GetPath() ); fHist->Close(); } void TMbsUnpackTof::DeleteHistograms() { if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::scalormu ) ) fScomUnp->DeleteHistos(); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::vftx ) ) fVftxUnp->DeleteHistos(); } // ------------------------------------------------------------------ Bool_t TMbsUnpackTof::CreateUnpackers() { if( 0 == fMbsUnpackPar->GetNbActiveBoards() ) { LOG(ERROR)<<"TMbsUnpackTof::CreateUnpackers => No active boards => No unpacker !?!?! "<GetNbActiveBoards( tofVme::scalormu ) ) fScomUnp = new TTofScomUnpacker( fMbsUnpackPar ); /* if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::caenV1290 ) ) fV1290Unp = new TTofV1290Unpacker( fMbsUnpackPar ); */ if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::vftx ) ) fVftxUnp = new TTofVftxUnpacker( fMbsUnpackPar ); /* if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::get4 ) ) fGet4Unp = new TTofGet4Unpacker( fMbsUnpackPar ); */ return kTRUE; } Bool_t TMbsUnpackTof::RegisterOutput() { if( 0 == fMbsUnpackPar->GetNbActiveBoards() ) { LOG(ERROR)<<"TMbsUnpackTof::RegisterOutput => No active boards => No output objects !?!?! "<GetNbActiveScalersB() && 1 != fMbsUnpackPar->GetNbActiveBoards( tofVme::triglog ) ) { fScalerBoardCollection = new TClonesArray( "TTofScalerBoard", fMbsUnpackPar->GetNbActiveScalersB()); // fManager->Register("TofRawScalers","TofUnpack",fScalerBoardCollection, kTRUE); fManager->Register( "TofRawScalers","TofUnpack",fScalerBoardCollection, fMbsUnpackPar->WriteDataInCbmOut() ); } // if( 0 < fMbsUnpackPar->GetNbActiveScalersB() ) //TDC // VFTX if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::vftx ) ) { fVftxBoardCollection = new TClonesArray( "TTofVftxBoard", fMbsUnpackPar->GetNbActiveBoards( tofVme::vftx )); // fManager->Register("TofVftxTdc","TofUnpack",fVftxBoardCollection, kTRUE); fManager->Register( "TofVftxTdc","TofUnpack",fVftxBoardCollection, fMbsUnpackPar->WriteDataInCbmOut()); } // if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::vftx ) ) // Caen v1290 TDC // VFTX // TRB3 return kTRUE; } Bool_t TMbsUnpackTof::ClearOutput() { LOG(DEBUG)<<"Clear MBS"<GetNbActiveScalersB() && 1 != fMbsUnpackPar->GetNbActiveBoards( tofVme::triglog ) ) fScalerBoardCollection->Clear("C"); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofVme::vftx ) ) fVftxBoardCollection->Clear("C"); return kTRUE; } // ------------------------------------------------------------------