ATLAS Offline Software
InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/CutTrk.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 // Author: Vadim Kostyukhin (vadim.kostyukhin@cern.ch)
5 
6 // Header include
9 
10 #include "TH1F.h"
11 
12 //-------------------------------------------------
13 namespace InDet{
14 
15 
16 
17  StatusCode InDetVKalVxInJetTool::cutTrk(const std::unordered_map<std::string,double>& TrkVarDouble,
18  const std::unordered_map<std::string,int>& TrkVarInt,
19  float evtWgt)
20  const
21  {
22 
23  double eta = TrkVarDouble.at("eta");
24  double PInvVert = TrkVarDouble.at("PInvVert");
25  double ThetaVert = TrkVarDouble.at("ThetaVert");
26  double A0Vert = TrkVarDouble.at("A0Vert");
27  double ZVert = TrkVarDouble.at("ZVert");
28  double Chi2 = TrkVarDouble.at("Chi2");
29  double ConeDist = TrkVarDouble.at("ConeDist");
30  double CovTrkMtx11 = TrkVarDouble.at("CovTrkMtx11");
31  double CovTrkMtx22 = TrkVarDouble.at("CovTrkMtx22");
32  double trkP = TrkVarDouble.at("trkP");
33  double trkPErr = TrkVarDouble.at("trkPErr");
34 
35  int PixelHits = TrkVarInt.at("PixelHits");
36  int SctHits = TrkVarInt.at("SctHits");
37  int BLayHits = TrkVarInt.at("BLayHits");
38  int SharedHits = TrkVarInt.at("SharedHits");
39  int badHits = TrkVarInt.at("badHits");
40 
41  if ( CovTrkMtx11 > m_a0TrkErrorCut*m_a0TrkErrorCut ) return StatusCode::FAILURE;
42  if ( CovTrkMtx22 > m_zTrkErrorCut*m_zTrkErrorCut ) return StatusCode::FAILURE;
43  if ( ConeDist > m_coneForTag ) return StatusCode::FAILURE;
44  if(trkP>10000.){
45  if(m_fillHist){
46  Hists& h = getHists();
47  h.m_hb_trkPErr->Fill( trkPErr , evtWgt);
48  }
49  if(trkPErr>0.5) return StatusCode::FAILURE;
50  }
51 
52  double Pt = sin(ThetaVert)/std::abs(PInvVert);
53  //- Track quality
54 
55  double pT_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMinPtAtEta(eta) : m_cutPt;
56  if(Pt < pT_cut) return StatusCode::FAILURE;
57 
58  if(!m_multiWithPrimary){ //Must not be used for primary vertex search
59  double z0_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMaxZImpactAtEta(eta) : m_cutZVrt;
60  // Eta-dependent cuts with z0*sin(theta)
61  if(m_useEtaDependentCuts && std::abs(ZVert*sin(ThetaVert)) > z0_cut) return StatusCode::FAILURE;
62  //Otherwise cuts with z0
63  else if(!m_useEtaDependentCuts && std::abs(ZVert) > z0_cut) return StatusCode::FAILURE;
64  }
65 
66  double chi2_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMaxChi2AtEta(eta) : m_cutChi2;
67  if(Chi2 > chi2_cut) return StatusCode::FAILURE;
68 
69  double d0_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMaxPrimaryImpactAtEta(eta) : m_cutA0;
70  if(std::abs(A0Vert) > d0_cut) return StatusCode::FAILURE;
71 
72  int pix_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMinPixelHitsAtEta(eta) : m_cutPixelHits;
73  if(!m_useEtaDependentCuts && std::abs(eta)>2.){
74  if(badHits && PixelHits<=3) return StatusCode::FAILURE;
75  PixelHits--;
76  }
77  if(PixelHits < pix_cut) return StatusCode::FAILURE;
78 
79  int strip_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMinStripHitsAtEta(eta) : m_cutSctHits;
81  if(SctHits<3) return StatusCode::FAILURE;
82  if(std::abs(eta)>2. && m_existIBL) SctHits--;
83  if(std::abs(eta)>1.65) SctHits--;
84  }
85  if(SctHits < strip_cut) return StatusCode::FAILURE;
86 
87  int si_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMinSiHitsAtEta(eta) : m_cutSiHits;
88  if((PixelHits+SctHits) < si_cut) return StatusCode::FAILURE;
89 
90  int inpix_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMinInnermostPixelHitsAtEta(eta) : m_cutBLayHits;
91  if(BLayHits < inpix_cut) return StatusCode::FAILURE;
92 
93  int shared_cut = m_useEtaDependentCuts ? m_etaDependentCutsSvc->getMaxSharedAtEta(eta) : m_cutSharedHits;
94  if(SharedHits > shared_cut) return StatusCode::FAILURE;
95 
96  return StatusCode::SUCCESS;
97 
98  }
99 
100 //==============================================================================================================
101 // xAOD based stuff
102 //
103  int InDetVKalVxInJetTool::selGoodTrkParticle( const std::vector<const xAOD::TrackParticle*>& InpTrk,
104  const xAOD::Vertex & PrimVrt,
105  const TLorentzVector & JetDir,
106  std::vector<const xAOD::TrackParticle*>& SelectedTracks,
107  float evtWgt)
108  const
109  {
110 
111  std::vector<const xAOD::TrackParticle*>::const_iterator i_ntrk;
112  std::vector<double> Impact,ImpactError;
113  std::multimap<double,const xAOD::TrackParticle*> orderedTrk;
114  int nPrimTrk=0;
115  for (i_ntrk = InpTrk.begin(); i_ntrk < InpTrk.end(); ++i_ntrk) {
116 
117  if((*i_ntrk)->numberDoF() == 0) continue; //Protection
118  if( (*i_ntrk)->pt() > JetDir.Pt() ) continue;
119 
120  //
121  //-- Perigee in TrackParticle
122  //
123  const Trk::Perigee mPer=(*i_ntrk)->perigeeParameters() ;
124  AmgVector(5) VectPerig = mPer.parameters();
125 
126 
127  double trkChi2 = (*i_ntrk)->chiSquared() / (*i_ntrk)->numberDoF();
128 
129  double CovTrkMtx11 = (*i_ntrk)->definingParametersCovMatrix()(0,0);
130  double CovTrkMtx22 = (*i_ntrk)->definingParametersCovMatrix()(1,1);
131  double CovTrkMtx55 = (*i_ntrk)->definingParametersCovMatrix()(4,4);
132  double ConeDist = coneDist(VectPerig,JetDir);
133 
134  double trkP=1./std::abs(VectPerig[4]);
135  double trkPErr=std::sqrt(CovTrkMtx55)*trkP ;
136 
137  uint8_t PixelHits,SctHits,BLayHits,sctSharedHits,pixSharedHits;
138  if( !((*i_ntrk)->summaryValue(PixelHits,xAOD::numberOfPixelHits)) ) continue; // Track is
139  if( !((*i_ntrk)->summaryValue( SctHits,xAOD::numberOfSCTHits)) ) continue; // definitely bad
140  if( !((*i_ntrk)->summaryValue(BLayHits,xAOD::numberOfInnermostPixelLayerHits))) BLayHits=0;
141  if( !((*i_ntrk)->summaryValue(sctSharedHits,xAOD::numberOfSCTSharedHits))) sctSharedHits=0; //VK Bad for high Pt
142  if( !((*i_ntrk)->summaryValue(pixSharedHits,xAOD::numberOfPixelSharedHits)))pixSharedHits=0; //and many tracks
143  long int SharedHits = sctSharedHits+pixSharedHits;
144 
145  uint8_t splSCTHits,outSCTHits,splPixHits,outPixHits;
146  if( !((*i_ntrk)->summaryValue(splSCTHits,xAOD::numberOfSCTSpoiltHits))) splSCTHits=0;
147  if( !((*i_ntrk)->summaryValue(outSCTHits,xAOD::numberOfSCTOutliers))) outSCTHits=0;
148  if( !((*i_ntrk)->summaryValue(splPixHits,xAOD::numberOfPixelSpoiltHits)))splPixHits=0;
149  if( !((*i_ntrk)->summaryValue(outPixHits,xAOD::numberOfPixelOutliers))) outPixHits=0;
150  bool badHits = ( splSCTHits || outSCTHits || outPixHits || splPixHits );
151 
152  Amg::Vector3D perigeePos=mPer.position();
153  double ImpactA0=std::sqrt( (perigeePos.x()-PrimVrt.x())*(perigeePos.x()-PrimVrt.x())
154  +(perigeePos.y()-PrimVrt.y())*(perigeePos.y()-PrimVrt.y()) );
155  double ImpactZ=perigeePos.z()-PrimVrt.z();
156  double ImpactSignif=std::sqrt(ImpactA0*ImpactA0/CovTrkMtx11+ImpactZ*ImpactZ/CovTrkMtx22);
157 
158  if(m_fillHist){
159  Hists& h = getHists();
160  h.m_hb_trkD0->Fill( ImpactA0, evtWgt);
161  }
162 
163  double eta = (*i_ntrk)->eta();
164 
165  std::unordered_map<std::string,double> TrkVarDouble;
166  std::unordered_map<std::string,int> TrkVarInt;
167 
168  TrkVarDouble["eta"] = eta;
169  TrkVarDouble["PInvVert"] = VectPerig[4];
170  TrkVarDouble["ThetaVert"] = VectPerig[3];
171  TrkVarDouble["A0Vert"] = ImpactA0;
172  TrkVarDouble["ZVert"] = ImpactZ;
173  TrkVarDouble["Chi2"] = trkChi2;
174  TrkVarDouble["ConeDist"] = ConeDist;
175  TrkVarDouble["CovTrkMtx11"] = CovTrkMtx11;
176  TrkVarDouble["CovTrkMtx22"] = CovTrkMtx22;
177  TrkVarDouble["trkP"] = trkP;
178  TrkVarDouble["trkPErr"] = trkPErr;
179 
180  TrkVarInt["PixelHits"] = PixelHits;
181  TrkVarInt["SctHits"] = SctHits;
182  TrkVarInt["BLayHits"] = BLayHits;
183  TrkVarInt["badHits"] = badHits;
184  TrkVarInt["SharedHits"] = SharedHits;
185 
186  StatusCode sc = cutTrk(TrkVarDouble, TrkVarInt);
187  if( sc.isFailure() ) continue;
188 
189  double rnkBTrk=rankBTrk(0.,0.,ImpactSignif);
190  if(rnkBTrk<0.7)nPrimTrk += 1;
191  orderedTrk.emplace(rnkBTrk,*i_ntrk);
192  }
193 
194  //---- Order tracks according to ranks
195  std::map<double,const xAOD::TrackParticle*>::reverse_iterator rt=orderedTrk.rbegin();
196  SelectedTracks.resize(orderedTrk.size());
197  for ( int cntt=0; rt!=orderedTrk.rend(); ++rt,++cntt) {SelectedTracks[cntt]=(*rt).second;}
198  return nPrimTrk;
199  }
200 
201 }//end namespace
xAOD::Vertex_v1::x
float x() const
Returns the x position.
InDetVKalVxInJetTool.h
InDet::InDetVKalVxInJetTool::Hists
Definition: InDetVKalVxInJetTool.h:124
xAOD::numberOfSCTSharedHits
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
Definition: TrackingPrimitives.h:272
xAOD::numberOfSCTSpoiltHits
@ numberOfSCTSpoiltHits
number of SCT hits with broad errors (width/sqrt(12)) [unit8_t].
Definition: TrackingPrimitives.h:274
InDet::InDetVKalVxInJetTool::m_cutChi2
double m_cutChi2
Definition: InDetVKalVxInJetTool.h:184
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:575
InDet::InDetVKalVxInJetTool::m_cutSctHits
long int m_cutSctHits
Definition: InDetVKalVxInJetTool.h:176
InDet::InDetVKalVxInJetTool::m_cutPt
double m_cutPt
Definition: InDetVKalVxInJetTool.h:181
InDet::InDetVKalVxInJetTool::getHists
Hists & getHists() const
Definition: InDetVKalVxInJetTool.cxx:493
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
Trk::ParametersT
Dummy class used to allow special convertors to be called for surfaces owned by a detector element.
Definition: EMErrorDetail.h:25
InDet
DUMMY Primary Vertex Finder.
Definition: VP1ErrorUtils.h:36
xAOD::numberOfPixelHits
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
Definition: TrackingPrimitives.h:259
InDet::InDetVKalVxInJetTool::m_multiWithPrimary
bool m_multiWithPrimary
Definition: InDetVKalVxInJetTool.h:212
TrkVKalVrtFitter.h
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
InDet::InDetVKalVxInJetTool::m_a0TrkErrorCut
double m_a0TrkErrorCut
Definition: InDetVKalVxInJetTool.h:190
InDet::InDetVKalVxInJetTool::m_cutZVrt
double m_cutZVrt
Definition: InDetVKalVxInJetTool.h:182
xAOD::numberOfPixelSharedHits
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
Definition: TrackingPrimitives.h:262
InDet::InDetVKalVxInJetTool::m_cutSharedHits
long int m_cutSharedHits
Definition: InDetVKalVxInJetTool.h:180
InDet::InDetVKalVxInJetTool::m_useEtaDependentCuts
bool m_useEtaDependentCuts
Definition: InDetVKalVxInJetTool.h:229
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
AmgVector
AmgVector(4) T2BSTrackFilterTool
Definition: T2BSTrackFilterTool.cxx:114
xAOD::numberOfPixelOutliers
@ numberOfPixelOutliers
these are the pixel outliers, including the b-layer [unit8_t].
Definition: TrackingPrimitives.h:260
InDet::InDetVKalVxInJetTool::m_existIBL
bool m_existIBL
Definition: InDetVKalVxInJetTool.h:198
InDet::InDetVKalVxInJetTool::selGoodTrkParticle
int selGoodTrkParticle(const std::vector< const xAOD::TrackParticle * > &inpPart, const xAOD::Vertex &primVrt, const TLorentzVector &jetDir, std::vector< const xAOD::TrackParticle * > &selPart, float evtWgt=1.) const
Definition: InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/CutTrk.cxx:103
xAOD::Vertex_v1::z
float z() const
Returns the z position.
InDet::InDetVKalVxInJetTool::rankBTrk
double rankBTrk(double TrkPt, double JetPt, double Signif) const
Definition: InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx:21
InDet::InDetVKalVxInJetTool::m_cutSiHits
long int m_cutSiHits
Definition: InDetVKalVxInJetTool.h:178
InDet::InDetVKalVxInJetTool::m_coneForTag
double m_coneForTag
Definition: InDetVKalVxInJetTool.h:186
InDet::InDetVKalVxInJetTool::m_cutA0
double m_cutA0
Definition: InDetVKalVxInJetTool.h:183
xAOD::numberOfPixelSpoiltHits
@ numberOfPixelSpoiltHits
number of pixel hits with broad errors (width/sqrt(12)) [unit8_t].
Definition: TrackingPrimitives.h:267
InDet::InDetVKalVxInJetTool::m_etaDependentCutsSvc
ServiceHandle< InDet::IInDetEtaDependentCutsSvc > m_etaDependentCutsSvc
service to get cut values depending on different variable
Definition: InDetVKalVxInJetTool.h:231
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
InDet::InDetVKalVxInJetTool::m_cutBLayHits
long int m_cutBLayHits
Definition: InDetVKalVxInJetTool.h:179
Prompt::Def::Pt
@ Pt
Definition: VarHolder.h:76
h
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
xAOD::numberOfSCTOutliers
@ numberOfSCTOutliers
number of SCT outliers [unit8_t].
Definition: TrackingPrimitives.h:269
xAOD::Vertex_v1::y
float y() const
Returns the y position.
InDet::InDetVKalVxInJetTool::cutTrk
StatusCode cutTrk(const std::unordered_map< std::string, double > &TrkVarDouble, const std::unordered_map< std::string, int > &TrkVarInt, float evtWgt=1.) const
Definition: InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/CutTrk.cxx:17
xAOD::numberOfSCTHits
@ numberOfSCTHits
number of hits in SCT [unit8_t].
Definition: TrackingPrimitives.h:268
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
InDet::InDetVKalVxInJetTool::m_cutPixelHits
long int m_cutPixelHits
Definition: InDetVKalVxInJetTool.h:177
InDet::InDetVKalVxInJetTool::m_fillHist
bool m_fillHist
Definition: InDetVKalVxInJetTool.h:196
InDet::InDetVKalVxInJetTool::m_zTrkErrorCut
double m_zTrkErrorCut
Definition: InDetVKalVxInJetTool.h:191
InDet::InDetVKalVxInJetTool::coneDist
static double coneDist(const AmgVector(5) &, const TLorentzVector &)
Definition: InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/Utilities.cxx:276
xAOD::numberOfInnermostPixelLayerHits
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
Definition: TrackingPrimitives.h:237