From 734f92720be3c762b74b0a025242e111be5ce2fa Mon Sep 17 00:00:00 2001
From: Marin Mlinarevic <marin.mlinarevic@cern.ch>
Date: Fri, 11 Aug 2023 21:04:07 +0200
Subject: [PATCH] Increased z vertex resolution for endcap layers to 150 when
 seeding FTF using ZFinder in jetSuper configuration

---
 .../python/TrigFastTrackFinderConfig.py       |  1 +
 .../src/TrigFastTrackFinder.cxx               | 18 +++--
 .../TrigCombinatorialSettings.h               |  2 +
 .../TrigTrackSeedGenerator.h                  |  1 +
 .../src/TrigTrackSeedGenerator.cxx            | 68 ++++++++++---------
 .../TrigInDetPattRecoTools/test/mockSeeds.cxx |  1 +
 6 files changed, 53 insertions(+), 38 deletions(-)

diff --git a/Trigger/TrigAlgorithms/TrigFastTrackFinder/python/TrigFastTrackFinderConfig.py b/Trigger/TrigAlgorithms/TrigFastTrackFinder/python/TrigFastTrackFinderConfig.py
index e018af15999a..ef9784a94613 100755
--- a/Trigger/TrigAlgorithms/TrigFastTrackFinder/python/TrigFastTrackFinderConfig.py
+++ b/Trigger/TrigAlgorithms/TrigFastTrackFinder/python/TrigFastTrackFinderConfig.py
@@ -395,6 +395,7 @@ def TrigFastTrackFinderCfg(flags: AthConfigFlags, name: str, slice_name: str, Ro
     ftf.doZFinderOnly = config.doZFinderOnly
     ftf.trigZFinder = theTrigZFinder
     ftf.zVertexResolution = 20 if flags.Tracking.ActiveConfig.name == "jetSuper" else 1
+    ftf.zVertexResolutionEndcap = 150 if flags.Tracking.ActiveConfig.name == "jetSuper" else ftf.zVertexResolution
     ftf.doFastZVertexSeeding = True
 
   if inputTracksName:
diff --git a/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx b/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx
index 01daa6efc69b..e98f6dec8dd9 100644
--- a/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx
+++ b/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx
@@ -96,12 +96,14 @@ TrigFastTrackFinder::TrigFastTrackFinder(const std::string& name, ISvcLocator* p
   declareProperty( "MinHits",               m_minHits = 5,"Minimum number of hits needed to perform tracking"  );
 
   //** Zfinder mode
-  declareProperty( "doZFinder",            m_doZFinder = true,"Use fast ZFinder to find z of primary vertices");
-  declareProperty( "doZFinderOnly",        m_doZFinderOnly = false,"stop processing after ZFinder - no tracking performed");
-  declareProperty( "VertexSeededMode",     m_vertexSeededMode = false); //** NOT USED Obsolete? ATR-24242
-  declareProperty( "doFastZVertexSeeding", m_doFastZVseeding = true,"Use ZFinder vertex information to filter seeds");
-  declareProperty( "zVertexResolution",    m_tcs.m_zvError = 10.0," Half-width (mm) in z of z region used to filter seeds when doFastZVertexSeeding enabled" );
-  declareProperty( "StoreZFinderVertices", m_storeZFinderVertices = false ); //** NOT USED - to be implemented ATR-24242
+  declareProperty( "doZFinder",               m_doZFinder = true,"Use fast ZFinder to find z of primary vertices");
+  declareProperty( "doZFinderOnly",           m_doZFinderOnly = false,"stop processing after ZFinder - no tracking performed");
+  declareProperty( "VertexSeededMode",        m_vertexSeededMode = false); //** NOT USED Obsolete? ATR-24242
+  declareProperty( "doFastZVertexSeeding",    m_doFastZVseeding = true,"Use ZFinder vertex information to filter seeds");
+  declareProperty( "zVertexResolution",       m_tcs.m_zvError = 10.0," Half-width (mm) in z of z region used to filter seeds when doFastZVertexSeeding enabled" );
+  declareProperty( "zVertexResolutionEndcap", m_tcs.m_zvErrorEndcap = -1," Half-width (mm) in z of region used to filter seeds when doFastZVertexSeeding enabled, for endcap pixels; set to m_tcs.m_zvError later if left negative" );
+  declareProperty( "StoreZFinderVertices",    m_storeZFinderVertices = false ); //** NOT USED - to be implemented ATR-24242
+
 
   /** SeedMaker */
   declareProperty("useNewLayerNumberScheme", m_useNewLayerNumberScheme = false,"Use LayerNumberTool for layer numbers");
@@ -220,6 +222,9 @@ StatusCode TrigFastTrackFinder::initialize() {
 
   if (m_doZFinder) {
     ATH_CHECK(m_trigZFinder.retrieve());
+    // If m_tcs.m_zvErrorEndcap has negative default value, it was not set by user,
+    // so set it to the same value as m_tcs.m_zvError
+    if (m_tcs.m_zvErrorEndcap < 0) m_tcs.m_zvErrorEndcap = m_tcs.m_zvError;
   } else {
     m_trigZFinder.disable();
   }
@@ -344,6 +349,7 @@ StatusCode TrigFastTrackFinder::initialize() {
   ATH_MSG_DEBUG("	m_doZFinderOnly            : " <<  m_doZFinderOnly      );
   ATH_MSG_DEBUG("	m_doFastZVseeding          : " <<  m_doFastZVseeding    );
   ATH_MSG_DEBUG("	m_tcs.m_zvError            : " <<  m_tcs.m_zvError      );
+  ATH_MSG_DEBUG("	m_tcs.m_zvErrorEndcap      : " <<  m_tcs.m_zvErrorEndcap    );
   ATH_MSG_DEBUG("	m_storeZFinderVertices     : " <<  m_storeZFinderVertices   );
   ATH_MSG_DEBUG("	m_tripletMinPtFrac         : " <<  m_tripletMinPtFrac   );
   ATH_MSG_DEBUG("	m_pTmin                    : " <<  m_pTmin              );
diff --git a/Trigger/TrigTools/TrigInDetPattRecoTools/TrigInDetPattRecoTools/TrigCombinatorialSettings.h b/Trigger/TrigTools/TrigInDetPattRecoTools/TrigInDetPattRecoTools/TrigCombinatorialSettings.h
index c07bb5e9e365..439ffa2e60d8 100644
--- a/Trigger/TrigTools/TrigInDetPattRecoTools/TrigInDetPattRecoTools/TrigCombinatorialSettings.h
+++ b/Trigger/TrigTools/TrigInDetPattRecoTools/TrigInDetPattRecoTools/TrigCombinatorialSettings.h
@@ -39,6 +39,7 @@ public:
     m_maxTripletBufferLength = 3;
 
     m_zvError = 10.0;
+    m_zvErrorEndcap = m_zvError;
     m_LRTmode=false;
     m_layerGeometry.clear();
     m_useTrigSeedML = 0;
@@ -67,6 +68,7 @@ public:
   unsigned int m_maxTripletBufferLength;
 
   float m_zvError;
+  float m_zvErrorEndcap;
   bool m_LRTmode;
   bool m_useEtaBinning;
 
diff --git a/Trigger/TrigTools/TrigInDetPattRecoTools/TrigInDetPattRecoTools/TrigTrackSeedGenerator.h b/Trigger/TrigTools/TrigInDetPattRecoTools/TrigInDetPattRecoTools/TrigTrackSeedGenerator.h
index 74389db676c7..d1c6f12b021e 100644
--- a/Trigger/TrigTools/TrigInDetPattRecoTools/TrigInDetPattRecoTools/TrigTrackSeedGenerator.h
+++ b/Trigger/TrigTools/TrigInDetPattRecoTools/TrigInDetPattRecoTools/TrigTrackSeedGenerator.h
@@ -350,6 +350,7 @@ private:
   std::vector<TrigInDetTriplet> m_triplets;
 
   float m_zMinus, m_zPlus, m_minCoord, m_maxCoord;
+  float m_zMinus, m_zPlus, m_minCoord, m_maxCoord, m_zMinusEndcap, m_zPlusEndcap;
 
   int m_nInner, m_nOuter;
   std::vector<int> m_innerMarkers, m_outerMarkers;
diff --git a/Trigger/TrigTools/TrigInDetPattRecoTools/src/TrigTrackSeedGenerator.cxx b/Trigger/TrigTools/TrigInDetPattRecoTools/src/TrigTrackSeedGenerator.cxx
index 298265acafc9..4f7c87abcffa 100644
--- a/Trigger/TrigTools/TrigInDetPattRecoTools/src/TrigTrackSeedGenerator.cxx
+++ b/Trigger/TrigTools/TrigInDetPattRecoTools/src/TrigTrackSeedGenerator.cxx
@@ -112,6 +112,8 @@ void TrigTrackSeedGenerator::createSeeds(const IRoiDescriptor* roiDescriptor) {
 
   m_zMinus = roiDescriptor->zedMinus() - m_zTol;
   m_zPlus  = roiDescriptor->zedPlus() + m_zTol;
+  m_zPlusEndcap = m_zMinus;
+  m_zMinusEndcap = m_zPlus;
   
   m_triplets.clear();
 
@@ -261,6 +263,8 @@ void TrigTrackSeedGenerator::createSeeds(const IRoiDescriptor* roiDescriptor, co
 
 	    m_zMinus = zVertex - m_settings.m_zvError;
 	    m_zPlus = zVertex + m_settings.m_zvError;
+      m_zPlusEndcap = zVertex + m_settings.m_zvErrorEndcap;
+      m_zMinusEndcap = zVertex - m_settings.m_zvErrorEndcap;
 
 	    for(int layerJ=0;layerJ<nLayers;layerJ++) {//loop over other layers
 
@@ -356,21 +360,21 @@ bool TrigTrackSeedGenerator::validateLayerPairNew(int layerI, int layerJ, float
     if(refCoordJ>0) {//positive EC
       if(refCoordJ > zm) {//outer layer
 	
-	if(zm < m_zMinus) return false;
-	if(zm == m_zPlus) return false;
+	if(zm < m_zMinusEndcap) return false;
+	if(zm == m_zPlusEndcap) return false;
 	float zMax = (zm*maxB-rm*refCoordJ)/(maxB-rm);
-	if( m_zMinus > zMax) return false;
+	if( m_zMinusEndcap > zMax) return false;
 	if (rm < minB) {
 	  float zMin = (zm*minB-rm*refCoordJ)/(minB-rm);
-	  if(m_zPlus<zMin) return false;
+	  if(m_zPlusEndcap<zMin) return false;
 	}
 
-	m_minCoord = (refCoordJ-m_zMinus)*rm/(zm-m_zMinus);
-	m_maxCoord = (refCoordJ-m_zPlus)*rm/(zm-m_zPlus);
-	m_minCoord -= deltaRefCoord*rm/std::fabs(zm-m_zMinus);
-	m_maxCoord += deltaRefCoord*rm/std::fabs(zm-m_zPlus);
+	m_minCoord = (refCoordJ-m_zMinusEndcap)*rm/(zm-m_zMinusEndcap);
+	m_maxCoord = (refCoordJ-m_zPlusEndcap)*rm/(zm-m_zPlusEndcap);
+	m_minCoord -= deltaRefCoord*rm/std::fabs(zm-m_zMinusEndcap);
+	m_maxCoord += deltaRefCoord*rm/std::fabs(zm-m_zPlusEndcap);
 
-	if(zm <= m_zPlus) m_maxCoord = maxB;
+	if(zm <= m_zPlusEndcap) m_maxCoord = maxB;
 	
 	if(m_minCoord > maxB) return false;
 	if(m_maxCoord < minB) return false;
@@ -379,35 +383,35 @@ bool TrigTrackSeedGenerator::validateLayerPairNew(int layerI, int layerJ, float
       else {//inner layer
         if(minB == rm) return false;
 	float zMax = (zm*minB-rm*refCoordJ)/(minB-rm);
-	if( m_zMinus > zMax) return false;
+	if( m_zMinusEndcap > zMax) return false;
 	if (rm>maxB) {// otherwise, intersect of line from maxB through middle sp will be on the wrong side of the layer
 	  float zMin = (zm*maxB-rm*refCoordJ)/(maxB-rm);
-	  if(m_zPlus<zMin) return false;
+	  if(m_zPlusEndcap<zMin) return false;
 	}
-	if(zm == m_zPlus || zm == m_zMinus) return false;
-	m_minCoord = (refCoordJ-m_zPlus)*rm/(zm-m_zPlus);
-	m_maxCoord = (refCoordJ-m_zMinus)*rm/(zm-m_zMinus);
-	m_minCoord -= deltaRefCoord*rm/std::fabs(zm-m_zPlus);
-	m_maxCoord += deltaRefCoord*rm/std::fabs(zm-m_zMinus);
+	if(zm == m_zPlusEndcap || zm == m_zMinusEndcap) return false;
+	m_minCoord = (refCoordJ-m_zPlusEndcap)*rm/(zm-m_zPlusEndcap);
+	m_maxCoord = (refCoordJ-m_zMinusEndcap)*rm/(zm-m_zMinusEndcap);
+	m_minCoord -= deltaRefCoord*rm/std::fabs(zm-m_zPlusEndcap);
+	m_maxCoord += deltaRefCoord*rm/std::fabs(zm-m_zMinusEndcap);
       }
     }
     else {//negative EC
       if(refCoordJ < zm) {//outer layer
 
-	if(zm > m_zPlus) return false;
-	if(zm == m_zMinus) return false;
+	if(zm > m_zPlusEndcap) return false;
+	if(zm == m_zMinusEndcap) return false;
 	float zMin = (zm*maxB-rm*refCoordJ)/(maxB-rm);
-	if( m_zPlus < zMin) return false;
+	if( m_zPlusEndcap < zMin) return false;
 	if (rm<minB) {// otherwise, intersect of line from minB through middle sp will be on the wrong side of the layer
 	  float zMax = (zm*minB-rm*refCoordJ)/(minB-rm);
-	  if(m_zMinus>zMax) return false;
+	  if(m_zMinusEndcap>zMax) return false;
 	}
 
-	m_minCoord = (refCoordJ-m_zPlus)*rm/(zm-m_zPlus);
-	m_maxCoord = (refCoordJ-m_zMinus)*rm/(zm-m_zMinus);
-	m_minCoord -= deltaRefCoord*rm/std::fabs(zm-m_zPlus);
-	m_maxCoord += deltaRefCoord*rm/std::fabs(zm-m_zMinus);
-	if(zm > m_zMinus) m_maxCoord = maxB;	
+	m_minCoord = (refCoordJ-m_zPlusEndcap)*rm/(zm-m_zPlusEndcap);
+	m_maxCoord = (refCoordJ-m_zMinusEndcap)*rm/(zm-m_zMinusEndcap);
+	m_minCoord -= deltaRefCoord*rm/std::fabs(zm-m_zPlusEndcap);
+	m_maxCoord += deltaRefCoord*rm/std::fabs(zm-m_zMinusEndcap);
+	if(zm > m_zMinusEndcap) m_maxCoord = maxB;	
 	if(m_minCoord > maxB) return false;
 	if(m_maxCoord < minB) return false;
 
@@ -415,16 +419,16 @@ bool TrigTrackSeedGenerator::validateLayerPairNew(int layerI, int layerJ, float
       else {//inner layer
         if(minB == rm) return false;
 	float zMin = (zm*minB-rm*refCoordJ)/(minB-rm);
-	if( m_zPlus < zMin) return false;
+	if( m_zPlusEndcap < zMin) return false;
 	if (rm>maxB) {// otherwise, intersect of line from maxB through middle sp will be on the wrong side of the layer
 	  float zMax = (zm*maxB-rm*refCoordJ)/(maxB-rm);
-	  if(m_zMinus>zMax) return false;
+	  if(m_zMinusEndcap>zMax) return false;
 	}
-	if(zm == m_zPlus || zm == m_zMinus) return false;
-	m_minCoord = (refCoordJ-m_zMinus)*rm/(zm-m_zMinus);
-	m_maxCoord = (refCoordJ-m_zPlus)*rm/(zm-m_zPlus);
-	m_minCoord -= deltaRefCoord*rm/std::fabs(zm-m_zMinus);
-	m_maxCoord += deltaRefCoord*rm/std::fabs(zm-m_zPlus);
+	if(zm == m_zPlusEndcap || zm == m_zMinusEndcap) return false;
+	m_minCoord = (refCoordJ-m_zMinusEndcap)*rm/(zm-m_zMinusEndcap);
+	m_maxCoord = (refCoordJ-m_zPlusEndcap)*rm/(zm-m_zPlusEndcap);
+	m_minCoord -= deltaRefCoord*rm/std::fabs(zm-m_zMinusEndcap);
+	m_maxCoord += deltaRefCoord*rm/std::fabs(zm-m_zPlusEndcap);
 
       }
     }
diff --git a/Trigger/TrigTools/TrigInDetPattRecoTools/test/mockSeeds.cxx b/Trigger/TrigTools/TrigInDetPattRecoTools/test/mockSeeds.cxx
index 2388906dde0f..7742f550838d 100644
--- a/Trigger/TrigTools/TrigInDetPattRecoTools/test/mockSeeds.cxx
+++ b/Trigger/TrigTools/TrigInDetPattRecoTools/test/mockSeeds.cxx
@@ -53,6 +53,7 @@ int main()
   tcs.m_tripletDoPPS = true;
   tcs.m_tripletDtCut      = 10.0;
   tcs.m_zvError = 10.0;
+  tcs.m_zvErrorEndcap = tcs.m_zvError;
   tcs.m_maxBarrelPix    = -1;
   tcs.m_minEndcapPix    = 8;
   tcs.m_maxEndcapPix    = -1;
-- 
GitLab