diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx index f1191e94ad8fa8afb9c7e9b9b041cdbf3de842c2..0973a3c480ff57888936ed8949403ea7e9cdb03a 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx +++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx @@ -67,17 +67,19 @@ Bool_t CbmMcbm2019TimeWinEventBuilderAlgo::InitAlgo() { } // if( kFALSE == CheckDataAvailable( *det ) ) } // for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) - /// Access the TS metadata to know TS start tim - fTimeSliceMetaDataArray = - dynamic_cast<TClonesArray*>(ioman->GetObject("TimesliceMetaData")); - if (!fTimeSliceMetaDataArray) { - LOG(fatal) - << "No TS metadata input found" - << " => Please check in the unpacking macro if the following line was " - "present!" - << std::endl - << "source->SetWriteOutputFlag(kTRUE); // For writing TS metadata"; - } // if (!fTimeSliceMetaDataArray) + /// Access the TS metadata to know TS start time if needed + if (fdTsStartTime < 0 || fdTsLength < 0 || fdTsOverLength < 0) { + fTimeSliceMetaDataArray = + dynamic_cast<TClonesArray*>(ioman->GetObject("TimesliceMetaData")); + if (!fTimeSliceMetaDataArray) { + LOG(fatal) + << "No TS metadata input found" + << " => Please check in the unpacking macro if the following line was " + "present!" + << std::endl + << "source->SetWriteOutputFlag(kTRUE); // For writing TS metadata"; + } // if (!fTimeSliceMetaDataArray) + } // if ( fdTsStartTime < 0 || fdTsLength < 0 || fdTsOverLength < 0 ) if (fbFillHistos) { CreateHistograms(); } // if( fbFillHistos ) @@ -209,37 +211,47 @@ void CbmMcbm2019TimeWinEventBuilderAlgo::BuildEvents() { template<class DigiSeed> void CbmMcbm2019TimeWinEventBuilderAlgo::LoopOnSeeds() { - pTsMetaData = - dynamic_cast<TimesliceMetaData*>(fTimeSliceMetaDataArray->At(0)); - if (nullptr == pTsMetaData) - LOG(fatal) << Form("CbmMcbm2019TimeWinEventBuilderAlgo::LoopOnSeeds => " - "No TS metadata found for TS %6u.", - fuNrTs); + /// 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("CbmMcbm2019TimeWinEventBuilderAlgo::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 - && pTsMetaData->GetOverlapDuration() < fdLatestTimeWinEnd) - || (pTsMetaData->GetOverlapDuration() < fdWidestTimeWinRange)) { + && dOverlapSize < fdLatestTimeWinEnd) + || (dOverlapSize < fdWidestTimeWinRange)) { LOG(warning) << "CbmMcbm2019TimeWinEventBuilderAlgo::LoopOnSeeds => " << Form("Event window not fitting in TS overlap, risk of " "incomplete events: %f %f %f %llu", fdEarliestTimeWinBeg, fdLatestTimeWinEnd, fdWidestTimeWinRange, - pTsMetaData->GetOverlapDuration()); + 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 = - pTsMetaData->GetStartTime() + dTsStartTime + (0.0 < fdEarliestTimeWinBeg ? 0.0 : -fdEarliestTimeWinBeg); Double_t dSeedWindowEnd = - pTsMetaData->GetOverlapStartTime() + dOverlapStart + (0.0 < fdEarliestTimeWinBeg ? 0.0 : -fdEarliestTimeWinBeg); if (fbIgnoreTsOverlap) { - dSeedWindowBeg = pTsMetaData->GetStartTime(); - dSeedWindowEnd = pTsMetaData->GetOverlapStartTime(); + dSeedWindowBeg = dTsStartTime; + dSeedWindowEnd = dOverlapStart; } // if( fbIgnoreTsOverlap ) if (ECbmModuleId::kT0 == fRefDet.detId) { diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h index af47dcd01b414888d19d1086ec3d2f62b0efc6dd..2173184714abd3a75899a7c0f980e5e37fb37c1e 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h +++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h @@ -153,6 +153,14 @@ public: void SetTriggerWindow(ECbmModuleId selDet, Double_t dWinBeg, Double_t dWinEnd); + void SetTsParameters(Double_t dTsStartTime, + Double_t dTsLength, + Double_t dTsOverLength) { + fdTsStartTime = dTsStartTime; + fdTsLength = dTsLength; + fdTsOverLength = fdTsOverLength; + } + /// Control flags void SetEventOverlapMode(EOverlapMode mode) { fOverMode = mode; } void SetIgnoreTsOverlap(Bool_t bFlagIn = kTRUE) { @@ -225,6 +233,10 @@ private: Double_t fdLatestTimeWinEnd = kdDefaultTimeWinEnd; Double_t fdWidestTimeWinRange = kdDefaultTimeWinEnd - kdDefaultTimeWinBeg; + Double_t fdTsStartTime = -1; + Double_t fdTsLength = -1; + Double_t fdTsOverLength = -1; + /// Data input /// FIXME: usage of CbmDigiManager in FairMq context?!? /// => Maybe by registering vector (or vector reference) to ioman in Device? diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx index a3e7cd99b0f07109e25e115cceee3b128482467f..56792605a7303f52c0bbeac5ac659183dd21714a 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx +++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx @@ -169,6 +169,15 @@ void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerWindow(ECbmModuleId det, if (nullptr != fpAlgo) fpAlgo->SetTriggerWindow(det, dWinBeg, dWinEnd); } + +void CbmMcbm2019TimeWinEventBuilderTask::SetTsParameters(Double_t dTsStartTime, + Double_t dTsLength, + Double_t dTsOverLength) { + if (nullptr != fpAlgo) fpAlgo->SetTsParameters(dTsStartTime, + dTsLength, + dTsOverLength); +} + void CbmMcbm2019TimeWinEventBuilderTask::SetEventOverlapMode( EOverlapMode mode) { if (nullptr != fpAlgo) fpAlgo->SetEventOverlapMode(mode); diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h index 4748f0c8c4d2990d498ffafa2581568531a87781..2c3b87dd97d41d6555e6c0b085402f6ef20deb59 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h +++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h @@ -72,6 +72,10 @@ public: void SetTriggerWindow(ECbmModuleId det, Double_t dWinBeg, Double_t dWinEnd); + void SetTsParameters(Double_t dTsStartTime, + Double_t dTsLength, + Double_t dTsOverLength); + void SetEventOverlapMode(EOverlapMode mode); void SetIgnoreTsOverlap(Bool_t bFlagIn);