From efc469ed67acb50ebb9f83a7ad538975ec871fc5 Mon Sep 17 00:00:00 2001
From: P-A Loizeau <p.-a.loizeau@gsi.de>
Date: Tue, 21 Jul 2020 18:01:17 +0200
Subject: [PATCH] mCBM 2020: improve time window event builder algo interface

- Add predefined EventBuilderDetector constants for each of the typical detectors
- Add interface methods taking EventBuilderDetector object as parameter
- Make all other interface methods use the EventBuilderDetector one
- Mark the methods using only ECbmModuleId as deprecated
- Update MQ device accordingly
- Disable clang-formatting in Init method of MQ device
---
 MQ/mcbm/CbmDeviceMcbmEventBuilderWin.cxx      | 162 ++++++-------
 .../CbmMcbm2019TimeWinEventBuilderAlgo.cxx    | 214 ++++++++++--------
 .../CbmMcbm2019TimeWinEventBuilderAlgo.h      |  48 +++-
 .../CbmMcbm2019TimeWinEventBuilderTask.cxx    |  11 +
 .../CbmMcbm2019TimeWinEventBuilderTask.h      |  10 +-
 5 files changed, 251 insertions(+), 194 deletions(-)

diff --git a/MQ/mcbm/CbmDeviceMcbmEventBuilderWin.cxx b/MQ/mcbm/CbmDeviceMcbmEventBuilderWin.cxx
index 78640c58..cb9641ab 100644
--- a/MQ/mcbm/CbmDeviceMcbmEventBuilderWin.cxx
+++ b/MQ/mcbm/CbmDeviceMcbmEventBuilderWin.cxx
@@ -98,96 +98,81 @@ void CbmDeviceMcbmEventBuilderWin::InitTask() try {
 
   //   InitContainers();
 
+  /// FIXME: Disable clang formatting for now as it corrupts all alignment
+  /* clang-format off */
+
   /// Initialize the Algorithm parameters
   fpAlgo->SetFillHistos(fbFillHistos);
   fpAlgo->SetIgnoreTsOverlap(fbIgnoreTsOverlap);
   /// Extract Event Overlap Mode
   EOverlapMode mode =
-    ("NoOverlap" == fsEvtOverMode
-       ? EOverlapMode::NoOverlap
-       : ("MergeOverlap" == fsEvtOverMode
-            ? EOverlapMode::MergeOverlap
-            : ("AllowOverlap" == fsEvtOverMode ? EOverlapMode::AllowOverlap
-                                               : EOverlapMode::NoOverlap)));
+     ("NoOverlap"    == fsEvtOverMode ? EOverlapMode::NoOverlap
+   : ("MergeOverlap" == fsEvtOverMode ? EOverlapMode::MergeOverlap
+   : ("AllowOverlap" == fsEvtOverMode ? EOverlapMode::AllowOverlap
+                                      : EOverlapMode::NoOverlap)));
   fpAlgo->SetEventOverlapMode(mode);
   /// Extract refdet
-  ECbmModuleId refDet =
-    ("kT0" == fsRefDet
-       ? ECbmModuleId::kT0
-       : ("kSts" == fsRefDet
-            ? ECbmModuleId::kSts
-            : ("kMuch" == fsRefDet
-                 ? ECbmModuleId::kMuch
-                 : ("kTrd" == fsRefDet
-                      ? ECbmModuleId::kTrd
-                      : ("kTof" == fsRefDet
-                           ? ECbmModuleId::kTof
-                           : ("kRich" == fsRefDet
-                                ? ECbmModuleId::kRich
-                                : ("kPsd" == fsRefDet
-                                     ? ECbmModuleId::kPsd
-                                     : ECbmModuleId::kNotExist)))))));
-
-  fpAlgo->SetReferenceDetector(refDet);
+  EventBuilderDetector refDet = ("kT0"   == fsRefDet ? kEventBuilderDetT0
+                              : ("kSts"  == fsRefDet ? kEventBuilderDetMuch
+                              : ("kMuch" == fsRefDet ? kEventBuilderDetTrd
+                              : ("kTrd"  == fsRefDet ? kEventBuilderDetTrd
+                              : ("kTof"  == fsRefDet ? kEventBuilderDetTof
+                              : ("kRich" == fsRefDet ? kEventBuilderDetRich
+                              : ("kPsd"  == fsRefDet ? kEventBuilderDetPsd
+                                                     : kEventBuilderDetUndef)))))));
+  if (kEventBuilderDetUndef != refDet) {
+    fpAlgo->SetReferenceDetector(refDet);
+  }  // if( kEventBuilderDetUndef != refDet )
+  else {
+    LOG(info) << "CbmDeviceMcbmEventBuilderWin::InitTask => Trying to change "
+                 "reference to unsupported detector, ignored! "
+              << fsRefDet;
+  }  // else of if( kEventBuilderDetUndef != refDet
+
   /// Extract detector to add if any
   for (std::vector<std::string>::iterator itStrAdd = fvsAddDet.begin();
        itStrAdd != fvsAddDet.end();
        ++itStrAdd) {
-    ECbmModuleId addDet =
-      ("kT0" == *itStrAdd
-         ? ECbmModuleId::kT0
-         : ("kSts" == *itStrAdd
-              ? ECbmModuleId::kSts
-              : ("kMuch" == *itStrAdd
-                   ? ECbmModuleId::kMuch
-                   : ("kTrd" == *itStrAdd
-                        ? ECbmModuleId::kTrd
-                        : ("kTof" == *itStrAdd
-                             ? ECbmModuleId::kTof
-                             : ("kRich" == *itStrAdd
-                                  ? ECbmModuleId::kRich
-                                  : ("kPsd" == *itStrAdd
-                                       ? ECbmModuleId::kPsd
-                                       : ECbmModuleId::kNotExist)))))));
-    if (ECbmModuleId::kNotExist != addDet) {
+    EventBuilderDetector addDet = ("kT0"   == *itStrAdd ? kEventBuilderDetT0
+                                : ("kSts"  == *itStrAdd ? kEventBuilderDetSts
+                                : ("kMuch" == *itStrAdd ? kEventBuilderDetMuch
+                                : ("kTrd"  == *itStrAdd ? kEventBuilderDetTrd
+                                : ("kTof"  == *itStrAdd ? kEventBuilderDetTof
+                                : ("kRich" == *itStrAdd ? kEventBuilderDetRich
+                                : ("kPsd"  == *itStrAdd ? kEventBuilderDetPsd
+                                                        : kEventBuilderDetUndef)))))));
+    if (kEventBuilderDetUndef != addDet) {
       fpAlgo->AddDetector(addDet);
-    }  // if(  ECbmModuleId::kNotExist != addDet )
+    }  // if( kEventBuilderDetUndef != addDet )
     else {
       LOG(info) << "CbmDeviceMcbmEventBuilderWin::InitTask => Trying to add "
                    "unsupported detector, ignored! "
                 << (*itStrAdd);
       continue;
-    }  // else of if(  ECbmModuleId::kNotExist != addDet
+    }  // else of if( kEventBuilderDetUndef != addDet )
   }  // for( std::vector< std::string >::iterator itStrAdd = fvsAddDet.begin(); itStrAdd != fvsAddDet.end(); ++itStrAdd )
-     /// Extract detector to add if any
+
+     /// Extract detector to remove if any
   for (std::vector<std::string>::iterator itStrRem = fvsDelDet.begin();
        itStrRem != fvsDelDet.end();
        ++itStrRem) {
-    ECbmModuleId remDet =
-      ("kT0" == *itStrRem
-         ? ECbmModuleId::kT0
-         : ("kSts" == *itStrRem
-              ? ECbmModuleId::kSts
-              : ("kMuch" == *itStrRem
-                   ? ECbmModuleId::kMuch
-                   : ("kTrd" == *itStrRem
-                        ? ECbmModuleId::kTrd
-                        : ("kTof" == *itStrRem
-                             ? ECbmModuleId::kTof
-                             : ("kRich" == *itStrRem
-                                  ? ECbmModuleId::kRich
-                                  : ("kPsd" == *itStrRem
-                                       ? ECbmModuleId::kPsd
-                                       : ECbmModuleId::kNotExist)))))));
-    if (ECbmModuleId::kNotExist != remDet) {
+    EventBuilderDetector remDet = ("kT0"   == *itStrRem ? kEventBuilderDetT0
+                                : ("kSts"  == *itStrRem ? kEventBuilderDetSts
+                                : ("kMuch" == *itStrRem ? kEventBuilderDetMuch
+                                : ("kTrd"  == *itStrRem ? kEventBuilderDetTrd
+                                : ("kTof"  == *itStrRem ? kEventBuilderDetTof
+                                : ("kRich" == *itStrRem ? kEventBuilderDetRich
+                                : ("kPsd"  == *itStrRem ? kEventBuilderDetPsd
+                                                        : kEventBuilderDetUndef)))))));
+    if (kEventBuilderDetUndef != remDet) {
       fpAlgo->RemoveDetector(remDet);
-    }  // if(  ECbmModuleId::kNotExist != remDet )
+    }  // if( kEventBuilderDetUndef != remDet )
     else {
       LOG(info) << "CbmDeviceMcbmEventBuilderWin::InitTask => Trying to remove "
                    "unsupported detector, ignored! "
                 << (*itStrRem);
       continue;
-    }  // else of if(  ECbmModuleId::kNotExist != remDet )
+    }  // else of if( kEventBuilderDetUndef != remDet )
   }  // for( std::vector< std::string >::iterator itStrAdd = fvsAddDet.begin(); itStrAdd != fvsAddDet.end(); ++itStrAdd )
      /// Extract Trigger window to add if any
   for (std::vector<std::string>::iterator itStrTrigWin = fvsSetTrigWin.begin();
@@ -205,22 +190,14 @@ void CbmDeviceMcbmEventBuilderWin::InitTask() try {
 
     /// Detector Enum Tag
     std::string sSelDet = (*itStrTrigWin).substr(0, charPosDel);
-    ECbmModuleId selDet =
-      ("kT0" == sSelDet
-         ? ECbmModuleId::kT0
-         : ("kSts" == sSelDet
-              ? ECbmModuleId::kSts
-              : ("kMuch" == sSelDet
-                   ? ECbmModuleId::kMuch
-                   : ("kTrd" == sSelDet
-                        ? ECbmModuleId::kTrd
-                        : ("kTof" == sSelDet
-                             ? ECbmModuleId::kTof
-                             : ("kRich" == sSelDet
-                                  ? ECbmModuleId::kRich
-                                  : ("kPsd" == sSelDet
-                                       ? ECbmModuleId::kPsd
-                                       : ECbmModuleId::kNotExist)))))));
+    ECbmModuleId selDet = ("kT0"   == sSelDet ? ECbmModuleId::kT0
+                        : ("kSts"  == sSelDet ? ECbmModuleId::kSts
+                        : ("kMuch" == sSelDet ? ECbmModuleId::kMuch
+                        : ("kTrd"  == sSelDet ? ECbmModuleId::kTrd
+                        : ("kTof"  == sSelDet ? ECbmModuleId::kTof
+                        : ("kRich" == sSelDet ? ECbmModuleId::kRich
+                        : ("kPsd"  == sSelDet ? ECbmModuleId::kPsd
+                                              : ECbmModuleId::kNotExist)))))));
     if (ECbmModuleId::kNotExist == selDet) {
       LOG(info)
         << "CbmDeviceMcbmEventBuilderWin::InitTask => "
@@ -265,22 +242,14 @@ void CbmDeviceMcbmEventBuilderWin::InitTask() try {
 
     /// Detector Enum Tag
     std::string sSelDet = (*itStrMinNb).substr(0, charPosDel);
-    ECbmModuleId selDet =
-      ("kT0" == sSelDet
-         ? ECbmModuleId::kT0
-         : ("kSts" == sSelDet
-              ? ECbmModuleId::kSts
-              : ("kMuch" == sSelDet
-                   ? ECbmModuleId::kMuch
-                   : ("kTrd" == sSelDet
-                        ? ECbmModuleId::kTrd
-                        : ("kTof" == sSelDet
-                             ? ECbmModuleId::kTof
-                             : ("kRich" == sSelDet
-                                  ? ECbmModuleId::kRich
-                                  : ("kPsd" == sSelDet
-                                       ? ECbmModuleId::kPsd
-                                       : ECbmModuleId::kNotExist)))))));
+    ECbmModuleId selDet = ("kT0"   == sSelDet ? ECbmModuleId::kT0
+                        : ("kSts"  == sSelDet ? ECbmModuleId::kSts
+                        : ("kMuch" == sSelDet ? ECbmModuleId::kMuch
+                        : ("kTrd"  == sSelDet ? ECbmModuleId::kTrd
+                        : ("kTof"  == sSelDet ? ECbmModuleId::kTof
+                        : ("kRich" == sSelDet ? ECbmModuleId::kRich
+                        : ("kPsd"  == sSelDet ? ECbmModuleId::kPsd
+                                              : ECbmModuleId::kNotExist)))))));
     if (ECbmModuleId::kNotExist == selDet) {
       LOG(info)
         << "CbmDeviceMcbmEventBuilderWin::InitTask => "
@@ -296,6 +265,9 @@ void CbmDeviceMcbmEventBuilderWin::InitTask() try {
     fpAlgo->SetTriggerMinNumber(selDet, uMinNb);
   }  //    for( std::vector< std::string >::iterator itStrMinNb = fvsSetTrigMinNb.begin(); itStrMinNb != fvsSetTrigMinNb.end(); ++itStrMinNb )
 
+  /// FIXME: Re-enable clang formatting after formatted lines
+  /* clang-format on */
+
   /// Create input vectors
   fvDigiT0   = new std::vector<CbmTofDigi>();
   fvDigiSts  = new std::vector<CbmStsDigi>();
diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx
index 6c13b12a..aed78fbf 100644
--- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx
+++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx
@@ -707,56 +707,15 @@ void CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector(
   Int_t iTriggerMaxDigisIn,
   Double_t fdTimeWinBegIn,
   Double_t fdTimeWinEndIn) {
-  /// Loop on selection detectors
-  for (std::vector<EventBuilderDetector>::iterator det = fvDets.begin();
-       det != fvDets.end();
-       ++det) {
-    if ((*det).detId == refDet) {
-      LOG(warning)
-        << "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => "
-           "Reference detector already in selection detector list!"
-        << sNameIn;
-      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(refDet);
-    }  // if( (*det).detId  == selDet )
-  }  // for( std::vector< EventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
 
-  if (fRefDet.detId == refDet) {
-    LOG(warning)
-      << "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => "
-         "Doing nothing, identical reference detector already in use";
-  }  // if( fRefDet.detId == refDet )
-  else {
-    LOG(info) << "CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector => "
-              << "Replacing " << fRefDet.sName << " with " << sNameIn
-              << " as reference detector";
-    LOG(warning)
-      << "                                                         => "
-         "You may want to use AddDetector after this command to add in "
-         "selection "
-      << fRefDet.sName;
-    LOG(warning)
-      << "                                                         => "
-         "Please also remember to update the selection windows!";
-  }  // else of if( fRefDet == refDet )
-  fRefDet = EventBuilderDetector(refDet,
-                                 dataTypeIn,
-                                 sNameIn,
-                                 uTriggerMinDigisIn,
-                                 iTriggerMaxDigisIn,
-                                 fdTimeWinBegIn,
-                                 fdTimeWinEndIn);
-
-  /// 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();
+  /// FIXME: Deprecated method to be removed later. For now create temp object.
+  SetReferenceDetector(EventBuilderDetector(refDet,
+                                            dataTypeIn,
+                                            sNameIn,
+                                            uTriggerMinDigisIn,
+                                            iTriggerMaxDigisIn,
+                                            fdTimeWinBegIn,
+                                            fdTimeWinEndIn) );
 }
 void CbmMcbm2019TimeWinEventBuilderAlgo::AddDetector(ECbmModuleId selDet,
                                                      ECbmDataType dataTypeIn,
@@ -765,68 +724,46 @@ void CbmMcbm2019TimeWinEventBuilderAlgo::AddDetector(ECbmModuleId selDet,
                                                      Int_t iTriggerMaxDigisIn,
                                                      Double_t fdTimeWinBegIn,
                                                      Double_t fdTimeWinEndIn) {
-  if (fRefDet.detId == 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).detId == selDet) {
-      LOG(warning) << "CbmMcbm2019TimeWinEventBuilderAlgo::AddDetector => "
-                      "Doing nothing, selection detector already in list!"
-                   << sNameIn;
-      return;
-    }  // if( (*det).detId  == selDet )
-  }  // for( std::vector< EventBuilderDetector >::iterator det = fvDets.begin(); det != fvDets.end(); ++det )
-  fvDets.push_back(EventBuilderDetector(selDet,
-                                        dataTypeIn,
-                                        sNameIn,
-                                        uTriggerMinDigisIn,
-                                        iTriggerMaxDigisIn,
-                                        fdTimeWinBegIn,
-                                        fdTimeWinEndIn));
-
-  /// 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();
+  /// 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) {
   switch (refDet) {
     case ECbmModuleId::kSts: {
-      SetReferenceDetector(refDet, ECbmDataType::kStsDigi, "Sts");
+      SetReferenceDetector(kEventBuilderDetSts);
       break;
     }  // case ECbmModuleId::kSts:
     case ECbmModuleId::kMuch: {
-      SetReferenceDetector(refDet, ECbmDataType::kMuchDigi, "Mush");
+      SetReferenceDetector(kEventBuilderDetMuch);
       break;
     }  // case ECbmModuleId::kMuch:
     case ECbmModuleId::kTrd: {
-      SetReferenceDetector(refDet, ECbmDataType::kTrdDigi, "Trd");
+      SetReferenceDetector(kEventBuilderDetTrd);
       break;
     }  // case ECbmModuleId::kTrd:
     case ECbmModuleId::kTof: {
-      SetReferenceDetector(refDet, ECbmDataType::kTofDigi, "Tof");
+      SetReferenceDetector(kEventBuilderDetTof);
       break;
     }  // case ECbmModuleId::kTof:
     case ECbmModuleId::kRich: {
-      SetReferenceDetector(refDet, ECbmDataType::kRichDigi, "Rich");
+      SetReferenceDetector(kEventBuilderDetRich);
       break;
     }  // case ECbmModuleId::kRich:
     case ECbmModuleId::kPsd: {
-      SetReferenceDetector(refDet, ECbmDataType::kPsdDigi, "Psd");
+      SetReferenceDetector(kEventBuilderDetPsd);
       break;
     }  // case ECbmModuleId::kPsd:
     case ECbmModuleId::kT0: {
-      SetReferenceDetector(refDet, ECbmDataType::kT0Digi, "T0");
+      SetReferenceDetector(kEventBuilderDetT0);
       break;
     }  // case ECbmModuleId::kT0:
     default: {
@@ -850,31 +787,31 @@ void CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector(
 void CbmMcbm2019TimeWinEventBuilderAlgo::AddDetector(ECbmModuleId selDet) {
   switch (selDet) {
     case ECbmModuleId::kSts: {
-      AddDetector(selDet, ECbmDataType::kStsDigi, "Sts");
+      AddDetector(kEventBuilderDetSts);
       break;
     }  // case ECbmModuleId::kSts:
     case ECbmModuleId::kMuch: {
-      AddDetector(selDet, ECbmDataType::kMuchDigi, "Mush");
+      AddDetector(kEventBuilderDetMuch);
       break;
     }  // case ECbmModuleId::kMuch:
     case ECbmModuleId::kTrd: {
-      AddDetector(selDet, ECbmDataType::kTrdDigi, "Trd");
+      AddDetector(kEventBuilderDetTrd);
       break;
     }  // case ECbmModuleId::kTrd:
     case ECbmModuleId::kTof: {
-      AddDetector(selDet, ECbmDataType::kTofDigi, "Tof");
+      AddDetector(kEventBuilderDetTof);
       break;
     }  // case ECbmModuleId::kTof:
     case ECbmModuleId::kRich: {
-      AddDetector(selDet, ECbmDataType::kRichDigi, "Rich");
+      AddDetector(kEventBuilderDetRich);
       break;
     }  // case ECbmModuleId::kRich:
     case ECbmModuleId::kPsd: {
-      AddDetector(selDet, ECbmDataType::kPsdDigi, "Psd");
+      AddDetector(kEventBuilderDetPsd);
       break;
     }  // case ECbmModuleId::kPsd:
     case ECbmModuleId::kT0: {
-      AddDetector(selDet, ECbmDataType::kT0Digi, "T0");
+      AddDetector(kEventBuilderDetT0);
       break;
     }  // case ECbmModuleId::kT0:
     default: {
@@ -910,6 +847,97 @@ void CbmMcbm2019TimeWinEventBuilderAlgo::RemoveDetector(ECbmModuleId selDet) {
                << selDet;
 }
 //----------------------------------------------------------------------
+void CbmMcbm2019TimeWinEventBuilderAlgo::SetReferenceDetector(EventBuilderDetector refDetIn)
+{
+  /// 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)
+{
+  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) {
diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h
index 11386540..8acbf864 100644
--- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h
+++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h
@@ -59,6 +59,13 @@ public:
     fdTimeWinEnd = fdTimeWinEndIn;
   }
 
+  bool operator ==(const EventBuilderDetector &other) const {
+    return (other.detId == this->detId);
+  }
+  bool operator !=(const EventBuilderDetector &other) const {
+    return (other.detId != this->detId);
+  }
+
   /// Settings
   ECbmModuleId detId    = ECbmModuleId::kNotExist;
   ECbmDataType dataType = ECbmDataType::kUnknown;
@@ -76,6 +83,37 @@ public:
   UInt_t fuEndIndex   = 0;
 };
 
+/// Pre-defined detector types
+static const EventBuilderDetector kEventBuilderDetSts  = EventBuilderDetector(
+                                            ECbmModuleId::kSts,
+                                            ECbmDataType::kStsDigi,
+                                            "Sts");
+static const EventBuilderDetector kEventBuilderDetMuch = EventBuilderDetector(
+                                            ECbmModuleId::kMuch,
+                                            ECbmDataType::kMuchDigi,
+                                             "Much");
+static const EventBuilderDetector kEventBuilderDetTrd  = EventBuilderDetector(
+                                            ECbmModuleId::kTrd,
+                                            ECbmDataType::kTrdDigi,
+                                            "Trd");
+static const EventBuilderDetector kEventBuilderDetTof  = EventBuilderDetector(
+                                            ECbmModuleId::kTof,
+                                            ECbmDataType::kTofDigi,
+                                            "Tof");
+static const EventBuilderDetector kEventBuilderDetRich = EventBuilderDetector(
+                                            ECbmModuleId::kRich,
+                                            ECbmDataType::kRichDigi,
+                                            "Rich");
+static const EventBuilderDetector kEventBuilderDetPsd  = EventBuilderDetector(
+                                            ECbmModuleId::kPsd,
+                                            ECbmDataType::kPsdDigi,
+                                            "Psd");
+static const EventBuilderDetector kEventBuilderDetT0   = EventBuilderDetector(
+                                            ECbmModuleId::kT0,
+                                            ECbmDataType::kT0Digi,
+                                            "T0");
+static const EventBuilderDetector kEventBuilderDetUndef = EventBuilderDetector();
+
 class CbmMcbm2019TimeWinEventBuilderAlgo {
 public:
   /** Default constructor **/
@@ -116,9 +154,13 @@ public:
                    Double_t fdTimeWinBegIn   = -100,
                    Double_t fdTimeWinEndIn   = 100);
 
-  void SetReferenceDetector(ECbmModuleId refDet);
-  void AddDetector(ECbmModuleId selDet);
-  void RemoveDetector(ECbmModuleId selDet);
+  void SetReferenceDetector(ECbmModuleId refDet) __attribute__ ((deprecated));
+  void AddDetector(ECbmModuleId selDet) __attribute__ ((deprecated));
+  void RemoveDetector(ECbmModuleId selDet) __attribute__ ((deprecated));
+
+  void SetReferenceDetector(EventBuilderDetector refDetIn);
+  void AddDetector(EventBuilderDetector selDet);
+  void RemoveDetector(EventBuilderDetector selDet);
 
   void SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal);
   void SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal);
diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx
index 82c2f600..aeb6c54e 100644
--- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx
+++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.cxx
@@ -150,6 +150,17 @@ void CbmMcbm2019TimeWinEventBuilderTask::RemoveDetector(ECbmModuleId selDet) {
   if (nullptr != fpAlgo) fpAlgo->RemoveDetector(selDet);
 }
 
+void CbmMcbm2019TimeWinEventBuilderTask::SetReferenceDetector(
+  EventBuilderDetector refDet) {
+  if (nullptr != fpAlgo) fpAlgo->SetReferenceDetector(refDet);
+}
+void CbmMcbm2019TimeWinEventBuilderTask::AddDetector(EventBuilderDetector selDet) {
+  if (nullptr != fpAlgo) fpAlgo->AddDetector(selDet);
+}
+void CbmMcbm2019TimeWinEventBuilderTask::RemoveDetector(EventBuilderDetector selDet) {
+  if (nullptr != fpAlgo) fpAlgo->RemoveDetector(selDet);
+}
+
 void CbmMcbm2019TimeWinEventBuilderTask::SetTriggerMinNumber(
   ECbmModuleId selDet,
   UInt_t uVal) {
diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h
index 6f7e6837..6c387fb7 100644
--- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h
+++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderTask.h
@@ -63,9 +63,13 @@ public:
   void SetFillHistos(Bool_t bFlag = kTRUE);
   void SetOutFilename(TString sNameIn);
 
-  void SetReferenceDetector(ECbmModuleId refDet);
-  void AddDetector(ECbmModuleId selDet);
-  void RemoveDetector(ECbmModuleId selDet);
+  void SetReferenceDetector(ECbmModuleId refDet) __attribute__ ((deprecated));
+  void AddDetector(ECbmModuleId selDet) __attribute__ ((deprecated));
+  void RemoveDetector(ECbmModuleId selDet) __attribute__ ((deprecated));
+
+  void SetReferenceDetector(EventBuilderDetector refDet);
+  void AddDetector(EventBuilderDetector selDet);
+  void RemoveDetector(EventBuilderDetector selDet);
 
   void SetTriggerMinNumber(ECbmModuleId selDet, UInt_t uVal);
   void SetTriggerMaxNumber(ECbmModuleId selDet, Int_t iVal);
-- 
GitLab