From 9d1c422efa480adbde3f4be2ff937356099420e9 Mon Sep 17 00:00:00 2001
From: Helen Maguire <helen.maguire@cern.ch>
Date: Fri, 19 Mar 2021 12:59:56 +0100
Subject: [PATCH] Added code for new histograms for matched, merged, split and
 fake vertices Initial commit towards QT task also added code for sumpt, sum
 charge , sum charge/n_trak and z-asymmetry for each category of vertex
 classification and for HS and PU vertices

---
 CommitTest.txt                                |   1 +
 .../share/InDetPVMPlotDefCommon.xml           | 167 +++++++++++-
 .../InDetPhysValMonitoring_topOptions.py      |   5 +
 .../src/InDetPerfPlot_VertexTruthMatching.cxx | 246 +++++++++++++++++-
 .../src/InDetPerfPlot_VertexTruthMatching.h   |  50 ++++
 .../src/InDetPerfPlot_nTracks.cxx             |  12 +
 .../src/InDetRttPlots.cxx                     |   9 +
 .../src/InDetRttPlots.h                       |   3 +
 8 files changed, 490 insertions(+), 3 deletions(-)
 create mode 100644 CommitTest.txt

diff --git a/CommitTest.txt b/CommitTest.txt
new file mode 100644
index 000000000000..c29f3a9ae881
--- /dev/null
+++ b/CommitTest.txt
@@ -0,0 +1 @@
+"test content for git tutorial"
diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/share/InDetPVMPlotDefCommon.xml b/InnerDetector/InDetValidation/InDetPhysValMonitoring/share/InDetPVMPlotDefCommon.xml
index 8a3e04e69276..a26dc53fcd58 100644
--- a/InnerDetector/InDetValidation/InDetPhysValMonitoring/share/InDetPVMPlotDefCommon.xml
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/share/InDetPVMPlotDefCommon.xml
@@ -933,7 +933,7 @@
   <y title="Entries"/>
 </h>
 <h id="vx_track_weights" type="TH1F" title="Weights of tracks at vertex">
-  <x title="Weight" n="100" lo="0." hi="10.0"/>
+  <x title="Weight" n="100" lo="0." hi="1.55555"/>
   <y title="Entries"/>
 </h>
 <h id="vx_track_pt" type="TH1F" title="Tracks at vertex p_{T}">
@@ -968,6 +968,171 @@
   <x title="#sigma(z_{0}) (mm)" n="50" lo="0.0" hi="5.0"/>
   <y title="Entries"/>
 </h>
+<!-- Helen OTP Vertex plots -->
+<h id="vx_ntracks_vs_nmatchedvertices" type="TH1" title="Number of tracks for matched PU vertices">
+  <x title="Number of Matched PU Vertices" n="150" lo="0.0" hi="150"/>
+  <y title="Number of Tracks" />
+</h>
+<h id="vx_ntracks_vs_nmergedvertices" type="TH1" title="Number of tracks for merged PU vertices">
+  <x title="Number of Merged PU Vertices" n="150" lo="0.0" hi="150"/>
+  <y title="Number of Tracks" />
+</h>
+<h id="vx_ntracks_vs_nsplitvertices" type="TH1" title="Number of tracks for split PU vertices">
+  <x title="Number of Split PU Vertices" n="150" lo="0.0" hi="150"/>
+  <y title="Number of Tracks" />
+</h>
+<h id="vx_ntracks_vs_nfakevertices" type="TH1" title="Number of tracks for fake PU vertices">
+  <x title="Number of Fake PU Vertices" n="150" lo="0.0" hi="150"/>
+  <y title="Number of Tracks" />
+</h>
+<h id="vx_ntracks_vs_HS_nmatchedvertices" type="TH1" title="Number of tracks for matched HS vertices">
+  <x title="Number of Matched HS Vertices" n="150" lo="0.0" hi="150"/>
+  <y title="Number of Tracks" />
+</h>
+<h id="vx_ntracks_vs_HS_nmergedvertices" type="TH1" title="Number of tracks for merged HS vertices">
+  <x title="Number of Merged HS Vertices" n="150" lo="0.0" hi="150"/>
+  <y title="Number of Tracks" />
+</h>
+<h id="vx_ntracks_vs_HS_nsplitvertices" type="TH1" title="Number of tracks for split HS vertices">
+  <x title="Number of Split HS Vertices" n="150" lo="0.0" hi="50"/>
+  <y title="Number of Tracks" />
+</h>
+<h id="vx_ntracks_vs_HS_nfakevertices" type="TH1" title="Number of tracks for fake HS vertices">
+  <x title="Number of Fake HS Vertices" n="150" lo="0.0" hi="50"/>
+  <y title="Number of Tracks" />
+</h>
+<h id="vx_sumpT_matched" type="TH1" title="SumPt of tracks for matched vertices">
+  <x title="sum p_{T} (GeV)of tracks" n="100" lo="0.0" hi="400"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumpT_merged" type="TH1" title="SumPt of tracks for merged vertices">
+  <x title="sum p_{T} (GeV)of tracks" n="100" lo="0.0" hi="400"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumpT_split" type="TH1" title="SumPt of tracks for split vertices">
+  <x title="sum p_{T} (GeV)of tracks" n="100" lo="0.0" hi="400"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumpT_fake" type="TH1" title="SumPt of tracks for fake vertices">
+  <x title="sum p_{T} (GeV)of tracks" n="100" lo="0.0" hi="400"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumpT_HS_matched" type="TH1" title="SumPt of tracks for HS matched vertices">
+  <x title="sum p_{T} (GeV)of tracks" n="100" lo="0.0" hi="400"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumpT_HS_merged" type="TH1" title="SumPt of tracks for HS merged vertices">
+  <x title="sum p_{T} (GeV)of tracks" n="100" lo="0.0" hi="400"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumpT_HS_split" type="TH1" title="SumPt of tracks for HS split vertices">
+  <x title="sum p_{T} (GeV)of tracks" n="100" lo="0.0" hi="400"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumpT_HS_fake" type="TH1" title="SumPt of tracks for HS fake vertices">
+  <x title="sum p_{T} (GeV)of tracks" n="100" lo="0.0" hi="400"/>
+  <y title="Entries" />
+</h>
+
+<!--Helen OTP sum charge plots -->
+<h id="vx_sumCharge_matched" type="TH1" title="Sum of charges of tracks for matched vertices">
+  <x title="sum of charges of tracks" n="100" lo="-25.0" hi="25"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_merged" type="TH1" title="Sum of charges of tracks for merged vertices">
+  <x title="sum of charges of tracks" n="100" lo="-25.0" hi="25"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_split" type="TH1" title="Sumof charges of tracks for split vertices">
+  <x title="sum of charges of tracks" n="100" lo="-25.0" hi="25"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_fake" type="TH1" title="Sum of charges of tracks for fake vertices">
+  <x title="sum of charges of tracks" n="100" lo="-25.0" hi="25"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_HS_matched" type="TH1" title="Sum of charges of tracks for HS matched vertices">
+  <x title="sum of charges of tracks" n="100" lo="-25.0" hi="25"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_HS_merged" type="TH1" title="Sum of charges of tracks for HS merged vertices">
+  <x title="sum of charges of tracks" n="100" lo="-25.0" hi="25"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_HS_split" type="TH1" title="Sumof charges of tracks for HS split vertices">
+  <x title="sum of charges of tracks" n="100" lo="-25.0" hi="25"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_HS_fake" type="TH1" title="Sum of charges of tracks for HS fake vertices">
+  <x title="sum of charges of tracks" n="100" lo="-25.0" hi="25"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_N_trk_HS_matched" type="TH1" title="Sum of charges of tracks/N_trk for HS matched vertices">
+  <x title="sum of charges of tracks/number of tracks" n="100" lo="-0.5" hi="0.5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_N_trk_HS_merged" type="TH1" title="Sum of charges of tracks/N_trk for HS merged vertices">
+  <x title="sum of charges of tracks/number of tracks" n="100" lo="-0.5" hi="0.5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_N_trk_HS_split" type="TH1" title="Sum of charges of tracks/N_trk for HS split vertices">
+  <x title="sum of charges of tracks/number of tracks" n="100" lo="-0.5" hi="0.5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_N_trk_HS_fake" type="TH1" title="Sum of charges of tracks/N_trk for HS fake vertices">
+  <x title="sum of charges of tracks/number of tracks" n="100" lo="-0.5" hi="0.5"/>
+  <y title="Entries" />
+</h>
+
+<h id="vx_sumCharge_N_trk_matched" type="TH1" title="Sum of charges of tracks/N_trk for PU matched vertices">
+  <x title="sum of charges of tracks/number of tracks" n="100" lo="-0.5" hi="0.5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_N_trk_merged" type="TH1" title="Sum of charges of tracks/N_trk for PU merged vertices">
+  <x title="sum of charges of tracks/number of tracks" n="100" lo="-0.5" hi="0.5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_N_trk_split" type="TH1" title="Sum of charges of tracks/N_trk for PU  split vertices">
+  <x title="sum of charges of tracks/number of tracks" n="100" lo="-0.5" hi="0.5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_sumCharge_N_trk_fake" type="TH1" title="Sum of charges of tracks/N_trk for PU fake vertices">
+  <x title="sum of charges of tracks/number of tracks" n="100" lo="-0.5" hi="0.5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_z_asym_matched" type="TH1" title="asymmetry of track Z0 around vertex of tracks for matched vertices">
+  <x title="asymmetry of track Z0 around vertex of tracks" n="100" lo="-5.0" hi="5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_z_asym_merged" type="TH1" title="asymmetry of track Z0 around vertex of tracks for merged vertices">
+  <x title="asymmetry of track Z0 around vertex of tracks" n="100" lo="-5.0" hi="5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_z_asym_split" type="TH1" title="asymmetry of track Z0 around vertex of tracks for split vertices">
+  <x title="asymmetry of track Z0 around vertex of tracks" n="100" lo="-5.0" hi="5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_z_asym_fake" type="TH1" title="asymmetry of track Z0 around vertex of tracks for fake vertices">
+  <x title="asymmetry of track Z0 around vertex of tracks" n="100" lo="-5.0" hi="5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_z_asym_HS_matched" type="TH1" title="asymmetry of track Z0 around vertex of tracks for HS matched vertices">
+  <x title="asymmetry of track Z0 around vertex of tracks" n="100" lo="-5.0" hi="5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_z_asym_HS_merged" type="TH1" title="asymmetry of track Z0 around vertex of tracks for HS merged vertices">
+  <x title="asymmetry of track Z0 around vertex of tracks" n="100" lo="-5.0" hi="5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_z_asym_HS_split" type="TH1" title="asymmetry of track Z0 around vertex of tracks for HS split vertices">
+  <x title="asymmetry of track Z0 around vertex of tracks" n="100" lo="-5.0" hi="5"/>
+  <y title="Entries" />
+</h>
+<h id="vx_z_asym_HS_fake" type="TH1" title="asymmetry of track Z0 around vertex of tracks for HS fake vertices">
+  <x title="asymmetry of track Z0 around vertex of tracks" n="100" lo="-5.0" hi="5"/>
+  <y title="Entries" />
+</h>
+
 <!-- -->
 <!-- Bad Match Rate (BMR) plots -->
 <h id="BadMatchRate" type="TProfile" title="Fraction of Tracks with &lt; 80% Truth Matching Probability">
diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/share/InDetPhysValMonitoring_topOptions.py b/InnerDetector/InDetValidation/InDetPhysValMonitoring/share/InDetPhysValMonitoring_topOptions.py
index ba7cb9e48839..a05e03f972a9 100644
--- a/InnerDetector/InDetValidation/InDetPhysValMonitoring/share/InDetPhysValMonitoring_topOptions.py
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/share/InDetPhysValMonitoring_topOptions.py
@@ -59,4 +59,9 @@ include ("PhysValMonitoring/PhysValInDet_jobOptions.py")
 # finally, set up the infrastructure for writing our output
 from GaudiSvc.GaudiSvcConf import THistSvc
 ServiceMgr += THistSvc()
+
 svcMgr.THistSvc.Output += ["M_output DATAFILE='"+MyArgs.outputFile+"' OPT='RECREATE'"]
+
+
+ToolSvc.InDetVertexTruthMatchTool.OutputLevel = 2
+
diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_VertexTruthMatching.cxx b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_VertexTruthMatching.cxx
index a6b21a33004b..9c412e3b486b 100644
--- a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_VertexTruthMatching.cxx
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_VertexTruthMatching.cxx
@@ -10,6 +10,9 @@
 #include "InDetPerfPlot_VertexTruthMatching.h"
 #include "EventPrimitives/EventPrimitives.h"
 #include "EventPrimitives/EventPrimitivesHelpers.h"
+// 2 new includes HRM
+#include "InDetPerfPlot_Vertex.h"
+#include "InDetPerfPlot_nTracks.h"
 
 using namespace IDPVM;
 
@@ -72,7 +75,49 @@ InDetPerfPlot_VertexTruthMatching::InDetPerfPlot_VertexTruthMatching(InDetPlotBa
     m_vx_hs_truth_y_res_vs_nTrk(nullptr),
     m_vx_hs_truth_z_pull_vs_nTrk(nullptr),
     m_vx_hs_truth_x_pull_vs_nTrk(nullptr),
-    m_vx_hs_truth_y_pull_vs_nTrk(nullptr)
+    m_vx_hs_truth_y_pull_vs_nTrk(nullptr),
+   // New histos HRM Helen OTP
+    m_vx_ntracks_vs_nmatchedvertices(nullptr),
+    m_vx_ntracks_vs_nmergedvertices(nullptr),
+    m_vx_ntracks_vs_nsplitvertices(nullptr),
+    m_vx_ntracks_vs_nfakevertices(nullptr),
+    m_vx_ntracks_vs_HS_nmatchedvertices(nullptr),
+    m_vx_ntracks_vs_HS_nmergedvertices(nullptr),
+    m_vx_ntracks_vs_HS_nsplitvertices(nullptr),
+    m_vx_ntracks_vs_HS_nfakevertices(nullptr),
+    m_vx_sumpT_matched(nullptr),
+    m_vx_sumpT_merged(nullptr),
+    m_vx_sumpT_split(nullptr),
+    m_vx_sumpT_fake(nullptr),
+    m_vx_sumpT_HS_matched(nullptr),
+    m_vx_sumpT_HS_merged(nullptr),
+    m_vx_sumpT_HS_split(nullptr),
+    m_vx_sumpT_HS_fake(nullptr),
+    //Helen OTP sum of charges
+    m_vx_sumCharge_matched(nullptr),
+    m_vx_sumCharge_merged(nullptr),
+    m_vx_sumCharge_split(nullptr),
+    m_vx_sumCharge_fake(nullptr),
+    m_vx_sumCharge_HS_matched(nullptr),
+    m_vx_sumCharge_HS_merged(nullptr),
+    m_vx_sumCharge_HS_split(nullptr),
+    m_vx_sumCharge_HS_fake(nullptr),
+    m_vx_sumCharge_N_trk_HS_matched(nullptr),
+    m_vx_sumCharge_N_trk_HS_merged(nullptr),
+    m_vx_sumCharge_N_trk_HS_split(nullptr),
+    m_vx_sumCharge_N_trk_HS_fake(nullptr),
+    m_vx_sumCharge_N_trk_matched(nullptr),
+    m_vx_sumCharge_N_trk_merged(nullptr),
+    m_vx_sumCharge_N_trk_split(nullptr),
+    m_vx_sumCharge_N_trk_fake(nullptr),
+    m_vx_z_asym_matched(nullptr),
+    m_vx_z_asym_merged(nullptr),
+    m_vx_z_asym_split(nullptr),
+    m_vx_z_asym_fake(nullptr),
+    m_vx_z_asym_HS_matched(nullptr),
+    m_vx_z_asym_HS_merged(nullptr),
+    m_vx_z_asym_HS_split(nullptr),
+    m_vx_z_asym_HS_fake(nullptr)
 
 {
   // nop
@@ -146,11 +191,55 @@ void InDetPerfPlot_VertexTruthMatching::initializePlots() {
         book(m_vx_hs_truth_x_pull_vs_nTrk, "vx_TYPE_truth_pull_x_vs_nTrk", "vx_hs_truth_pull_x_vs_nTrk");
         book(m_vx_hs_truth_y_pull_vs_nTrk, "vx_TYPE_truth_pull_y_vs_nTrk", "vx_hs_truth_pull_y_vs_nTrk");
 
+	// book the new histos  Helen OTP
+	book(m_vx_ntracks_vs_nmatchedvertices,"vx_ntracks_vs_nmatchedvertices");
+    	book(m_vx_ntracks_vs_nmergedvertices,"vx_ntracks_vs_nmergedvertices");
+    	book(m_vx_ntracks_vs_nsplitvertices,"vx_ntracks_vs_nsplitvertices");
+    	book(m_vx_ntracks_vs_nfakevertices,"vx_ntracks_vs_nfakevertices");
+	book(m_vx_ntracks_vs_HS_nmatchedvertices,"vx_ntracks_vs_HS_nmatchedvertices");
+    	book(m_vx_ntracks_vs_HS_nmergedvertices,"vx_ntracks_vs_HS_nmergedvertices");
+    	book(m_vx_ntracks_vs_HS_nsplitvertices,"vx_ntracks_vs_HS_nsplitvertices");
+    	book(m_vx_ntracks_vs_HS_nfakevertices,"vx_ntracks_vs_HS_nfakevertices");
+        book(m_vx_sumpT_matched,"vx_sumpT_matched");
+        book(m_vx_sumpT_merged,"vx_sumpT_merged");
+        book(m_vx_sumpT_split,"vx_sumpT_split");
+        book( m_vx_sumpT_fake,"vx_sumpT_fake");
+        book(m_vx_sumpT_HS_matched,"vx_sumpT_HS_matched");
+        book(m_vx_sumpT_HS_merged,"vx_sumpT_HS_merged");
+        book(m_vx_sumpT_HS_split,"vx_sumpT_HS_split");
+        book( m_vx_sumpT_HS_fake,"vx_sumpT_HS_fake");
+        // Helen OTP sum of charges
+        book(m_vx_sumCharge_matched,"vx_sumCharge_matched");
+        book(m_vx_sumCharge_merged,"vx_sumCharge_merged");
+        book(m_vx_sumCharge_split,"vx_sumCharge_split");
+        book( m_vx_sumCharge_fake,"vx_sumCharge_fake");
+        book(m_vx_sumCharge_HS_matched,"vx_sumCharge_HS_matched");
+        book(m_vx_sumCharge_HS_merged,"vx_sumCharge_HS_merged");
+        book(m_vx_sumCharge_HS_split,"vx_sumCharge_HS_split");
+        book(m_vx_sumCharge_HS_fake,"vx_sumCharge_HS_fake");
+        book(m_vx_sumCharge_N_trk_HS_matched, "vx_sumCharge_N_trk_HS_matched");
+        book(m_vx_sumCharge_N_trk_HS_merged, "vx_sumCharge_N_trk_HS_merged");
+        book(m_vx_sumCharge_N_trk_HS_split, "vx_sumCharge_N_trk_HS_split");
+        book(m_vx_sumCharge_N_trk_HS_fake, "vx_sumCharge_N_trk_HS_fake");
+        book(m_vx_sumCharge_N_trk_matched, "vx_sumCharge_N_trk_matched");
+        book(m_vx_sumCharge_N_trk_merged, "vx_sumCharge_N_trk_merged");
+        book(m_vx_sumCharge_N_trk_split, "vx_sumCharge_N_trk_split");
+        book(m_vx_sumCharge_N_trk_fake, "vx_sumCharge_N_trk_fake");
+        book(m_vx_z_asym_matched,"vx_z_asym_matched");
+        book(m_vx_z_asym_merged,"vx_z_asym_merged");
+        book(m_vx_z_asym_split,"vx_z_asym_split");
+        book(m_vx_z_asym_fake,"vx_z_asym_fake");
+        book(m_vx_z_asym_HS_matched,"vx_z_asym_HS_matched");
+        book(m_vx_z_asym_HS_merged,"vx_z_asym_HS_merged");
+        book(m_vx_z_asym_HS_split,"vx_z_asym_HS_split");
+        book(m_vx_z_asym_HS_fake,"vx_z_asym_HS_fake");
+ 
+
+
 
     }
 
 }
-
 const xAOD::Vertex* InDetPerfPlot_VertexTruthMatching::getHSRecoVertexSumPt2(const xAOD::VertexContainer& recoVertices) const {
     const xAOD::Vertex* recoHSVertex = nullptr;
     float sumPtMax = -1.;
@@ -174,6 +263,10 @@ const xAOD::Vertex* InDetPerfPlot_VertexTruthMatching::getHSRecoVertexSumPt2(con
     return recoHSVertex;
 }
 
+
+
+
+
 template<typename U, typename V>
 float InDetPerfPlot_VertexTruthMatching::getRadialDiff2(const U* vtx1, const V* vtx2) const {
     return (std::pow((vtx1->x() - vtx2->x()), 2) + std::pow((vtx1->y() - vtx2->y()), 2) + std::pow((vtx1->z() - vtx2->z()), 2));
@@ -315,6 +408,10 @@ void InDetPerfPlot_VertexTruthMatching::fill(const xAOD::Vertex& vertex) {
             matchType = recoVtxMatchTypeInfo(vertex);
             ATH_MSG_DEBUG("VERTEX DECORATOR ======= " << matchType << ", with nTRACKS === " << vertex.nTrackParticles() << ", vertex index = " << vertex.index() << " AT (x, y, z) = (" << vertex.x() << ", " << vertex.y() << ", " << vertex.z() << ")");
             fillHisto(m_vx_type_truth, matchType);
+
+
+
+
         }
         catch (SG::ExcBadAuxVar &) {
             ATH_MSG_WARNING("VertexMatchType DECORATOR seems to be available, but may be broken  ===========");
@@ -444,6 +541,149 @@ void InDetPerfPlot_VertexTruthMatching::fill(const xAOD::VertexContainer& vertex
             fillHisto(m_vx_all_truth_x_pull_vs_nTrk, vertex->nTrackParticles(), residual_x/vtxerr_y);
             fillHisto(m_vx_all_truth_y_pull_vs_nTrk, vertex->nTrackParticles(), residual_y/vtxerr_x);
 
+// Helen OTP - get sumpt for each vertex (not just for HS vertex)
+// For each vertex, loop over all tracks and get sumpt and sum of charges
+// also use this to get the z asymmetry around the vertex.
+   
+
+         const xAOD::TrackParticle* trackTmp = nullptr;
+         float sumPt =0;
+         // get the charge associated with each track
+         double sumCharge = 0;
+         float z_asym = 0;
+         float sumDZ = 0;
+         float deltaZ =0;
+         float modsumDZ =0;
+         
+ 
+            for (size_t i = 0; i < vertex->nTrackParticles(); i++) {
+                trackTmp = vertex->trackParticle(i);
+                deltaZ = trackTmp->z0();
+                if (trackTmp) {
+                    sumPt = sumPt + trackTmp->pt();
+                    sumCharge = sumCharge + trackTmp->charge();
+                    // sum of delta z
+                    sumDZ = sumDZ + deltaZ; 
+                    modsumDZ = modsumDZ + sqrt(deltaZ * deltaZ);
+                    z_asym = modsumDZ/sumDZ;
+                }
+            }
+           if (recoVtxMatchTypeInfo(*vertex) == InDetVertexTruthMatchUtils::VertexMatchType::MATCHED) {
+              if (vertex == bestRecoHSVtx_truth) {
+	
+		 fillHisto(m_vx_sumpT_HS_matched,sumPt / Gaudi::Units::GeV);
+                 fillHisto(m_vx_sumCharge_HS_matched,sumCharge);
+                 fillHisto(m_vx_sumCharge_N_trk_HS_matched, sumCharge/vertex->nTrackParticles());
+                 fillHisto(m_vx_z_asym_HS_matched, z_asym);
+
+              }	
+	      else { 
+		
+                 fillHisto(m_vx_sumpT_matched,sumPt / Gaudi::Units::GeV);
+                 fillHisto(m_vx_sumCharge_matched,sumCharge);
+                 fillHisto(m_vx_sumCharge_N_trk_matched, sumCharge/vertex->nTrackParticles());
+                 fillHisto(m_vx_z_asym_matched, z_asym);
+              }
+           }
+
+           if (recoVtxMatchTypeInfo(*vertex) == InDetVertexTruthMatchUtils::VertexMatchType::MERGED) {
+              if (vertex == bestRecoHSVtx_truth) {
+              
+                 fillHisto(m_vx_sumpT_HS_merged, sumPt / Gaudi::Units::GeV);
+                 fillHisto(m_vx_sumCharge_HS_merged, sumCharge);
+                 fillHisto(m_vx_sumCharge_N_trk_HS_merged, sumCharge/vertex->nTrackParticles());
+                 fillHisto(m_vx_z_asym_HS_merged, z_asym);
+              }
+              else {
+                 fillHisto(m_vx_sumpT_merged, sumPt / Gaudi::Units::GeV);
+                 fillHisto(m_vx_sumCharge_merged, sumCharge);
+                 fillHisto(m_vx_sumCharge_N_trk_merged, sumCharge/vertex->nTrackParticles());
+                 fillHisto(m_vx_z_asym_merged, z_asym);
+              }
+           }
+
+           if (recoVtxMatchTypeInfo(*vertex) == InDetVertexTruthMatchUtils::VertexMatchType::SPLIT) {
+              if (vertex == bestRecoHSVtx_truth) {
+                  fillHisto(m_vx_sumpT_HS_split, sumPt / Gaudi::Units::GeV);
+                  fillHisto(m_vx_sumCharge_HS_split, sumCharge);
+                  fillHisto(m_vx_sumCharge_N_trk_HS_split, sumCharge/vertex->nTrackParticles());
+                  fillHisto(m_vx_z_asym_HS_split, z_asym);
+              }
+              else {
+                  fillHisto(m_vx_sumpT_split, sumPt / Gaudi::Units::GeV);
+                  fillHisto(m_vx_sumCharge_split, sumCharge);
+                  fillHisto(m_vx_sumCharge_N_trk_split, sumCharge/vertex->nTrackParticles());
+                  fillHisto(m_vx_z_asym_HS_split, z_asym);
+              }
+	   }
+           if (recoVtxMatchTypeInfo(*vertex) == InDetVertexTruthMatchUtils::VertexMatchType::FAKE) {
+              if (vertex == bestRecoHSVtx_truth) {
+                  fillHisto(m_vx_sumpT_HS_fake, sumPt / Gaudi::Units::GeV);
+                  fillHisto(m_vx_sumCharge_HS_fake, sumCharge);
+                  fillHisto(m_vx_sumCharge_N_trk_HS_fake, sumCharge/vertex->nTrackParticles());
+                  fillHisto(m_vx_z_asym_HS_fake, z_asym);
+              }
+
+              else {
+
+                  fillHisto(m_vx_sumpT_fake, sumPt / Gaudi::Units::GeV);
+                  fillHisto(m_vx_sumCharge_fake, sumCharge);
+                  fillHisto(m_vx_sumCharge_N_trk_fake, sumCharge/vertex->nTrackParticles());
+                  fillHisto(m_vx_z_asym_fake, z_asym);
+             }
+           }
+
+         //end of sumPt;   // can't return here as its a void function
+ 
+
+
+// Add new histos to check for number of tracks for each vertex type Helen OTP  
+//
+
+           if (vertex == bestRecoHSVtx_truth) {
+
+         
+             if (recoVtxMatchTypeInfo(*vertex) == InDetVertexTruthMatchUtils::VertexMatchType::MATCHED) {
+
+                fillHisto(m_vx_ntracks_vs_HS_nmatchedvertices, vertex->nTrackParticles());
+             } 
+
+             if (recoVtxMatchTypeInfo(*vertex) == InDetVertexTruthMatchUtils::VertexMatchType::MERGED) {
+                 fillHisto(m_vx_ntracks_vs_HS_nmergedvertices,  vertex->nTrackParticles());
+
+             }
+
+             if (recoVtxMatchTypeInfo(*vertex) == InDetVertexTruthMatchUtils::VertexMatchType::SPLIT) {
+                 fillHisto(m_vx_ntracks_vs_HS_nsplitvertices,   vertex->nTrackParticles());
+             }
+             if (recoVtxMatchTypeInfo(*vertex) == InDetVertexTruthMatchUtils::VertexMatchType::FAKE) {
+                 fillHisto(m_vx_ntracks_vs_HS_nfakevertices,    vertex->nTrackParticles());
+             }
+           }
+           else {
+
+         
+
+             if (recoVtxMatchTypeInfo(*vertex) == InDetVertexTruthMatchUtils::VertexMatchType::MATCHED) {
+              
+                fillHisto(m_vx_ntracks_vs_nmatchedvertices, vertex->nTrackParticles());
+             }
+
+             if (recoVtxMatchTypeInfo(*vertex) == InDetVertexTruthMatchUtils::VertexMatchType::MERGED) {
+                fillHisto(m_vx_ntracks_vs_nmergedvertices,  vertex->nTrackParticles());
+
+             }
+
+             if (recoVtxMatchTypeInfo(*vertex) == InDetVertexTruthMatchUtils::VertexMatchType::SPLIT) {
+                 fillHisto(m_vx_ntracks_vs_nsplitvertices,   vertex->nTrackParticles());
+             }  
+             if (recoVtxMatchTypeInfo(*vertex) == InDetVertexTruthMatchUtils::VertexMatchType::FAKE) {
+                 fillHisto(m_vx_ntracks_vs_nfakevertices,    vertex->nTrackParticles());
+             }
+
+           }
+       
+   
 
         } // end loop over vertices
 
@@ -501,6 +741,8 @@ void InDetPerfPlot_VertexTruthMatching::fill(const xAOD::VertexContainer& vertex
         fillHisto(m_vx_nReco_vs_nTruth_split,   nTruthVertices, breakdown[InDetVertexTruthMatchUtils::VertexMatchType::SPLIT]);
         fillHisto(m_vx_nReco_vs_nTruth_fake,    nTruthVertices, breakdown[InDetVertexTruthMatchUtils::VertexMatchType::FAKE]);
         fillHisto(m_vx_nReco_vs_nTruth_dummy,   nTruthVertices, breakdown[InDetVertexTruthMatchUtils::VertexMatchType::DUMMY]);
+
+
         
         // And by hardscatter type:
         InDetVertexTruthMatchUtils::HardScatterType hsType = InDetVertexTruthMatchUtils::classifyHardScatter(vertexContainer);
diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_VertexTruthMatching.h b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_VertexTruthMatching.h
index 31574711c13c..c0961b52a50d 100644
--- a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_VertexTruthMatching.h
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_VertexTruthMatching.h
@@ -62,6 +62,8 @@ private:
     TProfile* m_vx_nReco_vs_nTruth_highpu;
     TProfile* m_vx_nReco_vs_nTruth_hssplit;
     TProfile* m_vx_nReco_vs_nTruth_none;
+
+
     // HS vertex reconstruction efficiency vs PU
     TEfficiency* m_vx_hs_reco_eff;
     // HS vertex selection efficiency vs PU
@@ -117,6 +119,54 @@ private:
     TH2* m_vx_hs_truth_z_pull_vs_nTrk;
     TH2* m_vx_hs_truth_x_pull_vs_nTrk;
     TH2* m_vx_hs_truth_y_pull_vs_nTrk;
+    // New Histograms for #of tracks acssociated with each type of vertex  - Helen OTP
+    TH1* m_vx_ntracks_vs_nmatchedvertices;
+    TH1* m_vx_ntracks_vs_nmergedvertices;
+    TH1* m_vx_ntracks_vs_nsplitvertices;
+    TH1* m_vx_ntracks_vs_nfakevertices;
+    TH1* m_vx_ntracks_vs_HS_nmatchedvertices;
+    TH1* m_vx_ntracks_vs_HS_nmergedvertices;
+    TH1* m_vx_ntracks_vs_HS_nsplitvertices;
+    TH1* m_vx_ntracks_vs_HS_nfakevertices;
+    // Helen OTP - sum Pt of tracks for each type of vertex
+    TH1* m_vx_sumpT_matched;
+    TH1* m_vx_sumpT_merged;
+    TH1* m_vx_sumpT_split;
+    TH1* m_vx_sumpT_fake;
+    TH1* m_vx_sumpT_HS_matched;
+    TH1* m_vx_sumpT_HS_merged;
+    TH1* m_vx_sumpT_HS_split;
+    TH1* m_vx_sumpT_HS_fake;
+    // Helen OTP - sum of charges 
+    TH1* m_vx_sumCharge_matched;
+    TH1* m_vx_sumCharge_merged;
+    TH1* m_vx_sumCharge_split;
+    TH1* m_vx_sumCharge_fake;
+    TH1* m_vx_sumCharge_HS_matched;
+    TH1* m_vx_sumCharge_HS_merged;
+    TH1* m_vx_sumCharge_HS_split;
+    TH1* m_vx_sumCharge_HS_fake;
+    // Helen OTP - sum charge/n_trk
+    TH1* m_vx_sumCharge_N_trk_HS_matched;
+    TH1* m_vx_sumCharge_N_trk_HS_merged;
+    TH1* m_vx_sumCharge_N_trk_HS_split;
+    TH1* m_vx_sumCharge_N_trk_HS_fake;
+    TH1* m_vx_sumCharge_N_trk_matched;
+    TH1* m_vx_sumCharge_N_trk_merged;
+    TH1* m_vx_sumCharge_N_trk_split;
+    TH1* m_vx_sumCharge_N_trk_fake;
+    // Helen OTP asymmetery in z
+    TH1* m_vx_z_asym_matched;
+    TH1* m_vx_z_asym_merged;
+    TH1* m_vx_z_asym_split;
+    TH1* m_vx_z_asym_fake;
+    TH1* m_vx_z_asym_HS_matched;
+    TH1* m_vx_z_asym_HS_merged;
+    TH1* m_vx_z_asym_HS_split;
+    TH1* m_vx_z_asym_HS_fake;
+
+
+
 
     ///@}
 private:
diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_nTracks.cxx b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_nTracks.cxx
index a261480fd998..3ee89c520b75 100644
--- a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_nTracks.cxx
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPerfPlot_nTracks.cxx
@@ -32,6 +32,14 @@ InDetPerfPlot_nTracks::initializePlots() {
 
   book(m_ntracks_vs_mu,"ntracks_vs_mu");
   book(m_ntracks_vs_nvertices,"ntracks_vs_nvertices");
+  //book(m_ntracks_vs_nmatchedvertices,"ntracks_vs_nmatchedvertices");
+  //book(m_ntracks_vs_nmergedvertices,"ntracks_vs_nmergedvertices");
+  //book(m_ntracks_vs_nsplitvertices,"ntracks_vs_nsplitvertices");
+  //book(m_ntracks_vs_nfakevertices,"ntracks_vs_nfakevertices");
+ 
+
+
+
 }
 
 void
@@ -45,5 +53,9 @@ void InDetPerfPlot_nTracks::fill(const unsigned int ntracks, const unsigned int
 
   fillHisto(m_ntracks_vs_mu, muu, ntracks);
   fillHisto(m_ntracks_vs_nvertices, nvertices, ntracks);
+ // fillHisto(m_ntracks_vs_nmatchedvertices,nvertices, ntracks);
+ // fillHisto(m_ntracks_vs_nmergedvertices,nvertices, ntracks);
+ // fillHisto(m_ntracks_vs_nsplitvertices,nvertices, ntracks);
+ // fillHisto(m_ntracks_vs_nfakevertices,nvertices, ntracks);
 
 }
diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetRttPlots.cxx b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetRttPlots.cxx
index a8b5d6887489..3fe6800de317 100644
--- a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetRttPlots.cxx
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetRttPlots.cxx
@@ -17,6 +17,9 @@
 
 InDetRttPlots::InDetRttPlots(InDetPlotBase* pParent, const std::string& sDir, const int iDetailLevel) : InDetPlotBase(pParent, sDir),
   m_trackParameters(this, "Tracks/Selected/Parameters"),
+  m_matchedTrackParameters(this, "Tracks/Matched/Parameters"),
+  m_mergedTrackParameters(this, "Tracks/Merged/Parameters"),
+  m_fakeTrackParameters(this, "Tracks/Fake/Parameters"),
   m_nTracks(this, "Tracks/Tracks"),
   m_hitResidualPlot(this, "Tracks/Hits/Residuals"),
   m_hitEffPlot(this, "Tracks/Hits/Efficiency"),
@@ -152,6 +155,9 @@ InDetRttPlots::fill(const xAOD::TrackParticle& particle) {
   m_hitEffPlot.fill(particle);
   // fill pt plots
   m_trackParameters.fill(particle);
+  m_matchedTrackParameters.fill(particle);
+  m_mergedTrackParameters.fill(particle);
+  m_fakeTrackParameters.fill(particle);
   m_anTrackingPlots.fill(particle);
 
   if(m_iDetailLevel >= 200){
@@ -204,6 +210,9 @@ void
 InDetRttPlots::fill(const xAOD::TruthParticle& truthParticle) {
   // fill truth plots 
   m_trackParameters.fill(truthParticle);
+  m_matchedTrackParameters.fill(truthParticle);
+  m_mergedTrackParameters.fill(truthParticle);
+  m_fakeTrackParameters.fill(truthParticle);
 }
 
 //
diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetRttPlots.h b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetRttPlots.h
index c5383ace813d..f85f6f21c3cb 100644
--- a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetRttPlots.h
+++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetRttPlots.h
@@ -81,6 +81,9 @@ public:
 
 private:
   InDetPerfPlot_TrackParameters m_trackParameters;
+  InDetPerfPlot_TrackParameters m_matchedTrackParameters;
+  InDetPerfPlot_TrackParameters m_mergedTrackParameters;
+  InDetPerfPlot_TrackParameters m_fakeTrackParameters;
   InDetPerfPlot_nTracks m_nTracks;
   InDetPerfPlot_HitResidual m_hitResidualPlot;
   InDetPerfPlot_HitEfficiency m_hitEffPlot;
-- 
GitLab