Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
TrackRoiSelectionTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
12 
14 #include "GaudiKernel/ISvcLocator.h"
15 #include "GaudiKernel/Service.h"
16 
18 #include "TrackRoiSelectionTool.h"
20 #include "TrackParametersHelper.h"
21 
23 #include <cmath> // std::fabs
24 #include <algorithm> // for std::find
25 
26 
31  const std::string& name ) :
32  asg::AsgTool( name ) { }
33 
34 
39 
41 
42  ATH_MSG_INFO( "Initializing " << name() );
43 
44  ATH_CHECK( m_triggerTrkParticleName.initialize(
45  not m_triggerTrkParticleName.key().empty() ) );
46 
47  ATH_CHECK( m_trigDecTool.retrieve() );
48 
49  return StatusCode::SUCCESS;
50 }
51 
52 
56 template< class T >
58  const T& t, const TrigRoiDescriptor* r ) const {
59 
60  if( r==0 ) {
61  ATH_MSG_ERROR( "Called with null RoiDescriptor" );
62  return true;
63  }
64 
65  if( r->composite() ) {
66 
67  for( unsigned i=r->size() ; i-- ; )
68  if( accept( t, (const TrigRoiDescriptor*)r->at(i) ) )
69  return true;
70 
71  } else {
72 
73  if( r->isFullscan() ) return true;
74 
77  bool contained_phi = ( r->phiMinus() < r->phiPlus() ) ?
78  ( phi(t) > r->phiMinus() && phi(t) < r->phiPlus() ) :
79  ( phi(t) > r->phiMinus() || phi(t) < r->phiPlus() );
80 
81  bool contained_zed = ( z0(t) > r->zedMinus() && z0(t) < r->zedPlus() );
82 
85  bool contained_eta = ( eta(t) < r->etaPlus() && eta(t) > r->etaMinus() );
86 
89  exitPoint_t exit = getExitPoint( z0(t), eta(t) );
90 
94  exitPoint_t exitPlus = getExitPoint( r->zedPlus(), r->etaPlus() );
95  exitPoint_t exitMinus = getExitPoint( r->zedMinus(), r->etaMinus() );
96 
97  float cross0 = exit.z * exitMinus.r - exit.r * exitMinus.z;
98  float cross1 = exit.z * exitPlus.r - exit.r * exitPlus.z;
99 
100  contained_eta = ( cross0>0 && cross1<0 ) ? true : false;
101 
103  float newphi = getOuterPhi( pTsig(t), phi(t), exit.r );
104 
105  if( newphi < -999. ) return false;
106 
107  if( r->phiMinus() < r->phiPlus() ) contained_phi &= ( newphi > r->phiMinus() && newphi < r->phiPlus() );
108  else contained_phi &= ( newphi > r->phiMinus() || newphi < r->phiPlus() );
109 
110  if( contained_eta && contained_phi && contained_zed ) return true;
111  }
112 
113  return false;
114 }
115 
118  const xAOD::TrackParticle& t, const TrigRoiDescriptor* r ) const;
119 
122  const xAOD::TruthParticle& t, const TrigRoiDescriptor* r ) const;
123 
124 
129  float pt, float phi, float r ) const {
130 
133 
135  float mqR = 10 * pt / ( 2.99792458 * 2 ); // 2.998=speed of light, 2=Atlas B field
136  float ratio = 0.5 * r / mqR;
137  float newphi = phi;
138 
140  if( std::fabs( ratio ) > 1 ) return -9999.;
141 
143  newphi -= std::asin( ratio );
144 
146  while( newphi < -M_PI ) newphi += 2 * M_PI;
147  while( newphi > M_PI ) newphi -= 2 * M_PI;
148 
149  return newphi;
150 }
151 
152 
157  float tz0, float teta ) const {
158 
159  exitPoint_t exitPoint;
160  float rexit(0.), zexit(0.);
161  const float maxRadius = 1000.;
162  const float maxZed = 2700.;
163 
164  if ( teta < 0 ) zexit = -maxZed;
165  else if ( teta > 0 ) zexit = maxZed;
166  else {
167  exitPoint.z = tz0;
168  exitPoint.r = maxRadius;
169  exitPoint.tantheta = 1e16; // don't really want to use nan
170  return exitPoint;
171  }
172 
173  float tantheta = std::tan( 2 * std::atan( std::exp( -teta ) ) );
174 
175  rexit = ( zexit - tz0 ) * tantheta;
176 
178  if ( std::fabs(rexit) > maxRadius ) {
183 
184  zexit = maxRadius / tantheta + tz0;
185  rexit = maxRadius;
186  }
187 
188  exitPoint.z = zexit;
189  exitPoint.r = rexit;
190  exitPoint.tantheta = tantheta;
191  return exitPoint;
192 }
193 
194 
198 template< class T >
200  const std::vector< const T* >& tvec,
201  const TrigRoiDescriptor* r ) const {
202 
203  std::vector< const T* > selectedTracks;
204 
205  for( size_t it=0 ; it<tvec.size() ; it++ ) {
206  const T* thisTrack = tvec.at(it);
207  if( accept<T>( *thisTrack, r ) ) {
208  selectedTracks.push_back( thisTrack );
209  }
210  }
211 
212  return selectedTracks;
213 }
214 
216 template std::vector< const xAOD::TrackParticle* >
218  const std::vector< const xAOD::TrackParticle* >& tvec,
219  const TrigRoiDescriptor* r ) const;
220 
222 template std::vector< const xAOD::TruthParticle* >
224  const std::vector< const xAOD::TruthParticle* >& tvec,
225  const TrigRoiDescriptor* r ) const;
226 
227 
231 std::vector< const xAOD::TrackParticle* >
233  const std::vector< const xAOD::TrackParticle* >& tvec,
234  const ElementLink< TrigRoiDescriptorCollection >& roiLink ) const
235 {
237  SG::ReadHandle< xAOD::TrackParticleContainer > handle( m_triggerTrkParticleName );
238 
242  m_trigDecTool->associateToEventView( handle, roiLink );
243 
245  std::vector< const xAOD::TrackParticle* > selectedTrigTracks;
247  for( trkItr = trigTrkItrPair.first ; trkItr != trigTrkItrPair.second ; ++trkItr ) {
250  if( std::find( tvec.begin(), tvec.end(), *trkItr ) == tvec.end() ) {
251  ATH_MSG_DEBUG( "Trigger track does not pass quality selection. Skipping." );
252  continue;
253  }
254  selectedTrigTracks.push_back( *trkItr );
255  }
256 
257  return selectedTrigTracks;
258 }
259 
260 
265  TrackAnalysisCollections& trkAnaColls,
267 
268  ATH_MSG_DEBUG( "Selecting tracks in RoI" );
269 
271  ISvcLocator* svcLoc = Gaudi::svcLocator();
272  SmartIF< ITrackAnalysisDefinitionSvc > trkAnaDefSvc(
273  svcLoc->service( "TrkAnaDefSvc"+trkAnaColls.anaTag() ) );
274  ATH_CHECK( trkAnaDefSvc.isValid() );
275 
276  const TrigRoiDescriptor* const* roi = roiLink.cptr();
277 
280  if( not m_triggerTrkParticleName.key().empty() ) {
281  ATH_CHECK( trkAnaColls.fillTrigTrackVec(
282  getTrigTracks(
284  roiLink ),
286  }
287 
289  if( trkAnaDefSvc->useOffline() ) {
290  ATH_CHECK( trkAnaColls.fillOfflTrackVec(
291  getTracks(
293  *roi ),
295  }
296 
298  if( trkAnaDefSvc->useTruth() ) {
299  ATH_CHECK( trkAnaColls.fillTruthPartVec(
300  getTracks(
302  *roi ),
304  }
305 
307  ATH_MSG_DEBUG( "Tracks after RoI selection: " <<
308  trkAnaColls.printInfo( TrackAnalysisCollections::InRoI, false ) );
309 
310  return StatusCode::SUCCESS;
311 }
IDTPM::TrackAnalysisCollections::printInfo
std::string printInfo(Stage stage=FULL, bool printVertex=true) const
print information about tracks in the collection(s)
Definition: TrackAnalysisCollections.cxx:1034
IDTPM::exitPoint_t::tantheta
float tantheta
Definition: TrackRoiSelectionTool.h:34
beamspotman.r
def r
Definition: beamspotman.py:676
IDTPM::TrackAnalysisCollections::fillTrigTrackVec
StatusCode fillTrigTrackVec(const std::vector< const xAOD::TrackParticle * > &vec, Stage stage=FULL)
Trigger tracks.
Definition: TrackAnalysisCollections.cxx:353
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
IDTPM::TrackAnalysisCollections
Definition: TrackAnalysisCollections.h:46
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
DataVector::const_iterator
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition: DataVector.h:837
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
IDTPM::z0
float z0(const U &p)
Definition: TrackParametersHelper.h:72
CutsMETMaker::accept
StatusCode accept(const xAOD::Muon *mu)
Definition: CutsMETMaker.cxx:18
skel.it
it
Definition: skel.GENtoEVGEN.py:407
asg
Definition: DataHandleTestTool.h:28
test_pyathena.pt
pt
Definition: test_pyathena.py:11
IDTPM::exitPoint_t
Definition: TrackRoiSelectionTool.h:31
M_PI
#define M_PI
Definition: ActiveFraction.h:11
TrigRoiDescriptor
nope - should be used for standalone also, perhaps need to protect the class def bits #ifndef XAOD_AN...
Definition: TrigRoiDescriptor.h:56
IDTPM::pTsig
float pTsig(const U &p)
Accessor utility function for getting the value of signed pT.
Definition: TrackParametersHelper.h:37
IDTPM::TrackRoiSelectionTool::selectTracksInRoI
StatusCode selectTracksInRoI(TrackAnalysisCollections &trkAnaColls, const ElementLink< TrigRoiDescriptorCollection > &roiLink)
Main Track selection method.
Definition: TrackRoiSelectionTool.cxx:264
IDTPM::TrackAnalysisCollections::trigTrackVec
const std::vector< const xAOD::TrackParticle * > & trigTrackVec(Stage stage=FULL)
Definition: TrackAnalysisCollections.h:233
TrackAnalysisCollections.h
Class to hold for each event collections needed in the TrkAnalsis.
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
IDTPM::TrackRoiSelectionTool::getOuterPhi
float getOuterPhi(float pt, float phi, float r=1000.) const
Definition: TrackRoiSelectionTool.cxx:128
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
IDTPM::TrackRoiSelectionTool::getTrigTracks
std::vector< const xAOD::TrackParticle * > getTrigTracks(const std::vector< const xAOD::TrackParticle * > &tvec, const ElementLink< TrigRoiDescriptorCollection > &roiLink) const
TrigDecTool- and EventView-based getter function for trigger tracks.
Definition: TrackRoiSelectionTool.cxx:232
IDTPM::TrackRoiSelectionTool::initialize
virtual StatusCode initialize() override
Initialize.
Definition: TrackRoiSelectionTool.cxx:38
IDTPM::phi
float phi(const U &p)
Definition: TrackParametersHelper.h:61
drawFromPickle.atan
atan
Definition: drawFromPickle.py:36
IDTPM::TrackRoiSelectionTool::getTracks
std::vector< const T * > getTracks(const std::vector< const T * > &tvec, const TrigRoiDescriptor *r) const
track getter function (for offline tracks or truth particles)
Definition: TrackRoiSelectionTool.cxx:199
IDTPM::TrackAnalysisCollections::fillOfflTrackVec
StatusCode fillOfflTrackVec(const std::vector< const xAOD::TrackParticle * > &vec, Stage stage=FULL)
Offline tracks.
Definition: TrackAnalysisCollections.cxx:336
IDTPM::TrackAnalysisCollections::fillTruthPartVec
StatusCode fillTruthPartVec(const std::vector< const xAOD::TruthParticle * > &vec, Stage stage=FULL)
fill truth/offline/trigger track vector (TEST or REFERENCE)
Definition: TrackAnalysisCollections.cxx:319
TrackParametersHelper.h
Utility methods to access track/truth particles parmeters in a consitent way in this package.
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
IDTPM::eta
float eta(const U &p)
Accessor utility function for getting the value of eta.
Definition: TrackParametersHelper.h:43
lumiFormat.i
int i
Definition: lumiFormat.py:85
IDTPM::TrackRoiSelectionTool::accept
bool accept(const T &t, const TrigRoiDescriptor *r) const
geometric RoI filters - for non-trigger tracks (e.g. offline, truth, etc.)
Definition: TrackRoiSelectionTool.cxx:57
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
IDTPM::TrackAnalysisCollections::FS
@ FS
Definition: TrackAnalysisCollections.h:54
IDTPM::exitPoint_t::r
float r
Definition: TrackRoiSelectionTool.h:33
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:37
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
IDTPM::TrackAnalysisCollections::offlTrackVec
const std::vector< const xAOD::TrackParticle * > & offlTrackVec(Stage stage=FULL)
Definition: TrackAnalysisCollections.h:231
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
getTracks< xAOD::TruthParticle >
template std::vector< const xAOD::TruthParticle * > IDTPM::TrackRoiSelectionTool::getTracks< xAOD::TruthParticle >(const std::vector< const xAOD::TruthParticle * > &tvec, const TrigRoiDescriptor *r) const
getTracks method for truth particles
TrackRoiSelectionTool.h
calibdata.exit
exit
Definition: calibdata.py:236
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
IDTPM::exitPoint_t::z
float z
Definition: TrackRoiSelectionTool.h:32
IDTPM::TrackRoiSelectionTool::getExitPoint
exitPoint_t getExitPoint(float tz0, float teta) const
Geometric utility methods for track-RoI association.
Definition: TrackRoiSelectionTool.cxx:156
python.compareTCTs.ratio
ratio
Definition: compareTCTs.py:295
IDTPM::TrackAnalysisCollections::InRoI
@ InRoI
Definition: TrackAnalysisCollections.h:54
IDTPM::TrackAnalysisCollections::truthPartVec
const std::vector< const xAOD::TruthParticle * > & truthPartVec(Stage stage=FULL)
get truth/offline/trigger track vector (TEST or REFERENCE)
Definition: TrackAnalysisCollections.h:229
getTracks< xAOD::TrackParticle >
template std::vector< const xAOD::TrackParticle * > IDTPM::TrackRoiSelectionTool::getTracks< xAOD::TrackParticle >(const std::vector< const xAOD::TrackParticle * > &tvec, const TrigRoiDescriptor *r) const
getTracks method for offline tracks
TrigRoiDescriptor.h
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
IDTPM::TrackAnalysisCollections::anaTag
const std::string & anaTag()
— Getter methods —
Definition: TrackAnalysisCollections.h:197
asg::AsgTool::initialize
virtual StatusCode initialize()
Dummy implementation of the initialisation function.
Definition: AsgTool.h:133
IDTPM::TrackRoiSelectionTool::TrackRoiSelectionTool
TrackRoiSelectionTool(const std::string &name)
Constructor.
Definition: TrackRoiSelectionTool.cxx:30