ATLAS Offline Software
InDetTrackClusterCleaningTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include "TrkTrack/Track.h"
7 #include "VxVertex/Vertex.h"
11 
12 namespace InDet
13 {
14 
16  {
17  if ( m_extrapolator.retrieve().isFailure() )
18  {
19  ATH_MSG_ERROR("Failed to retrieve tool " << m_extrapolator);
20  return StatusCode::FAILURE;
21  }
22  ATH_MSG_DEBUG("Retrieved tool " << m_extrapolator);
23 
24  return StatusCode::SUCCESS;
25  }//end of initialize method
26 
27 
28  InDetTrackClusterCleaningTool::InDetTrackClusterCleaningTool(const std::string& t, const std::string& n, const IInterface* p):
29  AthAlgTool(t,n,p), m_extrapolator("Trk::Extrapolator") ,m_zOffset(3.)
30  {
31  declareInterface<InDetTrackClusterCleaningTool>(this);
32  declareProperty("nStandDeviations", m_zOffset = 3.0);
33 
34  //extrapolator
35  declareProperty("Extrapolator",m_extrapolator);
36  }//end of constructor
37 
39 
40  std::pair<std::vector<const Trk::Track*>,std::vector<const Trk::Track*> > InDetTrackClusterCleaningTool::
41  clusterAndOutliers(const std::vector<const Trk::Track*>& cluster,
42  const Trk::Vertex * reference )const
43  {
44  const EventContext& ctx = Gaudi::Hive::currentContext();
45  std::vector<const Trk::Track*> clusterSeed(0);
46  std::vector<const Trk::Track*> outliers(0);
47  double z_center = 0;
48  std::vector<const Trk::Track*>::const_iterator inb = cluster.begin();
49  std::vector<const Trk::Track*>::const_iterator ine = cluster.end();
50 
51  unsigned int cluster_size = 0;
52  Trk::PerigeeSurface perigeeSurface(reference->position());
53 
54  //first getting the cluster center
55  for(std::vector<const Trk::Track*>::const_iterator i = inb; i != ine; ++i)
56  {
57  const Trk::TrackParameters * perigee =
58  m_extrapolator->extrapolateTrack(ctx,
59  **i,perigeeSurface,
60  Trk::anyDirection,true,
61  Trk::pion).release();
62 
63  if(perigee)
64  {
65  z_center += perigee->parameters()[Trk::z0];
66  ATH_MSG_DEBUG("Adding parameters: "<<perigee->parameters()[Trk::z0]);
67  ++cluster_size;
68  }else{
69  ATH_MSG_WARNING("The Track provided does not contain perigee parameters");
70  }//end of perigee security check
71  }//end of loop definig the center of a cluster
72 
73  ATH_MSG_DEBUG("Z center is: "<<z_center<<" for tracks: "<<cluster_size);
74 
75  if(cluster_size != 0) {
76  z_center = z_center/cluster_size;
77  }
78 
79  //discarding outlying tracks
80  for(std::vector<const Trk::Track*>::const_iterator i = inb; i != ine; ++i)
81  {
82  //here we want to make an extrapolation
83  const Trk::TrackParameters * measPerigee =
84  m_extrapolator->extrapolateTrack(
85  ctx, **i, perigeeSurface, Trk::anyDirection, true, Trk::pion).release();
86 
87  if(measPerigee)
88  {
89  double z0 = measPerigee->parameters()[Trk::z0];
90  const AmgSymMatrix(5) * cov = measPerigee->covariance();
91 
92  double sigma_z0 = Amg::error(*cov,Trk::z0);
93 
94  //if the track is closer than several standard deviations, keep it
95  if(std::abs(z_center-z0)< sigma_z0*m_zOffset) clusterSeed.push_back(*i);
96 
97  //declare it an outlier otherwise
98  else outliers.push_back(*i);
99  }else{
100  outliers.push_back(*i);
101  ATH_MSG_WARNING("This track has no meas perigee. Regarded as outlyer");
102  }//end of meas perigee protection check
103  }//end of selection loop over all the tracks
104 
105  std::pair<std::vector<const Trk::Track*>,std::vector<const Trk::Track*> > result(clusterSeed, outliers);
106  return result;
107  }//end of cleaning method (Track)
108 
109  std::pair<std::vector<const Trk::TrackParameters *>,
110  std::vector<const xAOD::TrackParticle *> > InDetTrackClusterCleaningTool::clusterAndOutliers(std::vector<const xAOD::TrackParticle *> cluster, const xAOD::Vertex * reference) const
111  {
112  const EventContext& ctx = Gaudi::Hive::currentContext();
113  std::vector<const Trk::TrackParameters*> clusterSeed(0);
114  std::vector<const xAOD::TrackParticle*> outliers(0);
115 
116  double z_center = 0;
117 
118  std::vector<const xAOD::TrackParticle*>::const_iterator inb = cluster.begin();
119  std::vector<const xAOD::TrackParticle*>::const_iterator ine = cluster.end();
120 
121  unsigned int cluster_size = 0;
122 
123  ATH_MSG_DEBUG("Receiving a cluster of size: "<< cluster.size());
124 
125  Trk::PerigeeSurface perigeeSurface(reference->position());
126 
127  //first getting the cluster center
128  for(std::vector<const xAOD::TrackParticle*>::const_iterator i = inb; i != ine; ++i){
129  const Trk::TrackParameters * perigee(nullptr);
130 
131  perigee = m_extrapolator->extrapolate(ctx,
132  (*i)->perigeeParameters(),
133  perigeeSurface,
135  true, Trk::pion).release();
136 
137  if (perigee) {
138  z_center += perigee->parameters()[Trk::z0];
139  ATH_MSG_DEBUG("Adding parameters: " << perigee->parameters()[Trk::z0]);
140  ++cluster_size;
141  } else {
143  "The TrackParticle provided does not contain perigee parameters");
144  } // end of perigee security check
145  }//end of loop definig the center of a cluster
146 
147  ATH_MSG_DEBUG("Z center is: "<<z_center<<" for tracks: "<<cluster_size);
148 
149  if(cluster_size != 0) {
150  z_center = z_center/cluster_size;
151  }
152 
153  ATH_MSG_DEBUG("Looping over the cluster");
154 
155  for(std::vector<const xAOD::TrackParticle*>::const_iterator i = inb; i != ine; ++i)
156  {
157  const Trk::TrackParameters * measPerigee(nullptr);
158  measPerigee = m_extrapolator->extrapolate(ctx,
159  (*i)->perigeeParameters(),
160  perigeeSurface,
162  true,
163  Trk::pion).release();
164 
165  if(nullptr!=measPerigee)
166  {
167  double z0 = measPerigee->parameters()[Trk::z0];
168  const AmgSymMatrix(5) * cov = measPerigee->covariance();
169  double sigma_z0 = Amg::error(*cov,Trk::z0);
170 
171  ATH_MSG_DEBUG("Perigee Z0 and corresponding sigma "<<z0<<" "<<sigma_z0);
172  ATH_MSG_DEBUG("Center of the cluster "<<z_center);
173  ATH_MSG_DEBUG("Offset "<<3.0);
174  ATH_MSG_DEBUG("discriminant "<<std::abs(z_center-z0)<<" "<< sigma_z0*3.0);
175 
176  //if the track is closer than several standard deviations, keep it
177  if(std::abs(z_center-z0)< sigma_z0*3.0) clusterSeed.push_back(&((*i)->perigeeParameters()));
178 
179  //declare it an outlier otherwise
180  else outliers.push_back(*i);
181  }else{
182  outliers.push_back(*i);
183  ATH_MSG_WARNING("This track has no meas perigee. Regarded as outlyer");
184  }//end of measured perigee check
185  }//end of separation loop
186 
187  std::pair<std::vector<const Trk::TrackParameters *>,
188  std::vector<const xAOD::TrackParticle *> > result(clusterSeed, outliers);
189  return result;
190 
191  }
192 
193 }//end of namespace definitions
194 
Trk::anyDirection
@ anyDirection
Definition: PropDirection.h:22
Trk::Vertex
Definition: Tracking/TrkEvent/VxVertex/VxVertex/Vertex.h:26
get_generator_info.result
result
Definition: get_generator_info.py:21
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
TrackParameters.h
InDet::InDetTrackClusterCleaningTool::m_zOffset
double m_zOffset
Definition: InDetTrackClusterCleaningTool.h:67
InDet::InDetTrackClusterCleaningTool::InDetTrackClusterCleaningTool
InDetTrackClusterCleaningTool(const std::string &t, const std::string &n, const IInterface *p)
Definition: InDetTrackClusterCleaningTool.cxx:28
Trk::PerigeeSurface
Definition: PerigeeSurface.h:43
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
InDet
DUMMY Primary Vertex Finder.
Definition: VP1ErrorUtils.h:36
EventPrimitivesHelpers.h
plotBeamSpotVxVal.cov
cov
Definition: plotBeamSpotVxVal.py:201
Trk::z0
@ z0
Definition: ParamDefs.h:70
IExtrapolator.h
reference
Definition: hcg.cxx:437
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
AmgSymMatrix
#define AmgSymMatrix(dim)
Definition: EventPrimitives.h:52
Track.h
InDetTrackClusterCleaningTool.h
InDet::InDetTrackClusterCleaningTool::m_extrapolator
ToolHandle< Trk::IExtrapolator > m_extrapolator
Definition: InDetTrackClusterCleaningTool.h:65
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
InDet::InDetTrackClusterCleaningTool::~InDetTrackClusterCleaningTool
~InDetTrackClusterCleaningTool()
lumiFormat.i
int i
Definition: lumiFormat.py:92
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
Trk::pion
@ pion
Definition: ParticleHypothesis.h:29
InDet::InDetTrackClusterCleaningTool::initialize
virtual StatusCode initialize() override
Definition: InDetTrackClusterCleaningTool.cxx:15
Trk::ParametersBase
Definition: ParametersBase.h:55
TRT::Track::z0
@ z0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:63
InDet::InDetTrackClusterCleaningTool::clusterAndOutliers
std::pair< std::vector< const Trk::Track * >, std::vector< const Trk::Track * > > clusterAndOutliers(const std::vector< const Trk::Track * > &cluster, const Trk::Vertex *reference=0) const
Cleaning method.
Definition: InDetTrackClusterCleaningTool.cxx:41
Amg::error
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
Definition: EventPrimitivesHelpers.h:40
Vertex.h
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
AthAlgTool
Definition: AthAlgTool.h:26