diff --git a/macro/run/run_reco.C b/macro/run/run_reco.C index 2fb2490c557afa704d4d15ea4bf345107f6bc2fb..5fb13de91be96a717f5f458905d685d236b2343e 100644 --- a/macro/run/run_reco.C +++ b/macro/run/run_reco.C @@ -221,9 +221,6 @@ void run_reco(TString input = "", Int_t nTimeSlices = -1, Int_t firstTimeSlice = << "building using ``Real2019'' option. Terminating macro." << std::endl; return; } - // Remove STS as it will be our reference - evBuildRaw->RemoveDetector(kEventBuilderDetSts); - // Set STS as reference detector evBuildRaw->SetReferenceDetector(kEventBuilderDetSts); evBuildRaw->SetTsParameters(0.0, 1.e7, 0.0); @@ -256,9 +253,6 @@ void run_reco(TString input = "", Int_t nTimeSlices = -1, Int_t firstTimeSlice = << "building using ``Real2019'' option. Terminating macro." << std::endl; return; } - // Remove STS as it will be our reference - evBuildRaw->RemoveDetector(kRawEventBuilderDetSts); - // Set STS as reference detector evBuildRaw->SetReferenceDetector(kRawEventBuilderDetSts); evBuildRaw->SetTsParameters(0.0, 1.e7, 0.0); diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx index a8dc141b4f6d15c54581d482666e3099fba750e2..6d052c64dc234094aca7954b2c24cc0ecaa449cb 100644 --- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx +++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx @@ -31,15 +31,6 @@ #include "TH2.h" #include "THttpServer.h" -/// C/C++ headers - -// ---- Default constructor -------------------------------------------- -CbmAlgoBuildRawEvents::CbmAlgoBuildRawEvents() {} - -// ---- Destructor ----------------------------------------------------- -CbmAlgoBuildRawEvents::~CbmAlgoBuildRawEvents() {} - -// ---- Init ----------------------------------------------------------- Bool_t CbmAlgoBuildRawEvents::InitAlgo() { LOG(info) << "CbmAlgoBuildRawEvents::InitAlgo => Starting sequence"; @@ -48,16 +39,14 @@ Bool_t CbmAlgoBuildRawEvents::InitAlgo() FairRootManager* ioman = FairRootManager::Instance(); /// Check if reference detector data are available - if (kFALSE == CheckDataAvailable(fRefDet)) { - LOG(fatal) << "No digi input for reference detector, stopping there!"; - } // if( kFALSE == CheckDataAvailable( fRefDet ) ) + if (kFALSE == CheckDataAvailable(fRefDet)) { LOG(fatal) << "No digi input for reference detector, stopping there!"; } /// Check if data for detectors in selection list are available for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { if (kFALSE == CheckDataAvailable(*det)) { LOG(fatal) << "No digi input for one of selection detector, stopping there!"; - } // if( kFALSE == CheckDataAvailable( *det ) ) - } // for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) + } + } /// Access the TS metadata to know TS start time if needed if (fdTsStartTime < 0 || fdTsLength < 0 || fdTsOverLength < 0) { @@ -68,23 +57,19 @@ Bool_t CbmAlgoBuildRawEvents::InitAlgo() "present!" << std::endl << "source->SetWriteOutputFlag(kTRUE); // For writing TS metadata"; - } // if (!fTimeSliceMetaDataArray) - } // if ( fdTsStartTime < 0 || fdTsLength < 0 || fdTsOverLength < 0 ) - - if (fbFillHistos) { CreateHistograms(); } // if( fbFillHistos ) + } + } + if (fbFillHistos) { CreateHistograms(); } LOG(info) << "CbmAlgoBuildRawEvents::InitAlgo => Done"; - return kTRUE; } -// ---- ProcessTs ------------------------------------------------------ void CbmAlgoBuildRawEvents::ProcessTs() { LOG_IF(info, fuNrTs % 1000 == 0) << "Begin of TS " << fuNrTs; - InitTs(); - + InitSeedWindow(); BuildEvents(); /// Store last event with trigger if not done by other seed @@ -97,14 +82,13 @@ void CbmAlgoBuildRawEvents::ProcessTs() /// Prevent building over TS edge fCurrentEvent = nullptr; - } // if( nullptr != fCurrentEvent ) + } LOG(debug) << "Found " << fEventVector.size() << " triggered events"; - - if (fbFillHistos) { FillHistos(); } // if( fbFillHistos ) - + if (fbFillHistos) { FillHistos(); } fuNrTs++; } + void CbmAlgoBuildRawEvents::ClearEventVector() { /// Need to delete the object the pointer points to first @@ -113,17 +97,14 @@ void CbmAlgoBuildRawEvents::ClearEventVector() LOG(debug) << "Event " << counter << " has " << event->GetNofData() << " digis"; delete event; counter++; - } // for( CbmEvent* event: fEventVector) - + } fEventVector.clear(); } -// ---- Finish --------------------------------------------------------- + void CbmAlgoBuildRawEvents::Finish() { LOG(info) << "Total errors: " << fuErrors; } -// --------------------------------------------------------------------- Bool_t CbmAlgoBuildRawEvents::CheckDataAvailable(RawEventBuilderDetector& det) { - if (ECbmModuleId::kT0 == det.detId) { if (!fT0DigiVec) { LOG(info) << "No T0 digi input found."; @@ -168,7 +149,7 @@ Bool_t CbmAlgoBuildRawEvents::CheckDataAvailable(RawEventBuilderDetector& det) } return kTRUE; } -// --------------------------------------------------------------------- + void CbmAlgoBuildRawEvents::InitTs() { /// Reset TS based variables (analysis per TS = no building over the border) @@ -179,7 +160,45 @@ void CbmAlgoBuildRawEvents::InitTs() for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { (*det).fuStartIndex = 0; (*det).fuEndIndex = 0; - } // for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) + } +} + +void CbmAlgoBuildRawEvents::InitSeedWindow() +{ + /// Access the TS metadata if needed to know TS start time and overlap size + Double_t dTsStartTime = fdTsStartTime; + Double_t dOverlapStart = fdTsStartTime + fdTsLength; + Double_t dOverlapSize = fdTsOverLength; + + if (fdTsStartTime < 0 || fdTsLength < 0 || fdTsOverLength < 0) { + pTsMetaData = dynamic_cast<TimesliceMetaData*>(fTimeSliceMetaDataArray->At(0)); + if (nullptr == pTsMetaData) + LOG(fatal) << Form("CbmAlgoBuildRawEvents::LoopOnSeeds => " + "No TS metadata found for TS %6u.", + fuNrTs); + dTsStartTime = pTsMetaData->GetStartTime(); + dOverlapStart = pTsMetaData->GetOverlapStartTime(); + dOverlapSize = pTsMetaData->GetOverlapDuration(); + } + + /// Print warning in first TS if time window borders out of potential overlap + if ((0.0 < fdEarliestTimeWinBeg && dOverlapSize < fdLatestTimeWinEnd) || (dOverlapSize < fdWidestTimeWinRange)) { + LOG(warning) << "CbmAlgoBuildRawEvents::LoopOnSeeds => " + << Form("Event window not fitting in TS overlap, risk of " + "incomplete events: %f %f %f %f", + fdEarliestTimeWinBeg, fdLatestTimeWinEnd, fdWidestTimeWinRange, dOverlapSize); + } // if end of event window does not fit in overlap for a seed at edge of TS core + + /// Define an acceptance window for the seeds in order to use the overlap + /// part of the TS to avoid incomplete events + if (fbIgnoreTsOverlap) { + fdSeedWindowBeg = dTsStartTime; + fdSeedWindowEnd = dOverlapStart; + } + else { + fdSeedWindowBeg = dTsStartTime + (0.0 < fdEarliestTimeWinBeg ? 0.0 : -fdEarliestTimeWinBeg); + fdSeedWindowEnd = dOverlapStart + (0.0 < fdEarliestTimeWinBeg ? 0.0 : -fdEarliestTimeWinBeg); + } } void CbmAlgoBuildRawEvents::BuildEvents() @@ -189,40 +208,40 @@ void CbmAlgoBuildRawEvents::BuildEvents() case ECbmModuleId::kSts: { LoopOnSeeds<CbmStsDigi>(); break; - } // case ECbmModuleId::kSts: + } case ECbmModuleId::kMuch: { - if (fbUseMuchBeamtimeDigi) { LoopOnSeeds<CbmMuchBeamTimeDigi>(); } // if (fbUseMuchBeamtimeDigi) + if (fbUseMuchBeamtimeDigi) { LoopOnSeeds<CbmMuchBeamTimeDigi>(); } else { LoopOnSeeds<CbmMuchDigi>(); - } // else of if (fbUseMuchBeamtimeDigi) + } break; - } // case ECbmModuleId::kMuch: + } case ECbmModuleId::kTrd: { LoopOnSeeds<CbmTrdDigi>(); break; - } // case ECbmModuleId::kTrd: + } case ECbmModuleId::kTof: { LoopOnSeeds<CbmTofDigi>(); break; - } // case ECbmModuleId::kTof: + } case ECbmModuleId::kRich: { LoopOnSeeds<CbmRichDigi>(); break; - } // case ECbmModuleId::kRich: + } case ECbmModuleId::kPsd: { LoopOnSeeds<CbmPsdDigi>(); break; - } // case ECbmModuleId::kPsd: + } case ECbmModuleId::kT0: { LoopOnSeeds<CbmTofDigi>(); break; - } // case ECbmModuleId::kT0: + } default: { LOG(fatal) << "CbmAlgoBuildRawEvents::BuildEvents => " << "Trying to search event seeds with unsupported det: " << fRefDet.sName; break; - } // default: - } // switch( *det ) + } + } // switch( *det ) } UInt_t CbmAlgoBuildRawEvents::GetNofDigis(ECbmModuleId detId) @@ -334,78 +353,33 @@ const CbmPsdDigi* CbmAlgoBuildRawEvents::GetDigi(UInt_t uDigi) template<class DigiSeed> void CbmAlgoBuildRawEvents::LoopOnSeeds() { - /// Access the TS metadata if needed to know TS start time and overlap size - Double_t dTsStartTime = fdTsStartTime; - Double_t dOverlapStart = fdTsStartTime + fdTsLength; - Double_t dOverlapSize = fdTsOverLength; - if (fdTsStartTime < 0 || fdTsLength < 0 || fdTsOverLength < 0) { - pTsMetaData = dynamic_cast<TimesliceMetaData*>(fTimeSliceMetaDataArray->At(0)); - if (nullptr == pTsMetaData) - LOG(fatal) << Form("CbmAlgoBuildRawEvents::LoopOnSeeds => " - "No TS metadata found for TS %6u.", - fuNrTs); - - dTsStartTime = pTsMetaData->GetStartTime(); - dOverlapStart = pTsMetaData->GetOverlapStartTime(); - dOverlapSize = pTsMetaData->GetOverlapDuration(); - } // if ( fdTsStartTime < 0 || fdTsLength < 0 || fdTsOverLength < 0 ) - - /// Print warning in first TS if time window borders out of potential overlap - if ((0.0 < fdEarliestTimeWinBeg && dOverlapSize < fdLatestTimeWinEnd) || (dOverlapSize < fdWidestTimeWinRange)) { - LOG(warning) << "CbmAlgoBuildRawEvents::LoopOnSeeds => " - << Form("Event window not fitting in TS overlap, risk of " - "incomplete events: %f %f %f %f", - fdEarliestTimeWinBeg, fdLatestTimeWinEnd, fdWidestTimeWinRange, dOverlapSize); - } // if end of event window does not fit in overlap for a seed at edge of TS core - - /// Define an acceptance window for the seeds in order to use the overlap - /// part of the TS to avoid incomplete events - Double_t dSeedWindowBeg = dTsStartTime + (0.0 < fdEarliestTimeWinBeg ? 0.0 : -fdEarliestTimeWinBeg); - Double_t dSeedWindowEnd = dOverlapStart + (0.0 < fdEarliestTimeWinBeg ? 0.0 : -fdEarliestTimeWinBeg); - if (fbIgnoreTsOverlap) { - dSeedWindowBeg = dTsStartTime; - dSeedWindowEnd = dOverlapStart; - } // if( fbIgnoreTsOverlap ) - if (ECbmModuleId::kT0 == fRefDet.detId) { - if (fT0DigiVec) { - /// Loop on size of vector - UInt_t uNbRefDigis = fT0DigiVec->size(); - /// Loop on size of vector - for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) { - LOG(debug) << Form("Checking seed %6u / %6u", uDigi, uNbRefDigis); - - Double_t dTime = fT0DigiVec->at(uDigi).GetTime(); - - /// Check Seed and build event if needed - CheckSeed(dTime, uDigi); - } // for( UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi ) - } // if ( fT0DigiVec ) - else - LOG(fatal) << "CbmAlgoBuildRawEvents::LoopOnSeeds => " - << "T0 as reference detector but vector not found!"; - } // if (ECbmModuleId::kT0 == fRefDet.detId) + const UInt_t uNbRefDigis = fT0DigiVec->size(); + /// Loop on size of vector + for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) { + LOG(debug) << Form("Checking seed %6u / %6u", uDigi, uNbRefDigis); + Double_t dTime = fT0DigiVec->at(uDigi).GetTime(); + /// Check Seed and build event if needed + CheckSeed(dTime, uDigi); + } + } else { - UInt_t uNbRefDigis = (0 < GetNofDigis(fRefDet.detId) ? GetNofDigis(fRefDet.detId) : 0); + const UInt_t uNbRefDigis = (0 < GetNofDigis(fRefDet.detId) ? GetNofDigis(fRefDet.detId) : 0); /// Loop on size of vector for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) { LOG(debug) << Form("Checking seed %6u / %6u", uDigi, uNbRefDigis); const DigiSeed* pDigi = GetDigi<DigiSeed>(uDigi); - /// Check that _entry is not out of range - if (nullptr != pDigi) { - Double_t dTime = pDigi->GetTime(); - - /// Check if seed in acceptance window - if (dTime < dSeedWindowBeg) { continue; } // if( dTime < dSeedWindowBeg ) - else if (dSeedWindowEnd < dTime) { - break; - } // else if( dSeedWindowEnd < dTime ) - - /// Check Seed and build event if needed - CheckSeed(dTime, uDigi); - } // if( nullptr != pDigi ) - } // for( UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi ) - } // else of if (ECbmModuleId::kT0 == fRefDet.detId) => Digi containers controlled by DigiManager + const Double_t dTime = pDigi->GetTime(); + + /// Check if seed in acceptance window + if (dTime < fdSeedWindowBeg) { continue; } + else if (fdSeedWindowEnd < dTime) { + break; + } + /// Check Seed and build event if needed + CheckSeed(dTime, uDigi); + } + } } void CbmAlgoBuildRawEvents::CheckSeed(Double_t dSeedTime, UInt_t uSeedDigiIdx) @@ -422,20 +396,20 @@ void CbmAlgoBuildRawEvents::CheckSeed(Double_t dSeedTime, UInt_t uSeedDigiIdx) LOG(debug1) << "Reject seed due to overlap"; return; break; - } // case EOverlapModeRaw::NoOverlap: + } case EOverlapModeRaw::MergeOverlap: { /// Merge overlap mode => do nothing and go on filling current event break; - } // case EOverlapModeRaw::MergeOverlap: + } case EOverlapModeRaw::AllowOverlap: { /// In allow overlap mode => reject only if reference det is in overlap /// to avoid cloning events due to single seed cluster LOG(debug1) << "Reject seed because part of cluster of previous one"; return; break; - } // case EOverlapModeRaw::AllowOverlap: - } // switch( fOverMode ) - } // if( prev Event exists and mode forbiden overlap present ) + } + } + } // if( prev Event exists and mode forbiden overlap present ) else { /// Out of overlap range or in overlap allowed mode /// => store previous event if not empty and create new one @@ -445,129 +419,70 @@ void CbmAlgoBuildRawEvents::CheckSeed(Double_t dSeedTime, UInt_t uSeedDigiIdx) fCurrentEvent->SetEndTime(fdPrevEvtEndTime); fEventVector.push_back(fCurrentEvent); fuCurEv++; - } // if( nullptr != fCurrentEvent ) + } fCurrentEvent = new CbmEvent(fuCurEv, dSeedTime, 0.); } // else of if( prev Event exists and mode forbiden overlap present ) /// If window open for reference detector, search for other reference Digis matching it /// Otherwise only add the current seed if (fRefDet.fdTimeWinBeg < fRefDet.fdTimeWinEnd) { - switch (fRefDet.detId) { - case ECbmModuleId::kSts: { - SearchMatches<CbmStsDigi>(dSeedTime, fRefDet); - break; - } // case ECbmModuleId::kSts: - case ECbmModuleId::kMuch: { - if (fbUseMuchBeamtimeDigi) { - SearchMatches<CbmMuchBeamTimeDigi>(dSeedTime, fRefDet); - } // if (fbUseMuchBeamtimeDigi) - else { - SearchMatches<CbmMuchDigi>(dSeedTime, fRefDet); - } // else of if (fbUseMuchBeamtimeDigi) - break; - } // case ECbmModuleId::kMuch: - case ECbmModuleId::kTrd: { - SearchMatches<CbmTrdDigi>(dSeedTime, fRefDet); - break; - } // case ECbmModuleId::kTrd: - case ECbmModuleId::kTof: { - SearchMatches<CbmTofDigi>(dSeedTime, fRefDet); - break; - } // case ECbmModuleId::kTof: - case ECbmModuleId::kRich: { - SearchMatches<CbmRichDigi>(dSeedTime, fRefDet); - break; - } // case ECbmModuleId::kRich: - case ECbmModuleId::kPsd: { - SearchMatches<CbmPsdDigi>(dSeedTime, fRefDet); - break; - } // case ECbmModuleId::kPsd: - case ECbmModuleId::kT0: { - SearchMatches<CbmTofDigi>(dSeedTime, fRefDet); - break; - } // case ECbmModuleId::kT0: - default: { - LOG(fatal) << "CbmAlgoBuildRawEvents::LoopOnSeeds => " - << "Trying to search matches with unsupported det: " << fRefDet.sName << std::endl - << "You may want to add support for it in the method."; - break; - } // default: - } // switch( fRefDet ) - + SearchMatches(dSeedTime, fRefDet); /// Also add the seed if the window starts after the seed if (0 < fRefDet.fdTimeWinBeg) AddDigiToEvent(fRefDet, uSeedDigiIdx); - } // if( fdRefTimeWinBeg < fdRefTimeWinEnd ) + } else { AddDigiToEvent(fRefDet, uSeedDigiIdx); - } // else of if( fdRefTimeWinBeg < fdRefTimeWinEnd ) + } /// Search for matches for each detector in selection list for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { - switch ((*det).detId) { - case ECbmModuleId::kSts: { - SearchMatches<CbmStsDigi>(dSeedTime, *det); - break; - } // case ECbmModuleId::kSts: - case ECbmModuleId::kMuch: { - if (fbUseMuchBeamtimeDigi) { - SearchMatches<CbmMuchBeamTimeDigi>(dSeedTime, *det); - } // if (fbUseMuchBeamtimeDigi) - else { - SearchMatches<CbmMuchDigi>(dSeedTime, *det); - } // else of if (fbUseMuchBeamtimeDigi) - break; - } // case ECbmModuleId::kMuch: - case ECbmModuleId::kTrd: { - SearchMatches<CbmTrdDigi>(dSeedTime, *det); - break; - } // case ECbmModuleId::kTrd: - case ECbmModuleId::kTof: { - SearchMatches<CbmTofDigi>(dSeedTime, *det); - break; - } // case ECbmModuleId::kTof: - case ECbmModuleId::kRich: { - SearchMatches<CbmRichDigi>(dSeedTime, *det); - break; - } // case ECbmModuleId::kRich: - case ECbmModuleId::kPsd: { - SearchMatches<CbmPsdDigi>(dSeedTime, *det); - break; - } // case ECbmModuleId::kPsd: - case ECbmModuleId::kT0: { - SearchMatches<CbmTofDigi>(dSeedTime, *det); - break; - } // case ECbmModuleId::kT0: - default: { - LOG(fatal) << "CbmAlgoBuildRawEvents::LoopOnSeeds => " - << "Trying to search matches with unsupported det: " << (*det).sName << std::endl - << "You may want to add support for it in the method."; - break; - } // default: - } // switch( *det ) - } // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) - - /// Check if event is filling trigger conditions and clear it if not - if (HasTrigger(fCurrentEvent)) { - fdPrevEvtTime = dSeedTime; - - /// In case of NoOverlap or MergeOverlap, we can and should start checking the next window - /// from end of current window in order to save CPU and avoid duplicating - if (EOverlapModeRaw::NoOverlap == fOverMode || EOverlapModeRaw::MergeOverlap == fOverMode) { + SearchMatches(dSeedTime, *det); + } - /// Update reference detector - fRefDet.fuStartIndex = fRefDet.fuEndIndex; + CheckTriggerCondition(dSeedTime); +} - /// Loop on selection detectors - for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { - (*det).fuStartIndex = (*det).fuEndIndex; - } // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) - } // If no overlap or merge overlap - } // if( !HasTrigger( fCurrentEvent ) ) - else { - LOG(debug1) << "Reject seed due to Trigger requirements"; - delete fCurrentEvent; - fCurrentEvent = nullptr; /// delete does NOT set a pointer to nullptr... - } // else of if( !HasTrigger( fCurrentEvent ) ) +void CbmAlgoBuildRawEvents::SearchMatches(Double_t dSeedTime, RawEventBuilderDetector& detMatch) +{ + switch (detMatch.detId) { + case ECbmModuleId::kSts: { + SearchMatches<CbmStsDigi>(dSeedTime, detMatch); + break; + } + case ECbmModuleId::kMuch: { + if (fbUseMuchBeamtimeDigi) { SearchMatches<CbmMuchBeamTimeDigi>(dSeedTime, detMatch); } + else { + SearchMatches<CbmMuchDigi>(dSeedTime, detMatch); + } + break; + } + case ECbmModuleId::kTrd: { + SearchMatches<CbmTrdDigi>(dSeedTime, detMatch); + break; + } + case ECbmModuleId::kTof: { + SearchMatches<CbmTofDigi>(dSeedTime, detMatch); + break; + } + case ECbmModuleId::kRich: { + SearchMatches<CbmRichDigi>(dSeedTime, detMatch); + break; + } + case ECbmModuleId::kPsd: { + SearchMatches<CbmPsdDigi>(dSeedTime, detMatch); + break; + } + case ECbmModuleId::kT0: { + SearchMatches<CbmTofDigi>(dSeedTime, detMatch); + break; + } + default: { + LOG(fatal) << "CbmAlgoBuildRawEvents::LoopOnSeeds => " + << "Trying to search matches with unsupported det: " << detMatch.sName << std::endl + << "You may want to add support for it in the method."; + break; + } + } } template<class DigiCheck> @@ -579,78 +494,87 @@ void CbmAlgoBuildRawEvents::SearchMatches(Double_t dSeedTime, RawEventBuilderDet /// Check the Digis until out of window if (ECbmModuleId::kT0 == detMatch.detId) { - if (fT0DigiVec) { - /// Loop on size of vector - UInt_t uNbSelDigis = fT0DigiVec->size(); - /// Loop on size of vector - for (UInt_t uDigi = detMatch.fuStartIndex; uDigi < uNbSelDigis; ++uDigi) { - Double_t dTime = fT0DigiVec->at(uDigi).GetTime(); - - Double_t dTimeDiff = dTime - dSeedTime; - - /// Check if within time window, update start/stop indices if needed - if (dTimeDiff < detMatch.fdTimeWinBeg) { - ++uLocalIndexStart; - continue; - } // if( dTimeDiff < detMatch.fdTimeWinBeg ) - else if (detMatch.fdTimeWinEnd < dTimeDiff) { - /// Store as end the first digi out of window to avoid double counting in case of - /// merged overlap event mode - uLocalIndexEnd = uDigi; - break; - } // else if( detMatch.fdTimeWinEnd < dTimeDiff ) of if( dTimeDiff < detMatch.fdTimeWinBeg ) - - AddDigiToEvent(detMatch, uDigi); - - if (fdPrevEvtEndTime < dTime) fdPrevEvtEndTime = dTime; - } // for( UInt_t uDigi = 0; uDigi < uNbSelDigis; ++uDigi ) - - /// catch the case where we reach the end of the vector before being out of the time window - if (uLocalIndexEnd < uLocalIndexStart) uLocalIndexEnd = uNbSelDigis; - } // if ( fT0DigiVec ) - else - LOG(fatal) << "CbmAlgoBuildRawEvents::SearchMatches => " - << "T0 as selection detector but vector not found!"; - } // if( ECbmModuleId::kT0 == detMatch.detId ) - else { - UInt_t uNbSelDigis = (0 < GetNofDigis(detMatch.detId) ? GetNofDigis(detMatch.detId) : 0); + /// Loop on size of vector + const UInt_t uNbSelDigis = fT0DigiVec->size(); for (UInt_t uDigi = detMatch.fuStartIndex; uDigi < uNbSelDigis; ++uDigi) { - const DigiCheck* pDigi = GetDigi<DigiCheck>(uDigi); - /// Check that _entry is not out of range - if (nullptr != pDigi) { - Double_t dTime = pDigi->GetTime(); - Double_t dTimeDiff = dTime - dSeedTime; - - LOG(debug4) << detMatch.sName << Form(" => Checking match %6u / %6u, dt %f", uDigi, uNbSelDigis, dTimeDiff); - - /// Check if within time window, update start/stop indices if needed - if (dTimeDiff < detMatch.fdTimeWinBeg) { - ++uLocalIndexStart; - continue; - } // if( dTimeDiff < detMatch.fdTimeWinBeg ) - else if (detMatch.fdTimeWinEnd < dTimeDiff) { - /// Store as end the first digi out of window to avoid double counting in case of - /// merged overlap event mode - uLocalIndexEnd = uDigi; - break; - } // else if( detMatch.fdTimeWinEnd < dTimeDiff ) of if( dTimeDiff < detMatch.fdTimeWinBeg ) - - AddDigiToEvent(detMatch, uDigi); - - if (fdPrevEvtEndTime < dTime) fdPrevEvtEndTime = dTime; - } // if( nullptr != pDigi ) - } // for( UInt_t uDigi = 0; uDigi < uNbSelDigis; ++uDigi ) + const Double_t dTime = fT0DigiVec->at(uDigi).GetTime(); + const Double_t dTimeDiff = dTime - dSeedTime; + + /// Check if within time window, update start/stop indices if needed + if (dTimeDiff < detMatch.fdTimeWinBeg) { + ++uLocalIndexStart; + continue; + } + else if (detMatch.fdTimeWinEnd < dTimeDiff) { + /// Store as end the first digi out of window to avoid double counting in case of + /// merged overlap event mode + uLocalIndexEnd = uDigi; + break; + } + AddDigiToEvent(detMatch, uDigi); + if (fdPrevEvtEndTime < dTime) fdPrevEvtEndTime = dTime; + } /// catch the case where we reach the end of the vector before being out of the time window if (uLocalIndexEnd < uLocalIndexStart) uLocalIndexEnd = uNbSelDigis; - } // else of if( ECbmModuleId::kT0 == detMatch.detId ) => Digi containers controlled by DigiManager + } + else { + const UInt_t uNbSelDigis = (0 < GetNofDigis(detMatch.detId) ? GetNofDigis(detMatch.detId) : 0); + /// Loop on size of vector + for (UInt_t uDigi = detMatch.fuStartIndex; uDigi < uNbSelDigis; ++uDigi) { + const DigiCheck* pDigi = GetDigi<DigiCheck>(uDigi); + const Double_t dTime = pDigi->GetTime(); + const Double_t dTimeDiff = dTime - dSeedTime; + LOG(debug4) << detMatch.sName << Form(" => Checking match %6u / %6u, dt %f", uDigi, uNbSelDigis, dTimeDiff); + + /// Check if within time window, update start/stop indices if needed + if (dTimeDiff < detMatch.fdTimeWinBeg) { + ++uLocalIndexStart; + continue; + } + else if (detMatch.fdTimeWinEnd < dTimeDiff) { + /// Store as end the first digi out of window to avoid double counting in case of + /// merged overlap event mode + uLocalIndexEnd = uDigi; + break; + } + AddDigiToEvent(detMatch, uDigi); + if (fdPrevEvtEndTime < dTime) fdPrevEvtEndTime = dTime; + } + /// catch the case where we reach the end of the vector before being out of the time window + if (uLocalIndexEnd < uLocalIndexStart) uLocalIndexEnd = uNbSelDigis; + } /// Update the StartIndex and EndIndex for the next event seed detMatch.fuStartIndex = uLocalIndexStart; detMatch.fuEndIndex = uLocalIndexEnd; } +void CbmAlgoBuildRawEvents::CheckTriggerCondition(Double_t dSeedTime) +{ + /// Check if event is filling trigger conditions and clear it if not + if (HasTrigger(fCurrentEvent)) { + fdPrevEvtTime = dSeedTime; + + /// In case of NoOverlap or MergeOverlap, we can and should start checking the next window + /// from end of current window in order to save CPU and avoid duplicating + if (EOverlapModeRaw::NoOverlap == fOverMode || EOverlapModeRaw::MergeOverlap == fOverMode) { + /// Update reference detector + fRefDet.fuStartIndex = fRefDet.fuEndIndex; + /// Loop on selection detectors + for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { + (*det).fuStartIndex = (*det).fuEndIndex; + } + } + } + else { + LOG(debug1) << "Reject seed due to Trigger requirements"; + delete fCurrentEvent; + fCurrentEvent = nullptr; /// delete does NOT set a pointer to nullptr... + } +} + void CbmAlgoBuildRawEvents::AddDigiToEvent(RawEventBuilderDetector& det, Int_t _entry) { fCurrentEvent->AddData(det.dataType, _entry); @@ -659,15 +583,11 @@ void CbmAlgoBuildRawEvents::AddDigiToEvent(RawEventBuilderDetector& det, Int_t _ Bool_t CbmAlgoBuildRawEvents::HasTrigger(CbmEvent* event) { /// Check first reference detector - if (kFALSE == CheckTriggerConditions(event, fRefDet)) { - return kFALSE; - } // if (kFALSE == CheckTriggerConditions(event, fRefDet) ) - + if (kFALSE == CheckTriggerConditions(event, fRefDet)) { return kFALSE; } /// Loop on selection detectors for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { if (kFALSE == CheckTriggerConditions(event, *det)) return kFALSE; - } // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) - + } /// All Ok, trigger is there return kTRUE; } @@ -675,9 +595,7 @@ Bool_t CbmAlgoBuildRawEvents::HasTrigger(CbmEvent* event) Bool_t CbmAlgoBuildRawEvents::CheckTriggerConditions(CbmEvent* event, RawEventBuilderDetector& det) { /// Check if both Trigger conditions disabled for this detector - if (0 == det.fuTriggerMinDigis && det.fiTriggerMaxDigis < 0) { - return kTRUE; - } // if( 0 == det.fuTriggerMinDigis && det.fiTriggerMaxDigis < 0 ) + if (0 == det.fuTriggerMinDigis && det.fiTriggerMaxDigis < 0) { return kTRUE; } /// Check if detector present if (ECbmModuleId::kT0 == det.detId) { @@ -687,108 +605,89 @@ Bool_t CbmAlgoBuildRawEvents::CheckTriggerConditions(CbmEvent* event, RawEventBu << " while the following trigger minimum are defined: " << det.fuTriggerMinDigis << " " << det.fiTriggerMaxDigis; return kFALSE; - } // if( !(fT0DigiVec) ) - } // if( ECbmDataType::kT0Digi == det.detId ) + } + } else { if (!DetIsPresent(det.detId)) { LOG(warning) << "Event does not have digis storage for " << det.sName << " while the following trigger min/max are defined: " << det.fuTriggerMinDigis << " " << det.fiTriggerMaxDigis; return kFALSE; - } // if( !fDigiMan->IsPresent( det ) ) - } // else of if( ECbmDataType::kT0Digi == det ) + } + } /// Check trigger rejection by minimal number or absence - Int_t iNbDigis = event->GetNofData(det.dataType); + const Int_t iNbDigis = event->GetNofData(det.dataType); if ((-1 == iNbDigis) || (static_cast<UInt_t>(iNbDigis) < det.fuTriggerMinDigis)) { LOG(debug2) << "Event does not have enough digis: " << iNbDigis << " vs " << det.fuTriggerMinDigis << " for " << det.sName; return kFALSE; - } // if((-1 == iNbDigis) || (static_cast<UInt_t>(iNbDigis) < det.fuTriggerMinDigis)) + } + /// Check trigger rejection by maximal number else if (0 < det.fiTriggerMaxDigis && det.fiTriggerMaxDigis < iNbDigis) { LOG(debug2) << "Event Has too many digis: " << iNbDigis << " vs " << det.fiTriggerMaxDigis << " for " << det.sName; return kFALSE; - } // else if( iNbDigis < det.fiTriggerMaxDigis ) + } else { return kTRUE; - } // else of else if( iNbDigis < det.fiTriggerMaxDigis ) + } } //---------------------------------------------------------------------- void CbmAlgoBuildRawEvents::CreateHistograms() { - /// FIXME: Disable clang formatting for histograms declaration for now - /* clang-format off */ - fhEventTime = new TH1F("hEventTime", - "seed time of the events; Seed time [s]; Events", - 60000, 0, 600); - fhEventDt = new TH1F( "fhEventDt", - "interval in seed time of consecutive events; Seed time [s]; Events", - 2100, -100.5, 1999.5); - fhEventSize = - new TH1F("hEventSize", - "nb of all digis in the event; Nb Digis []; Events []", - 10000, 0, 10000); - fhNbDigiPerEvtTime = - new TH2I("hNbDigiPerEvtTime", - "nb of all digis per event vs seed time of the events; Seed time " - "[s]; Nb Digis []; Events []", - 600, 0, 600, - 1000, 0, 10000); + fhEventTime = new TH1F("hEventTime", "seed time of the events; Seed time [s]; Events", 60000, 0, 600); + fhEventDt = + new TH1F("fhEventDt", "interval in seed time of consecutive events; Seed time [s]; Events", 2100, -100.5, 1999.5); + fhEventSize = new TH1F("hEventSize", "nb of all digis in the event; Nb Digis []; Events []", 10000, 0, 10000); + fhNbDigiPerEvtTime = new TH2I("hNbDigiPerEvtTime", + "nb of all digis per event vs seed time of the events; Seed time " + "[s]; Nb Digis []; Events []", + 600, 0, 600, 1000, 0, 10000); /// Loop on selection detectors - for (std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { + for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { /// In case name not provided, do not create the histo to avoid name conflicts! - if( "Invalid" == (*det).sName ) - { - fvhNbDigiPerEvtTimeDet.push_back( nullptr ); + if ("Invalid" == (*det).sName) { + fvhNbDigiPerEvtTimeDet.push_back(nullptr); continue; - } // if( "Invalid" == (*det).sName ) - - fvhNbDigiPerEvtTimeDet.push_back( - new TH2I( Form( "hNbDigiPerEvtTime%s", (*det).sName.data() ), - Form( "nb of %s digis per event vs seed time of the events; Seed time " - "[s]; Nb Digis []; Events []", - (*det).sName.data() ), - 600, 0, 600, - 4000, 0, 4000) ); - } // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) - - AddHistoToVector(fhEventTime, "evtbuild"); - AddHistoToVector(fhEventDt, "evtbuild"); - AddHistoToVector(fhEventSize, "evtbuild"); - AddHistoToVector(fhNbDigiPerEvtTime, "evtbuild"); - for (std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); - itHist != fvhNbDigiPerEvtTimeDet.end(); + } + + fvhNbDigiPerEvtTimeDet.push_back(new TH2I(Form("hNbDigiPerEvtTime%s", (*det).sName.data()), + Form("nb of %s digis per event vs seed time of the events; Seed time " + "[s]; Nb Digis []; Events []", + (*det).sName.data()), + 600, 0, 600, 4000, 0, 4000)); + } + + AddHistoToVector(fhEventTime, "evtbuild"); + AddHistoToVector(fhEventDt, "evtbuild"); + AddHistoToVector(fhEventSize, "evtbuild"); + AddHistoToVector(fhNbDigiPerEvtTime, "evtbuild"); + for (std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); itHist != fvhNbDigiPerEvtTimeDet.end(); ++itHist) { - if( nullptr != (*itHist) ) - { - AddHistoToVector((*itHist), "evtbuild"); - } // if( nullptr != (*itHist) ) - } // for( std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); itHist != fvhNbDigiPerEvtTimeDet.end(); ++itHist ) - - /// FIXME: Re-enable clang formatting after histograms declaration - /* clang-format on */ + if (nullptr != (*itHist)) { AddHistoToVector((*itHist), "evtbuild"); } + } } + void CbmAlgoBuildRawEvents::FillHistos() { Double_t dPreEvtTime = -1.0; for (CbmEvent* evt : fEventVector) { fhEventTime->Fill(evt->GetStartTime() * 1e-9); - if (0.0 <= dPreEvtTime) { fhEventDt->Fill(evt->GetStartTime() - dPreEvtTime); } // if( 0.0 <= dPreEvtTime ) + if (0.0 <= dPreEvtTime) { fhEventDt->Fill(evt->GetStartTime() - dPreEvtTime); } fhEventSize->Fill(evt->GetNofData()); fhNbDigiPerEvtTime->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData()); /// Loop on selection detectors for (UInt_t uDetIdx = 0; uDetIdx < fvDets.size(); ++uDetIdx) { if (nullptr == fvhNbDigiPerEvtTimeDet[uDetIdx]) continue; - fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData(fvDets[uDetIdx].dataType)); - } // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) - + } dPreEvtTime = evt->GetStartTime(); - } // for( CbmEvent * evt: fEventVector ) + } } + void CbmAlgoBuildRawEvents::ResetHistograms(Bool_t /*bResetTime*/) { fhEventTime->Reset(); @@ -800,22 +699,20 @@ void CbmAlgoBuildRawEvents::ResetHistograms(Bool_t /*bResetTime*/) for (std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); itHist != fvhNbDigiPerEvtTimeDet.end(); ++itHist) { (*itHist)->Reset(); - } // for( std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); itHist != fvhNbDigiPerEvtTimeDet.end(); ++itHist ) - + } /* if( kTRUE == bResetTime ) { /// Also reset the Start time for the evolution plots! fdStartTime = -1.0; - } // if( kTRUE == bResetTime ) -*/ + } + */ } -//---------------------------------------------------------------------- + void CbmAlgoBuildRawEvents::SetReferenceDetector(ECbmModuleId refDet, ECbmDataType dataTypeIn, std::string sNameIn, UInt_t uTriggerMinDigisIn, Int_t iTriggerMaxDigisIn, Double_t fdTimeWinBegIn, Double_t fdTimeWinEndIn) { - /// FIXME: Deprecated method to be removed later. For now create temp object. SetReferenceDetector(RawEventBuilderDetector(refDet, dataTypeIn, sNameIn, uTriggerMinDigisIn, iTriggerMaxDigisIn, fdTimeWinBegIn, fdTimeWinEndIn)); @@ -824,13 +721,11 @@ void CbmAlgoBuildRawEvents::AddDetector(ECbmModuleId selDet, ECbmDataType dataTy UInt_t uTriggerMinDigisIn, Int_t iTriggerMaxDigisIn, Double_t fdTimeWinBegIn, Double_t fdTimeWinEndIn) { - /// FIXME: Deprecated method to be removed later. For now create temp object. AddDetector(RawEventBuilderDetector(selDet, dataTypeIn, sNameIn, uTriggerMinDigisIn, iTriggerMaxDigisIn, fdTimeWinBegIn, fdTimeWinEndIn)); } -//---------------------------------------------------------------------- -//---------------------------------------------------------------------- + void CbmAlgoBuildRawEvents::SetReferenceDetector(RawEventBuilderDetector refDetIn) { /// Loop on selection detectors @@ -845,13 +740,13 @@ void CbmAlgoBuildRawEvents::SetReferenceDetector(RawEventBuilderDetector refDetI "Please also remember to update the selection windows to store " "clusters!"; RemoveDetector(refDetIn); - } // if( (*det) == refDetIn ) - } // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) + } + } if (fRefDet == refDetIn) { LOG(warning) << "CbmAlgoBuildRawEvents::SetReferenceDetector => " "Doing nothing, identical reference detector already in use"; - } // if( fRefDet == refDetIn ) + } else { LOG(info) << "CbmAlgoBuildRawEvents::SetReferenceDetector => " << "Replacing " << fRefDet.sName << " with " << refDetIn.sName << " as reference detector"; @@ -861,7 +756,7 @@ void CbmAlgoBuildRawEvents::SetReferenceDetector(RawEventBuilderDetector refDetI << refDetIn.sName; LOG(warning) << " => " "Please also remember to update the selection windows!"; - } // else of if( fRefDet == refDetIn ) + } fRefDet = refDetIn; /// Update the variables storing the earliest and latest time window boundaries @@ -869,6 +764,7 @@ void CbmAlgoBuildRawEvents::SetReferenceDetector(RawEventBuilderDetector refDetI /// Update the variable storing the size if widest time window for overlap detection UpdateWidestTimeWinRange(); } + void CbmAlgoBuildRawEvents::AddDetector(RawEventBuilderDetector selDet) { if (fRefDet == selDet) { @@ -877,7 +773,7 @@ void CbmAlgoBuildRawEvents::AddDetector(RawEventBuilderDetector selDet) << std::endl << "=> Maybe first change the reference detector with " "SetReferenceDetector?"; - } // if( fRefDet == selDet ) + } /// Loop on selection detectors for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { @@ -886,8 +782,8 @@ void CbmAlgoBuildRawEvents::AddDetector(RawEventBuilderDetector selDet) "Doing nothing, selection detector already in list!" << selDet.sName; return; - } // if( (*det) == selDet ) - } // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) + } + } fvDets.push_back(selDet); /// Update the variables storing the earliest and latest time window boundaries @@ -895,6 +791,7 @@ void CbmAlgoBuildRawEvents::AddDetector(RawEventBuilderDetector selDet) /// Update the variable storing the size if widest time window for overlap detection UpdateWidestTimeWinRange(); } + void CbmAlgoBuildRawEvents::RemoveDetector(RawEventBuilderDetector selDet) { /// Loop on selection detectors @@ -902,103 +799,95 @@ void CbmAlgoBuildRawEvents::RemoveDetector(RawEventBuilderDetector selDet) if ((*det) == selDet) { fvDets.erase(det); return; - } // if( (*det) == selDet ) - } // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) + } + } LOG(warning) << "CbmAlgoBuildRawEvents::RemoveDetector => Doing " "nothing, selection detector not in list!" << selDet.sName; } -//---------------------------------------------------------------------- + void CbmAlgoBuildRawEvents::SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal) { /// Check first if reference detector if (fRefDet.detId == selDet) { fRefDet.fuTriggerMinDigis = uVal; - LOG(debug) << "Set Trigger min limit for " << fRefDet.sName << " to " << uVal; - return; - } // if( fRefDet == selDet ) + } /// Loop on selection detectors for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { if ((*det).detId == selDet) { (*det).fuTriggerMinDigis = uVal; - LOG(debug) << "Set Trigger min limit for " << (*det).sName << " to " << uVal; - return; - } // if( (*det).detId == selDet ) - } // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) - + } + } LOG(warning) << "CbmAlgoBuildRawEvents::SetTriggerMinNumber => " "Doing nothing, detector neither reference nor in selection list!" << selDet; } + void CbmAlgoBuildRawEvents::SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal) { /// Check first if reference detector if (fRefDet.detId == selDet) { fRefDet.fiTriggerMaxDigis = iVal; - LOG(debug) << "Set Trigger min limit for " << fRefDet.sName << " to " << iVal; - return; - } // if( fRefDet == selDet ) + } /// Loop on selection detectors for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { if ((*det).detId == selDet) { (*det).fiTriggerMaxDigis = iVal; - LOG(debug) << "Set Trigger min limit for " << (*det).sName << " to " << iVal; - return; - } // if( (*det).detId == selDet ) - } // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) - + } + } LOG(warning) << "CbmAlgoBuildRawEvents::SetTriggerMaxNumber => " "Doing nothing, detector neither reference nor in selection list!" << selDet; } + void CbmAlgoBuildRawEvents::SetTriggerWindow(ECbmModuleId selDet, Double_t dWinBeg, Double_t dWinEnd) { /// Check if valid time window: end strictly after beginning - if (dWinEnd <= dWinBeg) + if (dWinEnd <= dWinBeg) { LOG(fatal) << "CbmAlgoBuildRawEvents::SetTriggerWindow => " "Invalid time window: [ " << dWinBeg << ", " << dWinEnd << " ]"; + } Bool_t bFound = kFALSE; /// Check first if reference detector if (fRefDet.detId == selDet) { fRefDet.fdTimeWinBeg = dWinBeg; fRefDet.fdTimeWinEnd = dWinEnd; - - bFound = kTRUE; - } // if( fRefDet == selDet ) + bFound = kTRUE; + } /// Loop on selection detectors for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { if ((*det).detId == selDet) { (*det).fdTimeWinBeg = dWinBeg; (*det).fdTimeWinEnd = dWinEnd; - - bFound = kTRUE; - } // if( (*det).detId == selDet ) - } // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) + bFound = kTRUE; + } + } if (kFALSE == bFound) { LOG(warning) << "CbmAlgoBuildRawEvents::SetTriggerWindow => " "Doing nothing, detector neither reference nor in selection list!" << selDet; - } // if( kFALSE == bFound ) + } /// Update the variables storing the earliest and latest time window boundaries UpdateTimeWinBoundariesExtrema(); /// Update the variable storing the size if widest time window for overlap detection UpdateWidestTimeWinRange(); } + void CbmAlgoBuildRawEvents::UpdateTimeWinBoundariesExtrema() { /// Initialize with reference detector @@ -1009,8 +898,9 @@ void CbmAlgoBuildRawEvents::UpdateTimeWinBoundariesExtrema() for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { fdEarliestTimeWinBeg = std::min(fdEarliestTimeWinBeg, (*det).fdTimeWinBeg); fdLatestTimeWinEnd = std::max(fdLatestTimeWinEnd, (*det).fdTimeWinEnd); - } // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) + } } + void CbmAlgoBuildRawEvents::UpdateWidestTimeWinRange() { /// Initialize with reference detector @@ -1019,8 +909,7 @@ void CbmAlgoBuildRawEvents::UpdateWidestTimeWinRange() /// Loop on selection detectors for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { fdWidestTimeWinRange = std::max(fdWidestTimeWinRange, (*det).fdTimeWinEnd - (*det).fdTimeWinBeg); - } // for( std::vector< RawEventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det ) + } } -//---------------------------------------------------------------------- ClassImp(CbmAlgoBuildRawEvents) diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h index efe156513b60a8ff9ea0defa2e49e7925928deb7..9cff5c5c4a3a1f3688669f26e8a118e0a878b4a1 100644 --- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h +++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h @@ -49,22 +49,23 @@ enum class EOverlapModeRaw class RawEventBuilderDetector { public: - RawEventBuilderDetector() { ; } + RawEventBuilderDetector() = default; + RawEventBuilderDetector(ECbmModuleId detIdIn, ECbmDataType dataTypeIn, std::string sNameIn) + : detId {detIdIn} + , dataType {dataTypeIn} + , sName {sNameIn} { - detId = detIdIn; - dataType = dataTypeIn; - sName = sNameIn; } + RawEventBuilderDetector(ECbmModuleId detIdIn, ECbmDataType dataTypeIn, std::string sNameIn, UInt_t uTriggerMinDigisIn, Int_t iTriggerMaxDigisIn, Double_t fdTimeWinBegIn, Double_t fdTimeWinEndIn) : RawEventBuilderDetector(detIdIn, dataTypeIn, sNameIn) { fuTriggerMinDigis = uTriggerMinDigisIn; fiTriggerMaxDigis = iTriggerMaxDigisIn; - - fdTimeWinBeg = fdTimeWinBegIn; - fdTimeWinEnd = fdTimeWinEndIn; + fdTimeWinBeg = fdTimeWinBegIn; + fdTimeWinEnd = fdTimeWinEndIn; } bool operator==(const RawEventBuilderDetector& other) const { return (other.detId == this->detId); } @@ -83,7 +84,6 @@ public: /// Selection Window Double_t fdTimeWinBeg = -100; Double_t fdTimeWinEnd = 100; - /// Book-keeping variables UInt_t fuStartIndex = 0; UInt_t fuEndIndex = 0; @@ -110,13 +110,13 @@ static const RawEventBuilderDetector kRawEventBuilderDetUndef = RawEventBuilderD class CbmAlgoBuildRawEvents { public: /** Default constructor **/ - CbmAlgoBuildRawEvents(); + CbmAlgoBuildRawEvents() = default; CbmAlgoBuildRawEvents(const CbmAlgoBuildRawEvents&) = delete; CbmAlgoBuildRawEvents operator=(const CbmAlgoBuildRawEvents&) = delete; /** Destructor **/ - ~CbmAlgoBuildRawEvents(); + ~CbmAlgoBuildRawEvents() {}; /** Initiliazation at the beginning of a run **/ Bool_t InitAlgo(); @@ -142,7 +142,6 @@ public: void SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal); void SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal); - void SetTriggerWindow(ECbmModuleId selDet, Double_t dWinBeg, Double_t dWinEnd); void SetTsParameters(Double_t dTsStartTime, Double_t dTsLength, Double_t dTsOverLength) @@ -191,6 +190,7 @@ private: /// Internal methods Bool_t CheckDataAvailable(RawEventBuilderDetector& det); void InitTs(); + void InitSeedWindow(); void BuildEvents(); void CreateHistograms(); @@ -199,8 +199,11 @@ private: template<class DigiSeed> void LoopOnSeeds(); void CheckSeed(Double_t dSeedTime, UInt_t uSeedDigiIdx); + void CheckTriggerCondition(Double_t dSeedTime); + template<class DigiCheck> void SearchMatches(Double_t dSeedTime, RawEventBuilderDetector& detMatch); + void SearchMatches(Double_t dSeedTime, RawEventBuilderDetector& detMatch); void AddDigiToEvent(RawEventBuilderDetector& det, Int_t uIdx); Bool_t HasTrigger(CbmEvent*); Bool_t CheckTriggerConditions(CbmEvent* event, RawEventBuilderDetector& det); @@ -232,6 +235,9 @@ private: Double_t fdEarliestTimeWinBeg = kdDefaultTimeWinBeg; Double_t fdLatestTimeWinEnd = kdDefaultTimeWinEnd; Double_t fdWidestTimeWinRange = kdDefaultTimeWinEnd - kdDefaultTimeWinBeg; + ///Seed window + Double_t fdSeedWindowBeg = 0; + Double_t fdSeedWindowEnd = 0; Double_t fdTsStartTime = -1; Double_t fdTsLength = -1; diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx index 9aae78088d832636ea0530961fa87128be410c58..ed71ed01e9dbd4d0cd332050e00d2b1ff3e66303 100644 --- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx +++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx @@ -7,7 +7,6 @@ ********************************************************************************/ #include "CbmTaskBuildRawEvents.h" -#include "CbmAlgoBuildRawEvents.h" #include "CbmDigiManager.h" #include "CbmEvent.h" @@ -21,23 +20,16 @@ #include "THttpServer.h" #include <TFile.h> -// ---- Default constructor ------------------------------------------- CbmTaskBuildRawEvents::CbmTaskBuildRawEvents() : FairTask("CbmTaskBuildRawEvents") { /// Create Algo. To be made generic/switchable when more event building algo are available! fpAlgo = new CbmAlgoBuildRawEvents(); } -// ---- Destructor ---------------------------------------------------- CbmTaskBuildRawEvents::~CbmTaskBuildRawEvents() {} -// ---- Initialisation ---------------------------------------------- -void CbmTaskBuildRawEvents::SetParContainers() -{ - /// Nothing to do -} +void CbmTaskBuildRawEvents::SetParContainers() {} -// ---- Init ---------------------------------------------------------- InitStatus CbmTaskBuildRawEvents::Init() { /// Get a handle from the IO manager @@ -113,7 +105,6 @@ InitStatus CbmTaskBuildRawEvents::Init() /// Register output array (CbmEvent) fEvents = new TClonesArray("CbmEvent", 100); ioman->Register("CbmEvent", "Cbm_Event", fEvents, IsOutputBranchPersistent("CbmEvent")); - if (!fEvents) LOG(fatal) << "Output branch was not created"; /// Call Algo Init method @@ -122,10 +113,8 @@ InitStatus CbmTaskBuildRawEvents::Init() return kFATAL; } -// ---- ReInit ------------------------------------------------------- InitStatus CbmTaskBuildRawEvents::ReInit() { return kSUCCESS; } -// ---- Exec ---------------------------------------------------------- void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/) { LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Starting sequence"; @@ -135,7 +124,7 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/) fStsDigis->clear(); for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kSts); i++) { const CbmStsDigi* Digi = fDigiMan->Get<CbmStsDigi>(i); - fStsDigis->insert(fStsDigis->begin() + i, *Digi); + fStsDigis->push_back(*Digi); } LOG(debug) << "Read: " << fStsDigis->size() << " STS digis."; LOG(debug) << "In DigiManager: " << fDigiMan->GetNofDigis(ECbmModuleId::kSts) << " STS digis."; @@ -147,7 +136,7 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/) fMuchBeamTimeDigis->clear(); for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kMuch); i++) { const CbmMuchBeamTimeDigi* Digi = fDigiMan->Get<CbmMuchBeamTimeDigi>(i); - fMuchBeamTimeDigis->insert(fMuchBeamTimeDigis->begin() + i, *Digi); + fMuchBeamTimeDigis->push_back(*Digi); } LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kMuch) << " MUCH digis."; LOG(debug) << "In DigiManager: " << fMuchBeamTimeDigis->size() << " MUCH digis."; @@ -156,7 +145,7 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/) fMuchDigis->clear(); for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kMuch); i++) { const CbmMuchDigi* Digi = fDigiMan->Get<CbmMuchDigi>(i); - fMuchDigis->insert(fMuchDigis->begin() + i, *Digi); + fMuchDigis->push_back(*Digi); } LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kMuch) << " MUCH digis."; LOG(debug) << "In DigiManager: " << fMuchDigis->size() << " MUCH digis."; @@ -168,7 +157,7 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/) fTrdDigis->clear(); for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kTrd); i++) { const CbmTrdDigi* Digi = fDigiMan->Get<CbmTrdDigi>(i); - fTrdDigis->insert(fTrdDigis->begin() + i, *Digi); + fTrdDigis->push_back(*Digi); } LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kTrd) << " TRD digis."; LOG(debug) << "In DigiManager: " << fTrdDigis->size() << " TRD digis."; @@ -179,7 +168,7 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/) fTofDigis->clear(); for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kTof); i++) { const CbmTofDigi* Digi = fDigiMan->Get<CbmTofDigi>(i); - fTofDigis->insert(fTofDigis->begin() + i, *Digi); + fTofDigis->push_back(*Digi); } LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kTof) << " TOF digis."; LOG(debug) << "In DigiManager: " << fTofDigis->size() << " TOF digis."; @@ -190,7 +179,7 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/) fRichDigis->clear(); for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kRich); i++) { const CbmRichDigi* Digi = fDigiMan->Get<CbmRichDigi>(i); - fRichDigis->insert(fRichDigis->begin() + i, *Digi); + fRichDigis->push_back(*Digi); } LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kRich) << " RICH digis."; LOG(debug) << "In DigiManager: " << fRichDigis->size() << " RICH digis."; @@ -201,12 +190,11 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/) fPsdDigis->clear(); for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kPsd); i++) { const CbmPsdDigi* Digi = fDigiMan->Get<CbmPsdDigi>(i); - fPsdDigis->insert(fPsdDigis->begin() + i, *Digi); + fPsdDigis->push_back(*Digi); } LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kPsd) << " PSD digis."; LOG(debug) << "In DigiManager: " << fPsdDigis->size() << " PSD digis."; } - /// Call Algo ProcessTs method fpAlgo->ProcessTs(); @@ -215,17 +203,13 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/) LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Done"; } - -// ---- Finish -------------------------------------------------------- void CbmTaskBuildRawEvents::Finish() { - if (fbFillHistos) { SaveHistos(); } // if( fbFillHistos ) - /// Call Algo finish method fpAlgo->Finish(); + if (fbFillHistos) { SaveHistos(); } } -//---------------------------------------------------------------------- void CbmTaskBuildRawEvents::FillOutput() { /// Clear TClonesArray before usage. @@ -239,12 +223,11 @@ void CbmTaskBuildRawEvents::FillOutput() LOG(debug) << "Vector: " << event->ToString(); new ((*fEvents)[fEvents->GetEntriesFast()]) CbmEvent(std::move(*event)); LOG(debug) << "TClonesArray: " << static_cast<CbmEvent*>(fEvents->At(fEvents->GetEntriesFast() - 1))->ToString(); - } // for( CbmEvent* event: vEvents ) - + } /// Clear event vector after usage fpAlgo->ClearEventVector(); } -//---------------------------------------------------------------------- + void CbmTaskBuildRawEvents::SaveHistos() { /// Obtain vector of pointers on each histo from the algo (+ optionally desired folder) @@ -262,75 +245,19 @@ void CbmTaskBuildRawEvents::SaveHistos() /// Save all plots and create folders if needed for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) { /// Make sure we end up in chosen folder - TString sFolder = vHistos[uHisto].second.data(); + const TString sFolder = vHistos[uHisto].second.data(); if (nullptr == gDirectory->Get(sFolder)) gDirectory->mkdir(sFolder); gDirectory->cd(sFolder); /// Write plot vHistos[uHisto].first->Write(); - histoFile->cd(); - } // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto ) + } /// Restore original directory position oldDir->cd(); histoFile->Close(); } -//---------------------------------------------------------------------- -void CbmTaskBuildRawEvents::SetFillHistos(Bool_t bFlag) -{ - fbFillHistos = bFlag; - if (nullptr != fpAlgo) fpAlgo->SetFillHistos(fbFillHistos); -} -void CbmTaskBuildRawEvents::SetOutFilename(TString sNameIn) { fsOutFileName = sNameIn; } - -void CbmTaskBuildRawEvents::SetReferenceDetector(RawEventBuilderDetector refDet) -{ - if (nullptr != fpAlgo) fpAlgo->SetReferenceDetector(refDet); -} -void CbmTaskBuildRawEvents::AddDetector(RawEventBuilderDetector selDet) -{ - if (nullptr != fpAlgo) fpAlgo->AddDetector(selDet); -} -void CbmTaskBuildRawEvents::RemoveDetector(RawEventBuilderDetector selDet) -{ - if (nullptr != fpAlgo) fpAlgo->RemoveDetector(selDet); -} - -void CbmTaskBuildRawEvents::SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal) -{ - if (nullptr != fpAlgo) fpAlgo->SetTriggerMinNumber(selDet, uVal); -} -void CbmTaskBuildRawEvents::SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal) -{ - if (nullptr != fpAlgo) fpAlgo->SetTriggerMaxNumber(selDet, iVal); -} - -void CbmTaskBuildRawEvents::SetTriggerWindow(ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd) -{ - if (nullptr != fpAlgo) fpAlgo->SetTriggerWindow(det, dWinBeg, dWinEnd); -} - - -void CbmTaskBuildRawEvents::SetTsParameters(Double_t dTsStartTime, Double_t dTsLength, Double_t dTsOverLength) -{ - if (nullptr != fpAlgo) fpAlgo->SetTsParameters(dTsStartTime, dTsLength, dTsOverLength); -} - -void CbmTaskBuildRawEvents::SetEventOverlapMode(EOverlapModeRaw mode) -{ - if (nullptr != fpAlgo) fpAlgo->SetEventOverlapMode(mode); -} -void CbmTaskBuildRawEvents::SetIgnoreTsOverlap(Bool_t bFlagIn) -{ - if (nullptr != fpAlgo) fpAlgo->SetIgnoreTsOverlap(bFlagIn); -} -void CbmTaskBuildRawEvents::ChangeMuchBeamtimeDigiFlag(Bool_t bFlagIn) -{ - if (nullptr != fpAlgo) fpAlgo->ChangeMuchBeamtimeDigiFlag(bFlagIn); - fbUseMuchBeamtimeDigi = bFlagIn; -} -//---------------------------------------------------------------------- ClassImp(CbmTaskBuildRawEvents) diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h index d79b95c89f51e7afc21f2af788b2c1b00e22b4cc..e736d634a227c7afe60aa552b4e25c6365854baa 100644 --- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h +++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h @@ -14,6 +14,7 @@ /// FAIRSOFT headers (geant, boost, ...) /// C/C++ headers +#include "CbmAlgoBuildRawEvents.h" #include "CbmMuchBeamTimeDigi.h" #include "CbmMuchDigi.h" #include "CbmPsdDigi.h" @@ -30,7 +31,6 @@ #include <vector> class CbmDigiManager; -class CbmAlgoBuildRawEvents; class RawEventBuilderDetector; class TClonesArray; @@ -47,18 +47,15 @@ public: /** Constructor with parameters (Optional) **/ // CbmTaskBuildRawEvents(Int_t verbose); - /** Destructor **/ ~CbmTaskBuildRawEvents(); - /** Initiliazation of task at the beginning of a run **/ virtual InitStatus Init(); /** ReInitiliazation of task when the runID changes **/ virtual InitStatus ReInit(); - /** Executed for each event. **/ virtual void Exec(Option_t*); @@ -68,24 +65,55 @@ public: /** Finish task called at the end of the run **/ virtual void Finish(); - void SetFillHistos(Bool_t bFlag = kTRUE); - void SetOutFilename(TString sNameIn); - - void SetReferenceDetector(RawEventBuilderDetector refDet); - void AddDetector(RawEventBuilderDetector selDet); - void RemoveDetector(RawEventBuilderDetector selDet); - - void SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal); - void SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal); - - void SetTriggerWindow(ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd); - - void SetTsParameters(Double_t dTsStartTime, Double_t dTsLength, Double_t dTsOverLength); - - void SetEventOverlapMode(EOverlapModeRaw mode); - void SetIgnoreTsOverlap(Bool_t bFlagIn); - - void ChangeMuchBeamtimeDigiFlag(Bool_t bFlagIn = kFALSE); + /** Setters **/ + void SetOutFilename(TString sNameIn) { fsOutFileName = sNameIn; } + + void SetFillHistos(Bool_t bFlag = kTRUE) + { + fbFillHistos = bFlag; + if (nullptr != fpAlgo) fpAlgo->SetFillHistos(fbFillHistos); + } + void SetReferenceDetector(RawEventBuilderDetector refDet) + { + if (nullptr != fpAlgo) fpAlgo->SetReferenceDetector(refDet); + } + void AddDetector(RawEventBuilderDetector selDet) + { + if (nullptr != fpAlgo) fpAlgo->AddDetector(selDet); + } + void RemoveDetector(RawEventBuilderDetector selDet) + { + if (nullptr != fpAlgo) fpAlgo->RemoveDetector(selDet); + } + void SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal) + { + if (nullptr != fpAlgo) fpAlgo->SetTriggerMinNumber(selDet, uVal); + } + void SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal) + { + if (nullptr != fpAlgo) fpAlgo->SetTriggerMaxNumber(selDet, iVal); + } + void SetTriggerWindow(ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd) + { + if (nullptr != fpAlgo) fpAlgo->SetTriggerWindow(det, dWinBeg, dWinEnd); + } + void SetTsParameters(Double_t dTsStartTime, Double_t dTsLength, Double_t dTsOverLength) + { + if (nullptr != fpAlgo) fpAlgo->SetTsParameters(dTsStartTime, dTsLength, dTsOverLength); + } + void SetEventOverlapMode(EOverlapModeRaw mode) + { + if (nullptr != fpAlgo) fpAlgo->SetEventOverlapMode(mode); + } + void SetIgnoreTsOverlap(Bool_t bFlagIn) + { + if (nullptr != fpAlgo) fpAlgo->SetIgnoreTsOverlap(bFlagIn); + } + void ChangeMuchBeamtimeDigiFlag(Bool_t bFlagIn = kFALSE) + { + if (nullptr != fpAlgo) fpAlgo->ChangeMuchBeamtimeDigiFlag(bFlagIn); + fbUseMuchBeamtimeDigi = bFlagIn; + } private: void FillOutput();