Newer
Older
/********************************************************************************
* Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
* *
* This software is distributed under the terms of the *
* GNU Lesser General Public Licence (LGPL) version 3, *
* copied verbatim in the file "LICENSE" *
********************************************************************************/
#include "CbmMcbm2019TimeWinEventBuilderAlgo.h"
/// CBM headers
#include "CbmEvent.h"
#include "CbmMuchBeamTimeDigi.h"
#include "CbmPsdDigi.h"
#include "CbmRichDigi.h"
#include "CbmStsDigi.h"
#include "CbmTofDigi.h"
#include "CbmTrdDigi.h"
#include "TimesliceMetaData.h"
#include "CbmDigiManager.h"
/// FAIRROOT headers
#include "FairLogger.h"
#include "FairRootManager.h"
#include "FairRunOnline.h"
/// FAIRSOFT headers (geant, boost, ...)
#include "TClonesArray.h"
#include "TH1.h"
#include "THttpServer.h"
/// C/C++ headers
// ---- Default constructor --------------------------------------------
CbmMcbm2019TimeWinEventBuilderAlgo::CbmMcbm2019TimeWinEventBuilderAlgo() {}
// ---- Destructor -----------------------------------------------------
CbmMcbm2019TimeWinEventBuilderAlgo::~CbmMcbm2019TimeWinEventBuilderAlgo() {}
// ---- Init -----------------------------------------------------------
Bool_t CbmMcbm2019TimeWinEventBuilderAlgo::InitAlgo() {
LOG(info)
<< "CbmMcbm2019TimeWinEventBuilderAlgo::InitAlgo => Starting sequence";
// Get a handle from the IO manager
FairRootManager* ioman = FairRootManager::Instance();
// Get a pointer to the previous already existing data level
fDigiMan = CbmDigiManager::Instance();
fDigiMan->UseMuchBeamTimeDigi();
fDigiMan->Init();

Pierre-Alain Loizeau
committed
/// Check if reference detector data are available
if (kFALSE == CheckDataAvailable(fRefDet)) {
LOG(fatal) << "No digi input for reference detector, stopping there!";

Pierre-Alain Loizeau
committed
} // if( kFALSE == CheckDataAvailable( fRefDet ) )

Pierre-Alain Loizeau
committed
/// Check if data for detectors in selection list are available
for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin();
det != fvDets.end();
++det) {
if (kFALSE == CheckDataAvailable(*det)) {
LOG(fatal)
<< "No digi input for one of selection detector, stopping there!";

Pierre-Alain Loizeau
committed
} // if( kFALSE == CheckDataAvailable( *det ) )
} // for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det)
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 (fbFillHistos) { CreateHistograms(); } // if( fbFillHistos )
LOG(info) << "CbmMcbm2019TimeWinEventBuilderAlgo::InitAlgo => Done";
}
// ---- ProcessTs ------------------------------------------------------
void CbmMcbm2019TimeWinEventBuilderAlgo::ProcessTs() {
LOG_IF(info, fuNrTs % 1000 == 0) << "Begin of TS " << fuNrTs;
/// Store last event with trigger if not done by other seed
if (nullptr != fCurrentEvent) {
/// TODO: store start time of current event ?
// fCurrentEvent->SetStartTime( fPrevTime ); // Replace Seed time with time of first digi in event?
fCurrentEvent->SetEndTime(fdPrevEvtEndTime);
fEventVector.push_back(fCurrentEvent);
fuCurEv++;
/// Prevent building over TS edge
fCurrentEvent = nullptr;
} // if( nullptr != fCurrentEvent )
LOG(debug) << "Found " << fEventVector.size() << " triggered events";
if (fbFillHistos) { FillHistos(); } // if( fbFillHistos )
void CbmMcbm2019TimeWinEventBuilderAlgo::ClearEventVector() {
/// Need to delete the object the pointer points to first
int counter = 0;
for (CbmEvent* event : fEventVector) {
LOG(debug) << "Event " << counter << " has " << event->GetNofData()
<< " digis";
delete event;
counter++;
} // for( CbmEvent* event: fEventVector)
fEventVector.clear();
}
// ---- Finish ---------------------------------------------------------
void CbmMcbm2019TimeWinEventBuilderAlgo::Finish() {
}
// ---------------------------------------------------------------------
Bool_t CbmMcbm2019TimeWinEventBuilderAlgo::CheckDataAvailable(
EventBuilderDetector& det) {

Pierre-Alain Loizeau
committed
// Get a handle from the IO manager
FairRootManager* ioman = FairRootManager::Instance();
if (ECbmModuleId::kT0 == det.detId) {

Pierre-Alain Loizeau
committed
// T0 is not included in DigiManager
fT0DigiVec = ioman->InitObjectAs<std::vector<CbmTofDigi> const*>("T0Digi");
if (!fT0DigiVec) {
LOG(info) << "No T0 digi input found.";
return kFALSE;
} // if( ! fT0DigiVec )
} // if( ECbmModuleId::kT0 == det.detId )

Pierre-Alain Loizeau
committed
else {
if (!fDigiMan->IsPresent(det.detId)) {
LOG(info) << "No " << det.sName << " digi input found.";
return kFALSE;
} // if( ! fDigiMan->IsPresent(ECbmModuleId::kSts) )
} // else of if( ECbmModuleId::kT0 == det.detId )

Pierre-Alain Loizeau
committed
return kTRUE;
}
// ---------------------------------------------------------------------
void CbmMcbm2019TimeWinEventBuilderAlgo::InitTs() {
/// Reset TS based variables (analysis per TS = no building over the border)
/// Reference detector

Pierre-Alain Loizeau
committed
fRefDet.fuStartIndex = 0;
fRefDet.fuEndIndex = 0;
/// Loop on detectors in selection list
for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin();
det != fvDets.end();
++det) {

Pierre-Alain Loizeau
committed
(*det).fuStartIndex = 0;
(*det).fuEndIndex = 0;
} // for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det)
void CbmMcbm2019TimeWinEventBuilderAlgo::BuildEvents() {
/// Call LoopOnSeed with proper template argument

Pierre-Alain Loizeau
committed
switch (fRefDet.detId) {
case ECbmModuleId::kSts: {
LoopOnSeeds<CbmStsDigi>();
} // case ECbmModuleId::kSts:
case ECbmModuleId::kMuch: {
LoopOnSeeds<CbmMuchBeamTimeDigi>();
} // case ECbmModuleId::kMuch:
case ECbmModuleId::kTrd: {
LoopOnSeeds<CbmTrdDigi>();
} // case ECbmModuleId::kTrd:
case ECbmModuleId::kTof: {
LoopOnSeeds<CbmTofDigi>();
} // case ECbmModuleId::kTof:
case ECbmModuleId::kRich: {
LoopOnSeeds<CbmRichDigi>();
} // case ECbmModuleId::kRich:
case ECbmModuleId::kPsd: {
LoopOnSeeds<CbmPsdDigi>();
} // case ECbmModuleId::kPsd:
case ECbmModuleId::kT0: {
LoopOnSeeds<CbmTofDigi>();
break;
} // case ECbmModuleId::kT0:
default: {
LOG(fatal) << "CbmMcbm2019TimeWinEventBuilderAlgo::BuildEvents => "
<< "Trying to search event seeds with unsupported det: "

Pierre-Alain Loizeau
committed
<< fRefDet.sName;
void CbmMcbm2019TimeWinEventBuilderAlgo::LoopOnSeeds() {
pTsMetaData =
dynamic_cast<TimesliceMetaData*>(fTimeSliceMetaDataArray->At(0));

Pierre-Alain Loizeau
committed
LOG(fatal) << Form("CbmMcbm2019TimeWinEventBuilderAlgo::LoopOnSeeds => "
"No TS metadata found for TS %6u.",
/// Print warning in first TS if time window borders out of potential overlap
if ((0.0 < fdEarliestTimeWinBeg
&& pTsMetaData->GetOverlapDuration() < fdLatestTimeWinEnd)
|| (pTsMetaData->GetOverlapDuration() < 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());
} // 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()
+ (0.0 < fdEarliestTimeWinBeg ? 0.0 : -fdEarliestTimeWinBeg);
Double_t dSeedWindowEnd =
pTsMetaData->GetOverlapStartTime()
+ (0.0 < fdEarliestTimeWinBeg ? 0.0 : -fdEarliestTimeWinBeg);
if (fbIgnoreTsOverlap) {
dSeedWindowBeg = pTsMetaData->GetStartTime();
dSeedWindowEnd = pTsMetaData->GetOverlapStartTime();
} // if( fbIgnoreTsOverlap )

Pierre-Alain Loizeau
committed
if (ECbmModuleId::kT0 == fRefDet.detId) {
if (fT0DigiVec) {
/// Loop on size of vector
UInt_t uNbRefDigis = fT0DigiVec->size();
for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) {
LOG(debug) << Form("Checking seed %6u / %6u", uDigi, uNbRefDigis);

Pierre-Alain Loizeau
committed
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) << "CbmMcbm2019TimeWinEventBuilderAlgo::LoopOnSeeds => "
<< "T0 as reference detector but vector not found!";
} // if (ECbmModuleId::kT0 == fRefDet.detId)
else {
UInt_t uNbRefDigis = (0 < fDigiMan->GetNofDigis(fRefDet.detId)
? fDigiMan->GetNofDigis(fRefDet.detId)
: 0);

Pierre-Alain Loizeau
committed
/// 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 = fDigiMan->Get<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
void CbmMcbm2019TimeWinEventBuilderAlgo::CheckSeed(Double_t dSeedTime,
UInt_t uSeedDigiIdx) {
/// If previous event valid and event overlap not allowed, check if we are in overlap
/// and react accordingly
if (nullptr != fCurrentEvent && EOverlapMode::AllowOverlap != fOverMode
&& dSeedTime - fdPrevEvtTime < fdWidestTimeWinRange) {
switch (fOverMode) {
case EOverlapMode::NoOverlap: {
} // case EOverlapMode::NoOverlap:
case EOverlapMode::MergeOverlap: {
/// Merge overlap mode => do nothing and go on filling current event
break;
} // case EOverlapMode::MergeOverlap:
case EOverlapMode::AllowOverlap: {
/// Not in Merge overlap mode => should have been catched before, nothing to do
break;
} // case EOverlapMode::AllowOverlap:
} // switch( fOverMode )
} // if( prev Event exists and overlap not allowed and overlap present )
else {
/// Out of overlap range or in overlap allowed mode
/// => store previous event if not empty and create new one
if (nullptr != fCurrentEvent) {
/// TODO: store start time of current event ?
// fCurrentEvent->SetStartTime( fPrevTime ); // Replace Seed time with time of first digi in event?
fCurrentEvent->SetEndTime(fdPrevEvtEndTime);
fEventVector.push_back(fCurrentEvent);
fuCurEv++;
} // if( nullptr != fCurrentEvent )
fCurrentEvent = new CbmEvent(fuCurEv, dSeedTime, 0.);
} // else of if( prev Event exists and overlap not allowed and overlap present )
/// If window open for reference detector, search for other reference Digis matching it
/// Otherwise only add the current seed

Pierre-Alain Loizeau
committed
if (fRefDet.fdTimeWinBeg < fRefDet.fdTimeWinEnd) {
switch (fRefDet.detId) {

Pierre-Alain Loizeau
committed
SearchMatches<CbmStsDigi>(dSeedTime, fRefDet);
} // case ECbmModuleId::kSts:
case ECbmModuleId::kMuch: {

Pierre-Alain Loizeau
committed
SearchMatches<CbmMuchBeamTimeDigi>(dSeedTime, fRefDet);
} // case ECbmModuleId::kMuch:
case ECbmModuleId::kTrd: {

Pierre-Alain Loizeau
committed
SearchMatches<CbmTrdDigi>(dSeedTime, fRefDet);
} // case ECbmModuleId::kTrd:
case ECbmModuleId::kTof: {

Pierre-Alain Loizeau
committed
SearchMatches<CbmTofDigi>(dSeedTime, fRefDet);
} // case ECbmModuleId::kTof:
case ECbmModuleId::kRich: {

Pierre-Alain Loizeau
committed
SearchMatches<CbmRichDigi>(dSeedTime, fRefDet);
} // case ECbmModuleId::kRich:
case ECbmModuleId::kPsd: {

Pierre-Alain Loizeau
committed
SearchMatches<CbmPsdDigi>(dSeedTime, fRefDet);
} // case ECbmModuleId::kPsd:
case ECbmModuleId::kT0: {

Pierre-Alain Loizeau
committed
SearchMatches<CbmTofDigi>(dSeedTime, fRefDet);
} // case ECbmModuleId::kT0:
default: {
LOG(fatal) << "CbmMcbm2019TimeWinEventBuilderAlgo::LoopOnSeeds => "
<< "Trying to search matches with unsupported det: "
<< fRefDet.sName << std::endl

Pierre-Alain Loizeau
committed
<< "You may want to add support for it in the method.";
/// Also add the seed if the window starts after the seed

Pierre-Alain Loizeau
committed
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<EventBuilderDetector>::iterator det = fvDets.begin();
det != fvDets.end();
++det) {

Pierre-Alain Loizeau
committed
switch ((*det).detId) {

Pierre-Alain Loizeau
committed
SearchMatches<CbmStsDigi>(dSeedTime, *det);
} // case ECbmModuleId::kSts:
case ECbmModuleId::kMuch: {

Pierre-Alain Loizeau
committed
SearchMatches<CbmMuchBeamTimeDigi>(dSeedTime, *det);
} // case ECbmModuleId::kMuch:
case ECbmModuleId::kTrd: {

Pierre-Alain Loizeau
committed
SearchMatches<CbmTrdDigi>(dSeedTime, *det);
} // case ECbmModuleId::kTrd:
case ECbmModuleId::kTof: {

Pierre-Alain Loizeau
committed
SearchMatches<CbmTofDigi>(dSeedTime, *det);
} // case ECbmModuleId::kTof:
case ECbmModuleId::kRich: {

Pierre-Alain Loizeau
committed
SearchMatches<CbmRichDigi>(dSeedTime, *det);
} // case ECbmModuleId::kRich:
case ECbmModuleId::kPsd: {

Pierre-Alain Loizeau
committed
SearchMatches<CbmPsdDigi>(dSeedTime, *det);
} // case ECbmModuleId::kPsd:
case ECbmModuleId::kT0: {

Pierre-Alain Loizeau
committed
SearchMatches<CbmTofDigi>(dSeedTime, *det);
} // case ECbmModuleId::kT0:
default: {
LOG(fatal) << "CbmMcbm2019TimeWinEventBuilderAlgo::LoopOnSeeds => "
<< "Trying to search matches with unsupported det: "
<< (*det).sName << std::endl

Pierre-Alain Loizeau
committed
<< "You may want to add support for it in the method.";

Pierre-Alain Loizeau
committed
} // for( std::vector< EventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
/// Check if event is filling trigger conditions and clear it if not

Pierre-Alain Loizeau
committed
/// 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 (EOverlapMode::NoOverlap == fOverMode
|| EOverlapMode::MergeOverlap == fOverMode) {

Pierre-Alain Loizeau
committed
/// Update reference detector
fRefDet.fuStartIndex = fRefDet.fuEndIndex;
/// Loop on selection detectors
for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin();
det != fvDets.end();
++det) {

Pierre-Alain Loizeau
committed
(*det).fuStartIndex = (*det).fuEndIndex;
} // for( std::vector< EventBuilderDetector >::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 CbmMcbm2019TimeWinEventBuilderAlgo::SearchMatches(
Double_t dSeedTime,
EventBuilderDetector& detMatch) {
/// This algo relies on time sorted vectors for the selected detectors

Pierre-Alain Loizeau
committed
UInt_t uLocalIndexStart = detMatch.fuStartIndex;
UInt_t uLocalIndexEnd = detMatch.fuStartIndex;
/// Check the Digis until out of window
if (ECbmModuleId::kT0 == detMatch.detId) {

Pierre-Alain Loizeau
committed
if (fT0DigiVec) {

Pierre-Alain Loizeau
committed
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();

Pierre-Alain Loizeau
committed
Double_t dTimeDiff = dTime - dSeedTime;

Pierre-Alain Loizeau
committed
/// 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 )

Pierre-Alain Loizeau
committed
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) << "CbmMcbm2019TimeWinEventBuilderAlgo::SearchMatches => "
<< "T0 as selection detector but vector not found!";
} // if( ECbmModuleId::kT0 == detMatch.detId )
else {
UInt_t uNbSelDigis = (0 < fDigiMan->GetNofDigis(detMatch.detId)
? fDigiMan->GetNofDigis(detMatch.detId)
: 0);

Pierre-Alain Loizeau
committed
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
/// Loop on size of vector
for (UInt_t uDigi = detMatch.fuStartIndex; uDigi < uNbSelDigis; ++uDigi) {
const DigiCheck* pDigi = fDigiMan->Get<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 )
/// 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
/// Update the StartIndex and EndIndex for the next event seed

Pierre-Alain Loizeau
committed
detMatch.fuStartIndex = uLocalIndexStart;
detMatch.fuEndIndex = uLocalIndexEnd;
void CbmMcbm2019TimeWinEventBuilderAlgo::AddDigiToEvent(
EventBuilderDetector& det,
Int_t _entry) {
fCurrentEvent->AddData(det.dataType, _entry);
Bool_t CbmMcbm2019TimeWinEventBuilderAlgo::HasTrigger(CbmEvent* event) {

Pierre-Alain Loizeau
committed
/// Check first reference detector
if (kFALSE == CheckTriggerConditions(event, fRefDet)) {
} // if (kFALSE == CheckTriggerConditions(event, fRefDet) )

Pierre-Alain Loizeau
committed
/// Loop on selection detectors
for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin();
det != fvDets.end();
++det) {
if (kFALSE == CheckTriggerConditions(event, *det)) return kFALSE;

Pierre-Alain Loizeau
committed
} // for( std::vector< EventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )

Pierre-Alain Loizeau
committed
/// All Ok, trigger is there
return kTRUE;
}
Bool_t CbmMcbm2019TimeWinEventBuilderAlgo::CheckTriggerConditions(
CbmEvent* event,
EventBuilderDetector& det) {
/// Check if both Trigger conditions disabled for this detector

Pierre-Alain Loizeau
committed
if (0 == det.fuTriggerMinDigis && det.fiTriggerMaxDigis < 0) {

Pierre-Alain Loizeau
committed
} // if( 0 == det.fuTriggerMinDigis && det.fiTriggerMaxDigis < 0 )
/// Check if detector present

Pierre-Alain Loizeau
committed
if (ECbmModuleId::kT0 == det.detId) {
/// FIXME: special case to be removed once T0 supported by DigiManager
if (!(fT0DigiVec)) {
LOG(warning) << "Event does not have digis storage for T0"

Pierre-Alain Loizeau
committed
<< " while the following trigger minimum are defined: "
<< det.fuTriggerMinDigis << " " << det.fiTriggerMaxDigis;

Pierre-Alain Loizeau
committed
} // if( ECbmDataType::kT0Digi == det.detId )

Pierre-Alain Loizeau
committed
if (!fDigiMan->IsPresent(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;
} // if( !fDigiMan->IsPresent( det ) )
} // else of if( ECbmDataType::kT0Digi == det )
/// Check Minimal trigger acceptance by minimal number

Pierre-Alain Loizeau
committed
Int_t iNbDigis = event->GetNofData(det.dataType);
if ((-1 != iNbDigis)
&& (det.fuTriggerMinDigis <= static_cast<UInt_t>(iNbDigis))) {

Pierre-Alain Loizeau
committed
} // if( ( -1 != iNbDigis ) && ( det.fuTriggerMinDigis <= static_cast< UInt_t >( iNbDigis ) )
else {
LOG(debug2) << "Event does not have enough digis: " << iNbDigis << " vs "

Pierre-Alain Loizeau
committed
<< det.fuTriggerMinDigis << " for " << det.sName;

Pierre-Alain Loizeau
committed
} // else of if( ( -1 != iNbDigis ) && ( det.fuTriggerMinDigis <= static_cast< UInt_t >( iNbDigis ) )
/// Check trigger rejection by maximal number

Pierre-Alain Loizeau
committed
if (iNbDigis < det.fiTriggerMaxDigis) {

Pierre-Alain Loizeau
committed
} // if( iNbDigis < det.fiTriggerMaxDigis )
else {
LOG(debug2) << "Event Has too many digis: " << iNbDigis << " vs "

Pierre-Alain Loizeau
committed
<< det.fiTriggerMaxDigis << " for " << det.sName;

Pierre-Alain Loizeau
committed
} // else of if( iNbDigis < det.fiTriggerMaxDigis )
}
//----------------------------------------------------------------------
void CbmMcbm2019TimeWinEventBuilderAlgo::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);

Pierre-Alain Loizeau
committed
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);

Pierre-Alain Loizeau
committed
/// Loop on selection detectors
for (std::vector< EventBuilderDetector >::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 );
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< EventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
AddHistoToVector(fhEventTime, "evtbuild");
AddHistoToVector(fhEventDt, "evtbuild");
AddHistoToVector(fhEventSize, "evtbuild");
AddHistoToVector(fhNbDigiPerEvtTime, "evtbuild");

Pierre-Alain Loizeau
committed
for (std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin();
itHist != fvhNbDigiPerEvtTimeDet.end();
++itHist) {
if( nullptr == (*itHist) )
AddHistoToVector((*itHist), "evtbuild");
} // for( std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); itHist != fvhNbDigiPerEvtTimeDet.end(); ++itHist )
/// FIXME: Re-enable clang formatting after histograms declaration
/* clang-format on */
void CbmMcbm2019TimeWinEventBuilderAlgo::FillHistos() {
for (CbmEvent* evt : fEventVector) {
fhEventTime->Fill(evt->GetStartTime() * 1e-9);
if (0.0 <= dPreEvtTime) {
fhEventDt->Fill(evt->GetStartTime() - dPreEvtTime);
} // if( 0.0 <= dPreEvtTime )
fhEventSize->Fill(evt->GetNofData());
fhNbDigiPerEvtTime->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData());

Pierre-Alain Loizeau
committed
/// Loop on selection detectors
for (UInt_t uDetIdx = 0; uDetIdx < fvDets.size(); ++uDetIdx) {
if (nullptr == fvhNbDigiPerEvtTimeDet[uDetIdx]) continue;

Pierre-Alain Loizeau
committed
fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(
evt->GetStartTime() * 1e-9, evt->GetNofData(fvDets[uDetIdx].dataType));

Pierre-Alain Loizeau
committed
} // for( std::vector< EventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
dPreEvtTime = evt->GetStartTime();
void CbmMcbm2019TimeWinEventBuilderAlgo::ResetHistograms(
Bool_t /*bResetTime*/) {
fhEventTime->Reset();
fhEventDt->Reset();
fhEventSize->Reset();

Pierre-Alain Loizeau
committed

Pierre-Alain Loizeau
committed
/// Loop on histograms
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 CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector(
ECbmModuleId refDet,
ECbmDataType dataTypeIn,
std::string sNameIn,
UInt_t uTriggerMinDigisIn,
Int_t iTriggerMaxDigisIn,
Double_t fdTimeWinBegIn,
Double_t fdTimeWinEndIn) {

Pierre-Alain Loizeau
committed
/// FIXME: Deprecated method to be removed later. For now create temp object.
SetReferenceDetector(EventBuilderDetector(refDet,
dataTypeIn,
sNameIn,
uTriggerMinDigisIn,
iTriggerMaxDigisIn,
fdTimeWinBegIn,

Pierre-Alain Loizeau
committed
void CbmMcbm2019TimeWinEventBuilderAlgo::AddDetector(ECbmModuleId selDet,
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.
AddDetector(EventBuilderDetector(selDet,
dataTypeIn,
sNameIn,
uTriggerMinDigisIn,
iTriggerMaxDigisIn,
fdTimeWinBegIn,
fdTimeWinEndIn));
}
//----------------------------------------------------------------------
void CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector(
ECbmModuleId refDet) {

Pierre-Alain Loizeau
committed
switch (refDet) {
SetReferenceDetector(kEventBuilderDetSts);

Pierre-Alain Loizeau
committed
} // case ECbmModuleId::kSts:
SetReferenceDetector(kEventBuilderDetMuch);

Pierre-Alain Loizeau
committed
} // case ECbmModuleId::kMuch:
SetReferenceDetector(kEventBuilderDetTrd);

Pierre-Alain Loizeau
committed
} // case ECbmModuleId::kTrd:
SetReferenceDetector(kEventBuilderDetTof);

Pierre-Alain Loizeau
committed
} // case ECbmModuleId::kTof:
case ECbmModuleId::kRich: {
SetReferenceDetector(kEventBuilderDetRich);

Pierre-Alain Loizeau
committed
break;
} // case ECbmModuleId::kRich:
SetReferenceDetector(kEventBuilderDetPsd);

Pierre-Alain Loizeau
committed
} // case ECbmModuleId::kPsd:
SetReferenceDetector(kEventBuilderDetT0);

Pierre-Alain Loizeau
committed
} // case ECbmModuleId::kT0:
LOG(fatal)
<< "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => "
<< "Trying to change reference to unsupported det: " << refDet
<< std::endl
<< "This method is deprecated and will be removed soon, "
<< "please use the full version of it.";

Pierre-Alain Loizeau
committed
} // default:
} // switch( refDet )
LOG(warning)
<< "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => "
<< "Changing reference detector with deprecated method to: "
<< fRefDet.sName << std::endl
<< "This method is deprecated, does not set all parameters "
<< "and will be removed soon, please use the full version of it.";
void CbmMcbm2019TimeWinEventBuilderAlgo::AddDetector(ECbmModuleId selDet) {
AddDetector(kEventBuilderDetSts);

Pierre-Alain Loizeau
committed
} // case ECbmModuleId::kSts:
AddDetector(kEventBuilderDetMuch);

Pierre-Alain Loizeau
committed
} // case ECbmModuleId::kMuch:
AddDetector(kEventBuilderDetTrd);

Pierre-Alain Loizeau
committed
} // case ECbmModuleId::kTrd:
AddDetector(kEventBuilderDetTof);

Pierre-Alain Loizeau
committed
} // case ECbmModuleId::kTof:
case ECbmModuleId::kRich: {
AddDetector(kEventBuilderDetRich);

Pierre-Alain Loizeau
committed
break;
} // case ECbmModuleId::kRich:
AddDetector(kEventBuilderDetPsd);

Pierre-Alain Loizeau
committed
} // case ECbmModuleId::kPsd:
AddDetector(kEventBuilderDetT0);

Pierre-Alain Loizeau
committed
} // case ECbmModuleId::kT0:

Pierre-Alain Loizeau
committed
LOG(fatal) << "CbmMcbm2019TimeWinEventBuilderAlgo::AddDetector => "
<< "Trying to change reference to unsupported det: " << selDet

Pierre-Alain Loizeau
committed
<< std::endl
<< "This method is deprecated and will be removed soon, "
<< "please use the full version of it.";

Pierre-Alain Loizeau
committed
} // default:
} // switch( selDet )
LOG(warning)
<< "CbmMcbm2019TimeWinEventBuilderAlgo::AddDetector => "
<< "Changing reference detector with deprecated method for: " << selDet
<< std::endl
<< "This method is deprecated, does not set all parameters "
<< "and will be removed soon, please use the full version of it.";

Pierre-Alain Loizeau
committed
}
void CbmMcbm2019TimeWinEventBuilderAlgo::RemoveDetector(ECbmModuleId selDet) {

Pierre-Alain Loizeau
committed
/// Loop on selection detectors
for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin();
det != fvDets.end();
++det) {

Pierre-Alain Loizeau
committed
if ((*det).detId == selDet) {
fvDets.erase(det);
return;
} // if( (*det).detId == selDet )
} // for( std::vector< EventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
LOG(warning) << "CbmMcbm2019TimeWinEventBuilderAlgo::RemoveDetector => Doing "
"nothing, selection detector not in list!"
<< selDet;
}
//----------------------------------------------------------------------
void CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector(
EventBuilderDetector refDetIn) {
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
/// Loop on selection detectors
for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin();
det != fvDets.end();
++det) {
if ((*det) == refDetIn) {
LOG(warning)
<< "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => "
"Reference detector already in selection detector list!"
<< refDetIn.sName;
LOG(warning)
<< " => "
"It will be automatically removed from selection detector list!";
LOG(warning)
<< " => "
"Please also remember to update the selection windows to store "
"clusters!";
RemoveDetector(refDetIn);
} // if( (*det) == refDetIn )
} // for( std::vector< EventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
if (fRefDet == refDetIn) {
LOG(warning)
<< "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => "
"Doing nothing, identical reference detector already in use";
} // if( fRefDet == refDetIn )
else {
LOG(info) << "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => "
<< "Replacing " << fRefDet.sName << " with " << refDetIn.sName
<< " as reference detector";
LOG(warning)
<< " => "
"You may want to use AddDetector after this command to add in "
"selection "
<< 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
UpdateTimeWinBoundariesExtrema();
/// Update the variable storing the size if widest time window for overlap detection
UpdateWidestTimeWinRange();
}
void CbmMcbm2019TimeWinEventBuilderAlgo::AddDetector(
EventBuilderDetector selDet) {
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
if (fRefDet == selDet) {
LOG(fatal) << "CbmMcbm2019TimeWinEventBuilderAlgo::AddDetector => Cannot "
"add the reference detector as selection detector!"
<< std::endl
<< "=> Maybe first change the reference detector with "
"SetReferenceDetector?";
} // if( fRefDet == selDet )
/// Loop on selection detectors
for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin();
det != fvDets.end();
++det) {
if ((*det) == selDet) {
LOG(warning) << "CbmMcbm2019TimeWinEventBuilderAlgo::AddDetector => "
"Doing nothing, selection detector already in list!"
<< selDet.sName;
return;
} // if( (*det) == selDet )
} // for( std::vector< EventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
fvDets.push_back(selDet);
/// 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 CbmMcbm2019TimeWinEventBuilderAlgo::RemoveDetector(
EventBuilderDetector selDet) {
/// Loop on selection detectors
for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin();
det != fvDets.end();
++det) {
if ((*det) == selDet) {
fvDets.erase(det);
return;
} // if( (*det) == selDet )
} // for( std::vector< EventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
LOG(warning) << "CbmMcbm2019TimeWinEventBuilderAlgo::RemoveDetector => Doing "
"nothing, selection detector not in list!"
<< selDet.sName;
}
//----------------------------------------------------------------------
void CbmMcbm2019TimeWinEventBuilderAlgo::SetTriggerMinNumber(
ECbmModuleId selDet,
UInt_t uVal) {

Pierre-Alain Loizeau
committed
/// Check first if reference detector
if (fRefDet.detId == selDet) {
fRefDet.fuTriggerMinDigis = uVal;
LOG(debug) << "Set Trigger min limit for " << fRefDet.sName << " to "
<< uVal;

Pierre-Alain Loizeau
committed
return;
} // if( fRefDet == selDet )
/// Loop on selection detectors
for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin();
det != fvDets.end();
++det) {

Pierre-Alain Loizeau
committed
if ((*det).detId == selDet) {
(*det).fuTriggerMinDigis = uVal;
LOG(debug) << "Set Trigger min limit for " << (*det).sName << " to "
<< uVal;

Pierre-Alain Loizeau
committed
return;
} // if( (*det).detId == selDet )
} // for( std::vector< EventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
LOG(warning)
<< "CbmMcbm2019TimeWinEventBuilderAlgo::SetTriggerMinNumber => "
"Doing nothing, detector neither reference nor in selection list!"
<< selDet;
void CbmMcbm2019TimeWinEventBuilderAlgo::SetTriggerMaxNumber(
ECbmModuleId selDet,
Int_t iVal) {

Pierre-Alain Loizeau
committed
/// Check first if reference detector
if (fRefDet.detId == selDet) {
fRefDet.fiTriggerMaxDigis = iVal;
LOG(debug) << "Set Trigger min limit for " << fRefDet.sName << " to "
<< iVal;

Pierre-Alain Loizeau
committed
return;
} // if( fRefDet == selDet )
/// Loop on selection detectors
for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin();
det != fvDets.end();
++det) {

Pierre-Alain Loizeau
committed
if ((*det).detId == selDet) {
(*det).fiTriggerMaxDigis = iVal;
LOG(debug) << "Set Trigger min limit for " << (*det).sName << " to "
<< iVal;

Pierre-Alain Loizeau
committed
return;
} // if( (*det).detId == selDet )
} // for( std::vector< EventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
LOG(warning)