From a1f9621fb1dea8dbb74149eb8d3639edb21baf6a Mon Sep 17 00:00:00 2001
From: Maximilian Emanuel Goblirsch-Kolb <maximilian.goblirsch-kolb@cern.ch>
Date: Tue, 25 Aug 2020 15:52:48 +0000
Subject: [PATCH] update ID tracking cut level 18 to be more efficient in dense
 b-jets

---
 .../python/ConfiguredNewTrackingCuts.py       | 30 ++++++++++++-------
 .../share/ConfiguredNewTrackingSiPattern.py   | 11 ++++---
 .../SiSpacePointsSeedMakerEventData.h         |  2 ++
 .../SiSpacePointsSeedMaker_ATLxk.h            |  6 ++--
 .../src/SiSpacePointsSeedMaker_ATLxk.cxx      | 18 +++++++----
 .../PROCTools/data/master_q221_AOD_digest.ref |  2 +-
 .../PROCTools/data/master_q431_AOD_digest.ref | 18 +++++------
 7 files changed, 55 insertions(+), 32 deletions(-)

diff --git a/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredNewTrackingCuts.py b/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredNewTrackingCuts.py
index 1f2f6c6d287..574be9df2b4 100755
--- a/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredNewTrackingCuts.py
+++ b/InnerDetector/InDetExample/InDetRecExample/python/ConfiguredNewTrackingCuts.py
@@ -76,8 +76,10 @@ class ConfiguredNewTrackingCuts :
     self.__seedFilterLevel         = 1
     self.__maxdImpactPPSSeeds      = 1.7
     self.__maxdImpactSSSSeeds      = 1000.0
-    self.__maxSeedsPerSP           = 5
-    self.__keepAllConfirmedSeeds   = False
+    self.__maxSeedsPerSP_Pixels    = 5
+    self.__maxSeedsPerSP_Strips    = 5
+    self.__keepAllConfirmedPixelSeeds   = False
+    self.__keepAllConfirmedStripSeeds   = False
 
     # --- min pt cut for brem
     self.__minPTBrem               = 1. * Units.GeV # off
@@ -232,9 +234,9 @@ class ConfiguredNewTrackingCuts :
       # impact. Kept as separate level pending cross-check of 
       # seed confirmation robustness with end-of-run-3 radiation
       # damage. 
-      self.__keepAllConfirmedSeeds  = True
-      self.__maxSeedsPerSP          = 1
-
+      self.__keepAllConfirmedPixelSeeds  = True
+      self.__maxSeedsPerSP_Pixels          = 1
+      self.__maxSeedsPerSP_Strips          = 5
     
     if self.__indetflags.cutLevel() >= 19:
       # Calo cluster Et for RoI seeded backtracking for TRT segment finding
@@ -400,8 +402,8 @@ class ConfiguredNewTrackingCuts :
       self.__nWeightedClustersMin    = 8   
       self.__maxdImpactSSSSeeds      = 300.0
       self.__doZBoundary             = True
-      self.__keepAllConfirmedSeeds   = True
-      self.__maxSeedsPerSP           = 1
+      self.__keepAllConfirmedStripSeeds   = True
+      self.__maxSeedsPerSP_Strips    = 1
 
 
     # --- mode for high-d0 tracks down to 100 MeV (minPT, minClusters, minSecondaryPt cuts loosened to MinBias level)
@@ -1018,11 +1020,17 @@ class ConfiguredNewTrackingCuts :
   def RoadWidth( self ) :
     return self.__roadWidth
 
-  def MaxSeedsPerSP( self ) :
-    return self.__maxSeedsPerSP
+  def MaxSeedsPerSP_Strips( self ) :
+    return self.__maxSeedsPerSP_Strips
+
+  def MaxSeedsPerSP_Pixels( self ) :
+    return self.__maxSeedsPerSP_Pixels
+    
+  def KeepAllConfirmedPixelSeeds( self ) :
+    return self.__keepAllConfirmedPixelSeeds
     
-  def KeepAllConfirmedSeeds( self ) :
-    return self.__keepAllConfirmedSeeds
+  def KeepAllConfirmedStripSeeds( self ) :
+    return self.__keepAllConfirmedStripSeeds
 
   def seedFilterLevel( self ) :
     return self.__seedFilterLevel
diff --git a/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py b/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py
index a214edabc05..732e79c0f03 100644
--- a/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py
+++ b/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py
@@ -92,14 +92,17 @@ class  ConfiguredNewTrackingSiPattern:
          if NewTrackingCuts.mode() == "Offline" or InDetFlags.doHeavyIon() or  NewTrackingCuts.mode() == "ForwardTracks":
             InDetSiSpacePointsSeedMaker.maxdImpactPPS = NewTrackingCuts.maxdImpactPPSSeeds()
             InDetSiSpacePointsSeedMaker.maxdImpactSSS = NewTrackingCuts.maxdImpactSSSSeeds()
-            InDetSiSpacePointsSeedMaker.maxSeedsForSpacePoint = NewTrackingCuts.MaxSeedsPerSP()
-            InDetSiSpacePointsSeedMaker.alwaysKeepConfirmedSeeds = NewTrackingCuts.KeepAllConfirmedSeeds()
+            if not InDetFlags.doHeavyIon():
+               InDetSiSpacePointsSeedMaker.maxSeedsForSpacePointStrips = NewTrackingCuts.MaxSeedsPerSP_Strips()
+               InDetSiSpacePointsSeedMaker.maxSeedsForSpacePointPixels = NewTrackingCuts.MaxSeedsPerSP_Pixels()
+               InDetSiSpacePointsSeedMaker.alwaysKeepConfirmedStripSeeds = NewTrackingCuts.KeepAllConfirmedStripSeeds()
+               InDetSiSpacePointsSeedMaker.alwaysKeepConfirmedPixelSeeds = NewTrackingCuts.KeepAllConfirmedPixelSeeds()
 
          if NewTrackingCuts.mode() == "R3LargeD0":
             InDetSiSpacePointsSeedMaker.usePixel = False
             InDetSiSpacePointsSeedMaker.etaMax = NewTrackingCuts.maxEta() 
-            InDetSiSpacePointsSeedMaker.maxSeedsForSpacePoint = NewTrackingCuts.MaxSeedsPerSP()
-            InDetSiSpacePointsSeedMaker.alwaysKeepConfirmedSeeds = NewTrackingCuts.KeepAllConfirmedSeeds()
+            InDetSiSpacePointsSeedMaker.maxSeedsForSpacePointStrips = NewTrackingCuts.MaxSeedsPerSP_Strips()
+            InDetSiSpacePointsSeedMaker.alwaysKeepConfirmedStripSeeds = NewTrackingCuts.KeepAllConfirmedStripSeeds()
             InDetSiSpacePointsSeedMaker.maxdRadius = 150
             InDetSiSpacePointsSeedMaker.seedScoreBonusConfirmationSeed = -2000  #let's be generous
 
diff --git a/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/SiSPSeededTrackFinderData/SiSpacePointsSeedMakerEventData.h b/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/SiSPSeededTrackFinderData/SiSpacePointsSeedMakerEventData.h
index 0d2eff9a4e2..9c089b2d4cc 100644
--- a/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/SiSPSeededTrackFinderData/SiSpacePointsSeedMakerEventData.h
+++ b/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/SiSPSeededTrackFinderData/SiSpacePointsSeedMakerEventData.h
@@ -58,6 +58,8 @@ namespace InDet {
     bool isvertex{false};   ///< whether or not we contain a non-empty vertex list
     bool checketa{false};   ///< whether to apply eta cuts
 
+    int maxSeedsPerSP{0};   ///<Number of Seeds allowed to be built per central Seed
+    bool keepAllConfirmedSeeds{false};   ///<Do we keep an unlimited number of confirmed seeds per central SP?
     int iteration{0};   ///< iteration currently being run 
     int iteration0{0};
     int r_first{0}; ///< points to the index of the highest occupied radius bin 
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ATLxk.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ATLxk.h
index 3d0568fcb15..8facf3b4f97 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ATLxk.h
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ATLxk.h
@@ -167,11 +167,13 @@ namespace InDet {
     /// maximum number of seeds to keep per central space point. 
     /// the top N seeds sorted by quality are preserved if more candidates
     /// than the limit exist 
-    IntegerProperty m_maxOneSize{this, "maxSeedsForSpacePoint", 5};
+    IntegerProperty m_maxOneSizeSSS{this, "maxSeedsForSpacePointStrips", 5};
+    IntegerProperty m_maxOneSizePPP{this, "maxSeedsForSpacePointPixels", 5};
     /// This flag will lead to all confirmed seeds (seeds where a second compatible seed
     /// with a different top spacepoint is found) being kept, even in excess of 
     /// maxSeedsForSpacePoint above 
-    BooleanProperty m_alwaysKeepConfirmedSeeds{this, "alwaysKeepConfirmedSeeds", false};
+    BooleanProperty m_alwaysKeepConfirmedPixelSeeds{this, "alwaysKeepConfirmedPixelSeeds", false};
+    BooleanProperty m_alwaysKeepConfirmedStripSeeds{this, "alwaysKeepConfirmedStripSeeds", false};
     FloatProperty m_etamax{this, "etaMax", 2.7};
     FloatProperty m_r1minv{this, "minVRadius1", 0.};
     FloatProperty m_r1maxv{this, "maxVRadius1", 60.};
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ATLxk.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ATLxk.cxx
index 49a59e4c69a..8a34c4c4343 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ATLxk.cxx
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ATLxk.cxx
@@ -143,9 +143,17 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::newEvent(const EventContext& ctx, Even
 
     /// set the spacepoint iterator to the beginning of the space-point list  
     data.i_spforseed = data.l_spforseed.begin();
+    // Set the seed multiplicity strategy of the event data to the one configured
+    // by the user for strip seeds
+    data.maxSeedsPerSP = m_maxOneSizeSSS;
+    data.keepAllConfirmedSeeds = m_alwaysKeepConfirmedStripSeeds;
   } ///< end if-statement for iteration 0 
   else {  /// for the second iteration (PPP pass), don't redo the full init required the first time 
     data.r_first = 0;     ///< reset the first radial bin 
+    // Set the seed multiplicity strategy of the event data to the one configured
+    // by the user for pixel seeds
+    data.maxSeedsPerSP = m_maxOneSizePPP;
+    data.keepAllConfirmedSeeds = m_alwaysKeepConfirmedPixelSeeds;
     /// call fillLists to repopulate the candidate space points and exit 
     fillLists(data);
     return;
@@ -2096,13 +2104,13 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::newOneSeed
   }
   /// There are three cases where we simply add our new seed to the list and push it into the map: 
     /// a) we have not yet reached our max number of seeds 
-  if (data.nOneSeeds < m_maxOneSize
+  if (data.nOneSeeds < data.maxSeedsPerSP
     /// b) we have reached the max number but always want to keep confirmed seeds 
     /// and the new seed is a confirmed one, with worse quality than the worst one so far 
-      || (m_alwaysKeepConfirmedSeeds && worstQualityInMap <= seedCandidateQuality  && isConfirmedSeed(p1,p3,seedCandidateQuality) && data.nOneSeeds < data.seedPerSpCapacity)
+      || (data.keepAllConfirmedSeeds  && worstQualityInMap <= seedCandidateQuality  && isConfirmedSeed(p1,p3,seedCandidateQuality) && data.nOneSeeds < data.seedPerSpCapacity)
     /// c) we have reached the max number but always want to keep confirmed seeds 
     ///and the new seed of higher quality than the worst one so far, with the latter however being confirmed 
-      || (m_alwaysKeepConfirmedSeeds && worstQualityInMap >  seedCandidateQuality  && isConfirmedSeed(worstSeedSoFar->spacepoint0(),worstSeedSoFar->spacepoint2(),worstQualityInMap) && data.nOneSeeds < data.seedPerSpCapacity)
+      || (data.keepAllConfirmedSeeds  && worstQualityInMap >  seedCandidateQuality  && isConfirmedSeed(worstSeedSoFar->spacepoint0(),worstSeedSoFar->spacepoint2(),worstQualityInMap) && data.nOneSeeds < data.seedPerSpCapacity)
     ){
     data.OneSeeds_Pro[data.nOneSeeds].set(p1,p2,p3,z);
     data.mapOneSeeds_Pro.insert(std::make_pair(seedCandidateQuality, &data.OneSeeds_Pro[data.nOneSeeds]));
@@ -2400,8 +2408,8 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::newSeed
 }
 
 void InDet::SiSpacePointsSeedMaker_ATLxk::initializeEventData(EventData& data) const {
-  int seedArrayPerSPSize = m_maxOneSize; 
-  if (m_alwaysKeepConfirmedSeeds)  seedArrayPerSPSize = 50; 
+  int seedArrayPerSPSize = (m_maxOneSizePPP>m_maxOneSizeSSS ? m_maxOneSizePPP : m_maxOneSizeSSS); 
+  if (m_alwaysKeepConfirmedStripSeeds || m_alwaysKeepConfirmedPixelSeeds)  seedArrayPerSPSize = 50; 
   data.initialize(EventData::ATLxk,
                   m_maxsizeSP,
                   seedArrayPerSPSize,
diff --git a/Tools/PROCTools/data/master_q221_AOD_digest.ref b/Tools/PROCTools/data/master_q221_AOD_digest.ref
index ed26ed9ad94..ab14ef762cf 100644
--- a/Tools/PROCTools/data/master_q221_AOD_digest.ref
+++ b/Tools/PROCTools/data/master_q221_AOD_digest.ref
@@ -12,7 +12,7 @@
       284500    87473084          83          86           7           2          15           1          14          10           4           6
       284500    87473091          43          49           3           0           2           1           1           5           2           3
       284500    87473096          72          76           3           2           2           0           2           3           2           1
-      284500    87473104          61          63           6           0           6           1           5           5           4           1
+      284500    87473104          61          64           6           0           6           2           4           6           5           1
       284500    87473114          93          80           7           2          13           1          12           8           5           3
       284500    87473121          93         100           6           3          16           4          12           6           5           1
       284500    87473132          81          58           9           1          11           0          11           4           4           0
diff --git a/Tools/PROCTools/data/master_q431_AOD_digest.ref b/Tools/PROCTools/data/master_q431_AOD_digest.ref
index 1eab7e7717b..909cf5efc36 100644
--- a/Tools/PROCTools/data/master_q431_AOD_digest.ref
+++ b/Tools/PROCTools/data/master_q431_AOD_digest.ref
@@ -1,25 +1,25 @@
          run       event       nTopo   nIdTracks       nJets      nMuons
       330470  1183722158           1           0           0           0
       330470  1183722342         394         415          18           0
-      330470  1183727953         532         570          13           4
-      330470  1183732647         467         453          12           1
+      330470  1183727953         532         574          11           4
+      330470  1183732647         467         454          12           1
       330470  1183733040         381         286           6           1
       330470  1183734651         361         363          14           3
       330470  1183735332         406         372          10           1
-      330470  1183736475         741         654          15           3
+      330470  1183736475         741         657          15           3
       330470  1183738728           1           0           0           0
-      330470  1183738949         368         421           9           1
+      330470  1183738949         368         423           9           1
       330470  1183742489         152         125           2           1
-      330470  1183743040         285         305           5           0
-      330470  1183746343         492         465          12           0
+      330470  1183743040         285         307           5           0
+      330470  1183746343         492         466          12           0
       330470  1183746710           6           0           0           0
       330470  1183751782         239         235           5           0
-      330470  1183752624         347         342           8           2
+      330470  1183752624         347         345           8           2
       330470  1183753006         357         377          11           3
       330470  1183754806         470         406          14           0
       330470  1183769295         342         318           8           2
-      330470  1183769939         348         340          11           3
-      330470  1183773832         307         198           7           0
+      330470  1183769939         348         341          11           3
+      330470  1183773832         307         199           7           0
       330470  1183775209          57           0           0           0
       330470  1183787124         431         361          11           2
       330470  1183787946         321         310           5           1
-- 
GitLab