From 1e207c0a3f57514c40b49b70e96892ccca48d191 Mon Sep 17 00:00:00 2001
From: Jay Ajitbhai Sandesara <jay.ajitbhai.sandesara@cern.ch>
Date: Wed, 23 Dec 2020 14:23:35 +0000
Subject: [PATCH] Moved from writing ntuple per event to per seed, for seeds
 seen by the SiSPSeededTrackFinder algorithm.

---
 .../python/InDetJobProperties.py              |   8 +-
 .../share/ConfiguredNewTrackingSiPattern.py   |  14 ++
 .../src/SiSPSeededTrackFinder.cxx             |  49 +++-
 .../SiSpacePointForSeed.h                     |  12 +
 .../SiSpacePointsProSeed.h                    |  26 +-
 .../src/SiSpacePointForSeed.cxx               |  33 ++-
 .../src/SiSpacePointsProSeed.cxx              |  23 +-
 .../SiSpacePointsSeed/SiSpacePointsSeed.h     | 225 +++++++++++++++++-
 .../ISiSpacePointsSeedMaker.h                 |  10 +-
 .../SiSpacePointsSeedMaker_ATLxk.h            |  57 ++++-
 .../SiSpacePointsSeedMaker_BeamGas.h          |   4 +
 .../SiSpacePointsSeedMaker_Cosmic.h           |   4 +
 .../SiSpacePointsSeedMaker_HeavyIon.h         |   4 +
 .../SiSpacePointsSeedMaker_ITK.h              |   4 +
 .../SiSpacePointsSeedMaker_LowMomentum.h      |   4 +
 .../SiSpacePointsSeedMaker_Trigger.h          |   4 +
 .../src/SiSpacePointsSeedMaker_ATLxk.cxx      | 118 ++++++++-
 .../src/SiSpacePointsSeedMaker_BeamGas.cxx    |   7 +
 .../src/SiSpacePointsSeedMaker_Cosmic.cxx     |   7 +
 .../src/SiSpacePointsSeedMaker_HeavyIon.cxx   |   7 +
 .../src/SiSpacePointsSeedMaker_ITK.cxx        |   7 +
 .../SiSpacePointsSeedMaker_LowMomentum.cxx    |   7 +
 .../src/SiSpacePointsSeedMaker_Trigger.cxx    |   7 +
 .../src/SiTrackMaker_xk.cxx                   |   4 +-
 24 files changed, 616 insertions(+), 29 deletions(-)

diff --git a/InnerDetector/InDetExample/InDetRecExample/python/InDetJobProperties.py b/InnerDetector/InDetExample/InDetRecExample/python/InDetJobProperties.py
index bf315e2c2a9..7b9068cff2f 100644
--- a/InnerDetector/InDetExample/InDetRecExample/python/InDetJobProperties.py
+++ b/InnerDetector/InDetExample/InDetRecExample/python/InDetJobProperties.py
@@ -1192,13 +1192,18 @@ class nnCutLargeD0Threshold(InDetFlagsJobProperty):
   allowedTypes = ['float']
   StoredValue  = -1.0
 
+class writeSeedValNtuple(InDetFlagsJobProperty):
+    """Turn writing of seed validation ntuple on and off"""
+    statusOn     = True
+    allowedTypes = ['bool']
+    StoredValue  = False
+
 class doTRTPIDNN(InDetFlagsJobProperty): 
   """calculate NN-based TRT electron probability""" 
   statusOn     = True 
   allowedTypes = ['bool']
   StoredValue  = True
 
-
 ##-----------------------------------------------------------------------------
 ## 2nd step
 ## Definition of the InDet flag container
@@ -2794,6 +2799,7 @@ _list_InDetJobProperties = [Enabled,
                             doDigitalROTCreation,
                             nnCutLargeD0Threshold,
                             useMuForTRTErrorScaling,
+                            writeSeedValNtuple,
                             doTRTPIDNN
                            ]
 for j in _list_InDetJobProperties: 
diff --git a/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py b/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py
index 64b02d8db79..5a6650eeed5 100644
--- a/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py
+++ b/InnerDetector/InDetExample/InDetRecExample/share/ConfiguredNewTrackingSiPattern.py
@@ -61,7 +61,10 @@ class  ConfiguredNewTrackingSiPattern:
       #
       # ------------------------------------------------------------
 
+      doSeedMakerValidation = InDetFlags.writeSeedValNtuple()
+
       if InDetFlags.doSiSPSeededTrackFinder():
+
          #
          # --- Space points seeds maker, use different ones for cosmics and collisions
          #
@@ -95,6 +98,17 @@ class  ConfiguredNewTrackingSiPattern:
                                                                SpacePointsOverlapName = InDetKeys.OverlapSpacePoints(),
                                                                radMax                 = NewTrackingCuts.radMax(),
                                                                RapidityCut            = NewTrackingCuts.maxEta())
+
+         if doSeedMakerValidation:
+
+           InDetSiSpacePointsSeedMaker.WriteNtuple = True
+
+           from AthenaCommon.AppMgr import ServiceMgr
+           if not hasattr(ServiceMgr, 'THistSvc'):
+             from GaudiSvc.GaudiSvcConf import THistSvc
+             ServiceMgr += THistSvc()
+
+           ServiceMgr.THistSvc.Output  = ["valNtuples DATAFILE='SeedMakerValidation.root' OPT='RECREATE'"]
             
          if NewTrackingCuts.mode() == "Offline" or InDetFlags.doHeavyIon() or  NewTrackingCuts.mode() == "ForwardTracks":
             InDetSiSpacePointsSeedMaker.maxdImpactPPS = NewTrackingCuts.maxdImpactPPSSeeds()
diff --git a/InnerDetector/InDetRecAlgs/SiSPSeededTrackFinder/src/SiSPSeededTrackFinder.cxx b/InnerDetector/InDetRecAlgs/SiSPSeededTrackFinder/src/SiSPSeededTrackFinder.cxx
index c608055d1ec..29a40a8ef8f 100644
--- a/InnerDetector/InDetRecAlgs/SiSPSeededTrackFinder/src/SiSPSeededTrackFinder.cxx
+++ b/InnerDetector/InDetRecAlgs/SiSPSeededTrackFinder/src/SiSPSeededTrackFinder.cxx
@@ -263,23 +263,39 @@ StatusCode InDet::SiSPSeededTrackFinder::newStrategy(const EventContext& ctx) co
   /// prepare a collection for the quality-sorted track canddiates
   std::multimap<double, Trk::Track*> qualitySortedTrackCandidates;
 
+  /// Get the value of the seed maker validation ntuple writing switch
+  bool doWriteNtuple = m_seedsmaker->getWriteNtupleBoolProperty();
+  long EvNumber = 0.;            //Event number variable to be used for the validation ntuple 
+
+  if (doWriteNtuple) {
+    SG::ReadHandle<xAOD::EventInfo> eventInfo(m_evtKey,ctx);
+    if(!eventInfo.isValid()) {EvNumber = -1.0;} else {EvNumber = eventInfo->eventNumber();}
+  }
+
   /// Loop through all seeds from the first pass and attempt to form track candidates
   while ((seed = m_seedsmaker->next(ctx, seedEventData))) {
+
     ++counter[kNSeeds];
     /// we only want to fill the Z histo with the first candidate for each seed. 
     bool firstTrack{true};
-    /// combinatorial track finding for one given seed 
-    std::list<Trk::Track*> trackList = m_trackmaker->getTracks(ctx, trackEventData, seed->spacePoints());
 
-    /// record found candidates
-    for (Trk::Track* t: trackList) {
-      qualitySortedTrackCandidates.insert(std::make_pair(-trackQuality(t), t));
-      /// For the first (highest quality) track from each seed, populate the vertex finding histograms 
-      if (firstTrack and not m_ITKGeometry) {
-        fillZHistogram(t, beamPosPerigee, numberHistogram, zWeightedHistogram, ptWeightedHistogram);
-      }
-      firstTrack = false;
-    }
+      /// copy all the tracks into trackList
+      std::list<Trk::Track*> trackList = m_trackmaker->getTracks(ctx, trackEventData, seed->spacePoints());
+      /// record track candidates found, using combinatorial track finding, from the given seed
+      for (Trk::Track* t: trackList) {
+
+        qualitySortedTrackCandidates.insert(std::make_pair(-trackQuality(t), t));
+
+        /// For the first (highest quality) track from each seed, populate the vertex finding histograms
+        if (firstTrack and not m_ITKGeometry) {
+          fillZHistogram(t, beamPosPerigee, numberHistogram, zWeightedHistogram, ptWeightedHistogram);
+        }
+        firstTrack = false;
+      }  
+      /// Call the ntuple writing method
+      if(doWriteNtuple) { m_seedsmaker->writeNtuple(seed, !trackList.empty() ? trackList.front() : nullptr, ISiSpacePointsSeedMaker::StripSeed, EvNumber) ; } 
+        
+
     if (counter[kNSeeds] >= m_maxNumberSeeds) {
       ERR = true;
       ++m_problemsTotal;
@@ -307,17 +323,24 @@ StatusCode InDet::SiSPSeededTrackFinder::newStrategy(const EventContext& ctx) co
 
   /// Again, loop over the newly found seeds and attempt to form track candidates
   while ((seed = m_seedsmaker->next(ctx, seedEventData))) {
+
     ++counter[kNSeeds];
-    /// insert the new tracks into the quality-sorted list
-    for (Trk::Track* t: m_trackmaker->getTracks(ctx, trackEventData, seed->spacePoints())) {
+
+    std::list<Trk::Track*> trackList = m_trackmaker->getTracks(ctx, trackEventData, seed->spacePoints());
+
+    for (Trk::Track* t: trackList) {
       qualitySortedTrackCandidates.insert(std::make_pair(-trackQuality(t), t));
     }
+
+    if(doWriteNtuple) { m_seedsmaker->writeNtuple(seed, !trackList.empty() ? trackList.front() : nullptr, ISiSpacePointsSeedMaker::PixelSeed, EvNumber); }
+
     if (counter[kNSeeds] >= m_maxNumberSeeds) {
       ERR = true;
       ++m_problemsTotal;
       break;
     }
   }
+
   m_trackmaker->endEvent(trackEventData);
 
   /// Remove shared tracks with worse quality
diff --git a/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/SiSPSeededTrackFinderData/SiSpacePointForSeed.h b/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/SiSPSeededTrackFinderData/SiSpacePointForSeed.h
index 2879259be24..31d942ba06e 100644
--- a/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/SiSPSeededTrackFinderData/SiSpacePointForSeed.h
+++ b/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/SiSPSeededTrackFinderData/SiSpacePointForSeed.h
@@ -46,6 +46,10 @@ namespace InDet {
     void set(const Trk::SpacePoint*const&,const float*,const float*);
     void setQuality(float);
     void setParam(const float&);
+    void setD0(const float&);
+    void setEta(const float&);
+    void setDZDR(const float&);
+    void setPt(const float&);
     void setScorePenalty(const float& par) {m_scorePenalty=par;}
 
     const Trk::SpacePoint* spacepoint; 
@@ -56,9 +60,13 @@ namespace InDet {
           float         phi() const {return atan2(m_y,m_x);}
     const float&       covr() const {return m_covr;}
     const float&       covz() const {return m_covz;}
+    const float&         d0() const {return m_d0;}
+    const float&        eta() const {return m_eta;}
     const float&      param() const {return m_param;} /// impact parameter
     const float&      scorePenalty() const {return m_scorePenalty;} /// penalty term in the seed score
     const float&    quality() const {return m_q ;}      /// quality of the best seed this candidate was seen on 
+    const float&       dzdr() const {return m_dzdr;}
+    const float&         Pt() const {return m_pt;}
     const Trk::Surface* sur() const {return m_su;}
     const Trk::Surface* sun() const {return m_sn;}
 
@@ -70,6 +78,10 @@ namespace InDet {
     float m_r   ; // radius       in beam system coordinates
     float m_covr; //
     float m_covz; //
+    float m_d0;
+    float m_eta;
+    float m_dzdr;
+    float m_pt;
     float m_param;  /// impact parameter
     float m_scorePenalty; /// penalty term in the seed score 
     float m_q   ;   /// quality of the best seed this candidate was seen on 
diff --git a/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/SiSPSeededTrackFinderData/SiSpacePointsProSeed.h b/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/SiSPSeededTrackFinderData/SiSpacePointsProSeed.h
index f7595db7d84..1efc685eb9f 100644
--- a/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/SiSPSeededTrackFinderData/SiSpacePointsProSeed.h
+++ b/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/SiSPSeededTrackFinderData/SiSpacePointsProSeed.h
@@ -39,7 +39,15 @@ namespace InDet {
     SiSpacePointForSeed* spacepoint0() {return m_s0;}
     SiSpacePointForSeed* spacepoint1() {return m_s1;}
     SiSpacePointForSeed* spacepoint2() {return m_s2;}
+    const float&            d0() const {return m_d0;}
     const float&             z() const {return m_z ;}
+    const float&           eta() const {return m_eta;}
+    const float&            z1() const {return m_z1;}
+    const float&            z2() const {return m_z2;}
+    const float&            z3() const {return m_z3;}
+    const float&            r1() const {return m_r1;}
+    const float&            r2() const {return m_r2;}
+    const float&            r3() const {return m_r3;}
     const float&       quality() const {return m_q ;}
     
     void set(SiSpacePointForSeed*&,SiSpacePointForSeed*&,SiSpacePointForSeed*&,float);
@@ -49,11 +57,19 @@ namespace InDet {
 
   private:
     
-    SiSpacePointForSeed* m_s0;
-    SiSpacePointForSeed* m_s1;
-    SiSpacePointForSeed* m_s2;
-    float                m_z ;
-    float                m_q ;
+    SiSpacePointForSeed* m_s0  ;
+    SiSpacePointForSeed* m_s1  ;
+    SiSpacePointForSeed* m_s2  ;
+    float                m_d0  ;
+    float                m_z   ;
+    float                m_eta ;
+    float                m_z1  ;
+    float                m_z2  ;
+    float                m_z3  ;
+    float                m_r1  ;
+    float                m_r2  ;
+    float                m_r3  ;
+    float                m_q   ;
   };
 } // end of name space
 
diff --git a/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/src/SiSpacePointForSeed.cxx b/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/src/SiSpacePointForSeed.cxx
index b1716d8257d..2701e4d01ee 100644
--- a/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/src/SiSpacePointForSeed.cxx
+++ b/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/src/SiSpacePointForSeed.cxx
@@ -21,6 +21,10 @@ namespace InDet {
     m_covr  = 0.;
     m_covz  = 0.;
     m_param = 0.;
+    m_d0    = 0.;
+    m_eta   = 0.;
+    m_dzdr  = 0.;
+    m_pt    = 0.;
     m_q     = 0.;
     m_su    = 0 ;
     m_sn    = 0 ;
@@ -38,6 +42,10 @@ namespace InDet {
       m_covr      = sp.m_covr    ;
       m_covz      = sp.m_covz    ;
       m_q         = sp.m_q       ;
+      m_dzdr      = sp.m_dzdr    ;
+      m_d0        = sp.m_d0      ;
+      m_eta       = sp.m_eta     ;
+      m_pt        = sp.m_pt      ;
       m_su        = sp.m_su      ;
       m_sn        = sp.m_sn      ;        
     }
@@ -47,13 +55,13 @@ namespace InDet {
   SiSpacePointForSeed::SiSpacePointForSeed
   (const Trk::SpacePoint*const& sp,const float* r) 
   {
-    set(sp,r); m_param = 0.;
+    set(sp,r); m_param = 0.;  
   }
 
   SiSpacePointForSeed::SiSpacePointForSeed
   (const Trk::SpacePoint*const& sp,const float* r,const float* sc) 
   {
-    set(sp,r,sc); m_param = 0.;
+    set(sp,r,sc); m_param = 0.; 
   }
 
   /////////////////////////////////////////////////////////////////////////////////
@@ -157,9 +165,30 @@ namespace InDet {
   {
     m_param = p;
   }
+
+  void SiSpacePointForSeed::setD0(const float& d0)
+  {
+    m_d0 = d0;
+  } 
+
+  void SiSpacePointForSeed::setEta(const float& eta)
+  {
+    m_eta = eta;
+  }
+
   void  SiSpacePointForSeed::setQuality(float q)
   {
     if(q <= m_q) m_q = q;
   }
+
+  void  SiSpacePointForSeed::setDZDR(const float& dzdr)
+  {
+    m_dzdr = dzdr;
+  }
+
+  void  SiSpacePointForSeed::setPt(const float& pt)
+  {
+    m_pt = pt;
+  }
  
 } // end of name space
diff --git a/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/src/SiSpacePointsProSeed.cxx b/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/src/SiSpacePointsProSeed.cxx
index 4894433ae64..c300db866c1 100644
--- a/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/src/SiSpacePointsProSeed.cxx
+++ b/InnerDetector/InDetRecEvent/SiSPSeededTrackFinderData/src/SiSpacePointsProSeed.cxx
@@ -13,6 +13,8 @@ namespace InDet {
     m_s0 = 0 ;
     m_s1 = 0 ;
     m_s2 = 0 ;
+    m_d0 = 0.;
+    m_eta = 0.;
     m_z  = 0.;
     m_q  = 0.;
   }
@@ -22,7 +24,9 @@ namespace InDet {
   {
     if(&sp!=this) {
 
+      m_d0  = sp.m_d0;
       m_z   = sp.m_z ;
+      m_eta = sp.m_eta;
       m_q   = sp.m_q ;
       m_s0  = sp.m_s0;
       m_s1  = sp.m_s1;
@@ -101,7 +105,24 @@ namespace InDet {
     s.add(m_s0->spacepoint);
     s.add(m_s1->spacepoint);
     s.add(m_s2->spacepoint);
-    s.setZVertex(double(m_z)); 
+    s.setD0(m_s2->param());
+    s.setZVertex(double(m_z));
+    s.setEta(m_s2->eta()); 
+    s.setX1(m_s0->x());
+    s.setX2(m_s1->x());
+    s.setX3(m_s2->x());
+    s.setY1(m_s0->y());
+    s.setY2(m_s1->y());
+    s.setY3(m_s2->y());
+    s.setZ1(m_s0->z());
+    s.setZ2(m_s1->z());
+    s.setZ3(m_s2->z());
+    s.setR1(m_s0->radius());
+    s.setR2(m_s1->radius());
+    s.setR3(m_s2->radius());
+    s.setDZDR_B(m_s0->dzdr());
+    s.setDZDR_T(m_s2->dzdr());
+    s.setPt(m_s2->Pt()); 
     return true;
   }
 
diff --git a/InnerDetector/InDetRecEvent/SiSpacePointsSeed/SiSpacePointsSeed/SiSpacePointsSeed.h b/InnerDetector/InDetRecEvent/SiSpacePointsSeed/SiSpacePointsSeed/SiSpacePointsSeed.h
index b05bb2581cb..e0b293a8b7b 100755
--- a/InnerDetector/InDetRecEvent/SiSpacePointsSeed/SiSpacePointsSeed/SiSpacePointsSeed.h
+++ b/InnerDetector/InDetRecEvent/SiSpacePointsSeed/SiSpacePointsSeed/SiSpacePointsSeed.h
@@ -47,9 +47,45 @@ namespace InDet {
     virtual ~SiSpacePointsSeed();
     void                                     erase();
     void                                     add(const Trk::SpacePoint*&);
+    void                                     setD0     (const double&);
     void                                     setZVertex(const double&);
+    void                                     setEta    (const double&);
+    void                                     setX1     (const double&);
+    void                                     setX2     (const double&);
+    void                                     setX3     (const double&);
+    void                                     setY1     (const double&);
+    void                                     setY2     (const double&);
+    void                                     setY3     (const double&);
+    void                                     setZ1     (const double&);
+    void                                     setZ2     (const double&);
+    void                                     setZ3     (const double&);
+    void                                     setR1     (const double&);
+    void                                     setR2     (const double&);
+    void                                     setR3     (const double&);
+    void                                     setDZDR_B (const double&);
+    void                                     setDZDR_T (const double&);
+    void                                     setPt     (const double&);
+
     const std::vector<const Trk::SpacePoint*>& spacePoints() const;
+    const double&                            d0         () const;
     const double&                            zVertex    () const;
+    const double&                            eta        () const;
+    const double&                            x1         () const;
+    const double&                            x2         () const;
+    const double&                            x3         () const;
+    const double&                            y1         () const;
+    const double&                            y2         () const;
+    const double&                            y3         () const;
+    const double&                            z1         () const;
+    const double&                            z2         () const;
+    const double&                            z3         () const;
+    const double&                            r1         () const;
+    const double&                            r2         () const;
+    const double&                            r3         () const;
+    const double&                            dzdr_b     () const;
+    const double&                            dzdr_t     () const;
+    const double&                            pt         () const;
+
     virtual MsgStream&    dump(MsgStream&    out) const ;
     virtual std::ostream& dump(std::ostream& out) const ;
     
@@ -60,7 +96,24 @@ namespace InDet {
   protected:
     
     std::vector<const Trk::SpacePoint*> m_spacepoints;
-    double                            m_zvertex    ;  
+    double                            m_d0         ;
+    double                            m_zvertex    ;
+    double                            m_eta        ;  
+    double                            m_x1         ;
+    double                            m_x2         ;
+    double                            m_x3         ;
+    double                            m_y1         ;
+    double                            m_y2         ;
+    double                            m_y3         ;
+    double                            m_z1         ;
+    double                            m_z2         ;
+    double                            m_z3         ;
+    double                            m_r1         ;
+    double                            m_r2         ;
+    double                            m_r3         ;
+    double                            m_dzdr_b     ;
+    double                            m_dzdr_t     ;
+    double                            m_pt         ;
   };
 
   MsgStream&    operator << (MsgStream&   ,const SiSpacePointsSeed&);
@@ -85,16 +138,186 @@ namespace InDet {
       m_spacepoints.push_back(p);
     }
 
+  inline void SiSpacePointsSeed::setD0(const double& d0)
+    {
+      m_d0 = d0;
+    }
+
   inline void SiSpacePointsSeed::setZVertex(const double& z) 
     {
       m_zvertex = z;
     }
 
+  inline void SiSpacePointsSeed::setEta(const double& eta)
+    {
+      m_eta = eta;
+    }
+
+  inline void SiSpacePointsSeed::setX1(const double& x1)
+    {
+      m_x1 = x1;
+    }
+
+  inline void SiSpacePointsSeed::setX2(const double& x2)
+    {
+      m_x2 = x2;
+    }
+
+  inline void SiSpacePointsSeed::setX3(const double& x3)
+    {
+      m_x3 = x3;
+    }
+
+  inline void SiSpacePointsSeed::setY1(const double& y1)
+    {
+      m_y1 = y1;
+    }
+
+  inline void SiSpacePointsSeed::setY2(const double& y2)
+    {
+      m_y2 = y2;
+    }
+
+  inline void SiSpacePointsSeed::setY3(const double& y3)
+    {
+      m_y3 = y3;
+    }
+
+  inline void SiSpacePointsSeed::setZ1(const double& z1)
+    {
+      m_z1 = z1;
+    }
+
+  inline void SiSpacePointsSeed::setZ2(const double& z2)
+    {
+      m_z2 = z2;
+    }
+
+  inline void SiSpacePointsSeed::setZ3(const double& z3)
+    {
+      m_z3 = z3;
+    }
+
+  inline void SiSpacePointsSeed::setR1(const double& r1)
+    {
+      m_r1 = r1;
+    }
+
+  inline void SiSpacePointsSeed::setR2(const double& r2)
+    {
+      m_r2 = r2;
+    }
+
+  inline void SiSpacePointsSeed::setR3(const double& r3)
+    {
+      m_r3 = r3;
+    }
+
+  inline void SiSpacePointsSeed::setDZDR_B(const double& dzdr)
+    {
+      m_dzdr_b = dzdr;
+    }
+
+  inline void SiSpacePointsSeed::setDZDR_T(const double& dzdr)
+    {
+      m_dzdr_t = dzdr;
+    }
+
+  inline void SiSpacePointsSeed::setPt(const double& pt)
+    {
+      m_pt = pt;
+    }
+
+  inline const double& SiSpacePointsSeed::d0() const
+    {
+      return m_d0;
+    }
+
   inline const double& SiSpacePointsSeed::zVertex() const 
     {
       return m_zvertex;
     }
+   
+  inline const double& SiSpacePointsSeed::eta() const
+    {
+      return m_eta;
+    }
+
+  inline const double& SiSpacePointsSeed::x1() const
+    {
+      return m_x1;
+    }
+
+  inline const double& SiSpacePointsSeed::x2() const
+    {
+      return m_x2;
+    }
+
+  inline const double& SiSpacePointsSeed::x3() const
+    {
+      return m_x3;
+    }
+
+  inline const double& SiSpacePointsSeed::y1() const
+    {
+      return m_y1;
+    }
+
+  inline const double& SiSpacePointsSeed::y2() const
+    {
+      return m_y2;
+    }
+
+  inline const double& SiSpacePointsSeed::y3() const
+    {
+      return m_y3;
+    }
+
+  inline const double& SiSpacePointsSeed::z1() const
+    {
+      return m_z1;
+    }
+
+  inline const double& SiSpacePointsSeed::z2() const
+    {
+      return m_z2;
+    }
+
+  inline const double& SiSpacePointsSeed::z3() const
+    {
+      return m_z3;
+    }
+
+  inline const double& SiSpacePointsSeed::r1() const
+    {
+      return m_r1;
+    }
+
+  inline const double& SiSpacePointsSeed::r2() const
+    {
+      return m_r2;
+    }
+
+  inline const double& SiSpacePointsSeed::r3() const
+    {
+      return m_r3;
+    }
+
+  inline const double& SiSpacePointsSeed::dzdr_b() const
+    {
+      return m_dzdr_b;
+    }
+
+  inline const double& SiSpacePointsSeed::dzdr_t() const
+    {
+      return m_dzdr_t;
+    }
   
+  inline const double& SiSpacePointsSeed::pt() const
+    {
+      return m_pt;
+    }
+
 } // end of name space
 
 #endif  // SiSpacePointsSeed_h
diff --git a/InnerDetector/InDetRecTools/InDetRecToolInterfaces/InDetRecToolInterfaces/ISiSpacePointsSeedMaker.h b/InnerDetector/InDetRecTools/InDetRecToolInterfaces/InDetRecToolInterfaces/ISiSpacePointsSeedMaker.h
index e51088b9ea7..d166e6712cc 100644
--- a/InnerDetector/InDetRecTools/InDetRecToolInterfaces/InDetRecToolInterfaces/ISiSpacePointsSeedMaker.h
+++ b/InnerDetector/InDetRecTools/InDetRecToolInterfaces/InDetRecToolInterfaces/ISiSpacePointsSeedMaker.h
@@ -26,6 +26,8 @@
 
 class MsgStream;
 
+namespace Trk { class Track; }
+
 namespace InDet {
 
   class SiSpacePointsSeed;
@@ -126,7 +128,13 @@ namespace InDet {
       //@{
       virtual const SiSpacePointsSeed* next(const EventContext& ctx, SiSpacePointsSeedMakerEventData& data) const =0;
       //@}
-      
+
+      virtual void writeNtuple(const SiSpacePointsSeed* seed, const Trk::Track*, int seedType, long eventNumber) const =0;
+
+      virtual bool getWriteNtupleBoolProperty() const =0;
+     
+      enum seedType { StripSeed = 0, PixelSeed = 1 };
+ 
       ///////////////////////////////////////////////////////////////////
       /// @name Print internal tool parameters and status
       ///////////////////////////////////////////////////////////////////
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ATLxk.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ATLxk.h
index adc213c8c9e..1fa659963e5 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ATLxk.h
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ATLxk.h
@@ -22,6 +22,9 @@
 #include "TrkSpacePoint/SpacePointContainer.h" 
 #include "TrkSpacePoint/SpacePointOverlapCollection.h"
 #include "TrkEventUtils/PRDtoTrackMap.h"
+#include "GaudiKernel/ITHistSvc.h"
+#include "TFile.h"
+#include "TTree.h"
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // MagField cache
@@ -35,6 +38,8 @@
 #include <vector>
 
 class MsgStream;
+//class TFile;
+//class TTree;
 
 namespace InDet {
 
@@ -117,7 +122,16 @@ namespace InDet {
     **/ 
     virtual const SiSpacePointsSeed* next(const EventContext& ctx, EventData& data) const override;
     //@}
-      
+     
+    /** This method is called by the SiSPSeededTrackFinder algorithm to fill ntuples for 
+    * seeds seen by the algorithm. seedType represents Pixel/SCT type seeds, where 0->SCT
+    * and 1->Pixel. givesTrack is determined by whether or not the given seed forms atleast 
+    * one track candidate. 0->No track candidate 1->At least one track Candidate
+    **/  
+    virtual void writeNtuple(const SiSpacePointsSeed* seed, const Trk::Track* track, int seedType, long eventNumber) const;
+
+    virtual bool getWriteNtupleBoolProperty() const;
+
     ///////////////////////////////////////////////////////////////////
     /// @name Print internal tool parameters and status
     ///////////////////////////////////////////////////////////////////
@@ -475,6 +489,47 @@ namespace InDet {
      * @return true if the seed is confirmed, false otherwise 
      **/ 
     bool isConfirmedSeed(const InDet::SiSpacePointForSeed* bottomSP, const InDet::SiSpacePointForSeed* topSP, float quality) const; 
+
+    ///Flag to write validation ntuples. Turned off by default
+    Gaudi::Property<bool> m_writeNtuple {this, "WriteNtuple", false, "Flag to write Validation Ntuples"};
+
+    ITHistSvc* m_thistSvc;
+
+    TFile* m_outputFile;
+    TTree* m_outputTree;
+
+    mutable std::mutex m_mutex;
+
+    mutable std::string          m_treeName               ATLAS_THREAD_SAFE;
+    mutable TString              m_treeFolder             ATLAS_THREAD_SAFE;
+
+    mutable float                  m_d0                   ATLAS_THREAD_SAFE;
+    mutable float                  m_z0                   ATLAS_THREAD_SAFE;
+    mutable float                  m_pt                   ATLAS_THREAD_SAFE;
+    mutable float                  m_eta                  ATLAS_THREAD_SAFE;
+    mutable double                 m_x1                   ATLAS_THREAD_SAFE;
+    mutable double                 m_x2                   ATLAS_THREAD_SAFE;
+    mutable double                 m_x3                   ATLAS_THREAD_SAFE;
+    mutable double                 m_y1                   ATLAS_THREAD_SAFE;
+    mutable double                 m_y2                   ATLAS_THREAD_SAFE;
+    mutable double                 m_y3                   ATLAS_THREAD_SAFE;
+    mutable double                 m_z1                   ATLAS_THREAD_SAFE;
+    mutable double                 m_z2                   ATLAS_THREAD_SAFE;
+    mutable double                 m_z3                   ATLAS_THREAD_SAFE;
+    mutable double                 m_r1                   ATLAS_THREAD_SAFE;
+    mutable double                 m_r2                   ATLAS_THREAD_SAFE;
+    mutable double                 m_r3                   ATLAS_THREAD_SAFE;
+    mutable float                  m_quality              ATLAS_THREAD_SAFE;
+    mutable int                    m_type                 ATLAS_THREAD_SAFE;
+    mutable int                    m_status               ATLAS_THREAD_SAFE;
+    mutable double                 m_dzdr_t               ATLAS_THREAD_SAFE;
+    mutable double                 m_dzdr_b               ATLAS_THREAD_SAFE;
+    mutable bool                   m_givesTrack           ATLAS_THREAD_SAFE;
+    mutable float                  m_trackD0              ATLAS_THREAD_SAFE;
+    mutable float                  m_trackZ0              ATLAS_THREAD_SAFE;
+    mutable float                  m_trackPt              ATLAS_THREAD_SAFE;
+    mutable float                  m_trackEta             ATLAS_THREAD_SAFE;
+    mutable long                   m_eventNumber          ATLAS_THREAD_SAFE;
   };
   
 } // end of name space
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_BeamGas.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_BeamGas.h
index ce9990ce62b..5ec5f5ba0e1 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_BeamGas.h
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_BeamGas.h
@@ -111,6 +111,10 @@ namespace InDet {
     virtual const SiSpacePointsSeed* next(const EventContext& ctx, EventData& data) const override;
     //@}
 
+    virtual void writeNtuple(const SiSpacePointsSeed* seed, const Trk::Track* track, int seedType, long EventNumber) const;
+
+    virtual bool getWriteNtupleBoolProperty() const;
+
     ///////////////////////////////////////////////////////////////////
     /// @name Print internal tool parameters and status
     ///////////////////////////////////////////////////////////////////
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Cosmic.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Cosmic.h
index 9dabc1d84eb..a72164353de 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Cosmic.h
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Cosmic.h
@@ -108,6 +108,10 @@ namespace InDet {
     virtual const SiSpacePointsSeed* next(const EventContext& ctx, EventData& data) const override;
     //@}
 
+    virtual void writeNtuple(const SiSpacePointsSeed* seed, const Trk::Track* track, int seedType, long eventNumber) const;
+
+    virtual bool getWriteNtupleBoolProperty() const;
+
     ///////////////////////////////////////////////////////////////////
     /// @name Print internal tool parameters and status
     ///////////////////////////////////////////////////////////////////
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_HeavyIon.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_HeavyIon.h
index 9dd38fd4534..19e54527894 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_HeavyIon.h
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_HeavyIon.h
@@ -109,6 +109,10 @@ namespace InDet {
     virtual const SiSpacePointsSeed* next(const EventContext& ctx, EventData& data) const override;
     //@}
 
+    virtual void writeNtuple(const SiSpacePointsSeed* seed, const Trk::Track* track, int seedType, long eventNumber) const;
+
+    virtual bool getWriteNtupleBoolProperty() const;
+
     ///////////////////////////////////////////////////////////////////
     /// @name Print internal tool parameters and status
     ///////////////////////////////////////////////////////////////////
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ITK.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ITK.h
index a744dc44eaf..b922f7a3866 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ITK.h
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_ITK.h
@@ -111,6 +111,10 @@ namespace InDet {
     virtual const SiSpacePointsSeed* next(const EventContext& ctx, EventData& data) const override;
     //@}
 
+    virtual void writeNtuple(const SiSpacePointsSeed* seed, const Trk::Track* track, int seedType, long eventNumber) const;
+
+    virtual bool getWriteNtupleBoolProperty() const;
+
     ///////////////////////////////////////////////////////////////////
     /// @name Print internal tool parameters and status
     ///////////////////////////////////////////////////////////////////
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_LowMomentum.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_LowMomentum.h
index aa55a92ed6d..153db9d6f5b 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_LowMomentum.h
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_LowMomentum.h
@@ -109,6 +109,10 @@ namespace InDet {
     virtual const SiSpacePointsSeed* next(const EventContext& ctx, EventData& data) const override;
     //@}
 
+    virtual void writeNtuple(const SiSpacePointsSeed* seed, const Trk::Track* track, int seedType, long eventNumber) const;
+
+    virtual bool getWriteNtupleBoolProperty() const;
+
     ///////////////////////////////////////////////////////////////////
     /// @name Print internal tool parameters and status
     ///////////////////////////////////////////////////////////////////
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Trigger.h b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Trigger.h
index 92375cc65ee..6ffa79a5ee9 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Trigger.h
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/SiSpacePointsSeedTool_xk/SiSpacePointsSeedMaker_Trigger.h
@@ -107,6 +107,10 @@ namespace InDet {
     virtual const SiSpacePointsSeed* next(const EventContext& ctx, EventData& data) const override;
     //@}
 
+    virtual void writeNtuple(const SiSpacePointsSeed* seed, const Trk::Track* track, int seedType, long eventNumber) const;
+
+    virtual bool getWriteNtupleBoolProperty() const;
+
     ///////////////////////////////////////////////////////////////////
     /// @name Print internal tool parameters and status
     ///////////////////////////////////////////////////////////////////
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ATLxk.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ATLxk.cxx
index b039fc6bae1..36a72a60852 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ATLxk.cxx
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ATLxk.cxx
@@ -16,6 +16,10 @@
 #include "InDetPrepRawData/SiCluster.h"
 #include "InDetReadoutGeometry/SiDetectorElement.h"
 
+#include "TrkTrack/Track.h"
+#include "TrkParameters/TrackParameters.h"
+
+#include "StoreGate/ReadCondHandle.h"
 #include <iomanip>
 #include <ostream>
 
@@ -25,7 +29,11 @@
 
 InDet::SiSpacePointsSeedMaker_ATLxk::SiSpacePointsSeedMaker_ATLxk
 (const std::string& t,const std::string& n,const IInterface* p)
-  : base_class(t, n, p)
+  : base_class(t, n, p),
+    m_thistSvc(nullptr),
+    m_outputTree(nullptr),
+    m_treeName(""),
+    m_treeFolder("/valNtuples/")
 {
 }
 
@@ -62,6 +70,46 @@ StatusCode InDet::SiSpacePointsSeedMaker_ATLxk::initialize()
     dump(data, msg(MSG::DEBUG));
   }
 
+  if (m_writeNtuple) {
+
+    ATH_CHECK( service("THistSvc",m_thistSvc)  );
+ 
+    m_treeName = (std::string("SeedTree_")+name());
+    std::replace( m_treeName.begin(), m_treeName.end(), '.', '_' );
+ 
+    m_outputTree = new TTree( m_treeName.c_str() , "SeedMakerValTool"); 
+
+    m_outputTree->Branch("eventNumber",    &m_eventNumber); 
+    m_outputTree->Branch("d0",             &m_d0);
+    m_outputTree->Branch("z0",             &m_z0);
+    m_outputTree->Branch("pt",             &m_pt);
+    m_outputTree->Branch("eta",            &m_eta);
+    m_outputTree->Branch("x1",             &m_x1);
+    m_outputTree->Branch("x2",             &m_x2);
+    m_outputTree->Branch("x3",             &m_x3);
+    m_outputTree->Branch("y1",             &m_y1);
+    m_outputTree->Branch("y2",             &m_y2);
+    m_outputTree->Branch("y3",             &m_y3);
+    m_outputTree->Branch("z1",             &m_z1);
+    m_outputTree->Branch("z2",             &m_z2);
+    m_outputTree->Branch("z3",             &m_z3);
+    m_outputTree->Branch("r1",             &m_r1);
+    m_outputTree->Branch("r2",             &m_r2);
+    m_outputTree->Branch("r3",             &m_r3);
+    m_outputTree->Branch("quality",        &m_quality);
+    m_outputTree->Branch("seedType",       &m_type);
+    m_outputTree->Branch("givesTrack",     &m_givesTrack);
+    m_outputTree->Branch("dzdr_b",  	   &m_dzdr_b);
+    m_outputTree->Branch("dzdr_t",         &m_dzdr_t);
+    m_outputTree->Branch("track_pt",       &m_trackPt);
+    m_outputTree->Branch("track_eta",      &m_trackEta);
+
+    TString fullTreeName = m_treeFolder + m_treeName;
+
+    ATH_CHECK(  m_thistSvc->regTree( fullTreeName.Data(), m_outputTree )  );
+
+  }
+
   return sc;
 }
 
@@ -147,6 +195,7 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::newEvent(const EventContext& ctx, Even
     // 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 
@@ -154,6 +203,7 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::newEvent(const EventContext& ctx, Even
     // 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;
@@ -1767,6 +1817,7 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::production3Sp
 	      if(z0 > zmax || z0 < zmin) continue;
         /// found a bottom SP candidate, write it into the data object
         data.SP[Nb] = (*iter_otherSP);
+        if(m_writeNtuple) data.SP[Nb]->setDZDR(dZdR);
         /// if we are exceeding the SP capacity of our data object,
         /// make it resize its vectors. Will add 50 slots by default,
         /// so rarely should happen more than once per event.  
@@ -1815,6 +1866,7 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::production3Sp
  	      if(z0 > zmax || z0 < zmin) continue;
         /// add SP to the list
         data.SP[Nt] = (*iter_otherSP);
+        if (m_writeNtuple)  data.SP[Nt]->setDZDR(dZdR);
         /// if we are exceeding the SP capacity of our data object,
         /// make it resize its vectors. Will add 50 slots by default,
         /// so rarely should happen more than once per event.  
@@ -1904,6 +1956,11 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::production3Sp
         
         /// average value of 1/tan(theta), approximate the slope at the location of the central space point
         float meanOneOverTanTheta = (Tzb+data.Tz[t])/2.; 
+        float theta = 0.;
+        if(m_writeNtuple){
+          /// theta estimate of the seed based on the average value of 1/tan(theta)
+          theta = atan(1./meanOneOverTanTheta);
+        }
         /// squared error on the difference in tan(theta) due to space point position errors. 
         float sigmaSquaredSpacePointErrors = Erb+data.Er[t]   /// pre-computed individual squared errors on 1/tan(theta) for the two segments 
                         + 2. * covz0 * data.R[t]*data.R[b]    /// mixed term with z-uncertainty on central SP
@@ -1956,7 +2013,6 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::production3Sp
          * pt. This refines the cut applied above, following the same logic ("delta² - sigma² ?<=0")
          **/
         if (BSquare  > ipt2K*onePlusAsquare || remainingSquaredDelta*onePlusAsquare > BSquare*sigmaSquaredScatteringPtDependent) continue;
-
         /** This is an estimate of the transverse impact parameter. 
         * The reasoning is that, in the x-y frame with the central SP as origin and 
         * the x axis pointing away from the IP, we have for the distance between
@@ -1992,11 +2048,18 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::production3Sp
           /// deviate from a straight line in r-z
           data.SP[t]->setScorePenalty(std::abs((Tzb-data.Tz[t])/(dr*sTzb2)));
           data.SP[t]->setParam(d0);
+
+          if(m_writeNtuple){
+            /// set parameters for ntuple writing
+            data.SP[t]->setEta(-log(tan(0.5*theta)));
+            data.SP[t]->setPt(std::sqrt(onePlusAsquare/BSquare)/(1000*data.K)); 
+          }
           /// record one possible seed candidate, sort by the curvature 
           data.CmSp.emplace_back(std::make_pair(B/std::sqrt(onePlusAsquare), data.SP[t]));
           /// store the transverse IP, will later be used as a quality estimator 
 
         }
+   
       }   ///< end loop over top space point candidates
       /// now apply further cleaning on the seed candidates for this central+bottom pair. 
       if (!data.CmSp.empty()) {
@@ -2006,6 +2069,7 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::production3Sp
     ///record seeds found in this run  
     fillSeeds(data);
     nseed += data.fillOneSeeds;
+   
   } ///< end loop over central SP 
 }
 
@@ -2386,6 +2450,7 @@ void InDet::SiSpacePointsSeedMaker_ATLxk::newOneSeedWithCurvaturesComparison
 
 void InDet::SiSpacePointsSeedMaker_ATLxk::fillSeeds(EventData& data) const
 {
+
   data.fillOneSeeds = 0;
 
   std::multimap<float,InDet::SiSpacePointsProSeed*>::iterator it_firstSeedCandidate = data.mapOneSeeds_Pro.begin();
@@ -2442,6 +2507,7 @@ const InDet::SiSpacePointsSeed* InDet::SiSpacePointsSeedMaker_ATLxk::next(const
       }
       /// iterate until we find a valid seed satisfying certain quality cuts in set3 
     } while (!(*data.i_seed_Pro++).set3(data.seedOutput));
+
     /// then return this next seed candidate 
     return &data.seedOutput;
   } else {
@@ -2456,6 +2522,50 @@ const InDet::SiSpacePointsSeed* InDet::SiSpacePointsSeedMaker_ATLxk::next(const
   return nullptr;
 }
 
+///////////////////////////////////////////////////////////////////////////////////
+/// Method to write ntuple entries for an input seed
+///////////////////////////////////////////////////////////////////////////////////
+void InDet::SiSpacePointsSeedMaker_ATLxk::writeNtuple(const SiSpacePointsSeed* seed, const Trk::Track* track, int seedType, long eventNumber) const{
+  
+  if(m_writeNtuple) {
+    std::lock_guard<std::mutex> lock(m_mutex);
+
+    if(track != nullptr) {
+      m_trackPt = (track->trackParameters()->front()->pT())/1000.;
+      m_trackEta = std::abs(track->trackParameters()->front()->eta());
+    }
+    else {
+      m_trackPt = -1.;
+      m_trackEta = -1.; 
+    }
+    m_d0           =   seed->d0();
+    m_z0           =   seed->zVertex();
+    m_eta          =   seed->eta();
+    m_x1           =   seed->x1();
+    m_x2           =   seed->x2();
+    m_x3           =   seed->x3();
+    m_y1           =   seed->y1();
+    m_y2           =   seed->y2();
+    m_y3           =   seed->y3();      
+    m_z1           =   seed->z1();
+    m_z2           =   seed->z2();
+    m_z3           =   seed->z3();
+    m_r1           =   seed->r1();
+    m_r2           =   seed->r2();
+    m_r3           =   seed->r3();
+    m_type         =   seedType;
+    m_dzdr_b       =   seed->dzdr_b();
+    m_dzdr_t       =   seed->dzdr_t();
+    m_pt           =   seed->pt();
+    m_givesTrack   =   !(track == nullptr);
+    m_eventNumber  =   eventNumber;
+
+    m_outputTree->Fill();
+
+  }
+
+}
+
 bool InDet::SiSpacePointsSeedMaker_ATLxk::isZCompatible  
 (EventData& data, const float& Zv, const float& R, const float& T) const
 {
@@ -2562,3 +2672,7 @@ bool InDet::SiSpacePointsSeedMaker_ATLxk::isConfirmedSeed(const InDet::SiSpacePo
     /// PPS: the confirmation is the only quality modifier applied
     else return (quality < 0.); 
 }
+
+bool InDet::SiSpacePointsSeedMaker_ATLxk::getWriteNtupleBoolProperty() const{
+    return m_writeNtuple;
+} 
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_BeamGas.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_BeamGas.cxx
index 2c7400366b8..3ebae905d6d 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_BeamGas.cxx
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_BeamGas.cxx
@@ -1216,3 +1216,10 @@ void InDet::SiSpacePointsSeedMaker_BeamGas::initializeEventData(EventData& data)
                   0, // sizeRFZV not used
                   false); // checkEta not used
 }
+
+void InDet::SiSpacePointsSeedMaker_BeamGas::writeNtuple(const SiSpacePointsSeed*, const Trk::Track*, int, long) const{
+}
+
+bool InDet::SiSpacePointsSeedMaker_BeamGas::getWriteNtupleBoolProperty() const{
+    return false;
+}
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Cosmic.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Cosmic.cxx
index bbfc2e54f25..d1ef2528e3d 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Cosmic.cxx
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Cosmic.cxx
@@ -1160,3 +1160,10 @@ void InDet::SiSpacePointsSeedMaker_Cosmic::initializeEventData(EventData& data)
                   0, // sizeRFZV not used
                   false); // checkEta not used
 }
+
+void InDet::SiSpacePointsSeedMaker_Cosmic::writeNtuple(const SiSpacePointsSeed*, const Trk::Track*, int, long) const{
+}
+
+bool InDet::SiSpacePointsSeedMaker_Cosmic::getWriteNtupleBoolProperty() const{
+    return false;
+}
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_HeavyIon.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_HeavyIon.cxx
index 423b40ddfde..297a3a60f3a 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_HeavyIon.cxx
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_HeavyIon.cxx
@@ -1743,3 +1743,10 @@ void InDet::SiSpacePointsSeedMaker_HeavyIon::initializeEventData(EventData& data
                   SizeRFZV,
                   false); // checkEta not used
 }
+
+void InDet::SiSpacePointsSeedMaker_HeavyIon::writeNtuple(const SiSpacePointsSeed*, const Trk::Track*, int, long) const{
+}
+
+bool InDet::SiSpacePointsSeedMaker_HeavyIon::getWriteNtupleBoolProperty() const{
+    return false;
+}
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ITK.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ITK.cxx
index acc9bb73cea..aabcf9cd641 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ITK.cxx
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_ITK.cxx
@@ -2077,3 +2077,10 @@ void InDet::SiSpacePointsSeedMaker_ITK::initializeEventData(EventData& data) con
                   SizeRFZV,
                   m_checketa);
 }
+
+void InDet::SiSpacePointsSeedMaker_ITK::writeNtuple(const SiSpacePointsSeed*, const Trk::Track*, int, long) const{
+}
+
+bool InDet::SiSpacePointsSeedMaker_ITK::getWriteNtupleBoolProperty() const{
+    return false;
+}
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_LowMomentum.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_LowMomentum.cxx
index 3f075123c6b..b0fb2dc7cd7 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_LowMomentum.cxx
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_LowMomentum.cxx
@@ -1184,3 +1184,10 @@ void InDet::SiSpacePointsSeedMaker_LowMomentum::initializeEventData(EventData& d
                   0, // sizeRFZV not used
                   false); // checkEta not used
 }
+
+void InDet::SiSpacePointsSeedMaker_LowMomentum::writeNtuple(const SiSpacePointsSeed*, const Trk::Track*, int, long) const{
+}
+
+bool InDet::SiSpacePointsSeedMaker_LowMomentum::getWriteNtupleBoolProperty() const{
+    return false;
+}
diff --git a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Trigger.cxx b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Trigger.cxx
index 61db8694e7a..4bae1bd01ec 100644
--- a/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Trigger.cxx
+++ b/InnerDetector/InDetRecTools/SiSpacePointsSeedTool_xk/src/SiSpacePointsSeedMaker_Trigger.cxx
@@ -1664,3 +1664,10 @@ void InDet::SiSpacePointsSeedMaker_Trigger::initializeEventData(EventData& data)
                   SizeRFZV,
                   false); // checkEta not used
 }
+
+void InDet::SiSpacePointsSeedMaker_Trigger::writeNtuple(const SiSpacePointsSeed*, const Trk::Track*, int, long) const{
+}
+
+bool InDet::SiSpacePointsSeedMaker_Trigger::getWriteNtupleBoolProperty() const{
+    return false;
+}
diff --git a/InnerDetector/InDetRecTools/SiTrackMakerTool_xk/src/SiTrackMaker_xk.cxx b/InnerDetector/InDetRecTools/SiTrackMakerTool_xk/src/SiTrackMaker_xk.cxx
index ac26da25831..8c775c0772e 100644
--- a/InnerDetector/InDetRecTools/SiTrackMakerTool_xk/src/SiTrackMaker_xk.cxx
+++ b/InnerDetector/InDetRecTools/SiTrackMakerTool_xk/src/SiTrackMaker_xk.cxx
@@ -565,8 +565,8 @@ void InDet::SiTrackMaker_xk::newTrigEvent(const EventContext& ctx, SiTrackMakerE
   data.inputseeds() = 0;
   data.goodseeds()  = 0;
   data.findtracks() = 0;
-  for(int i=0; i!=SiCombinatorialTrackFinderData_xk::kNStatAllTypes; ++i) { for(int k = 0; k!=SiCombinatorialTrackFinderData_xk::kNSeedTypes; ++k) data.summaryStatAll()[i][k]; }
-  for(int i=0; i!=SiCombinatorialTrackFinderData_xk::kNStatEtaTypes; ++i) { for(int k = 0; k!=SiCombinatorialTrackFinderData_xk::kNSeedTypes; ++k) { for(int r=0; r!=SiCombinatorialTrackFinderData_xk::kNRapidityRanges; ++r) data.summaryStatUsedInTrack()[i][k][r]; } }
+  for(int i=0; i!=SiCombinatorialTrackFinderData_xk::kNStatAllTypes; ++i) { for(int k = 0; k!=SiCombinatorialTrackFinderData_xk::kNSeedTypes; ++k) data.summaryStatAll()[i][k] = 0.; }
+  for(int i=0; i!=SiCombinatorialTrackFinderData_xk::kNStatEtaTypes; ++i) { for(int k = 0; k!=SiCombinatorialTrackFinderData_xk::kNSeedTypes; ++k) { for(int r=0; r!=SiCombinatorialTrackFinderData_xk::kNRapidityRanges; ++r) data.summaryStatUsedInTrack()[i][k][r] = 0.; } }
 
 }
 
-- 
GitLab