From 9ced96a17ae5abc5bfce52ea726cc0f23945eab2 Mon Sep 17 00:00:00 2001
From: P-A Loizeau <p.-a.loizeau@gsi.de>
Date: Thu, 23 Jul 2020 15:20:14 +0200
Subject: [PATCH] mCBM 2020: in time win evt builder, reject seeds if part of
 reference det cluster from previous seed

=> This should fix the problem that in AllowOverlap mode events where cloned/split due to the cluster size when using TOF as reference
=> a mean cluster size of <N> in the reference detector was leading to N events for each real seed in this mode!
---
 .../tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx    | 13 +++++++++----
 .../tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h      |  2 ++
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx
index 43d14bc8..42e076a4 100644
--- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx
+++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.cxx
@@ -291,7 +291,9 @@ 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
+  if (nullptr != fCurrentEvent
+      && (EOverlapMode::AllowOverlap != fOverMode
+          || dSeedTime - fdPrevEvtTime < fRefDet.GetTimeWinRange())
       && dSeedTime - fdPrevEvtTime < fdWidestTimeWinRange) {
     /// Within overlap range
     switch (fOverMode) {
@@ -306,11 +308,14 @@ void CbmMcbm2019TimeWinEventBuilderAlgo::CheckSeed(Double_t dSeedTime,
         break;
       }  // case EOverlapMode::MergeOverlap:
       case EOverlapMode::AllowOverlap: {
-        /// Not in Merge overlap mode => should have been catched before, nothing to do
+        /// 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 EOverlapMode::AllowOverlap:
     }    // switch( fOverMode )
-  }      // if( prev Event exists and overlap not allowed and 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
@@ -322,7 +327,7 @@ void CbmMcbm2019TimeWinEventBuilderAlgo::CheckSeed(Double_t dSeedTime,
       fuCurEv++;
     }  // if( nullptr != fCurrentEvent )
     fCurrentEvent = new CbmEvent(fuCurEv, dSeedTime, 0.);
-  }  // else of if( prev Event exists and overlap not allowed and overlap present )
+  }  // 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
diff --git a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h
index efe475a3..58dcf9b1 100644
--- a/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h
+++ b/fles/mcbm2018/tasks/CbmMcbm2019TimeWinEventBuilderAlgo.h
@@ -66,6 +66,8 @@ public:
     return (other.detId != this->detId);
   }
 
+  Double_t GetTimeWinRange() { return fdTimeWinEnd - fdTimeWinBeg; }
+
   /// Settings
   ECbmModuleId detId    = ECbmModuleId::kNotExist;
   ECbmDataType dataType = ECbmDataType::kUnknown;
-- 
GitLab