// ------------------------------------------------------------------ // ----- TMbsUnpackTof ----- // ----- Created 05/07/2013 by P.-A. Loizeau ----- // ------------------------------------------------------------------ #include "TMbsUnpackTof.h" // SubEvent ProcId from ROC library #include "commons.h" // General MBS headers #include "TofDef.h" #include "TMbsUnpackTofPar.h" // ToF specific headers #include "TTofScal2014Unpacker.h" #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, roc3587::proc_COSY_Nov11, 1, 9 ), fiVerbosity(0), fMbsUnpackPar(0), fiNbEvents(0), fiFirstEventNumber(0), fiLastEventNumber(0) { } TMbsUnpackTof::TMbsUnpackTof( Int_t verbose ) : FairUnpack( 10, 1, roc3587::proc_COSY_Nov11, 1, 9 ), fiVerbosity(verbose), fMbsUnpackPar(0), fiNbEvents(0), fiFirstEventNumber(0), fiLastEventNumber(0) { } TMbsUnpackTof::TMbsUnpackTof( Int_t type, Int_t subType, Short_t procId, Int_t verbose, Short_t subCrate, Short_t control) : FairUnpack( type, subType, procId, subCrate, control ), fiVerbosity(verbose), fMbsUnpackPar(0), fiNbEvents(0), fiFirstEventNumber(0), fiLastEventNumber(0) { } TMbsUnpackTof::~TMbsUnpackTof() { LOG(INFO)<<"**** TMbsUnpackTof: Delete instance "<GetNbActiveBoards( tofMbs::scaler2014 ) ) delete fScal2014Unp; if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::scalormu ) ) delete fScomUnp; if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::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( 400 < fiNbEvents ) // LOG(ERROR)<<"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( 411 == fiNbEvents ) // cout<<"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 tofMbs::caenV1290: break; case tofMbs::vftx: fVftxUnp->ProcessVFTX( fMbsUnpackPar->GetGlobalToActiveInd( uBoard ), (UInt_t*) iTagPos[uBoard], iTagLen[uBoard]); break; case tofMbs::get4: break; case tofMbs::triglog: break; case tofMbs::scalormu: fScomUnp->ProcessScom( fMbsUnpackPar->GetGlobalToActiveInd( uBoard ), (UInt_t*) iTagPos[uBoard], iTagLen[uBoard]); // Scaler Or Multiplicity break; case tofMbs::scaler2014: fScal2014Unp->ProcessScal2014( fMbsUnpackPar->GetGlobalToActiveInd( uBoard ), (UInt_t*) iTagPos[uBoard], iTagLen[uBoard]); // Scalers 2014 break; case tofMbs::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( tofMbs::scaler2014 ) ) fScal2014Unp->CreateHistos(); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::scalormu ) ) fScomUnp->CreateHistos(); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::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( tofMbs::scaler2014 ) ) fScal2014Unp->FillHistos(); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::scalormu ) ) fScomUnp->FillHistos(); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::vftx ) ) fVftxUnp->FillHistos(); return kTRUE; } void TMbsUnpackTof::WriteHistogramms() { TDirectory * oldir = gDirectory; TFile *fHist; if( 1 == fMbsUnpackPar->GetNbActiveBoards( tofMbs::triglog ) ) fHist = new TFile("./tofMbsUnp.hst.root","UPDATE"); else fHist = new TFile("./tofMbsUnp.hst.root","RECREATE"); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::scaler2014 ) ) fScal2014Unp->WriteHistos( fHist ); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::scalormu ) ) fScomUnp->WriteHistos( fHist ); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::vftx ) ) fVftxUnp->WriteHistos( fHist ); gDirectory->cd( oldir->GetPath() ); fHist->Close(); } void TMbsUnpackTof::DeleteHistograms() { if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::scaler2014 ) ) fScal2014Unp->DeleteHistos(); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::scalormu ) ) fScomUnp->DeleteHistos(); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::vftx ) ) fVftxUnp->DeleteHistos(); } // ------------------------------------------------------------------ Bool_t TMbsUnpackTof::CreateUnpackers() { if( 0 == fMbsUnpackPar->GetNbActiveBoards() ) { LOG(ERROR)<<"TMbsUnpackTof::CreateUnpackers => No active boards => No unpacker !?!?! "<GetNbActiveBoards( tofMbs::scaler2014 ) ) fScal2014Unp = new TTofScal2014Unpacker( fMbsUnpackPar ); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::scalormu ) ) fScomUnp = new TTofScomUnpacker( fMbsUnpackPar ); /* if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::caenV1290 ) ) fV1290Unp = new TTofV1290Unpacker( fMbsUnpackPar ); */ if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::vftx ) ) fVftxUnp = new TTofVftxUnpacker( fMbsUnpackPar ); /* if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::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( tofMbs::triglog ) ) { fScalerBoardCollection = new TClonesArray( "TTofScalerBoard", fMbsUnpackPar->GetNbActiveScalersB()); // fManager->Register("TofRawScalers","TofUnpack",fScalerBoardCollection, kTRUE); fManager->Register( "TofRawScalers","TofUnpack",fScalerBoardCollection, fMbsUnpackPar->WriteDataInCbmOut() || fbSaveScalers ); } // if( 0 < fMbsUnpackPar->GetNbActiveScalersB() ) //TDC // VFTX if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::vftx ) ) { fVftxBoardCollection = new TClonesArray( "TTofVftxBoard", fMbsUnpackPar->GetNbActiveBoards( tofMbs::vftx )); // fManager->Register("TofVftxTdc","TofUnpack",fVftxBoardCollection, kTRUE); fManager->Register( "TofVftxTdc","TofUnpack",fVftxBoardCollection, fMbsUnpackPar->WriteDataInCbmOut() || fbSaveRawVftx ); } // if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::vftx ) ) // Caen v1290 TDC // VFTX // TRB3 return kTRUE; } Bool_t TMbsUnpackTof::ClearOutput() { LOG(DEBUG)<<"Clear MBS"<GetNbActiveScalersB() && 1 != fMbsUnpackPar->GetNbActiveBoards( tofMbs::triglog ) ) fScalerBoardCollection->Clear("C"); if( 0 < fMbsUnpackPar->GetNbActiveBoards( tofMbs::vftx ) ) fVftxBoardCollection->Clear("C"); return kTRUE; } void TMbsUnpackTof::SetSaveScalers( Bool_t bSaveScal ) { fbSaveScalers = bSaveScal; LOG(INFO)<<"TMbsUnpackTof => Enable the saving of raw scaler data in analysis output file" < Enable the saving of raw VFTX data in analysis output file" <