ATLAS Offline Software
TrackPairsSelector.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 /***************************************************************************
6  TrackPairsSelector.cxx - Description
7  ------------------
8  begin : 01-01-2008
9  authors : Tatjana Lenz, Thomas Koffas
10  email : tatjana.lenz@cern.ch, Thomas.Koffas@cern.ch
11  changes : M.Elsing
12 ***************************************************************************/
16 
18 
19 
20 // Would be nice to use something like Amg::distance instead.
21 // But that rounds slightly differently.
22 // Do it like this so that results are identical with the pre-MT version.
23 namespace {
24  inline double square(const double tosquare) {
25  return std::pow(tosquare,2);
26  }
27  double dist(const std::pair<Amg::Vector3D,Amg::Vector3D>& pairofpos) {
28  Amg::Vector3D diff(pairofpos.first-pairofpos.second);
29  return std::sqrt(square(diff.x())+square(diff.y())+square(diff.z()));
30  }
31 }
32 
33 
34 namespace InDet {
35 
36  // -------------------------------------------------------------
37  static const InterfaceID IID_ITrackPairsSelector("InDet::TrackPairsSelector", 1, 0);
38 
39  // -------------------------------------------------------------
41  const std::string& name,
42  const IInterface* parent)
44  , m_maxR(500.)
45  , m_MinTrkAngle(0.)
46  {
47  m_etaCut.push_back(0.8);
48  m_etaCut.push_back(1.2);
49  m_etaCut.push_back(1.2);
50 
51  m_initCut.push_back(10000.);
52  m_initCut.push_back(10000.);
53  m_initCut.push_back(10000.);
54 
55  m_maxDist.push_back(8.);
56  m_maxDist.push_back(80.);
57  m_maxDist.push_back(45.);
58 
59  declareInterface<TrackPairsSelector>(this);
60  declareProperty("MaxFirstHitRadius" , m_maxR);
61  declareProperty("MaxDistBetweenTracks" , m_maxDist);
62  declareProperty("MaxEta" , m_etaCut );
63  declareProperty("MaxInitDistance" , m_initCut );
64  declareProperty("MinTrackAngle" , m_MinTrkAngle);
65  }
66 
67  // -------------------------------------------------------------
69 
70  // -------------------------------------------------------------
71  const InterfaceID& TrackPairsSelector::interfaceID() {
72  return IID_ITrackPairsSelector;
73  }
74 
75  // -------------------------------------------------------------
77 
78  /* Get the track selector tool from ToolSvc */
79  if ( m_helpertool.retrieve().isFailure() ) {
80  ATH_MSG_ERROR("Failed to retrieve tool " << m_helpertool);
81  return StatusCode::FAILURE;
82  }
83  ATH_MSG_DEBUG("Retrieved tool " << m_helpertool);
84 
85  /* Get the distance tool from ToolsSvc */
86  if(m_distanceTool.retrieve().isFailure()) {
87  ATH_MSG_ERROR("Could not get " << m_distanceTool);
88  return StatusCode::FAILURE;
89  }
90  ATH_MSG_DEBUG("Got the distance tool " << m_distanceTool);
91 
92  ATH_MSG_DEBUG("Initialization successful");
93  return StatusCode::SUCCESS;
94  }
95 
96  // -------------------------------------------------------------
98  return StatusCode::SUCCESS;
99  }
100 
101  // -------------------------------------------------------------
102  bool
104  const xAOD::TrackParticle* trkPpos,
105  const xAOD::TrackParticle* trkPneg,
106  TrackPairsSelector::Cache& cache) const
107  {
108 
109  bool pass = true;
110  //Getting the track perigee parameters
111  const Trk::TrackParameters* perPos = &(trkPpos->perigeeParameters());
112  const Trk::TrackParameters* perNeg = &(trkPneg->perigeeParameters());
113  if (!(m_helpertool->momFraction(perPos, perNeg))) pass = false;
114 
115  //Track summary information
116 
117 
118  uint8_t nclusPos(0);
119  uint8_t dummy(0);
121  nclusPos += dummy;
122  }
124  nclusPos += dummy;
125  }
126 
127  uint8_t nclusNeg(0);
129  nclusNeg += dummy;
130  }
132  nclusNeg += dummy;
133  }
134 
135 
136  int sCase = 100;
137  if(nclusNeg>0 && nclusPos>0) sCase = 0;
138  if((nclusNeg>0 && nclusPos==0) || (nclusNeg==0 && nclusPos>0)) sCase = 1;
139  if(nclusNeg==0 && nclusPos==0) sCase = 2;
140 
141  //Position of first hit in track particle
144 
145  int index(-1);
146  for(unsigned int i(0); i< trkPpos->numberOfParameters() ; ++i ){
147  if( xAOD::FirstMeasurement == trkPpos->parameterPosition(i) ){
148  index = i;
149  break;
150  }
151  }
152  if(index!=-1){
153  parPos = trkPpos->curvilinearParameters(index);
154  } else {
155  ATH_MSG_WARNING("Track Particle does not contain first Measurement track parameters");
156  return false;
157  }
158 
159  index = -1;
160  for(unsigned int i(0); i< trkPneg->numberOfParameters() ; ++i ){
161  if( xAOD::FirstMeasurement == trkPneg->parameterPosition(i) ){
162  index = i;
163  break;
164  }
165  }
166  if(index!=-1){
167  parNeg = trkPneg->curvilinearParameters(index);
168  } else {
169  ATH_MSG_WARNING("Track Particle does not contain first Measurement track parameters");
170  return false;
171  }
172 
173  double firstRpos = parPos.position().perp();
174  double firstRneg = parNeg.position().perp();
175 
176  //Cut on Deta
177  double detaCut = 0.0;
178  if(sCase == 0) {
179  detaCut = m_etaCut[0];
180  } else if(sCase == 1) {
181  detaCut = m_etaCut[1];
182  } else if(sCase == 2) {
183  if(fabs(perPos->eta())<0.6 && fabs(perNeg->eta())<0.6) detaCut = 10000.; // No eta cut for barrel TRT tracks
184  else detaCut = m_etaCut[2];
185  }
186 
187  cache.m_deltaCotTheta = fabs(1. / tan(perPos->parameters()[Trk::theta]) -
188  1. / tan(perNeg->parameters()[Trk::theta]));
189  if (cache.m_deltaCotTheta > detaCut)
190  return false;
191 
192  //Cut on distance between the initial hit position of the two tracks.
193  double dinit = 1000.;
194  if(sCase == 0) {
195  dinit = m_initCut[0];
196  } else if(sCase == 1) {
197  dinit = m_initCut[1];
198  } else if(sCase == 2) {
199  dinit = m_initCut[2];
200  }
201 
202  cache.m_deltaInit = fabs(firstRpos - firstRneg);
203  if (cache.m_deltaInit > dinit) return false;
204 
205  //Cut on distance of minimum approach between the two tracks.
206  double maxDist = 1000.;
207  if(sCase == 0) {
208  maxDist = m_maxDist[0];
209  } else if(sCase == 1) {
210  maxDist = m_maxDist[1];
211  } else if(sCase == 2) {
212  maxDist = m_maxDist[2];
213  }
214 
215  cache.m_distance = 1000000.;
216  std::optional<Trk::ITrkDistanceFinder::TwoPoints> result
217  = m_distanceTool->CalculateMinimumDistance(trkPneg->perigeeParameters(),
218  trkPpos->perigeeParameters() );
219  if (!result) return false;
220  cache.m_distance = dist (result.value());
221  if (cache.m_distance>maxDist) return false;
222 
223  //3D angle cut in the case of V0s, not used in the case of conversions
224  double d_beta = (perPos->momentum().dot(perNeg->momentum())) /
225  (perPos->momentum().mag() * perNeg->momentum().mag());
226  if(d_beta <m_MinTrkAngle) pass = false;
227 
228  return pass;
229  }
230 
231  // -------------------------------------------------------------
232  bool
234  const Trk::Track* trkneg) const
235  {
236 
237  bool pass = true;
239  const Trk::Perigee* perPos = trkpos->perigeeParameters();
240  const Trk::Perigee* perNeg = trkneg->perigeeParameters();
241  if (!(m_helpertool->momFraction(perPos, perNeg))) pass = false;
242 
244  double init_pos = 0.; double init_neg = 0.;
247  if(!mb_pos || !mb_neg) {pass = false; return pass;}
249  init_pos = (*itp_pos)->globalPosition().perp();
251  init_neg = (*itp_neg)->globalPosition().perp();
252  int sCase = 100;
253  if (init_neg<=m_maxR && init_pos<=m_maxR) sCase = 0;
254  if ((init_neg<=m_maxR && init_pos>m_maxR) || (init_neg>m_maxR && init_pos<=m_maxR)) sCase = 1;
255  if (init_neg>m_maxR && init_pos>m_maxR) sCase = 2;
256 
257  //Cut on Deta
258  double detaCut = 0.0;
259  if(sCase == 0) {
260  detaCut = m_etaCut[0];
261  } else if(sCase == 1) {
262  detaCut = m_etaCut[1];
263  } else if(sCase == 2) {
264  detaCut = m_etaCut[2];
265  }
266 
267  if (fabs(1. / tan(perPos->parameters()[Trk::theta]) -
268  1. / tan(perNeg->parameters()[Trk::theta])) > detaCut)
269  pass = false;
270 
271  //Cut on distance between the initial hit position of the two tracks.
272  double dinit = 1000.;
273  if(sCase == 0) {
274  dinit = m_initCut[0];
275  } else if(sCase == 1) {
276  dinit = m_initCut[1];
277  } else if(sCase == 2) {
278  dinit = m_initCut[2];
279  }
280  if(fabs(init_pos - init_neg) > dinit) pass = false;
281 
282  //Cut on distance of minimum approach between the two tracks.
283  double maxDist = 1000.;
284  if(sCase == 0) {
285  maxDist = m_maxDist[0];
286  } else if(sCase == 1) {
287  maxDist = m_maxDist[1];
288  } else if(sCase == 2) {
289  maxDist = m_maxDist[2];
290  }
291 
292  double newDistance = 1000000.;
293  std::optional<Trk::ITrkDistanceFinder::TwoPoints> result
294  = m_distanceTool->CalculateMinimumDistance(*trkpos, *trkneg);
295  if (!result) {
296  pass = false;
297  }
298  else {
299  newDistance = dist (result.value());
300  if (newDistance>maxDist) pass = false;
301  }
302 
303  //3D angle cut in the case of V0s, not used in the case of conversions
304  double d_beta = (perPos->momentum().dot(perNeg->momentum())) /
305  (perPos->momentum().mag() * perNeg->momentum().mag());
306  if(d_beta <m_MinTrkAngle) pass = false;
307 
308  return pass;
309  }
310 
311  // -------------------------------------------------------------
312  std::map<std::string, float>
314  const TrackPairsSelector::Cache& cache)
315  {
316  return {{"minimumDistanceTrk", cache.m_distance},
317  {"deltaCotThetaTrk", cache.m_deltaCotTheta},
318  {"deltaInitRadius", cache.m_deltaInit} };
319  }
320 
321 } // namespace InDet
322 
323 
324 
325 
xAOD::TrackParticle_v1::curvilinearParameters
const Trk::CurvilinearParameters curvilinearParameters(unsigned int index) const
Returns a curvilinear representation of the parameters at 'index'.
Definition: TrackParticle_v1.cxx:673
InDet::TrackPairsSelector::selectTrackParticlePair
bool selectTrackParticlePair(const xAOD::TrackParticle *trkPpos, const xAOD::TrackParticle *trkPneg, Cache &cache) const
Track pair selectors.Return true if the argument track fulfills the selection.
Definition: TrackPairsSelector.cxx:103
get_generator_info.result
result
Definition: get_generator_info.py:21
MeasurementBase.h
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:575
Trk::Track
The ATLAS Track class.
Definition: Tracking/TrkEvent/TrkTrack/TrkTrack/Track.h:73
InDet::TrackPairsSelector::Cache::m_deltaInit
float m_deltaInit
Distance difference between initial hits of tracks.
Definition: TrackPairsSelector.h:37
InDet::TrackPairsSelector::m_initCut
std::vector< double > m_initCut
Maximum distance difference between initial hits of tracks in pair.
Definition: TrackPairsSelector.h:91
Trk::ParametersBase::position
const Amg::Vector3D & position() const
Access method for the position.
index
Definition: index.py:1
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
InDet::TrackPairsSelector::selectTrackPair
bool selectTrackPair(const Trk::Track *trkpos, const Trk::Track *trkneg) const
Definition: TrackPairsSelector.cxx:233
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::TrackParticle_v1::summaryValue
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
Definition: TrackParticle_v1.cxx:736
InDet::TrackPairsSelector::Cache::m_distance
float m_distance
Distance of closest approach between the tracks.
Definition: TrackPairsSelector.h:33
conifer::pow
constexpr int pow(int x)
Definition: conifer.h:20
TrackPairsSelector.h
mc.diff
diff
Definition: mc.SFGenPy8_MuMu_DD.py:14
xAOD::numberOfPixelHits
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
Definition: TrackingPrimitives.h:259
InDet::TrackPairsSelector::Cache::m_deltaCotTheta
float m_deltaCotTheta
Delta cot theta between the tracks.
Definition: TrackPairsSelector.h:35
InDet::TrackPairsSelector::getLastValues
static std::map< std::string, float > getLastValues(const Cache &cache)
Return a map with the values calculated for the last pair to decorate the vertex once it is created.
Definition: TrackPairsSelector.cxx:313
InDet::TrackPairsSelector::m_MinTrkAngle
double m_MinTrkAngle
Minimum allowed angle between decay tracks.
Definition: TrackPairsSelector.h:85
xAOD::TrackParticle_v1::perigeeParameters
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
Definition: TrackParticle_v1.cxx:485
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
InDet::TrackPairsSelector::m_maxDist
std::vector< double > m_maxDist
Maximum allowed distance of minimum approach.
Definition: TrackPairsSelector.h:87
lumiFormat.i
int i
Definition: lumiFormat.py:92
Trk::theta
@ theta
Definition: ParamDefs.h:72
xAOD::FirstMeasurement
@ FirstMeasurement
Parameter defined at the position of the 1st measurement.
Definition: TrackingPrimitives.h:213
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
test_pyathena.parent
parent
Definition: test_pyathena.py:15
python.xAODType.dummy
dummy
Definition: xAODType.py:4
InDet::TrackPairsSelector::m_etaCut
std::vector< double > m_etaCut
Maximum eta difference between tracks in pair.
Definition: TrackPairsSelector.h:89
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
Trk::ParametersBase
Definition: ParametersBase.h:55
Trk::CurvilinearParametersT
Definition: CurvilinearParametersT.h:48
xAOD::TrackParticle_v1::parameterPosition
xAOD::ParameterPosition parameterPosition(unsigned int index) const
Return the ParameterPosition of the parameters at 'index'.
Definition: TrackParticle_v1.cxx:647
DataVector< const Trk::MeasurementBase >
InDet::TrackPairsSelector::initialize
virtual StatusCode initialize() override
Definition: TrackPairsSelector.cxx:76
InDet::TrackPairsSelector::m_maxR
double m_maxR
Properties for track selection: all cuts are ANDed.
Definition: TrackPairsSelector.h:82
InDet::TrackPairsSelector::TrackPairsSelector
TrackPairsSelector(const std::string &type, const std::string &name, const IInterface *parent)
Definition: TrackPairsSelector.cxx:40
Trk::Track::perigeeParameters
const Perigee * perigeeParameters() const
return Perigee.
Definition: Tracking/TrkEvent/TrkTrack/src/Track.cxx:163
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
InDet::TrackPairsSelector::finalize
virtual StatusCode finalize() override
Definition: TrackPairsSelector.cxx:97
xAOD::TrackParticle_v1::numberOfParameters
size_t numberOfParameters() const
Returns the number of additional parameters stored in the TrackParticle.
Definition: TrackParticle_v1.cxx:553
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
InDet::TrackPairsSelector::m_helpertool
ToolHandle< InDet::ConversionFinderUtils > m_helpertool
Conversion helper tool.
Definition: TrackPairsSelector.h:66
InDet::TrackPairsSelector::Cache
Definition: TrackPairsSelector.h:31
Trk::Track::measurementsOnTrack
const DataVector< const MeasurementBase > * measurementsOnTrack() const
return a pointer to a vector of MeasurementBase (NOT including any that come from outliers).
Definition: Tracking/TrkEvent/TrkTrack/src/Track.cxx:178
TrackParticle.h
Trk::ParametersBase::momentum
const Amg::Vector3D & momentum() const
Access method for the momentum.
DeMoScan.index
string index
Definition: DeMoScan.py:362
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
InDet::TrackPairsSelector::interfaceID
static const InterfaceID & interfaceID()
Definition: TrackPairsSelector.cxx:71
GeoPrimitivesHelpers.h
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
xAOD::numberOfSCTHits
@ numberOfSCTHits
number of hits in SCT [unit8_t].
Definition: TrackingPrimitives.h:268
Trk::ParametersBase::eta
double eta() const
Access method for pseudorapidity - from momentum.
InDet::TrackPairsSelector::~TrackPairsSelector
virtual ~TrackPairsSelector()
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
AthAlgTool
Definition: AthAlgTool.h:26
InDet::TrackPairsSelector::m_distanceTool
ToolHandle< Trk::ITrkDistanceFinder > m_distanceTool
Distance of minimum approach tool
Definition: TrackPairsSelector.h:73
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.