ATLAS Offline Software
DerivationFramework/DerivationFrameworkMCTruth/src/TruthIsolationTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // TruthIsolationTool.cxx
7 // Author: Kevin Finelli (kevin.finelli@cern.ch)
8 // Calculate isolation at truth level for given lists of truth particles
9 
12 #include <vector>
13 #include <string>
14 #include <algorithm>
15 
16 // Constructor
18  const std::string& n,
19  const IInterface* p ) :
20  AthAlgTool(t,n,p)
21 {
22  declareInterface<DerivationFramework::IAugmentationTool>(this);
23 }
24 
25 // Destructor
27 }
28 
29 // Athena initialize
31 {
32 
33  // Initialise input keys
34  ATH_CHECK(m_isoParticlesKey.initialize());
35  ATH_CHECK(m_allParticlesKey.initialize());
36 
37  //sort (descsending) the cone sizes vector to optimize calculation
38  m_coneSizesSort = m_coneSizes;
39  std::sort(m_coneSizesSort.begin(), m_coneSizesSort.end(), [](float a, float b){return a>b;});
40 
41  // Decorations depend on the list of cone sizes
42  for ( auto csize_itr : m_coneSizesSort ) {
43  std::ostringstream sizess;
44  if (m_variableR) sizess << "var";
45  sizess << m_isoVarNamePrefix.value() << (int)((csize_itr)*100.);
46  m_isoDecorKeys.emplace_back(m_isoParticlesKey.key()+"."+sizess.str());
47  }
48  ATH_CHECK(m_isoDecorKeys.initialize());
49 
50  return StatusCode::SUCCESS;
51 }
52 
53 // Function to do isolation calc, implements interface in IAugmentationTool
55 {
56  // Event context
57  const EventContext& ctx = Gaudi::Hive::currentContext();
58 
59  // Retrieve the truth collections
60  SG::ReadHandle<xAOD::TruthParticleContainer> isoTruthParticles(m_isoParticlesKey, ctx);
61  if (!isoTruthParticles.isValid()) {
62  ATH_MSG_ERROR("Couldn't retrieve collection with name " << m_isoParticlesKey);
63  return StatusCode::FAILURE;
64  }
65 
66  SG::ReadHandle<xAOD::TruthParticleContainer> allTruthParticles(m_allParticlesKey, ctx);
67  if (!allTruthParticles.isValid()) {
68  ATH_MSG_ERROR("Couldn't retrieve collection with name " << m_allParticlesKey);
69  return StatusCode::FAILURE;
70  }
71 
72  //get struct of helper functions
74 
75  // Isolation is applied to selected particles only
76  std::vector<const xAOD::TruthParticle*> listOfParticlesForIso;
77  decayHelper.constructListOfFinalParticles(isoTruthParticles.ptr(), listOfParticlesForIso, m_listOfPIDs);
78 
79  // Vectors to store particles which will be dressed
80  std::vector<const xAOD::TruthParticle*> candidateParticlesList;
81 
82  std::vector<int> emptyList;
83  //make a list of all candidate particles that could fall inside the cone of the particle of interest from listOfParticlesForIso
84  decayHelper.constructListOfFinalParticles(allTruthParticles.ptr(), candidateParticlesList, emptyList, true, m_chargedOnly);
85 
86  std::vector<SG::WriteDecorHandle< xAOD::TruthParticleContainer, float > >
87  decorator_iso = m_isoDecorKeys.makeHandles (ctx);
88 
89  //All isolation must filled for all Particles.
91  for ( unsigned int icone = 0; icone < m_coneSizesSort.size(); ++icone ) {
92  for (const auto part : *isoTruthParticles) {
93  decorator_iso.at(icone)(*part) = -1;
94  }
95  }
96 
97  // Standard particle loop over final state particles of interest
98  for (const auto& part : listOfParticlesForIso) {
99  std::vector<float> isolationsCalcs(m_coneSizesSort.size(), 0.0);
100  calcIsos(part, candidateParticlesList, isolationsCalcs);
101  for ( unsigned int icone = 0; icone < m_coneSizesSort.size(); ++icone ) {
102  decorator_iso.at(icone)(*part) = isolationsCalcs.at(icone);
103  }
104  }
105 
106  return StatusCode::SUCCESS;
107 }
108 
110  const std::vector<const xAOD::TruthParticle*> &candidateParticlesList,
111  std::vector<float> &isoCalcs) const
112 {
113  //given a bare TruthParticle particle, calculate the isolation(s) using the
114  //particles in candidateParticlesList, filling isoCalcs in order corresponding
115  //to the sorted cone sizes
116 
117  float part_eta = particle->eta();
118  float part_phi = particle->phi();
119  for (const auto& cand_part : candidateParticlesList) {
120  if (find(m_excludeFromCone.begin(), m_excludeFromCone.end(), cand_part->pdgId()) != m_excludeFromCone.end()) {
121  //skip if we find a particle in the exclude list
122  continue;
123  }
124  if (!m_includeNonInteracting && !MC::isInteracting(cand_part->pdgId())){
125  // Do not include non-interacting particles, and this particle is non-interacting
126  continue;
127  }
128  if (HepMC::uniqueID(cand_part) != HepMC::uniqueID(particle)) {
129  //iteration over sorted cone sizes
130  for ( unsigned int icone = 0; icone < m_coneSizesSort.size(); ++icone ) {
131  const float dr2 = calculateDeltaR2(cand_part, part_eta, part_phi);
132  const float coneSize = m_coneSizesSort.at(icone);
133  if (dr2 < coneSize*coneSize &&
134  (!m_variableR || dr2*particle->pt()*particle->pt() < 100000000.)) {
135  //sum the transverse momenta
136  isoCalcs.at(icone) = isoCalcs.at(icone) + cand_part->pt();
137  } else {
138  //break out of the loop safely since the cone sizes are sorted descending
139  break;
140  }
141  }
142  }
143  }
144  return;
145 }
146 
148 {
149  //calculate dR^2 this way to hopefully do fewer sqrt and TVector3::Pseudorapidity calls
150  float phi1 = p1->phi();
151  float eta1 = p1->eta();
152  float deltaPhi = fabs(phi1-phi2);
153  if (deltaPhi>TMath::Pi()) deltaPhi = 2.0*TMath::Pi() - deltaPhi;
154  float deltaPhiSq = deltaPhi * deltaPhi;
155  float deltaEtaSq = (eta1-eta2)*(eta1-eta2);
156  return deltaPhiSq+deltaEtaSq;
157 }
LArG4FSStartPointFilter.part
part
Definition: LArG4FSStartPointFilter.py:21
P4Helpers::deltaEtaSq
double deltaEtaSq(const I4Momentum &p1, const I4Momentum &p2)
Computes efficiently .
Definition: P4Helpers.h:85
Trk::ParticleSwitcher::particle
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
Definition: ParticleHypothesis.h:76
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
ParticleGun_SamplingFraction.eta2
eta2
Definition: ParticleGun_SamplingFraction.py:96
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
xAOD::deltaPhi
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setInterceptInner setEtaMap setEtaBin setIsTgcFailure setDeltaPt deltaPhi
Definition: L2StandAloneMuon_v1.cxx:160
DerivationFramework::TruthIsolationTool::initialize
virtual StatusCode initialize() override
Definition: DerivationFramework/DerivationFrameworkMCTruth/src/TruthIsolationTool.cxx:30
TruthIsolationTool.h
xAOD::eta1
setEt setPhi setE277 setWeta2 eta1
Definition: TrigEMCluster_v1.cxx:41
DerivationFramework::DecayGraphHelper::constructListOfFinalParticles
bool constructListOfFinalParticles(const xAOD::TruthParticleContainer *allParticles, std::vector< const xAOD::TruthParticle * > &selectedlist, const std::vector< int > &pdgId, bool allowFromHadron=false, bool chargedOnly=false) const
Definition: DecayGraphHelper.h:218
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
xAOD::IParticle
Class providing the definition of the 4-vector interface.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:40
DerivationFramework::TruthIsolationTool::TruthIsolationTool
TruthIsolationTool(const std::string &t, const std::string &n, const IInterface *p)
Definition: DerivationFramework/DerivationFrameworkMCTruth/src/TruthIsolationTool.cxx:17
DerivationFramework::TruthIsolationTool::calcIsos
void calcIsos(const xAOD::TruthParticle *particle, const std::vector< const xAOD::TruthParticle * > &, std::vector< float > &) const
Definition: DerivationFramework/DerivationFrameworkMCTruth/src/TruthIsolationTool.cxx:109
DerivationFramework::TruthIsolationTool::addBranches
virtual StatusCode addBranches() const override
Pass the thinning service
Definition: DerivationFramework/DerivationFrameworkMCTruth/src/TruthIsolationTool.cxx:54
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:41
HepMC::uniqueID
int uniqueID(const T &p)
Definition: MagicNumbers.h:113
DerivationFramework::TruthIsolationTool::~TruthIsolationTool
~TruthIsolationTool()
Definition: DerivationFramework/DerivationFrameworkMCTruth/src/TruthIsolationTool.cxx:26
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
P4Helpers::deltaPhiSq
double deltaPhiSq(const I4Momentum &pA, const I4Momentum &pB)
delta Phi squared in range ([-pi,pi[)^2 from two I4momentum references
Definition: P4Helpers.h:172
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
DerivationFramework::DecayGraphHelper
Definition: DecayGraphHelper.h:26
SG::ReadHandle::ptr
const_pointer_type ptr()
Dereference the pointer.
a
TList * a
Definition: liststreamerinfos.cxx:10
xAOD::IParticle::eta
virtual double eta() const =0
The pseudorapidity ( ) of the particle.
DerivationFramework::TruthIsolationTool::calculateDeltaR2
static float calculateDeltaR2(const xAOD::IParticle *p1, float eta2, float phi2)
Definition: DerivationFramework/DerivationFrameworkMCTruth/src/TruthIsolationTool.cxx:147
MC::isInteracting
bool isInteracting(const T &p)
Identify if the particle with given PDG ID would not interact with the detector, i....
Definition: HepMCHelpers.h:23
xAOD::IParticle::phi
virtual double phi() const =0
The azimuthal angle ( ) of the particle.
AthAlgTool
Definition: AthAlgTool.h:26
xAOD::Iso::coneSize
float coneSize(IsolationConeSize type)
convert Isolation Size into cone size
Definition: IsolationHelpers.h:27
HepMCHelpers.h