ATLAS Offline Software
Public Member Functions | Static Public Member Functions | Protected Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
AthTruthSelectionTool Class Reference

class to apply selection to xAOD::TruthParticles,required by validation More...

#include <AthTruthSelectionTool.h>

Inheritance diagram for AthTruthSelectionTool:
Collaboration diagram for AthTruthSelectionTool:

Public Member Functions

 AthTruthSelectionTool (const std::string &type, const std::string &name, const IInterface *parent)
 
virtual ~AthTruthSelectionTool ()
 
StatusCode initialize () final
 
StatusCode finalize () final
 
virtual IAthSelectionTool::CutResult accept (const xAOD::IParticle *particle) const final
 The most important method to determine whether the particle is accepted. More...
 
virtual IAthSelectionTool::CutResult testAllCuts (const xAOD::IParticle *p, std::vector< unsigned int > &counter) const final
 The most important method to determine whether the particle is accepted. More...
 
unsigned int nCuts () const final
 return the number of cuts. More...
 
std::vector< std::string > names () const final
 return the names of the cuts as a vector<string> More...
 
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc. More...
 
const ServiceHandle< StoreGateSvc > & evtStore () const
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc. More...
 
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc. More...
 
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm. More...
 
virtual StatusCode sysStart () override
 Handle START transition. More...
 
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles. More...
 
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles. More...
 
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T > &t)
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, SG::VarHandleKey &hndl, const std::string &doc, const SG::VarHandleKeyType &)
 Declare a new Gaudi property. More...
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, SG::VarHandleBase &hndl, const std::string &doc, const SG::VarHandleType &)
 Declare a new Gaudi property. More...
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, SG::VarHandleKeyArray &hndArr, const std::string &doc, const SG::VarHandleKeyArrayType &)
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, T &property, const std::string &doc, const SG::NotHandleType &)
 Declare a new Gaudi property. More...
 
Gaudi::Details::PropertyBase * declareProperty (const std::string &name, T &property, const std::string &doc="none")
 Declare a new Gaudi property. More...
 
void updateVHKA (Gaudi::Details::PropertyBase &)
 
MsgStream & msg () const
 
MsgStream & msg (const MSG::Level lvl) const
 
bool msgLvl (const MSG::Level lvl) const
 

Static Public Member Functions

static const InterfaceID & interfaceID ()
 interfaceID reimplemented from base More...
 

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution More...
 
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
 
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed. More...
 

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t
 

Private Member Functions

Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey> More...
 
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleKeyArrayType &)
 specialization for handling Gaudi::Property<SG::VarHandleKeyArray> More...
 
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &hndl, const SG::VarHandleType &)
 specialization for handling Gaudi::Property<SG::VarHandleBase> More...
 
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T > &t, const SG::NotHandleType &)
 specialization for handling everything that's not a Gaudi::Property<SG::VarHandleKey> or a <SG::VarHandleKeyArray> More...
 

Private Attributes

CutList< xAOD::TruthParticlem_cutList
 
FloatProperty m_maxEta {this, "maxEta", 2.5}
 
FloatProperty m_maxPt {this, "maxPt", -1.}
 
FloatProperty m_minPt {this, "minPt", 400.}
 
BooleanProperty m_requireOnlyPrimary {this, "requireOnlyPrimary", true}
 
BooleanProperty m_requireCharged {this, "requireCharged", true}
 
IntegerProperty m_selectedCharge {this, "selectedCharge", 0}
 
BooleanProperty m_requireStable {this, "requireStable", true}
 
IntegerProperty m_requireSiHit {this, "requireSiHit", 0}
 
FloatProperty m_maxProdVertRadius {this, "maxProdVertRadius", 110.}
 
IntegerProperty m_pdgId {this, "pdgId", -1}
 
BooleanProperty m_grandparent {this, "hasNoGrandparent", false}
 
BooleanProperty m_poselectronfromgamma {this, "poselectronfromgamma", false}
 
std::vector< unsigned int > m_counters {}
 
IntegerArrayProperty m_ancestors {this, "ancestorList", {}}
 
FloatProperty m_radiusCylinder
 
FloatProperty m_minZCylinder
 
FloatProperty m_maxZCylinder
 
FloatProperty m_zDisc
 
FloatProperty m_minRadiusDisc
 
FloatProperty m_maxRadiusDisc
 
std::unique_ptr< Trk::CylinderSurfacem_cylinder
 
std::unique_ptr< Trk::DiscSurfacem_disc1
 
std::unique_ptr< Trk::DiscSurfacem_disc2
 
PublicToolHandle< Trk::IExtrapolatorm_extrapolator {this,"Extrapolator","Trk::Extrapolator/AtlasExtrapolator",""}
 Too handle for truth-track extrapolation. More...
 
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default) More...
 
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default) More...
 
std::vector< SG::VarHandleKeyArray * > m_vhka
 
bool m_varHandleArraysDeclared
 

Detailed Description

class to apply selection to xAOD::TruthParticles,required by validation

Definition at line 28 of file AthTruthSelectionTool.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ AthTruthSelectionTool()

AthTruthSelectionTool::AthTruthSelectionTool ( const std::string &  type,
const std::string &  name,
const IInterface *  parent 
)

Definition at line 44 of file AthTruthSelectionTool.cxx.

45  :
47 {
48  // declare interface from base class
49  declareInterface<IAthSelectionTool>(this);
50 }

◆ ~AthTruthSelectionTool()

virtual AthTruthSelectionTool::~AthTruthSelectionTool ( )
inlinevirtual

Definition at line 31 of file AthTruthSelectionTool.h.

31  {
32  /*nop*/
33  };

Member Function Documentation

◆ accept()

IAthSelectionTool::CutResult AthTruthSelectionTool::accept ( const xAOD::IParticle p) const
finalvirtual

The most important method to determine whether the particle is accepted.

Parameters
pPointer to particle baseclass, will be cast to truth or track
Returns
the number of cuts which are not passed or tested

Implements IAthSelectionTool.

Definition at line 251 of file AthTruthSelectionTool.cxx.

251  {
252  const xAOD::TruthParticle* pTruth = dynamic_cast<const xAOD::TruthParticle*>(particle);
253 
254  //@TODO
255  if (not pTruth) {
256  return m_cutList.size()+1; // marker for invalid particles
257  }
258  return m_cutList.accept(*pTruth);
259 }

◆ declareGaudiProperty() [1/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  hndl,
const SG::VarHandleKeyArrayType  
)
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKeyArray>

Definition at line 170 of file AthCommonDataStore.h.

172  {
173  return *AthCommonDataStore<PBASE>::declareProperty(hndl.name(),
174  hndl.value(),
175  hndl.documentation());
176 
177  }

◆ declareGaudiProperty() [2/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  hndl,
const SG::VarHandleKeyType  
)
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158  {
159  return *AthCommonDataStore<PBASE>::declareProperty(hndl.name(),
160  hndl.value(),
161  hndl.documentation());
162 
163  }

◆ declareGaudiProperty() [3/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  hndl,
const SG::VarHandleType  
)
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleBase>

Definition at line 184 of file AthCommonDataStore.h.

186  {
187  return *AthCommonDataStore<PBASE>::declareProperty(hndl.name(),
188  hndl.value(),
189  hndl.documentation());
190  }

◆ declareGaudiProperty() [4/4]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T > &  t,
const SG::NotHandleType  
)
inlineprivateinherited

specialization for handling everything that's not a Gaudi::Property<SG::VarHandleKey> or a <SG::VarHandleKeyArray>

Definition at line 199 of file AthCommonDataStore.h.

200  {
201  return PBASE::declareProperty(t);
202  }

◆ declareProperty() [1/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
SG::VarHandleBase hndl,
const std::string &  doc,
const SG::VarHandleType  
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
hndlObject holding the property value.
docDocumentation string for the property.

This is the version for types that derive from SG::VarHandleBase. The property value object is put on the input and output lists as appropriate; then we forward to the base class.

Definition at line 245 of file AthCommonDataStore.h.

249  {
250  this->declare(hndl.vhKey());
251  hndl.vhKey().setOwner(this);
252 
253  return PBASE::declareProperty(name,hndl,doc);
254  }

◆ declareProperty() [2/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
SG::VarHandleKey hndl,
const std::string &  doc,
const SG::VarHandleKeyType  
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
hndlObject holding the property value.
docDocumentation string for the property.

This is the version for types that derive from SG::VarHandleKey. The property value object is put on the input and output lists as appropriate; then we forward to the base class.

Definition at line 221 of file AthCommonDataStore.h.

225  {
226  this->declare(hndl);
227  hndl.setOwner(this);
228 
229  return PBASE::declareProperty(name,hndl,doc);
230  }

◆ declareProperty() [3/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
SG::VarHandleKeyArray hndArr,
const std::string &  doc,
const SG::VarHandleKeyArrayType  
)
inlineinherited

Definition at line 259 of file AthCommonDataStore.h.

263  {
264 
265  // std::ostringstream ost;
266  // ost << Algorithm::name() << " VHKA declareProp: " << name
267  // << " size: " << hndArr.keys().size()
268  // << " mode: " << hndArr.mode()
269  // << " vhka size: " << m_vhka.size()
270  // << "\n";
271  // debug() << ost.str() << endmsg;
272 
273  hndArr.setOwner(this);
274  m_vhka.push_back(&hndArr);
275 
276  Gaudi::Details::PropertyBase* p = PBASE::declareProperty(name, hndArr, doc);
277  if (p != 0) {
278  p->declareUpdateHandler(&AthCommonDataStore<PBASE>::updateVHKA, this);
279  } else {
280  ATH_MSG_ERROR("unable to call declareProperty on VarHandleKeyArray "
281  << name);
282  }
283 
284  return p;
285 
286  }

◆ declareProperty() [4/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
T &  property,
const std::string &  doc,
const SG::NotHandleType  
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
propertyObject holding the property value.
docDocumentation string for the property.

This is the generic version, for types that do not derive from SG::VarHandleKey. It just forwards to the base class version of declareProperty.

Definition at line 333 of file AthCommonDataStore.h.

337  {
338  return PBASE::declareProperty(name, property, doc);
339  }

◆ declareProperty() [5/6]

Gaudi::Details::PropertyBase* AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( const std::string &  name,
T &  property,
const std::string &  doc = "none" 
)
inlineinherited

Declare a new Gaudi property.

Parameters
nameName of the property.
propertyObject holding the property value.
docDocumentation string for the property.

This dispatches to either the generic declareProperty or the one for VarHandle/Key/KeyArray.

Definition at line 352 of file AthCommonDataStore.h.

355  {
356  typedef typename SG::HandleClassifier<T>::type htype;
357  return declareProperty (name, property, doc, htype());
358  }

◆ declareProperty() [6/6]

Gaudi::Details::PropertyBase& AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T > &  t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145  {
146  typedef typename SG::HandleClassifier<T>::type htype;
148  }

◆ detStore()

const ServiceHandle<StoreGateSvc>& AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

95 { return m_detStore; }

◆ evtStore() [1/2]

ServiceHandle<StoreGateSvc>& AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

85 { return m_evtStore; }

◆ evtStore() [2/2]

const ServiceHandle<StoreGateSvc>& AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( ) const
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 90 of file AthCommonDataStore.h.

90 { return m_evtStore; }

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase &  ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ finalize()

StatusCode AthTruthSelectionTool::finalize ( )
final

Definition at line 239 of file AthTruthSelectionTool.cxx.

239  {
240  // nop
241  return StatusCode::SUCCESS;
242 }

◆ initialize()

StatusCode AthTruthSelectionTool::initialize ( )
final

Definition at line 53 of file AthTruthSelectionTool.cxx.

53  {
54  // can set cut properties now
55  using P_t = xAOD::TruthParticle;
56  using Accept_t = Accept<P_t>;
57  //
58  const std::vector<Accept_t> filters = {
59  // if p.pt=0, TVector3 generates an error when querying p.eta(); a limit of 1e-7 was not found to be enough to
60  // prevent this
61  // the following also vetoes the case where the p.pt()=NaN, as any inequality with NaN evaluates to false
62  Accept_t([this](const P_t& p) -> bool {
63  return((p.pt() > 0.1) ? (std::abs(p.eta()) < m_maxEta) : false);
64  }, std::string("eta")),
65  Accept_t([this](const P_t& p) -> bool {
66  return(p.pt() > m_minPt);
67  }, std::string("min_pt"))
68  };
69  //
70  m_cutList = CutList<P_t>(filters);
71  if (m_maxProdVertRadius>0) {
72  m_cutList.add(Accept_t([&m_maxProdVertRadius = std::as_const(m_maxProdVertRadius)](const P_t& p) -> bool {
73  return((not (p.hasProdVtx()))or(p.prodVtx()->perp() < m_maxProdVertRadius));
74  },
75  "decay_before_" + std::to_string(m_maxProdVertRadius)));
76  }
77  if (m_maxPt > 0) {
78  m_cutList.add(Accept_t([&m_maxPt = std::as_const(m_maxPt)](const P_t& p) {
79  return(p.pt() < m_maxPt);
80  }, "max_pt"));
81  }
82  if (m_requireSiHit > 0) {
83  m_cutList.add(Accept_t([&m_requireSiHit = std::as_const(m_requireSiHit)](const P_t& p) {
84  static const SG::AuxElement::ConstAccessor< float > nSilHitsAcc("nSilHits");
85  if (nSilHitsAcc.isAvailable(p)) return (nSilHitsAcc(p) >= m_requireSiHit);
86  else return false;
87  }, "siHit"));
88  }
90  m_cutList.add(Accept_t([](const P_t& p) {
92  }, "OnlyPrimary"));
93  }
94  if (m_requireCharged) {
95  m_cutList.add(Accept_t([&m_selectedCharge = std::as_const(m_selectedCharge)](const P_t& p) {
96  if(m_selectedCharge ==0) return(not (p.isNeutral()));
97  else return(not(p.isNeutral()) and p.charge()==m_selectedCharge);
98  }, "charged"));
99  }
100  if (m_requireStable) {
101  m_cutList.add(Accept_t([](const P_t& p) {
102  return(MC::isStable(&p));
103  }, "stable"));
104  }
105  if (m_pdgId > 0) {
106  m_cutList.add(Accept_t([&m_pdgId = std::as_const(m_pdgId)](const P_t& p) {
107  return(std::abs(p.pdgId()) == m_pdgId);
108  }, "pdgId"));
109  }
110  if (m_grandparent) {
111  m_cutList.add(Accept_t([](const P_t& p) {
112  return((p.nParents() == 0) || ((p.nParents() == 1)and((p.parent(0))->nParents() == 0)));
113  }, "hasNoGrandparent"));
114  }
115  //require the truth particles to come from certain ancesters
116  if (!m_ancestors.empty()) {
117  m_cutList.add(Accept_t([&m_ancestors = std::as_const(m_ancestors)](const P_t& p) -> bool {
118  const xAOD::TruthParticle* pTruth = dynamic_cast<const xAOD::TruthParticle*>(&p);
119  if (not pTruth) return false;
120  else return hasAncestor(pTruth, m_ancestors);
121  }, "ancestors"));
122  }
124  m_cutList.add(Accept_t([](const P_t& p) {
125  return((p.absPdgId() == electronId)and(p.nParents() >= 1) and(p.parent(0)) and(p.parent(0)->pdgId() == gammaId));
126  }, "poselectronfromgamma"));
127  }
128  if (m_radiusCylinder > 0) {
129  // m_cutList.add(Accept_t(acceptExtrapolatedTPToSurface, "SelectCylinder"));
130  if (not m_cylinder) {
131  ATH_MSG_VERBOSE("Creating and caching cylinder surface");
132  Amg::Transform3D trnsf;
133  trnsf.setIdentity();
134  m_cylinder = std::make_unique<Trk::CylinderSurface>( trnsf, m_radiusCylinder, 20000.);
135  }
136  m_cutList.add(Accept_t([this](const P_t& p) -> bool {
137  ATH_MSG_VERBOSE("Checking particle for intersection with cylinder of radius " << m_radiusCylinder);
138  //create surface we extrapolate to and cache it
139  const xAOD::TruthVertex* ptruthVertex = p.prodVtx();
140  if (ptruthVertex == nullptr) {
141  //cannot derive production vertex, reject track
142  ATH_MSG_VERBOSE("Rejecting particle without production vertex.");
143  return false;
144  }
145  const auto xPos = ptruthVertex->x();
146  const auto yPos = ptruthVertex->y();
147  const auto z_truth = ptruthVertex->z();
148  const Amg::Vector3D position(xPos, yPos, z_truth);
149  const Amg::Vector3D momentum(p.px(), p.py(), p.pz());
150  const Trk::CurvilinearParameters cParameters(position, momentum, p.charge());
151  const Trk::TrackParameters *exParameters = m_extrapolator->extrapolate(Gaudi::Hive::currentContext(),
152  cParameters,
153  *m_cylinder,
154  Trk::anyDirection, false, Trk::pion).release();
155  if (!exParameters) {
156  ATH_MSG_VERBOSE("Failed extrapolation. Rejecting track.");
157  return false;
158  }
159  ATH_MSG_VERBOSE("Extrapolated parameters to cylinder: " << *exParameters);
160  const float ex_abs_z = fabs(exParameters->position().z());
161  if ( (ex_abs_z > m_minZCylinder) and (ex_abs_z < m_maxZCylinder) ) {
162  ATH_MSG_VERBOSE("Particle accepted.");
163  return true;
164  }
165  //else..
166  ATH_MSG_VERBOSE("Particle rejected");
167  return false;
168  }, "SelectCylinder"));
169  } else if (m_zDisc > 0) {
170  //m_cutList.add(Accept_t(acceptExtrapolatedTPToSurface, "SelectDisc"));
171  if (not m_disc1 || not m_disc2) { //m_disc2 == 0 implied
172  ATH_MSG_VERBOSE("Creating and caching disc surface");
174  m_disc1 = std::make_unique<Trk::DiscSurface>( trnsf_shiftZ, m_minRadiusDisc, m_maxRadiusDisc);
175  trnsf_shiftZ = Amg::Translation3D(0.,0.,-m_zDisc);
176  m_disc2 = std::make_unique<Trk::DiscSurface>( trnsf_shiftZ, m_minRadiusDisc, m_maxRadiusDisc);
177  }
178  m_cutList.add(Accept_t([this](const P_t& p) -> bool {
179  ATH_MSG_VERBOSE("Checking particle for intersection with discs of |z| " << m_zDisc);
180  //create surface we extrapolate to and cache it
181  const xAOD::TruthVertex* ptruthVertex = p.prodVtx();
182  if (ptruthVertex == nullptr) {
183  //cannot derive production vertex, reject track
184  ATH_MSG_VERBOSE("Rejecting particle without production vertex.");
185  return false;
186  }
187  const auto xPos = ptruthVertex->x();
188  const auto yPos = ptruthVertex->y();
189  const auto z_truth = ptruthVertex->z();
190  const Amg::Vector3D position(xPos, yPos, z_truth);
191  const Amg::Vector3D momentum(p.px(), p.py(), p.pz());
192  const Trk::CurvilinearParameters cParameters(position, momentum, p.charge());
193  const Trk::TrackParameters *exParameters = m_extrapolator->extrapolate(Gaudi::Hive::currentContext(),
194  cParameters,
195  *m_disc1, Trk::anyDirection, true, Trk::pion).release();
196  if (exParameters) {
197  //since boundary check is true, should be enough to say we've hit the disk..
198  ATH_MSG_VERBOSE("Successfully extrapolated track to disk at +" << m_zDisc << ": " << *exParameters);
199  float ex_radius = sqrt(pow(exParameters->position().x(),2)+pow(exParameters->position().y(),2));
200  ATH_MSG_VERBOSE("radial position at surface: " << ex_radius);
201  if ((ex_radius > m_minRadiusDisc) and (ex_radius < m_maxRadiusDisc)) {
202  ATH_MSG_VERBOSE("Confirmed within the disk. Accepting particle");
203  return true;
204  }
205  //else...
206  ATH_MSG_VERBOSE("Strange, extrapolation succeeded but extrapolated position not within disc radius! Test next disc");
207  }
208  exParameters = m_extrapolator->extrapolate(Gaudi::Hive::currentContext(),cParameters, *m_disc2, Trk::anyDirection, true, Trk::pion).release();
209  if (exParameters) {
210  //since boundary check is true, should be enough to say we've hit the disk..
211  ATH_MSG_VERBOSE("Successfully extrapolated track to disk at -" << m_zDisc << ": " << *exParameters);
212  float ex_radius = sqrt(pow(exParameters->position().x(),2)+pow(exParameters->position().y(),2));
213  ATH_MSG_VERBOSE("radial position at surface: " << ex_radius);
214  if ((ex_radius > m_minRadiusDisc) and (ex_radius < m_maxRadiusDisc)) {
215  ATH_MSG_VERBOSE("Confirmed within the disk. Accepting particle");
216  return true;
217  }
218  //else...
219  ATH_MSG_VERBOSE("Strange, extrapolation succeeded but extrapolated position not within disc radius! Rejecting");
220  }
221  //else..
222  ATH_MSG_VERBOSE("Particle rejected");
223  return false;
224  }, "SelectDisc"));
225  } //m_zDisc > 0
226 
227  std::string msg = std::to_string(m_cutList.size()) + " truth acceptance cuts are used:\n";
228  for (const auto& i:m_cutList.names()) {
229  msg += i + "\n";
230  }
231  ATH_MSG_INFO(msg);
232 
233  ATH_CHECK(m_extrapolator.retrieve(EnableTool{ m_radiusCylinder > 0 || m_zDisc >0 }));
234 
235  return StatusCode::SUCCESS;
236 }

◆ inputHandles()

virtual std::vector<Gaudi::DataHandle*> AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ interfaceID()

const InterfaceID & IAthSelectionTool::interfaceID ( )
inlinestaticinherited

interfaceID reimplemented from base

Definition at line 73 of file IAthSelectionTool.h.

73  {
74  return IID_IAthSelectionTool;
75 }

◆ msg() [1/2]

MsgStream& AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24  {
25  return this->msgStream();
26  }

◆ msg() [2/2]

MsgStream& AthCommonMsg< AlgTool >::msg ( const MSG::Level  lvl) const
inlineinherited

Definition at line 27 of file AthCommonMsg.h.

27  {
28  return this->msgStream(lvl);
29  }

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level  lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30  {
31  return this->msgLevel(lvl);
32  }

◆ names()

std::vector< std::string > AthTruthSelectionTool::names ( ) const
finalvirtual

return the names of the cuts as a vector<string>

Implements IAthSelectionTool.

Definition at line 246 of file AthTruthSelectionTool.cxx.

246  {
247  return m_cutList.names();
248 }

◆ nCuts()

unsigned int AthTruthSelectionTool::nCuts ( ) const
inlinefinalvirtual

return the number of cuts.

Returns
the number of cuts

Implements IAthSelectionTool.

Definition at line 43 of file AthTruthSelectionTool.h.

43  {
44  return m_cutList.size();
45  }

◆ outputHandles()

virtual std::vector<Gaudi::DataHandle*> AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t<std::is_void_v<std::result_of_t<decltype(&T::renounce)(T)> > && !std::is_base_of_v<SG::VarHandleKeyArray, T> && std::is_base_of_v<Gaudi::DataHandle, T>, void> AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T &  h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381  {
382  h.renounce();
383  PBASE::renounce (h);
384  }

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364  {
365  handlesArray.renounce();
366  }

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in DerivationFramework::CfAthAlgTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and asg::AsgMetadataTool.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ testAllCuts()

IAthSelectionTool::CutResult AthTruthSelectionTool::testAllCuts ( const xAOD::IParticle p,
std::vector< unsigned int > &  counter 
) const
finalvirtual

The most important method to determine whether the particle is accepted.

Parameters
pPointer to particle baseclass, will be cast to truth or track
Returns
true if particle passes cuts

Implements IAthSelectionTool.

Definition at line 262 of file AthTruthSelectionTool.cxx.

262  {
263  const xAOD::TruthParticle* pTruth = dynamic_cast<const xAOD::TruthParticle*>(particle);
264 
265  //@TODO
266  if (not pTruth) {
267  return m_cutList.size()+1; // marker for invalid particles
268  }
269  return m_cutList.testAllCuts(*pTruth,counter);
270 }

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase &  )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308  {
309  // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310  // << " size: " << m_vhka.size() << endmsg;
311  for (auto &a : m_vhka) {
312  std::vector<SG::VarHandleKey*> keys = a->keys();
313  for (auto k : keys) {
314  k->setOwner(this);
315  }
316  }
317  }

Member Data Documentation

◆ m_ancestors

IntegerArrayProperty AthTruthSelectionTool::m_ancestors {this, "ancestorList", {}}
private

Definition at line 67 of file AthTruthSelectionTool.h.

◆ m_counters

std::vector<unsigned int> AthTruthSelectionTool::m_counters {}
private

Definition at line 66 of file AthTruthSelectionTool.h.

◆ m_cutList

CutList<xAOD::TruthParticle> AthTruthSelectionTool::m_cutList
private

Definition at line 50 of file AthTruthSelectionTool.h.

◆ m_cylinder

std::unique_ptr<Trk::CylinderSurface> AthTruthSelectionTool::m_cylinder
private

Definition at line 86 of file AthTruthSelectionTool.h.

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_disc1

std::unique_ptr<Trk::DiscSurface> AthTruthSelectionTool::m_disc1
private

Definition at line 87 of file AthTruthSelectionTool.h.

◆ m_disc2

std::unique_ptr<Trk::DiscSurface> AthTruthSelectionTool::m_disc2
private

Definition at line 88 of file AthTruthSelectionTool.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extrapolator

PublicToolHandle<Trk::IExtrapolator> AthTruthSelectionTool::m_extrapolator {this,"Extrapolator","Trk::Extrapolator/AtlasExtrapolator",""}
private

Too handle for truth-track extrapolation.

Definition at line 94 of file AthTruthSelectionTool.h.

◆ m_grandparent

BooleanProperty AthTruthSelectionTool::m_grandparent {this, "hasNoGrandparent", false}
private

Definition at line 64 of file AthTruthSelectionTool.h.

◆ m_maxEta

FloatProperty AthTruthSelectionTool::m_maxEta {this, "maxEta", 2.5}
private

Definition at line 52 of file AthTruthSelectionTool.h.

◆ m_maxProdVertRadius

FloatProperty AthTruthSelectionTool::m_maxProdVertRadius {this, "maxProdVertRadius", 110.}
private

Definition at line 62 of file AthTruthSelectionTool.h.

◆ m_maxPt

FloatProperty AthTruthSelectionTool::m_maxPt {this, "maxPt", -1.}
private

Definition at line 53 of file AthTruthSelectionTool.h.

◆ m_maxRadiusDisc

FloatProperty AthTruthSelectionTool::m_maxRadiusDisc
private
Initial value:
{this, "maxRadiusDisc", 0.,
"Maximum radius on disk for accepting extrapolated truth particle to surface."}

Definition at line 82 of file AthTruthSelectionTool.h.

◆ m_maxZCylinder

FloatProperty AthTruthSelectionTool::m_maxZCylinder
private
Initial value:
{this, "maxZCylinder", 0.,
"Maximum |Z| on cylinder for accepting extrapolated truth particle to surface."}

Definition at line 76 of file AthTruthSelectionTool.h.

◆ m_minPt

FloatProperty AthTruthSelectionTool::m_minPt {this, "minPt", 400.}
private

Definition at line 54 of file AthTruthSelectionTool.h.

◆ m_minRadiusDisc

FloatProperty AthTruthSelectionTool::m_minRadiusDisc
private
Initial value:
{this, "minRadiusDisc", 0.,
"Minimum radius on disk for accepting extrapolated truth particle to surface."}

Definition at line 80 of file AthTruthSelectionTool.h.

◆ m_minZCylinder

FloatProperty AthTruthSelectionTool::m_minZCylinder
private
Initial value:
{this, "minZCylinder", 0.,
"Minimum |Z| on cylinder for accepting extrapolated truth particle to surface."}

Definition at line 74 of file AthTruthSelectionTool.h.

◆ m_pdgId

IntegerProperty AthTruthSelectionTool::m_pdgId {this, "pdgId", -1}
private

Definition at line 63 of file AthTruthSelectionTool.h.

◆ m_poselectronfromgamma

BooleanProperty AthTruthSelectionTool::m_poselectronfromgamma {this, "poselectronfromgamma", false}
private

Definition at line 65 of file AthTruthSelectionTool.h.

◆ m_radiusCylinder

FloatProperty AthTruthSelectionTool::m_radiusCylinder
private
Initial value:
{this, "radiusCylinder", -1.,
"Select truth particle based on extrapolated position on cylinder placed at this radius. Enabled if greater than 0."}

Definition at line 72 of file AthTruthSelectionTool.h.

◆ m_requireCharged

BooleanProperty AthTruthSelectionTool::m_requireCharged {this, "requireCharged", true}
private

Definition at line 56 of file AthTruthSelectionTool.h.

◆ m_requireOnlyPrimary

BooleanProperty AthTruthSelectionTool::m_requireOnlyPrimary {this, "requireOnlyPrimary", true}
private

Definition at line 55 of file AthTruthSelectionTool.h.

◆ m_requireSiHit

IntegerProperty AthTruthSelectionTool::m_requireSiHit {this, "requireSiHit", 0}
private

Definition at line 59 of file AthTruthSelectionTool.h.

◆ m_requireStable

BooleanProperty AthTruthSelectionTool::m_requireStable {this, "requireStable", true}
private

Definition at line 58 of file AthTruthSelectionTool.h.

◆ m_selectedCharge

IntegerProperty AthTruthSelectionTool::m_selectedCharge {this, "selectedCharge", 0}
private

Definition at line 57 of file AthTruthSelectionTool.h.

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.

◆ m_zDisc

FloatProperty AthTruthSelectionTool::m_zDisc
private
Initial value:
{this, "zDisc", -1.,
"Select truth particle based on extrapolated position on disks placed at +/- z positions. Enabled if greater than 0."}

Definition at line 78 of file AthTruthSelectionTool.h.


The documentation for this class was generated from the following files:
Trk::anyDirection
@ anyDirection
Definition: PropDirection.h:22
AthTruthSelectionTool::m_maxRadiusDisc
FloatProperty m_maxRadiusDisc
Definition: AthTruthSelectionTool.h:82
Trk::ParticleSwitcher::particle
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
Definition: ParticleHypothesis.h:76
AthTruthSelectionTool::m_cylinder
std::unique_ptr< Trk::CylinderSurface > m_cylinder
Definition: AthTruthSelectionTool.h:86
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
AthTruthSelectionTool::m_pdgId
IntegerProperty m_pdgId
Definition: AthTruthSelectionTool.h:63
AthTruthSelectionTool::m_radiusCylinder
FloatProperty m_radiusCylinder
Definition: AthTruthSelectionTool.h:72
Trk::ParametersBase::position
const Amg::Vector3D & position() const
Access method for the position.
AthCommonDataStore::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
StoreGateSvc_t m_evtStore
Pointer to StoreGate (event store by default)
Definition: AthCommonDataStore.h:390
AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
std::vector< SG::VarHandleKeyArray * > m_vhka
Definition: AthCommonDataStore.h:398
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:55
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
CutList
Templated CutList class to contain a group of cuts.
Definition: CutFlow.h:93
xAOD::TruthVertex_v1::y
float y() const
Vertex y displacement.
AthTruthSelectionTool::m_minPt
FloatProperty m_minPt
Definition: AthTruthSelectionTool.h:54
AthTruthSelectionTool::m_maxEta
FloatProperty m_maxEta
Definition: AthTruthSelectionTool.h:52
SG::VarHandleKeyArray::setOwner
virtual void setOwner(IDataHandleHolder *o)=0
IDTPMcnv.htype
htype
Definition: IDTPMcnv.py:29
AthTruthSelectionTool::m_requireOnlyPrimary
BooleanProperty m_requireOnlyPrimary
Definition: AthTruthSelectionTool.h:55
AthTruthSelectionTool::m_disc1
std::unique_ptr< Trk::DiscSurface > m_disc1
Definition: AthTruthSelectionTool.h:87
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
AthCommonDataStore
Definition: AthCommonDataStore.h:52
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ParticleGun_EoverP_Config.momentum
momentum
Definition: ParticleGun_EoverP_Config.py:63
HepMC::is_simulation_particle
bool is_simulation_particle(const T &p)
Method to establish if a particle (or barcode) was created during the simulation (TODO update to be s...
Definition: MagicNumbers.h:355
lumiFormat.i
int i
Definition: lumiFormat.py:85
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:37
Trk::pion
@ pion
Definition: ParticleHypothesis.h:29
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
xAOD::TruthParticle
TruthParticle_v1 TruthParticle
Typedef to implementation.
Definition: Event/xAOD/xAODTruth/xAODTruth/TruthParticle.h:15
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
AthTruthSelectionTool::m_requireSiHit
IntegerProperty m_requireSiHit
Definition: AthTruthSelectionTool.h:59
AthTruthSelectionTool::m_minZCylinder
FloatProperty m_minZCylinder
Definition: AthTruthSelectionTool.h:74
AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
StoreGateSvc_t m_detStore
Pointer to StoreGate (detector store by default)
Definition: AthCommonDataStore.h:393
Trk::ParametersBase
Definition: ParametersBase.h:55
Trk::CurvilinearParametersT
Definition: CurvilinearParametersT.h:48
AthAlgTool::AthAlgTool
AthAlgTool()
Default constructor:
AthTruthSelectionTool::m_ancestors
IntegerArrayProperty m_ancestors
Definition: AthTruthSelectionTool.h:67
SG::VarHandleKeyArray::renounce
virtual void renounce()=0
SG::HandleClassifier::type
std::conditional< std::is_base_of< SG::VarHandleKeyArray, T >::value, VarHandleKeyArrayType, type2 >::type type
Definition: HandleClassifier.h:54
xAOD::TruthVertex_v1
Class describing a truth vertex in the MC record.
Definition: TruthVertex_v1.h:37
AthTruthSelectionTool::m_selectedCharge
IntegerProperty m_selectedCharge
Definition: AthTruthSelectionTool.h:57
merge_scale_histograms.doc
string doc
Definition: merge_scale_histograms.py:9
AthTruthSelectionTool::m_extrapolator
PublicToolHandle< Trk::IExtrapolator > m_extrapolator
Too handle for truth-track extrapolation.
Definition: AthTruthSelectionTool.h:95
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
AthTruthSelectionTool::m_poselectronfromgamma
BooleanProperty m_poselectronfromgamma
Definition: AthTruthSelectionTool.h:65
xAOD::TruthVertex_v1::x
float x() const
Vertex x displacement.
MC::isStable
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
Definition: HepMCHelpers.h:45
a
TList * a
Definition: liststreamerinfos.cxx:10
h
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
xAOD::TruthVertex_v1::z
float z() const
Vertex longitudinal distance along the beam line form the origin.
Amg::Translation3D
Eigen::Translation< double, 3 > Translation3D
Definition: GeoPrimitives.h:44
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
AthTruthSelectionTool::m_requireCharged
BooleanProperty m_requireCharged
Definition: AthTruthSelectionTool.h:56
SG::VarHandleBase::vhKey
SG::VarHandleKey & vhKey()
Return a non-const reference to the HandleKey.
Definition: StoreGate/src/VarHandleBase.cxx:623
AthTruthSelectionTool::m_disc2
std::unique_ptr< Trk::DiscSurface > m_disc2
Definition: AthTruthSelectionTool.h:88
AthTruthSelectionTool::m_zDisc
FloatProperty m_zDisc
Definition: AthTruthSelectionTool.h:78
AthTruthSelectionTool::m_minRadiusDisc
FloatProperty m_minRadiusDisc
Definition: AthTruthSelectionTool.h:80
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:798
AthTruthSelectionTool::m_cutList
CutList< xAOD::TruthParticle > m_cutList
Definition: AthTruthSelectionTool.h:50
Accept
Templated class containing a cut, name of cut and description of cut(optional) Typically,...
Definition: CutFlow.h:28
test_pyathena.counter
counter
Definition: test_pyathena.py:15
AthTruthSelectionTool::m_grandparent
BooleanProperty m_grandparent
Definition: AthTruthSelectionTool.h:64
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15
AthCommonDataStore::declareGaudiProperty
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>
Definition: AthCommonDataStore.h:156
AthTruthSelectionTool::m_maxProdVertRadius
FloatProperty m_maxProdVertRadius
Definition: AthTruthSelectionTool.h:62
AthTruthSelectionTool::m_maxPt
FloatProperty m_maxPt
Definition: AthTruthSelectionTool.h:53
fitman.k
k
Definition: fitman.py:528
AthTruthSelectionTool::m_maxZCylinder
FloatProperty m_maxZCylinder
Definition: AthTruthSelectionTool.h:76
AthTruthSelectionTool::m_requireStable
BooleanProperty m_requireStable
Definition: AthTruthSelectionTool.h:58