ATLAS Offline Software
Loading...
Searching...
No Matches
TrigTrackSelector Class Reference

L2 tracks. More...

#include <TrigTrackSelector.h>

Inheritance diagram for TrigTrackSelector:
Collaboration diagram for TrigTrackSelector:

Public Types

typedef std::vector< ElementLink< xAOD::TrackParticleContainer > > TrackParticleLinks_t

Public Member Functions

 TrigTrackSelector (TrackFilter *selector)
 use a radius of 47 mm corresponding to the Run 1 pixel inner radius For the IBL it should be 32 mm, but this was kept as 47 mm for consistency of the definition.
 TrigTrackSelector (TrackFilter *selector, double radius)
 TrigTrackSelector (TrackFilter *selector, int selectPdgId, int selectParentPdgId)
 TrigTrackSelector (TrackFilter *selector, double radius, int selectPdgId, int selectParentPdgId)
template<typename T>
 TrigTrackSelector (T &tm, TrackFilter *selector, double radius=default_radius(), int selectPdgId=0, int selectParentPdgId=0)
template<typename T>
 TrigTrackSelector (T tbegin, T tend, TrackFilter *selector, double radius=default_radius(), int selectPdgId=0, int selectParentPdgId=0)
 ~TrigTrackSelector ()
virtual TrackSelectorclone () override
void setBeamline (double x, double y, double z=0)
double getBeamX () const
double getBeamY () const
double getBeamZ () const
void correctTracks (bool b=true)
virtual void clear () override
bool selectTrack (const TrigInDetTrack *track, const TrigInDetTrackTruthMap *truthMap=0)
 neater code to make use of vector function also for a single ancestor pdgid, instead of the full code duplication, but less efficienct as it then needs to create a single element vector for each particle, to avoid the code duplication.
void selectTracks (const TrigInDetTrackCollection *trigtracks, const TrigInDetTrackTruthMap *truthMap=0)
bool selectTrack (const Rec::TrackParticle *track)
void selectTracks (const Rec::TrackParticleContainer *trigtracks)
void selectTracks (const TruthParticleContainer *truthtracks)
void selectTracks (const xAOD::TruthParticleContainer *truthtracks)
void truthBeamline (const xAOD::TruthParticleContainer *truthtracks, double &x0, double &y0)
 extract all the tracks from a xAOD::TruthParticle collection and histogram the x and y production coordinates to determine the event "beamline" position
bool selectTrack (HepMC::ConstGenParticlePtr track)
bool selectTrack (const TruthParticle &track)
bool selectTrack (const TruthParticle *track)
bool selectTrack (const xAOD::TruthParticle *track, double x0=0, double y0=0)
TIDA::TrackmakeTrack (HepMC::ConstGenParticlePtr track)
TIDA::TrackmakeTrack (const TruthParticle *track, unsigned long tid=0)
bool selectTrack (const Trk::Track *track)
void selectTracks (const TrackCollection *trigtracks)
bool selectTrack (const xAOD::TrackParticle *track, void *=0)
 legacy run 2 selector access
void selectTracks (const xAOD::TrackParticleContainer *tracks, void *=0)
void selectTracks (xAOD::TrackParticleContainer::const_iterator trackitr, xAOD::TrackParticleContainer::const_iterator trackend, void *=0)
 MT selector access.
void selectTracks (const TrackParticleLinks_t &tracks)
void correctToBeamline (double &z0, double &dz0, double &d0, double &dd0, double theta, double phi)
virtual bool addTrack (TIDA::Track *t, bool(*f)(const TIDA::Track *)=0)
virtual void addTracks (std::vector< TIDA::Track * > &t, bool(*f)(const TIDA::Track *)=0)
const std::vector< TIDA::Track * > & tracks () const
std::vector< TIDA::Track * > tracks (TrackFilter *selector) const
unsigned size () const
void delete_track (TIDA::Track *t)

Static Public Member Functions

static double default_radius ()

Protected Member Functions

const xAOD::TruthParticlefromAncestor (const int pdg_id, const xAOD::TruthParticle *p) const
 recursive functions to identify whether a particle comes from some particle of a specific PDG ID, or some numb er of specified PDG IDs.
const xAOD::TruthParticlefromAncestor (const std::vector< int > &ids, const xAOD::TruthParticle *p) const
 recursive function to identify whether a particle comes from some other number of ancestor particles, with the pdgids passed in as a vector.
virtual void cleanup (TIDA::Track *)

Protected Attributes

std::vector< TIDA::Track * > m_tracks
TrackFilterm_selector

Private Attributes

unsigned long m_id
double m_xBeam
double m_yBeam
double m_zBeam
bool m_correctTrkTracks
double m_radius
int m_selectPdgId
int m_selectParentPdgId

Static Private Attributes

static const double s_default_radius = 47
 NB: This was 47 for Run 2, but with the addition of the IBL it should be 32 It was kept at 47 for all Run 2 and migration to MT, but for Run 3 we really want it changed to be 32.

Detailed Description

L2 tracks.

TruthMap offline and EF MC truth FrameWork includes #include "GaudiKernel/ServiceHandle.h" #include "GaudiKernel/IPartPropSvc.h" absolutely pathetic!! write my own class TrigInDetAnalysis classes

Definition at line 58 of file TrigTrackSelector.h.

Member Typedef Documentation

◆ TrackParticleLinks_t

Constructor & Destructor Documentation

◆ TrigTrackSelector() [1/6]

TrigTrackSelector::TrigTrackSelector ( TrackFilter * selector)
inline

use a radius of 47 mm corresponding to the Run 1 pixel inner radius For the IBL it should be 32 mm, but this was kept as 47 mm for consistency of the definition.

this should be changed to 32 mm for Run 3

Definition at line 70 of file TrigTrackSelector.h.

70: TrigTrackSelector( selector, default_radius(), 0, 0 ) { }
TrigTrackSelector(TrackFilter *selector)
use a radius of 47 mm corresponding to the Run 1 pixel inner radius For the IBL it should be 32 mm,...
static double default_radius()

◆ TrigTrackSelector() [2/6]

TrigTrackSelector::TrigTrackSelector ( TrackFilter * selector,
double radius )
inline

Definition at line 72 of file TrigTrackSelector.h.

72: TrigTrackSelector( selector, radius, 0, 0 ) { }

◆ TrigTrackSelector() [3/6]

TrigTrackSelector::TrigTrackSelector ( TrackFilter * selector,
int selectPdgId,
int selectParentPdgId )
inline

Definition at line 74 of file TrigTrackSelector.h.

74: TrigTrackSelector( selector, default_radius(), selectPdgId, selectParentPdgId ) { }

◆ TrigTrackSelector() [4/6]

TrigTrackSelector::TrigTrackSelector ( TrackFilter * selector,
double radius,
int selectPdgId,
int selectParentPdgId )

◆ TrigTrackSelector() [5/6]

template<typename T>
TrigTrackSelector::TrigTrackSelector ( T & tm,
TrackFilter * selector,
double radius = default_radius(),
int selectPdgId = 0,
int selectParentPdgId = 0 )
inline

Definition at line 79 of file TrigTrackSelector.h.

79 :
80 TrigTrackSelector( tm.begin(), tm.end(), selector, radius, selectPdgId, selectParentPdgId ) {
81 }

◆ TrigTrackSelector() [6/6]

template<typename T>
TrigTrackSelector::TrigTrackSelector ( T tbegin,
T tend,
TrackFilter * selector,
double radius = default_radius(),
int selectPdgId = 0,
int selectParentPdgId = 0 )
inline

Definition at line 84 of file TrigTrackSelector.h.

84 :
85 TrigTrackSelector( selector, radius, selectPdgId, selectParentPdgId ) {
86 selectTracks( tbegin, tend );
87 }
void selectTracks(const TrigInDetTrackCollection *trigtracks, const TrigInDetTrackTruthMap *truthMap=0)

◆ ~TrigTrackSelector()

TrigTrackSelector::~TrigTrackSelector ( )
inline

Definition at line 90 of file TrigTrackSelector.h.

90{ clear(); }
virtual void clear() override

Member Function Documentation

◆ addTrack()

virtual bool TrackSelector::addTrack ( TIDA::Track * t,
bool(* )(const TIDA::Track *) = 0 )
inlinevirtualinherited

Definition at line 35 of file Trigger/TrigAnalysis/TrigInDetAnalysis/TrigInDetAnalysis/TrackSelector.h.

35 {
36 //std::cout << "addtrack() before f: t " << *t << " " << size() << "\t f " << f << std::endl;
37 if ( f==0 ) {
38 if ( m_selector && m_selector->select(t) ) { m_tracks.push_back(t); return true; }
39 else { cleanup(t); }
40 }
41 else {
42 if ( f(t) ) { m_tracks.push_back(t); return true; }
43 else { cleanup(t); }
44 }
45 return false;
46 }

◆ addTracks()

virtual void TrackSelector::addTracks ( std::vector< TIDA::Track * > & t,
bool(* )(const TIDA::Track *) = 0 )
inlinevirtualinherited

Definition at line 48 of file Trigger/TrigAnalysis/TrigInDetAnalysis/TrigInDetAnalysis/TrackSelector.h.

48 {
49 for ( size_t i=0 ; i<t.size() ; i++ ) addTrack( t[i], f );
50 }
virtual bool addTrack(TIDA::Track *t, bool(*f)(const TIDA::Track *)=0)

◆ cleanup()

virtual void TrackSelector::cleanup ( TIDA::Track * )
inlineprotectedvirtualinherited

◆ clear()

virtual void TrigTrackSelector::clear ( )
inlineoverridevirtual

Reimplemented from TrackSelector.

Definition at line 102 of file TrigTrackSelector.h.

102{ for ( size_t i=m_tracks.size() ; i-- ; ) delete m_tracks[i]; m_tracks.clear(); }

◆ clone()

virtual TrackSelector * TrigTrackSelector::clone ( )
inlineoverridevirtual

Implements TrackSelector.

Definition at line 92 of file TrigTrackSelector.h.

92{ return new TrigTrackSelector(*this); }

◆ correctToBeamline()

void TrigTrackSelector::correctToBeamline ( double & z0,
double & dz0,
double & d0,
double & dd0,
double theta,
double phi )

make sure that users have set the beamline parameters

error estimates

Definition at line 1262 of file TrigTrackSelector.cxx.

1264 {
1265
1267
1268 // if ( m_first ) {
1269 // if ( m_xBeam==0 && m_yBeam==0 ) {
1270 // std::cerr << "TrigTrackSelector::correctToBeamline() WARNING -- Beamline set to (0,0) -- WARNING" << std::endl;
1271 // }
1272 // else {
1273 // std::cout << "TrigTrackSelector::correctToBeamline() Beamline set to " << m_xBeam << " " << m_yBeam << std::endl;
1274 // }
1275 // m_first = false;
1276 // }
1277
1278
1279 // double theta = 2*std::atan( exp( (-1)*eta ) );
1280 double z0t = z0 + ((std::cos(phi)*m_xBeam + std::sin(phi)*m_yBeam)/std::tan(theta));
1281 double a0t = d0 + std::sin(phi)*m_xBeam - std::cos(phi)*m_yBeam;
1282
1284 double dz0t = dz0 + ((std::cos(phi)*m_xBeam + std::sin(phi)*m_yBeam)/std::tan(theta));
1285 double da0t = dd0 + std::sin(phi)*m_xBeam - std::cos(phi)*m_yBeam;
1286
1287 z0 = z0t;
1288 d0 = a0t;
1289
1290 dz0 = dz0t;
1291 dd0 = da0t;
1292}
Scalar phi() const
phi method
Scalar theta() const
theta method

◆ correctTracks()

void TrigTrackSelector::correctTracks ( bool b = true)
inline

Definition at line 100 of file TrigTrackSelector.h.

◆ default_radius()

double TrigTrackSelector::default_radius ( )
inlinestatic

Definition at line 188 of file TrigTrackSelector.h.

188{ return s_default_radius; }
static const double s_default_radius
NB: This was 47 for Run 2, but with the addition of the IBL it should be 32 It was kept at 47 for all...

◆ delete_track()

void TrackSelector::delete_track ( TIDA::Track * t)
inlineinherited

Definition at line 69 of file Trigger/TrigAnalysis/TrigInDetAnalysis/TrigInDetAnalysis/TrackSelector.h.

69 {
70 m_tracks.erase( std::remove( m_tracks.begin(), m_tracks.end(), t ), m_tracks.end() );
71 }
DataModel_detail::iterator< DVL > remove(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end, const T &value)
Specialization of remove for DataVector/List.

◆ fromAncestor() [1/2]

const xAOD::TruthParticle * TrigTrackSelector::fromAncestor ( const int pdg_id,
const xAOD::TruthParticle * p ) const
protected

recursive functions to identify whether a particle comes from some particle of a specific PDG ID, or some numb er of specified PDG IDs.

recursive function to identify whether a particle comes from some other ancestor particle at any point in its history - checks its parents and then function calls itself to check their parents etc., until it either finds the pdgid it is looking for, or it has no more ancestors if it finds an appropriate ancestor it returns the pointer to it, otherwise it returns a nullptr

finds an appropriate ancestor and returns the pointer to it, otherwise it just returns a nullptr

Definition at line 39 of file TrigTrackSelector.cxx.

39 {
40 if ( p==nullptr ) return nullptr;
41 if ( MC::isElectron(p) || MC::isMuon(p) ) return nullptr; //don't want light leptons from eg tau decays - they are found directly
42 if ( p->absPdgId()==pdg_id ) {
43 return p; // recursive stopping conditions
44 }
45 auto vertex = p->prodVtx();
46 if ( vertex == nullptr ) {
47 return nullptr; // has no production vertex !!!
48 }
49 if ( vertex->nIncomingParticles() < 1 ) {
50 return nullptr; // recursive stopping conditions
51 }
52 for( unsigned ip = 0; ip < vertex->nIncomingParticles(); ip++ ) {
53 auto* in = vertex->incomingParticle(ip);
54 auto parent = fromAncestor( pdg_id, in);
55 if ( parent!=nullptr ) {
56 if (parent->absPdgId()==pdg_id) return parent;
57 }
58 }
59
60 return nullptr;
61}
const xAOD::TruthParticle * fromAncestor(const int pdg_id, const xAOD::TruthParticle *p) const
recursive functions to identify whether a particle comes from some particle of a specific PDG ID,...
bool isElectron(const T &p)
bool isMuon(const T &p)

◆ fromAncestor() [2/2]

const xAOD::TruthParticle * TrigTrackSelector::fromAncestor ( const std::vector< int > & ids,
const xAOD::TruthParticle * p ) const
protected

recursive function to identify whether a particle comes from some other number of ancestor particles, with the pdgids passed in as a vector.

Any such ancestors at point in it's history will do - checks it's parents and then calls the function calls itself to check the parent's parents etc, until it either finds one of the pdgids it is looking for, or it has no more ancestors if it finds an appropriate ancestor it returns the pointer to it, otherwise it returns a nullptr

Definition at line 73 of file TrigTrackSelector.cxx.

73 {
74 if ( p==nullptr ) return nullptr;
75 if (MC::isElectron(p) || MC::isMuon(p)) return nullptr; //don't want light leptons from eg tau decays - they are found directly
76 for ( size_t i=ids.size() ; i-- ; ) {
77 if ( p->absPdgId()==ids[i] ) return p; // recursive stopping conditions
78 }
79
80 auto vertex = p->prodVtx();
81 if ( vertex == nullptr ) return nullptr; // has no production vertex !!!
82
83 if ( vertex->nIncomingParticles()<1 ) return nullptr; // recursive stopping conditions
84
85 for( unsigned ip = 0; ip < vertex->nIncomingParticles(); ip++ ) {
86 auto* in = vertex->incomingParticle(ip);
87 auto parent = fromAncestor( ids, in);
88 if ( parent!=nullptr ) {
89 for ( size_t i=ids.size() ; i-- ; ) {
90 if ( parent->absPdgId()==ids[i] ) return parent;
91 }
92 }
93 }
94
95 return nullptr;
96}

◆ getBeamX()

double TrigTrackSelector::getBeamX ( ) const
inline

Definition at line 96 of file TrigTrackSelector.h.

96{ return m_xBeam; }

◆ getBeamY()

double TrigTrackSelector::getBeamY ( ) const
inline

Definition at line 97 of file TrigTrackSelector.h.

97{ return m_yBeam; }

◆ getBeamZ()

double TrigTrackSelector::getBeamZ ( ) const
inline

Definition at line 98 of file TrigTrackSelector.h.

98{ return m_zBeam; }

◆ makeTrack() [1/2]

TIDA::Track * TrigTrackSelector::makeTrack ( const TruthParticle * track,
unsigned long tid = 0 )

check for final state

the is our new "final state" requirement the inner and outer radii are in some sense arbitrary - these correspond to an envelope around the pixel detector, so the track must pass through the entire pixel detector NB: In order to ensure you don't miss any tracks they really need to be the same ie if a track brems in your "volume" then you will miss that track, and also the resulting track, even if it is a high et track

keep anything over 10 GeV with the old requirement

avoid default (unset) TruthParticle charge

only use charged tracks

what a faff - refuse to mess about with the classes to swim tracks etc - why can't they just encode this sort of information in the class!! It's not as if it doesn't actually have members for anything else useless!! Classes should be designed for ease of use !!!!

is there a sign issue here ?

correct back to the beamline

how about storing uniqueID/status/pidg info?

this isn't good!! but it will do for testing

probably won't work either

get the production vertex for the z0 and d0 but should we store the z0 of the production vertex? or swim the track to the perigee point with respect to 0,0 and use the parameters there?

what to do with these???

Definition at line 700 of file TrigTrackSelector.cxx.

700 {
701
702 if ( track==0 ) return 0;
703 if ( !MC::isStable(track)) return 0;
704
705
706 double phi = track->phi();
707 double eta = track->eta();
708
712 double xp[3] = { 0, 0, 0 };
713
714 if ( track->genParticle()->production_vertex() ) {
715 xp[0] = track->genParticle()->production_vertex()->position().x();
716 xp[1] = track->genParticle()->production_vertex()->position().y();
717 xp[2] = track->genParticle()->production_vertex()->position().z();
718 }
719
720 // CHANGED BY JK - z0 with respect to (0,0)
721 // double z0 = xp[2];
722 double theta = 2*std::atan( exp( (-1)*eta ) );
723 double z0 = xp[2] - (xp[0]*std::cos(phi) + xp[1]*std::sin(phi))/std::tan(theta);
724
725 double xd[3] = { 0, 0, 0 };
726
727 if ( track->genParticle()->end_vertex() ) {
728 xd[0] = track->genParticle()->end_vertex()->position().x();
729 xd[1] = track->genParticle()->end_vertex()->position().y();
730 xd[2] = track->genParticle()->end_vertex()->position().z();
731 }
732
733 double rp = std::sqrt( xp[0]*xp[0] + xp[1]*xp[1] );
734 double rd = std::sqrt( xd[0]*xd[0] + xd[1]*xd[1] );
735
736
737 bool final_state = false;
738
750 const double inner_radius = m_radius;
751 const double outer_radius = m_radius;
752 if ( ( track->genParticle()->production_vertex() && rp<=inner_radius ) &&
753 ( track->genParticle()->end_vertex()==0 || rd>outer_radius ) ) final_state = true;
754
755
756 if ( !final_state ) return 0;
757
768
769 double q = track->charge();
770
771 static const particleType ptype;
772
774 if ( q==-999 ) q = ptype.charge( track->pdgId() );
775
777 if ( q==0 ) return 0;
778
779 double pT = q*track->pt();
780
781
782 double d0 = 0;
783
788
790
791
792 // CHANGED BY JK - d0 with respect to (0,0)
793 // d0 = q*rp*std::sin(phi);
794 d0 = xp[1]*std::cos(phi) - xp[0]*std::sin(phi);
795
796
798
799 double dz0 = 0;
800 double dd0 = 0;
801
802 correctToBeamline( z0, dz0, d0, dd0, theta, phi );
803
804
805
807
809 int author = track->pdgId();
810 int uniqueID = HepMC::uniqueID(track);
811
812
813 unsigned long id = (unsigned long)track;
814 if ( tid!=0 ) id = tid;
815
819
820
822
823 // std::cout << "\t\t\tSUTT Truth track"
824 // << "\teta=" << eta // << " +- " << (*trackitr)->params()->deta()
825 // << "\tphi=" << phi // << " +- " << (*trackitr)->params()->dphi()
826 // << "\tz0=" << z0
827 // << "\tpT=" << pT // << "\t( " << 1/qoverp << ")"
828 // << "\td0=" << d0
829 // << "\tauthor=" << author
830 // << std::endl;
831
832
833
834 TIDA::Track* t = new TIDA::Track(eta, phi, z0, d0, pT, 0, 0,
835 0, 0, 0, 0, 0,
836 0, 0, 0, 0,
837 0, 0, 0, 0,
838 author, false, uniqueID, -1,
839 false,
840 id ) ;
841
842 return t;
843
844}
Scalar eta() const
pseudorapidity method
ReadCards * rp
void correctToBeamline(double &z0, double &dz0, double &d0, double &dd0, double theta, double phi)
double charge(int id) const
int uniqueID(const T &p)
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.

◆ makeTrack() [2/2]

TIDA::Track * TrigTrackSelector::makeTrack ( HepMC::ConstGenParticlePtr track)

Definition at line 688 of file TrigTrackSelector.cxx.

688 {
689//AV Using memory to get some value is not a good idea. This is not a repruducible/portable way, but I leave it as is.
690#ifdef HEPMC3
691 unsigned long id = (unsigned long)(track.get());
692#else
693 unsigned long id = (unsigned long)track;
694#endif
695 TruthParticle t = TruthParticle(track);
696 return makeTrack( &t, id );
697}
TIDA::Track * makeTrack(HepMC::ConstGenParticlePtr track)
TruthParticle_v1 TruthParticle
Typedef to implementation.

◆ selectTrack() [1/8]

bool TrigTrackSelector::selectTrack ( const Rec::TrackParticle * track)

temporarily remove interaction mean z position

<< check this <<–

check this !!!

now some ridiculous code to get the author of the TrackParticle (offline) tracks

Definition at line 200 of file TrigTrackSelector.cxx.

200 {
201
202 // do the track extraction stuff here....
203
204 static const int hpmap[20] = { 0, 1, 2, 7, 8, 9, 3, 4, 5, 6, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
205
206 if ( track ) {
207
208#ifdef TRKPARAMETERS_MEASUREDPERIGEE_H
209 const Trk::MeasuredPerigee* measPer = track->measuredPerigee();
210#else
211 const Trk::Perigee* measPer = track->measuredPerigee();
212#endif
213 // CLHEP::HepVector perigeeParams = measPer->parameters();
214
215 double pT = measPer->pT();
216 double eta = measPer->eta();
217 double phi = measPer->parameters()[Trk::phi0];
218 double z0 = measPer->parameters()[Trk::z0] + m_zBeam;
219 double d0 = measPer->parameters()[Trk::d0];
220
221 double theta = measPer->parameters()[Trk::theta];
222 double p = 1/measPer->parameters()[Trk::qOverP];
223
224 // AAARCH!!!!! the TrackParticle pT is NOT SIGNED!!!! ( I ask you! )
225 if ( measPer->parameters()[Trk::qOverP]<0 && pT>0 ) pT *= -1;
226
227#ifdef TRKPARAMETERS_MEASUREDPERIGEE_H
228 const Trk::ErrorMatrix err = measPer->localErrorMatrix();
229 double dtheta = err.error(Trk::theta);
230 double dqovp = err.error(Trk::qOverP);
231 double covthetaOvP = err.covValue(Trk::qOverP,Trk::theta);
232#else
233 double dtheta = std::sqrt((*measPer->covariance())(Trk::theta,Trk::theta));
234 double dqovp = std::sqrt((*measPer->covariance())(Trk::qOverP,Trk::qOverP));
235 double covthetaOvP = (*measPer->covariance())(Trk::qOverP,Trk::theta);
236#endif
237
238
239 double deta = 0.5*dtheta/(std::cos(0.5*theta)*std::cos(0.5*theta)*std::tan(0.5*theta));
240
241#ifdef TRKPARAMETERS_MEASUREDPERIGEE_H
242 double dphi = err.error(Trk::phi0);
243 double dz0 = err.error(Trk::z0);
244 double dd0 = err.error(Trk::d0);
245#else
246 double dphi = std::sqrt((*measPer->covariance())(Trk::phi0,Trk::phi0));
247 double dz0 = std::sqrt((*measPer->covariance())(Trk::z0,Trk::z0));
248 double dd0 = std::sqrt((*measPer->covariance())(Trk::d0,Trk::d0));
249#endif
250
251 double dpT = 0;
252
253
254 double sintheta = std::sin(theta);
255 double costheta = std::cos(theta);
256 double dpt2 = (p*p*sintheta)*(p*p*sintheta)*dqovp*dqovp + (p*costheta)*(p*costheta)*dtheta*dtheta - 2*(p*p*sintheta)*(p*costheta)*covthetaOvP;
257
258 if ( dpt2>0 ) dpT = std::sqrt( dpt2 );
259
260 // Check number of hits
261 // NB: a spacepoint is two offline "hits", so a pixel spacepoint is really
262 // 2 "hits" and an offline SCT "hit" is really a 1D cluster, so two intersecting
263 // stereo clusters making a spacepoint are two "hits"
264 const Trk::TrackSummary *summary = track->trackSummary();
265 int nBlayerHits = 2*summary->get(Trk::numberOfBLayerHits);
267 int nSctHits = summary->get(Trk::numberOfSCTHits);
268 int nStrawHits = summary->get(Trk::numberOfTRTHits);
269 int nTrHits = summary->get(Trk::numberOfTRTHighThresholdHits);
270
271 int nSiHits = nPixelHits + nSctHits;
272 bool expectBL = false; // Not stored for Rec::TrackParticle
273
274 const Trk::FitQuality *quality = track->fitQuality();
275 double chi2 = quality->chiSquared();
276 double dof = quality->numberDoF();
277
278 unsigned bitmap = 0;
279
280
281 unsigned long id = (unsigned long)track;
282
283 for ( int ih=0 ; ih<20 ; ih++ ) {
284 if ( summary->isHit(Trk::DetectorType(ih)) ) bitmap |= ( 1<<hpmap[ih] );
285 }
286
289
290 // std::cout << "fetching author info :" << track->info().trackFitter() << ":"
291 // << track->info().dumpInfo() << ": bm 0x" << std::hex << bitmap << std::dec << std::endl;
292
293 int fitter = track->info().trackFitter();
294 std::string dumpinfo = track->info().dumpInfo();
295
296 int trackAuthor = -1;
297 if ( fitter>0 && fitter<Trk::TrackInfo::NumberOfTrackFitters ) {
298 if ( dumpinfo.find("TRTStandalone")!=std::string::npos) trackAuthor = 2;
299 else if ( dumpinfo.find("TRTSeededTrackFinder")!=std::string::npos) trackAuthor = 1;
300 else trackAuthor = 0;
301 }
302
303#if 0
304 std::cout << "\t\t\tSUTT TP track"
305 << "\teta=" << eta // << " +- " << (*trackitr)->params()->deta()
306 << "\tphi=" << phi // << " +- " << (*trackitr)->params()->dphi()
307 << "\tz0=" << z0
308 << "\tpT=" << pT // << "\t( " << 1/qoverp << ")"
309 << "\td0=" << d0
310 << "\tNsi=" << nSiHits
311 << "\tNtrt=" << nTrHits
312 << "\tNstr=" << nStrawHits
313 << "\tauthor=" << trackAuthor
314 << std::endl;
315#endif
316
317 // Create and save Track
318
319 TIDA::Track* t = new TIDA::Track(eta, phi, z0, d0, pT, chi2, dof,
320 deta, dphi, dz0, dd0, dpT,
321 nBlayerHits, nPixelHits, nSctHits, nSiHits,
322 nStrawHits, nTrHits, bitmap, 0,
323 trackAuthor, false, -1, -1,
324 expectBL, id) ;
325
326 // std::cout << "SUTT TP track " << *t << "\t0x" << std::hex << bitmap << std::dec << std::endl;
327
328 if ( !addTrack( t ) ){
329 delete t;
330 return false;
331 }
332 return true;
333
334 }
335 return false;
336}
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
Definition FitQuality.h:60
double chiSquared() const
returns the of the overall track fit
Definition FitQuality.h:56
double eta() const
Access method for pseudorapidity - from momentum.
double pT() const
Access method for transverse momentum.
double chi2(TH1 *h0, TH1 *h1)
float nSiHits(const U &p)
float nPixelHits(const U &p)
const ShapeFitter * fitter
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ phi0
Definition ParamDefs.h:65
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
DetectorType
enumerates the various detector types currently accessible from the isHit() method.
@ numberOfPixelHits
number of pixel layers on track with absence of hits
@ numberOfBLayerHits
these are the hits in the 0th pixel layer?
@ numberOfTRTHighThresholdHits
total number of TRT hits which pass the high threshold
Perigee MeasuredPerigee

◆ selectTrack() [2/8]

bool TrigTrackSelector::selectTrack ( const TrigInDetTrack * track,
const TrigInDetTrackTruthMap * truthMap = 0 )

neater code to make use of vector function also for a single ancestor pdgid, instead of the full code duplication, but less efficienct as it then needs to create a single element vector for each particle, to avoid the code duplication.

Perhaps something can be done for the compiler optimisation to realise this and somehow
reduce the opverhead of creating the single int vector - need to investiogate this more thoroghly before including this, as it would be a much neater solution

not definied ofr TrigInDetTracks

Definition at line 116 of file TrigTrackSelector.cxx.

116 {
117 // do the track extraction stuff here....
118 if ( track ) {
119
120 double eta = track->param()->eta();
121 double phi = track->param()->phi0();
122 double z0 = track->param()->z0();
123 double pT = track->param()->pT();
124 double d0 = track->param()->a0();
125
126 double deta = track->param()->eeta();
127 double dphi = track->param()->ephi0();
128 double dz0 = track->param()->ez0();
129 double dpT = track->param()->epT();
130 double dd0 = track->param()->ea0();
131
132 double theta = 2*std::atan( exp( (-1)*eta ) );
133 correctToBeamline( z0, dz0, d0, dd0, theta, phi );
134
135 int algoid = track->algorithmId();
136
137 int nBlayerHits = (track->HitPattern() & 0x1);
138 int nPixelHits = 2 * track->NPixelSpacePoints(); // NB: for comparison with offline
139 int nSctHits = 2 * track->NSCT_SpacePoints(); // a spacepoint is 2 "hits"
140 int nStrawHits = track->NStrawHits();
141 int nTrHits = track->NTRHits();
142
143 int nSiHits = nPixelHits + nSctHits;
144
145 bool expectBL = false; //not filled in
146
147 unsigned long id = (unsigned long)track;
148
149 unsigned hitPattern = track->HitPattern();
150 unsigned multiPattern = 0;
151
152 double chi2 = track->chi2();
153 double dof = 0;
154
155 bool truth = false;
156 int match_uniqueID = HepMC::INVALID_PARTICLE_ID;
157
158 if ( truthMap ) {
159 const TrigInDetTrackTruth* trackTruth = truthMap->truth(track);
160 if (trackTruth!=0 && trackTruth->nrMatches() > 0) {
161 match_uniqueID = HepMC::uniqueID(trackTruth->bestSiMatch());
162 truth = true;
163 }
164 }
165
166
167 TIDA::Track* t = new TIDA::Track( eta, phi, z0, d0, pT, chi2, dof,
168 deta, dphi, dz0, dd0, dpT,
169 nBlayerHits, nPixelHits, nSctHits, nSiHits,
170 nStrawHits, nTrHits,
171 hitPattern, multiPattern,
172 algoid, truth, -1, match_uniqueID,
173 expectBL, id) ;
174
175 // std::cout << "SUTT ID track " << *t << "\t0x" << std::hex << track->HitPattern() << std::dec << std::endl;
176
177 if ( !addTrack( t ) ){
178 delete t;
179 return false;
180 }
181 return true;
182 }
183 return false;
184}
const TrigInDetTrackTruth * truth(const TrigInDetTrack *p_trig_trk) const
const HepMcParticleLink * bestSiMatch() const
returns best match according to the number of hits
unsigned int nrMatches() const
returns number of matching particles
constexpr int INVALID_PARTICLE_ID

◆ selectTrack() [3/8]

bool TrigTrackSelector::selectTrack ( const Trk::Track * track)

a covariance!

check this <<–

now some ridiculous code to get the author of the TrackParticle (offline) tracks

Definition at line 849 of file TrigTrackSelector.cxx.

849 {
850
851 // do the track extraction stuff here....
852
853 static const int hpmap[20] = { 0, 1, 2, 7, 8, 9, 3, 4, 5, 6, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
854 // std::cout << __FILE__<< " " <<__LINE__<<std::endl;
855
856 if ( track ) {
857
858 // const Trk::Perigee* startPerigee = track->perigeeParameters();
859
860#ifdef TRKPARAMETERS_MEASUREDPERIGEE_H
861 const Trk::MeasuredPerigee* startPerigee = dynamic_cast<const Trk::MeasuredPerigee*>(track->perigeeParameters());
862 // const Trk::MeasuredPerigee* measPer = startPerigee; // just out of laziness
863#else
864 const Trk::Perigee* startPerigee = track->perigeeParameters();
865 const Trk::Perigee* measPer = startPerigee; // just out of laziness
866#endif
867
868
869 // CLHEP::HepVector perigeeParams = measPer->parameters();
870 // double pT = measPer->pT();
871 // double eta = measPer->eta();
872 // double phi = perigeeParams[Trk::phi0];
873 // double z0 = perigeeParams[Trk::z0];
874 // double d0 = perigeeParams[Trk::d0];
875 // // AAARCH!!!!! the TrackParticle pT is NOT SIGNED!!!! ( I ask you! )
876 // if ( perigeeParams[Trk::qOverP]<0 ) pT *= -1;
877 // std::cout <<pT1<<" pt1vspT "<<pT<<std::endl;
878
879 if (startPerigee){
880
881 double theta = startPerigee->parameters()[Trk::theta];
882 double p = 1/startPerigee->parameters()[Trk::qOverP];
883 double qOverPt = startPerigee->parameters()[Trk::qOverP]/std::sin(theta);
884 double charge = startPerigee->charge();
885 double eta = startPerigee->eta();
886 double phi = startPerigee->parameters()[Trk::phi0];
887 double z0 = startPerigee->parameters()[Trk::z0];
888 double d0 = startPerigee->parameters()[Trk::d0];
889 // double pT = (1./qOverPt)*(charge);
890 double pT = (1./qOverPt); // always use signed PT
891
892 if ( charge<0 && pT>0 ) pT *= -1;
893 if ( charge<0 && p>0 ) p *= -1;
894
895
896
897#ifdef TRKPARAMETERS_MEASUREDPERIGEE_H
898 const Trk::ErrorMatrix err = startPerigee->localErrorMatrix();
899 double dtheta = err.error(Trk::theta);
900 double dqovp = err.error(Trk::qOverP);
901 double covthetaOvP = err.covValue(Trk::qOverP,Trk::theta);
902
903 double dphi = err.error(Trk::phi0);
904 double dz0 = err.error(Trk::z0);
905 double dd0 = err.error(Trk::d0);
906#else
907 double dtheta = std::sqrt((*measPer->covariance())(Trk::theta,Trk::theta));
908 double dqovp = std::sqrt((*measPer->covariance())(Trk::qOverP,Trk::qOverP));
909 double covthetaOvP = (*measPer->covariance())(Trk::qOverP,Trk::theta);
910
911 double dphi = std::sqrt((*measPer->covariance())(Trk::phi0,Trk::phi0));
912 double dz0 = std::sqrt((*measPer->covariance())(Trk::z0,Trk::z0));
913 double dd0 = std::sqrt((*measPer->covariance())(Trk::d0,Trk::d0));
914#endif
915
916 double deta = 0.5*dtheta/(std::cos(0.5*theta)*std::cos(0.5*theta)*std::tan(0.5*theta));
917
918
919 if ( m_correctTrkTracks ) correctToBeamline( z0, dz0, d0, dd0, theta, phi );
920
921 double dpT = 0;
922
923
924 double sintheta = std::sin(theta);
925 double costheta = std::cos(theta);
926 double dpT2 = (p*p*sintheta)*(p*p*sintheta)*dqovp*dqovp + (p*costheta)*(p*costheta)*dtheta*dtheta - 2*(p*p*sintheta)*(p*costheta)*covthetaOvP;
927
928 if ( dpT2>0 ) dpT = std::sqrt( dpT2 );
929
930 // Check number of hits
931 // NB: a spacepoint is two offline "hits", so a pixel spacepoint is really
932 // 2 "hits" and an offline SCT "hit" is really a 1D cluster, so two intersetcting
933 // stereo clusters making a spacepoint are two "hits"
934 // const Trk::TrackSummary *summary = dynamic_cast<const Trk::TrackSummary*>(track->trackSummary());
935 //ToolHandle< Trk::ITrackSummaryTool > m_trackSumTool;
936 //m_trackSumTool = ToolHandle<Trk::ITrackSummaryTool>("Trk::TrackSummaryTool/InDetTrackSummaryTool");
937 //const Trk::TrackSummary* summary = NULL;
938 //summary = m_trackSumTool->createSummary(*track);
939
940 const Trk::TrackSummary * summary = track->trackSummary();
941 int nBlayerHits = 0;
942 int nPixelHits = 0;
943 int nSctHits = 0;
944 int nStrawHits = 0;
945 int nTrHits = 0;
946 int nSiHits = 0;
947 bool expectBL = false; // Not stored for Trk::Track
948 unsigned bitmap = 0;
949
950 if(summary==0){
951 std::cerr << "Could not create TrackSummary - Track will likely fail hits requirements" << std::endl;
952 }
953 else{
954 nBlayerHits = 2*summary->get(Trk::numberOfBLayerHits);
956 nSctHits = summary->get(Trk::numberOfSCTHits);
957 nStrawHits = summary->get(Trk::numberOfTRTHits);
959 nSiHits = nPixelHits + nSctHits;
960
961 for ( int ih=0 ; ih<20 ; ih++ ) {
962 if ( summary->isHit(Trk::DetectorType(ih)) ) bitmap |= ( 1<<hpmap[ih] );
963 }
964 }
965
966 unsigned long id = (unsigned long)track;
967 double chi2 = 0;
968 double dof = 0;
969 //const Trk::FitQuality *quality = dynamic_cast<const Trk::FitQuality*>(track->fitQuality());
970 const Trk::FitQuality *quality = (track->fitQuality());
971 if(quality==0) std::cerr << "Could not create FitQuality - Track will likely fail hits requirements" << std::endl;
972 else{
973 chi2 = quality->chiSquared();
974 dof = quality->numberDoF();
975 }
976
977 int trackAuthor = -1;
978
981
982 // std::cout << "fetching author info :" << track->info().trackFitter() << ":"
983 // << track->info().dumpInfo() << ": bm 0x" << std::hex << bitmap << std::dec << std::endl;
984
985 int fitter = track->info().trackFitter();
986 // std::string dumpinfo = track->info().dumpInfo();
987
988 if ( fitter>0 && fitter<Trk::TrackInfo::NumberOfTrackFitters ) {
989 if ((track->info().dumpInfo()).find("TRTStandalone") != std::string::npos) trackAuthor = 2;
990 else if ((track->info().dumpInfo()).find("TRTSeededTrackFinder") != std::string::npos) trackAuthor = 1;
991 else trackAuthor = 0;
992 }
993
994 #if 0
995 std::cout << "\t\t\tSUTT TP track"
996 << "\teta=" << eta // << " +- " << (*trackitr)->params()->deta()
997 << "\tphi=" << phi // << " +- " << (*trackitr)->params()->dphi()
998 << "\tz0=" << z0
999 << "\tpT=" << pT // << "\t( " << 1/qoverp << ")"
1000 << "\td0=" << d0
1001 << "\tNsi=" << nSiHits
1002 << "\tNtrt=" << nTrHits
1003 << "\tNstr=" << nStrawHits
1004 << "\tauthor=" << trackAuthor
1005 << std::endl;
1006 #endif
1007 // Create and save Track
1008 TIDA::Track* t = new TIDA::Track(eta, phi, z0, d0, pT, chi2, dof,
1009 deta, dphi, dz0, dd0, dpT,
1010 nBlayerHits, nPixelHits, nSctHits, nSiHits,
1011 nStrawHits, nTrHits, bitmap, 0,
1012 trackAuthor, false, -1, -1,
1013 expectBL, id) ;
1014
1015 if ( !addTrack( t ) ){
1016 delete t;
1017 return false;
1018 }
1019 return true;
1020
1021 //std::cout << "SUTT TP track " << *t << "\t0x" << std::hex << bitmap << std::dec << std::endl;
1022 }
1023 }
1024
1025 return false;
1026}
double charge(const T &p)
Definition AtlasPID.h:997
double charge() const
Returns the charge.

◆ selectTrack() [4/8]

bool TrigTrackSelector::selectTrack ( const TruthParticle & track)

Definition at line 522 of file TrigTrackSelector.cxx.

522 {
523
524 return selectTrack( &track );
525
526}
bool selectTrack(const TrigInDetTrack *track, const TrigInDetTrackTruthMap *truthMap=0)
neater code to make use of vector function also for a single ancestor pdgid, instead of the full code...

◆ selectTrack() [5/8]

bool TrigTrackSelector::selectTrack ( const TruthParticle * track)

Definition at line 530 of file TrigTrackSelector.cxx.

530 {
531 TIDA::Track* t = makeTrack( track, m_id );
532 if ( t == 0 ) return false;
533 if ( !addTrack(t) ) {
534 delete t;
535 return false;
536 }
537 return true;
538}

◆ selectTrack() [6/8]

bool TrigTrackSelector::selectTrack ( const xAOD::TrackParticle * track,
void * = 0 )

legacy run 2 selector access

lazy just to avoid a find-replace of measPer to track

Grrrrr remove interaction mean z position!!!

protect against spurious qOverP = 0 BUT !!! this should NEVER happen !!! so shouldn't really have this failing silently, but not allowed to put in std::cerr output leave the original code in as this is mostly for a test

a covariance not an error

don't correct xaod tracks to the beamline

??? <<– check this

holes

cheat !! pack the holes into the hits so that eg int pixelholes() { return npix/1000; } int pixelhits() { return npix%1000; }

get the total number of holes as well

fit quality

Definition at line 1045 of file TrigTrackSelector.cxx.

1045 {
1046 // do the track extraction stuff here....
1047
1048 // static int hpmap[20] = { 0, 1, 2, 7, 8, 9, 3, 4, 5, 6, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
1049
1050 if ( track ) {
1051
1053 const xAOD::TrackParticle* measPer = track;
1054
1055 // CLHEP::HepVector perigeeParams = measPer->parameters();
1056
1057 double pT = measPer->pt();
1058 double eta = measPer->eta();
1059 double phi = measPer->phi0();
1060 double z0 = measPer->z0() + measPer->vz();
1061 double d0 = measPer->d0();
1062
1063 double theta = measPer->theta();
1064
1069 // if ( measPer->qOverP()==0 ) return false;
1070 if ( measPer->qOverP()==0 ) throw std::runtime_error( "probable corrupted track - this should never happen" );
1071 double p = 1/measPer->qOverP();
1072
1073 // AAARCH!!!!! the TrackParticle pT is NOT SIGNED!!!! ( I ask you! )
1074 if ( measPer->qOverP()<0 && pT>0 ) pT *= -1;
1075
1076 double dtheta = std::sqrt(measPer->definingParametersCovMatrix()(Trk::theta,Trk::theta));
1077 double dqovp = std::sqrt(measPer->definingParametersCovMatrix()(Trk::qOverP,Trk::qOverP));
1078 double covthetaOvP = measPer->definingParametersCovMatrix()(Trk::qOverP,Trk::theta);
1079
1080 double deta = 0.5*dtheta/(std::cos(0.5*theta)*std::cos(0.5*theta)*std::tan(0.5*theta)); // ???? CHECK THIS <<--
1081
1082 double dphi = std::sqrt(measPer->definingParametersCovMatrix()(Trk::phi0,Trk::phi0));
1083 double dz0 = std::sqrt(measPer->definingParametersCovMatrix()(Trk::z0,Trk::z0));
1084 double dd0 = std::sqrt(measPer->definingParametersCovMatrix()(Trk::d0,Trk::d0));
1085
1086 double dpT = 0;
1087
1088
1090 // if ( m_xBeam!=0 || m_yBeam!=0 ) correctToBeamline( z0, dz0, d0, dd0, theta, phi );
1091
1092
1093 double sintheta = std::sin(theta);
1094 double costheta = std::cos(theta);
1095 double dpt2 = (p*p*sintheta)*(p*p*sintheta)*dqovp*dqovp + (p*costheta)*(p*costheta)*dtheta*dtheta - 2*(p*p*sintheta)*(p*costheta)*covthetaOvP;
1096
1097 if ( dpt2>0 ) dpT = std::sqrt( dpt2 );
1098
1099 // Check number of hits
1100 // NB: a spacepoint is two offline "hits", so a pixel spacepoint is really
1101 // 2 "hits" and an offline SCT "hit" is really a 1D cluster, so two intersetcting
1102 // stereo clusters making a spacepoint are two "hits"
1103
1104 uint8_t sum_nBlayerHits = 0;
1105 track->summaryValue( sum_nBlayerHits, xAOD::numberOfInnermostPixelLayerHits);
1106 int nBlayerHits = 2*sum_nBlayerHits;
1107
1108 uint8_t sum_nPixelHits = 0;
1109 track->summaryValue( sum_nPixelHits, xAOD::numberOfPixelHits);
1110 int nPixelHits = 2*sum_nPixelHits;
1111
1112 uint8_t sum_nSctHits = 0;
1113 track->summaryValue( sum_nSctHits, xAOD::numberOfSCTHits);
1114 int nSctHits = sum_nSctHits;
1115
1116 uint8_t sum_nStrawHits = 0;
1117 track->summaryValue( sum_nStrawHits, xAOD::numberOfTRTHits);
1118 int nStrawHits = sum_nStrawHits;
1119
1120 uint8_t sum_nTrtHits = 0;
1121 track->summaryValue( sum_nTrtHits, xAOD::numberOfTRTHighThresholdHits);
1122 int nTrtHits = sum_nTrtHits;
1123
1124
1125 uint8_t sum_expectBL = 0;
1126 track->summaryValue( sum_expectBL, xAOD::expectInnermostPixelLayerHit);
1127 bool expectBL = ( sum_expectBL ? true : false );
1128
1130
1131 uint8_t sum_sctholes = 0;
1132 track->summaryValue( sum_sctholes, xAOD::numberOfSCTHoles);
1133
1134 uint8_t sum_pixholes = 0;
1135 track->summaryValue( sum_pixholes, xAOD::numberOfPixelHoles);
1136
1140
1141 nSctHits += 1000*sum_sctholes;
1142 nPixelHits += 1000*sum_pixholes;
1143
1145 int nSiHits = nPixelHits + nSctHits;
1146
1148
1149 double chi2 = track->chiSquared();
1150 double dof = track->numberDoF();
1151
1152 unsigned long id = (unsigned long)track;
1153
1154 unsigned bitmap = track->hitPattern();
1155
1156
1157
1158 double xbeam = track->vx();
1159 double ybeam = track->vy();
1160 double zbeam = track->vz();
1161
1162 if ( xbeam!=getBeamX() || ybeam!=getBeamY() || zbeam!=getBeamZ() ) setBeamline( xbeam, ybeam, zbeam );
1163
1164 int trackAuthor = 0;
1165
1166 int fitter = track->trackFitter();
1167 std::bitset<xAOD::NumberOfTrackRecoInfo> patternrec = track->patternRecoInfo();
1168
1169 //int icount = 0;<- never used if section below is commented
1170 for ( unsigned ipr=patternrec.size() ; ipr-- ; ) {
1171 if ( patternrec[ipr] ) {
1172 //icount++; <- never used if section below is commented
1173 trackAuthor |= (ipr >> 16);
1174 // static bool first = true;
1175 // if ( first && icount>1 ) {
1176 // std::cerr << "more than one pattern rec strategy " << ipr << "\t(suppressing further output)" << std::endl;
1177 // first = false;
1178 // }
1179 }
1180 }
1181
1182 trackAuthor |= fitter;
1183
1184 // if ( fitter>0 && fitter<Trk::TrackInfo::NumberOfTrackFitters ) {
1185 // if ( dumpinfo.find("TRTStandalone")!=std::string::npos) trackAuthor = 2;
1186 // else if ( dumpinfo.find("TRTSeededTrackFinder")!=std::string::npos) trackAuthor = 1;
1187 // else trackAuthor = 0;
1188 // }
1189
1190#if 0
1191 std::cout << "\t\t\tSUTT TP track"
1192 << "\teta=" << eta // << " +- " << (*trackitr)->params()->deta()
1193 << "\tphi=" << phi // << " +- " << (*trackitr)->params()->dphi()
1194 << "\tz0=" << z0
1195 << "\tpT=" << pT // << "\t( " << 1/qoverp << ")"
1196 << "\td0=" << d0
1197 << "\tNsi=" << nSiHits
1198 // << "\tNtrt=" << nTrtHits
1199 // << "\tNstr=" << nStrawHits
1200 << "\tfitter=" << fitter
1201 << "\tauthor=" << trackAuthor
1202 << "\tVTX x " << track->vx() << "\ty " << track->vy() << "\tz " << track->vz()
1203 << std::endl;
1204#endif
1205
1206 // Create and save Track
1207
1208 TIDA::Track* t = new TIDA::Track( eta, phi, z0, d0, pT, chi2, dof,
1209 deta, dphi, dz0, dd0, dpT,
1210 nBlayerHits, nPixelHits, nSctHits, nSiHits,
1211 nStrawHits, nTrtHits, bitmap, 0,
1212 trackAuthor, false, -1, -1,
1213 expectBL, id) ;
1214
1215 // std::cout << "SUTT TP track " << *t << "\t0x" << std::hex << bitmap << std::dec << std::endl;
1216
1217 if ( !addTrack( t ) ){
1218 delete t;
1219 return false;
1220 }
1221 return true;
1222
1223 }
1224 return false;
1225
1226
1227}
void setBeamline(double x, double y, double z=0)
double getBeamY() const
double getBeamX() const
double getBeamZ() const
float z0() const
Returns the parameter.
float theta() const
Returns the parameter, which has range 0 to .
const ParametersCovMatrix_t definingParametersCovMatrix() const
Returns the 5x5 symmetric matrix containing the defining parameters covariance matrix.
float vz() const
The z origin for the parameters.
float d0() const
Returns the parameter.
float qOverP() const
Returns the parameter.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
float phi0() const
Returns the parameter, which has range to .
TrackParticle_v1 TrackParticle
Reference the current persistent version:
@ expectInnermostPixelLayerHit
Do we expect a 0th-layer barrel hit for this track?
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
@ numberOfTRTHits
number of TRT hits [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfTRTHighThresholdHits
number of TRT hits which pass the high threshold (only xenon counted) [unit8_t].
@ numberOfSCTHoles
number of SCT holes [unit8_t].

◆ selectTrack() [7/8]

bool TrigTrackSelector::selectTrack ( const xAOD::TruthParticle * track,
double x0 = 0,
double y0 = 0 )

lazy just to avoid a find-replace of measPer to track

avoid default (unset) TruthParticle charge

only use charged tracks

need to calculate the origin, and the beamline, and the d0 and z0 with respect to the beamline leave this in until we have checked whether everything is implemented correctly

need to calculate d0 and z0 correctly.

these are the d0 and z at the point of closest approach to x0, y0, the event "beamline", which is the best that we can do for the moment

the is our new "final state" requirement the inner and outer radii are in some sense arbitrary - these correspond to an envelope around the pixel detector, so the track must pass through the entire pixel detector NB: In order to ensure you don't miss any tracks they really need to be the same ie if a track brems in your "volume" then you will miss that track, and also the resulting track, even if it is a high et track

was hardcoded as 47 - now is set from the constructor

get the total number of holes as well

useful debug info - leave in

Definition at line 544 of file TrigTrackSelector.cxx.

544 {
545 if ( track ) {
546
547 if (!MC::isStable(track) ) return false;
548
550 const xAOD::TruthParticle* measPer = track;
551
552 double pT = measPer->pt();
553 double eta = measPer->eta();
554 double phi = measPer->phi();
555
556 // AAARCH!!!!! the TrackParticle pT is NOT SIGNED!!!! ( I ask you! )
557 if ( measPer->charge()<0 && pT>0 ) pT *= -1;
558 double q = track->charge();
559
560 static const particleType ptype;
561
563 if ( q==-999 ) q = ptype.charge( track->pdgId() );
564
566 if ( q==0 ) return 0;
567
571 // double xbeam = getBeamX(); // track->vx();
572 // double ybeam = getBeamY(); // track->vy();
573 // double zbeam = getBeamZ(); // track->vz();
574
575 if ( !track->hasProdVtx() ) return false;
576
578
579 double xp[3] = { measPer->prodVtx()->x(), measPer->prodVtx()->y(), measPer->prodVtx()->z() };
580 double xb[3] = { xp[0]-x0, xp[1]-y0, measPer->prodVtx()->z() };
581 double xd[3] = { 0, 0, 0 };
582
583 if ( track->hasDecayVtx() ) {
584 xd[0] = track->decayVtx()->x();
585 xd[1] = track->decayVtx()->y();
586 xd[2] = track->decayVtx()->z();
587 }
588
589 double rp = std::sqrt( xp[0]*xp[0] + xp[1]*xp[1] );
590 double rd = std::sqrt( xd[0]*xd[0] + xd[1]*xd[1] );
591
594 double theta = 2*std::atan( std::exp( -eta ) );
595 double z0 = xb[2] - (xb[0]*std::cos(phi) + xb[1]*std::sin(phi))/std::tan(theta);
596 double d0 = xb[1]*std::cos(phi) - xb[0]*std::sin(phi);
597
598 bool final_state = false;
599
611 const double inner_radius = m_radius;
612 const double outer_radius = m_radius;
613
614 if ( ( track->hasProdVtx() && rp<=inner_radius ) &&
615 ( !track->hasDecayVtx() || rd>outer_radius ) ) final_state = true;
616
617 if ( !final_state ) return false;
618
619 double deta = 0;
620 double dphi = 0;
621 double dz0 = 0;
622 double dd0 = 0;
623
624 double dpT = 0;
625
626 int nBlayerHits = 0;
627 int nPixelHits = 0;
628 int nSctHits = 0;
629 int nStrawHits = 0;
630 int nTrtHits = 0;
631
632 double chi2 = 0;
633 double dof = 0;
634
635 bool expectBL = false;
636
637 nSctHits += 0;
638 nPixelHits += 0;
639
641 int nSiHits = 0;
642
643 unsigned long id = (unsigned long)track;
644
645 unsigned bitmap = 0;
646
647 int trackAuthor = track->pdgId();
648 int uniqueID = HepMC::uniqueID(track);
649
650#if 0
651 std::cout << "\t\t\tSUTT TP track"
652 << "\teta=" << eta
653 << "\tphi=" << phi
654 << "\tz0=" << z0
655 << "\tpT=" << pT
656 << "\td0=" << d0
657 << "\tauthor=" << trackAuthor
658 << "\tVTX x " << xp[0]<< "\ty " << xp[1] << "\tz " << xp[2]
659 << std::endl;
660#endif
661
662 // Create and save Track
663
664 TIDA::Track* t = new TIDA::Track( eta, phi, z0, d0, pT, chi2, dof,
665 deta, dphi, dz0, dd0, dpT,
666 nBlayerHits, nPixelHits, nSctHits, nSiHits,
667 nStrawHits, nTrtHits, bitmap, 0,
668 trackAuthor, false, uniqueID, -1,
669 expectBL, id) ;
670
672 // std::cout << "SUTT TP track " << *t << "\t0x" << std::hex << bitmap << std::dec << std::endl;
673
674 // addTrack applies additional cuts using the Filter
675 if ( !addTrack( t ) ){
676 delete t;
677 return false;
678 }
679 }
680 return false;
681
682}
virtual double pt() const override final
The transverse momentum ( ) of the particle.
const TruthVertex_v1 * prodVtx() const
The production vertex of this particle.
double charge() const
Physical charge.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
virtual double phi() const override final
The azimuthal angle ( ) of the particle.
float z() const
Vertex longitudinal distance along the beam line form the origin.
float y() const
Vertex y displacement.
float x() const
Vertex x displacement.

◆ selectTrack() [8/8]

bool TrigTrackSelector::selectTrack ( HepMC::ConstGenParticlePtr track)

not a "final state" particle

set this so can use it as the identifier - don't forget to reset!!

Definition at line 500 of file TrigTrackSelector.cxx.

500 {
501
503 if ( !MC::isStable(track) ) return false;
504
506//AV Using memory to get some value is not a good idea. This is not a repruducible/portable way, but I leave it as is.
507#ifdef HEPMC3
508 m_id = (unsigned long)(track.get());
509#else
510 m_id = (unsigned long)track;
511#endif
512 bool sel;
513 sel = selectTrack( TruthParticle(track) );
514 m_id = 0;
515
516 return sel;
517
518}

◆ selectTracks() [1/8]

void TrigTrackSelector::selectTracks ( const Rec::TrackParticleContainer * trigtracks)

Definition at line 340 of file TrigTrackSelector.cxx.

340 {
341
342 // std::cout << "\t\t\tSUTT \tTrackParticleContainer->size() = " << trigtracks->size() << std::endl;
343
344 Rec::TrackParticleContainer::const_iterator trackitr = trigtracks->begin();
345 Rec::TrackParticleContainer::const_iterator trackend = trigtracks->end();
346
347 while ( trackitr!=trackend ) {
348
349 selectTrack( *trackitr );
350
351 ++trackitr;
352
353 } // loop over tracks
354
355}
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.

◆ selectTracks() [2/8]

void TrigTrackSelector::selectTracks ( const TrackCollection * trigtracks)

Definition at line 1029 of file TrigTrackSelector.cxx.

1029 {
1030
1031 // std::cout << "\t\t\tSUTT \tTrackContainer->size() = " << trigtracks->size() << std::endl;
1032
1033 TrackCollection::const_iterator trackitr = trigtracks->begin();
1034 TrackCollection::const_iterator trackend = trigtracks->end();
1035
1036 while ( trackitr!=trackend ) {
1037 selectTrack( *trackitr );
1038 ++trackitr;
1039 } // loop over tracks
1040
1041}

◆ selectTracks() [3/8]

void TrigTrackSelector::selectTracks ( const TrackParticleLinks_t & tracks)

Definition at line 1254 of file TrigTrackSelector.cxx.

1254 {
1255 for( const auto& track : tracks ) selectTrack( *track );
1256}

◆ selectTracks() [4/8]

void TrigTrackSelector::selectTracks ( const TrigInDetTrackCollection * trigtracks,
const TrigInDetTrackTruthMap * truthMap = 0 )

Definition at line 188 of file TrigTrackSelector.cxx.

188 {
189 // do the track extraction stuff here....
190 TrigInDetTrackCollection::const_iterator trackitr = trigtracks->begin();
191 TrigInDetTrackCollection::const_iterator trackend = trigtracks->end();
192 while ( trackitr!=trackend ) {
193 selectTrack( *trackitr, truthMap );
194 ++trackitr;
195 }
196}

◆ selectTracks() [5/8]

void TrigTrackSelector::selectTracks ( const TruthParticleContainer * truthtracks)

Definition at line 360 of file TrigTrackSelector.cxx.

360 {
361 // std::cout << "\t\t\tSUTT \tTrackParticleContainer->size() = " << trigtracks->size() << std::endl;
362
363 TruthParticleContainer::const_iterator trackitr = truthtracks->begin();
364 TruthParticleContainer::const_iterator trackend = truthtracks->end();
365
366 while ( trackitr!=trackend ) {
367
368 selectTrack( *trackitr );
369
370 ++trackitr;
371
372 } // loop over tracks
373
374}

◆ selectTracks() [6/8]

void TrigTrackSelector::selectTracks ( const xAOD::TrackParticleContainer * tracks,
void * = 0 )

Definition at line 1230 of file TrigTrackSelector.cxx.

1230 {
1231 // std::cout << "\t\t\tSUTT \tTrackContainer->size() = " << trigtracks->size() << std::endl;
1234 while ( trackitr!=trackend ) {
1235 selectTrack( *trackitr );
1236 ++trackitr;
1237 } // loop over tracks
1238}

◆ selectTracks() [7/8]

void TrigTrackSelector::selectTracks ( const xAOD::TruthParticleContainer * truthtracks)

get truth beamline

fix default (unset) TruthParticle charge

not just yet - save for later ... else ( gotPdgId && m_selectParentPdgIds.size()!=0 ) gotParentPdgId = fromAncestor(m_selectParentPdgIds, (*trackitr))!=nullptr;

Definition at line 455 of file TrigTrackSelector.cxx.

455 {
456
457 xAOD::TruthParticleContainer::const_iterator trackitr = truthtracks->begin();
458 xAOD::TruthParticleContainer::const_iterator trackend = truthtracks->end();
459
461 double x0 = 0;
462 double y0 = 0;
463
464 truthBeamline( truthtracks, x0, y0 );
465
466
467 for ( ; trackitr!=trackend; ++trackitr) {
468
469
470 // Only select charged final state particles
471 double q = (*trackitr)->charge();
472
474 static const particleType ptype;
475 if ( q==-999 ) q = ptype.charge( (*trackitr)->pdgId() );
476
477 if (q == 0 || !MC::isStable(*trackitr) ) continue;
478
479 // If looking for tau parents, don't select mu or e children
480
481 // select based on the pdg of final state particle
482 bool gotPdgId = true;
483 if (m_selectPdgId!=0) gotPdgId = (*trackitr)->absPdgId()==m_selectPdgId;
484
485 // select based on the pdg of the parent or ancestor
486 bool gotParentPdgId = true;
487 if ( gotPdgId && m_selectParentPdgId!=0 ) gotParentPdgId = fromAncestor(m_selectParentPdgId, (*trackitr))!=nullptr;
490
491 if ( gotParentPdgId && gotPdgId ) selectTrack( *trackitr, x0, y0);
492
493 } // loop over tracks
494
495}
void truthBeamline(const xAOD::TruthParticleContainer *truthtracks, double &x0, double &y0)
extract all the tracks from a xAOD::TruthParticle collection and histogram the x and y production coo...

◆ selectTracks() [8/8]

void TrigTrackSelector::selectTracks ( xAOD::TrackParticleContainer::const_iterator trackitr,
xAOD::TrackParticleContainer::const_iterator trackend,
void * = 0 )

MT selector access.

will need this printout during debugging, so leave commented until all the feature access has been properly debugged

Definition at line 1242 of file TrigTrackSelector.cxx.

1243 {
1246 // std::cout << "\t\t\tSUTT \tTrackContainer->size() = " << trigtracks->size() << std::endl;
1247 while ( trackitr!=trackend ) {
1248 selectTrack( *trackitr );
1249 ++trackitr;
1250 } // loop over tracks
1251}

◆ setBeamline()

void TrigTrackSelector::setBeamline ( double x,
double y,
double z = 0 )
inline

Definition at line 94 of file TrigTrackSelector.h.

94{ m_xBeam = x; m_yBeam = y; m_zBeam=z; }
#define y
#define x
#define z

◆ size()

unsigned TrackSelector::size ( ) const
inlineinherited

◆ tracks() [1/2]

const std::vector< TIDA::Track * > & TrackSelector::tracks ( ) const
inlineinherited

◆ tracks() [2/2]

std::vector< TIDA::Track * > TrackSelector::tracks ( TrackFilter * selector) const
inlineinherited

Definition at line 55 of file Trigger/TrigAnalysis/TrigInDetAnalysis/TrigInDetAnalysis/TrackSelector.h.

55 {
56 if ( selector==0 ) return m_tracks;
57 std::vector<TIDA::Track*> t;
58 for ( int i=m_tracks.size() ; i-- ; ) if ( selector->select(m_tracks[i]) ) t.push_back(m_tracks[i]);
59 return t;
60 }

◆ truthBeamline()

void TrigTrackSelector::truthBeamline ( const xAOD::TruthParticleContainer * truthtracks,
double & x0,
double & y0 )

extract all the tracks from a xAOD::TruthParticle collection and histogram the x and y production coordinates to determine the event "beamline" position

histograms and book keeoing

positions

numbers of tracks

fill histograms ...

get track production vertex

add to the correct bins

calculate the most populous bin in x and y

require more than 1 particle for it to be classed a "vertex" therefore, for single particle Monte Carlo, this will not be updated and (0,0) will still be correctly used

Definition at line 381 of file TrigTrackSelector.cxx.

381 {
382
383 x0 = 0;
384 y0 = 0;
385
387
388 int Nx = 300;
389 int Ny = 300;
390
392 std::vector<double> xpos(Nx,0);
393 std::vector<double> ypos(Ny,0);
394
396 std::vector<int> xn(Nx,0);
397 std::vector<int> yn(Ny,0);
398
399 int xoffset = Nx/2;;
400 int yoffset = Ny/2;
401
402 double deltax = 3.0/Nx;
403 double deltay = 3.0/Ny;
404
406
407 xAOD::TruthParticleContainer::const_iterator trackitr = truthtracks->begin();
408 xAOD::TruthParticleContainer::const_iterator trackend = truthtracks->end();
409
410 for ( ; trackitr!=trackend ; ++trackitr ) {
411
412 const xAOD::TruthParticle* track = (*trackitr);
413
414 if ( !MC::isStable(track) || !track->hasProdVtx() ) continue;
415
417
418 double xp[3] = { track->prodVtx()->x(), track->prodVtx()->y(), track->prodVtx()->z() };
419
421
422 int ix = xp[0]/deltax + xoffset;
423 int iy = xp[1]/deltay + yoffset;
424
425 if ( ix<0 || ix>=Nx || iy<0 || iy>=Nx ) continue;
426
427 xpos[ix] += xp[0];
428 ypos[iy] += xp[1];
429
430 xn[ix]++;
431 yn[iy]++;
432
433 } // loop over tracks
434
436
437 int imx = 0;
438 int imy = 0;
439
440 for ( size_t i=0 ; i<xpos.size() ; i++ ) {
441 if ( xn[i]>xn[imx] ) imx = i;
442 if ( yn[i]>yn[imy] ) imy = i;
443 }
444
448 if ( xn[imx]>1 ) x0 = xpos[imx]/xn[imx];
449 if ( yn[imy]>1 ) y0 = ypos[imy]/yn[imy];
450
451}

Member Data Documentation

◆ m_correctTrkTracks

bool TrigTrackSelector::m_correctTrkTracks
private

Definition at line 198 of file TrigTrackSelector.h.

◆ m_id

unsigned long TrigTrackSelector::m_id
private

Definition at line 192 of file TrigTrackSelector.h.

◆ m_radius

double TrigTrackSelector::m_radius
private

Definition at line 200 of file TrigTrackSelector.h.

◆ m_selector

TrackFilter* TrackSelector::m_selector
protectedinherited

◆ m_selectParentPdgId

int TrigTrackSelector::m_selectParentPdgId
private

Definition at line 203 of file TrigTrackSelector.h.

◆ m_selectPdgId

int TrigTrackSelector::m_selectPdgId
private

Definition at line 202 of file TrigTrackSelector.h.

◆ m_tracks

std::vector<TIDA::Track*> TrackSelector::m_tracks
protectedinherited

◆ m_xBeam

double TrigTrackSelector::m_xBeam
private

Definition at line 194 of file TrigTrackSelector.h.

◆ m_yBeam

double TrigTrackSelector::m_yBeam
private

Definition at line 195 of file TrigTrackSelector.h.

◆ m_zBeam

double TrigTrackSelector::m_zBeam
private

Definition at line 196 of file TrigTrackSelector.h.

◆ s_default_radius

const double TrigTrackSelector::s_default_radius = 47
staticprivate

NB: This was 47 for Run 2, but with the addition of the IBL it should be 32 It was kept at 47 for all Run 2 and migration to MT, but for Run 3 we really want it changed to be 32.

Definition at line 205 of file TrigTrackSelector.h.


The documentation for this class was generated from the following files: