ATLAS Offline Software
TestMacroHelpers.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3  */
4 
5 #ifndef XAOD_STANDALONE
11 #include <xAODEgamma/Electron.h>
12 #include <xAODMuon/Muon.h>
16 namespace CP {
17 
18  static const FloatAccessor acc_assocClustEta{IsolationCloseByCorrectionTool::caloDecors()[0]};
19  static const FloatAccessor acc_assocClustPhi{IsolationCloseByCorrectionTool::caloDecors()[1]};
20  static const FloatAccessor acc_assocClustEne{IsolationCloseByCorrectionTool::caloDecors()[2]};
21  static const CharAccessor acc_assocCaloIsDec{IsolationCloseByCorrectionTool::caloDecors()[3]};
22 
23  static const FloatAccessor acc_assocPflowEta{IsolationCloseByCorrectionTool::pflowDecors()[0]};
24  static const FloatAccessor acc_assocPflowPhi{IsolationCloseByCorrectionTool::pflowDecors()[1]};
25  static const FloatAccessor acc_assocPflowEne{IsolationCloseByCorrectionTool::pflowDecors()[2]};
26  static const CharAccessor acc_assocPflowIsDec{IsolationCloseByCorrectionTool::pflowDecors()[3]};
27 
28  //############################################################################
29  // IsoCorrectionTestHelper
30  //############################################################################
31  bool IsoCorrectionTestHelper::init() { return true; }
32  bool IsoCorrectionTestHelper::fill(const EventContext&) { return true; }
35  const std::vector<std::unique_ptr<IsolationWP>>& WPs) :
36  MuonTesterBranch(outTree, ContainerName),
37  m_cont_name{ContainerName} {
38  // Retrieve the isolaiton accessors directly from the WP
39  for (const std::unique_ptr<IsolationWP>& W : WPs) {
40  for (const auto& C : W->conditions()) {
41  for (unsigned int t = 0; t < C->num_types(); ++t) {
42  const IsoType iso_type = C->type(t);
43  bool add = std::find_if(m_iso_branches.begin(), m_iso_branches.end(), [iso_type](const IsolationBranches& known) {
44  return known.Accessor->isotype() == iso_type;
45  }) == m_iso_branches.end();
46  if (add) m_iso_branches.emplace_back(*this, iso_type, "");
47  }
48  }
49  // Assume only 1 WP
50  break;
51  }
52  }
55  m_acc_used_for_corr = std::make_optional<CharAccessor>(acc);
56  }
58  m_acc_passDefault = std::make_optional<CharAccessor>(acc);
59  }
61  m_acc_passCorrected = std::make_optional<CharAccessor>(acc);
62  }
65  branch.Accessor = std::make_unique<IsoVariableHelper>(branch.Accessor->isotype(), prefix);
66  }
67  }
68 
70  if (!Particles) {
71  Error("IsoCorrectionTestHelper::Fill()", "No particles given");
72  return StatusCode::FAILURE;
73  }
74 
75  for (const xAOD::IParticle* object : *Particles) {
76  if (m_acc_used_for_corr != std::nullopt && (!(*m_acc_used_for_corr).isAvailable(*object) || !(*m_acc_used_for_corr)(*object)))
77  continue;
78  m_pt.push_back(object->pt());
79  m_eta.push_back(object->eta());
80  m_phi.push_back(object->phi());
81  m_e.push_back(object->e());
82  m_Q.push_back(Charge(object));
84  if (!FillIsolationBranches(object, branch.Accessor, branch.original_cones, branch.corrected_cones).isSuccess()) {
85  Error("IsoCorrectionTestHelper()", "Failed to fill isolation");
86  return StatusCode::FAILURE;
87  }
88  }
89  if (m_acc_passDefault != std::nullopt && !(*m_acc_passDefault).isAvailable(*object)) {
90  Error("IsoCorrectionTestHelper()", "It has not been stored whether the particle passes the default isolation");
91  return StatusCode::FAILURE;
92  } else
93  m_orig_passIso.push_back(m_acc_passDefault != std::nullopt ? (*m_acc_passDefault)(*object) : false);
94 
95  if (m_acc_passCorrected != std::nullopt && !(*m_acc_passCorrected).isAvailable(*object)) {
96  Error("IsoCorrectionTestHelper()", "It has not been stored whether the particle passes the corrected isolation.");
97  return StatusCode::FAILURE;
98  } else
99  m_corr_passIso.push_back(m_acc_passCorrected != std::nullopt ? (*m_acc_passCorrected)(*object) : false);
101  if (object->type() != xAOD::Type::ObjectType::Electron && object->type() != xAOD::Type::ObjectType::Muon) continue;
102 
103  const xAOD::TrackParticle* assoc_track = nullptr;
104  CaloClusterPtr assoc_cluster{};
105  FlowElementPtr assoc_flow{};
106  if (object->type() == xAOD::Type::ObjectType::Muon) {
107  const xAOD::Muon* mu = dynamic_cast<const xAOD::Muon*>(object);
108  assoc_track = mu->trackParticle(xAOD::Muon::TrackParticleType::InnerDetectorTrackParticle);
109  if (m_clusters.empty())
110  assoc_cluster = mu->cluster();
111  else {
112  assoc_cluster = (*std::min_element(m_clusters.begin(), m_clusters.end(),[mu](const CaloClusterPtr& a, const
113  CaloClusterPtr& b){
114  return xAOD::P4Helpers::deltaR2(a, mu) < xAOD::P4Helpers::deltaR2(b, mu);
115  }));
116  }
117  } else if (object->type() == xAOD::Type::ObjectType::Electron) {
118  const xAOD::Electron* el = dynamic_cast<const xAOD::Electron*>(object);
120  assoc_cluster = el->caloCluster(0);
121  }
122  if (!m_flows.empty()) {
123  assoc_flow = (*std::min_element(m_flows.begin(), m_flows.end(),[object](const FlowElementPtr& a, const
124  FlowElementPtr& b){
125  return xAOD::P4Helpers::deltaR2(a, object) < xAOD::P4Helpers::deltaR2(b, object);
126  }));
127  }
128  m_assoc_track_pt.push_back(assoc_track ? assoc_track->pt() : FLT_MAX);
129 
130  if (acc_assocCaloIsDec.isAvailable(*object) && acc_assocCaloIsDec(*object)) {
131  m_assoc_cluster_et.push_back(acc_assocClustEne(*object));
132  m_assoc_cluster_eta.push_back(acc_assocClustEta(*object));
133  m_assoc_cluster_phi.push_back(acc_assocClustPhi(*object));
134  } else if (assoc_cluster) {
136  m_assoc_cluster_eta.push_back(assoc_cluster->eta());
137  m_assoc_cluster_phi.push_back(assoc_cluster->phi());
138  } else {
139  m_assoc_cluster_et += FLT_MAX;
140  m_assoc_cluster_eta += FLT_MAX;
141  m_assoc_cluster_phi += FLT_MAX;
142  }
143  if (acc_assocPflowIsDec.isAvailable(*object) && acc_assocPflowIsDec(*object)) {
144  m_assoc_pflow_et.push_back( acc_assocPflowEne(*object));
145  m_assoc_pflow_eta.push_back(acc_assocPflowEta(*object));
146  m_assoc_pflow_phi.push_back(acc_assocPflowPhi(*object));
147  } else if (assoc_flow) {
148  m_assoc_pflow_et.push_back(assoc_flow->e() * assoc_flow.weight);
149  m_assoc_pflow_eta.push_back(assoc_flow->eta());
150  m_assoc_pflow_phi.push_back(assoc_flow->phi());
151  } else {
152  m_assoc_pflow_et += FLT_MAX;
153  m_assoc_pflow_eta += FLT_MAX;
154  m_assoc_pflow_phi += FLT_MAX;
155  }
156  }
157  return StatusCode::SUCCESS;
158  }
160  static const FloatAccessor acc_charge("charge");
161  if (!acc_charge.isAvailable(*P))
162  return 0;
163  else
164  return acc_charge(*P);
165  }
166 
169  if (!Acc) return StatusCode::SUCCESS;
170  float IsoValue{-1.};
171  if (Acc->getOriginalIsolation(P, IsoValue).code() != CorrectionCode::Ok) return StatusCode::FAILURE;
172  Original.push_back(IsoValue);
173  if (Acc->getIsolation(P, IsoValue).code() != CorrectionCode::Ok) return StatusCode::FAILURE;
174  Corrected.push_back(IsoValue);
175  return StatusCode::SUCCESS;
176  }
177 } // namespace CP
178 #endif
xAOD::TrackParticle_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: TrackParticle_v1.cxx:73
CP::IsoCorrectionTestHelper::m_assoc_pflow_eta
MuonVal::VectorBranch< float > & m_assoc_pflow_eta
Definition: TestMacroHelpers.h:66
CP::IsoCorrectionTestHelper::SetBackupPreFix
void SetBackupPreFix(const std::string &prefix)
Specify whether the vanilla isolation variable is backuped to another set of decorators.
Definition: TestMacroHelpers.cxx:63
xAOD::Electron
Electron_v1 Electron
Definition of the current "egamma version".
Definition: Event/xAOD/xAODEgamma/xAODEgamma/Electron.h:17
CP::IsoCorrectionTestHelper::FillIsolationBranches
StatusCode FillIsolationBranches(const xAOD::IParticle *P, const IsoHelperPtr &Acc, MuonVal::VectorBranch< float > &Original, MuonVal::VectorBranch< float > &Corrected)
Definition: TestMacroHelpers.cxx:167
CP::IsoHelperPtr
std::unique_ptr< IsoVariableHelper > IsoHelperPtr
Definition: IsoVariableHelper.h:16
CP::IsoCorrectionTestHelper::m_assoc_pflow_phi
MuonVal::VectorBranch< float > & m_assoc_pflow_phi
Definition: TestMacroHelpers.h:67
Muon.h
xAODP4Helpers.h
JetTiledMap::W
@ W
Definition: TiledEtaPhiMap.h:44
CP::PflowSet
std::set< FlowElementPtr > PflowSet
Definition: PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/Defs.h:74
CP::IsoCorrectionTestHelper::m_Q
MuonVal::VectorBranch< int > & m_Q
Definition: TestMacroHelpers.h:54
CP::IsoCorrectionTestHelper::m_corr_passIso
MuonVal::VectorBranch< bool > & m_corr_passIso
Definition: TestMacroHelpers.h:57
CP::IsolationCloseByCorrectionTool::clusterEtMinusTile
static float clusterEtMinusTile(const xAOD::CaloCluster *C)
Definition: IsolationCloseByCorrectionTool.cxx:975
CP::IsolationCloseByCorrectionTool::pflowDecors
static caloDecorNames pflowDecors()
Definition: IsolationCloseByCorrectionTool.cxx:28
CP::SortedObjPtr
Small helper struct to have sets of particle pointers sorted by pt.
Definition: PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/Defs.h:40
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:54
MuonVal::VectorBranch< float >
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
CP::IsoCorrectionTestHelper::m_assoc_track_pt
MuonVal::VectorBranch< float > & m_assoc_track_pt
Definition: TestMacroHelpers.h:59
xAOD::IParticle
Class providing the definition of the 4-vector interface.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:40
CP::IsoCorrectionTestHelper::m_flows
PflowSet m_flows
Definition: TestMacroHelpers.h:84
CP
Select isolated Photons, Electrons and Muons.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:48
xAOD::Muon_v1
Class describing a Muon.
Definition: Muon_v1.h:38
CP::IsoCorrectionTestHelper::SetFlowElements
void SetFlowElements(const PflowSet &flows)
Definition: TestMacroHelpers.cxx:33
CP::IsoCorrectionTestHelper::SetUpdatedIsoDecorator
void SetUpdatedIsoDecorator(const std::string &acc)
Pipe the name of te decorator encoding whether the object already passed the corrected isolation.
Definition: TestMacroHelpers.cxx:60
getIsolationCorrectionAccessor.h
CP::IsoCorrectionTestHelper::m_assoc_cluster_et
MuonVal::VectorBranch< float > & m_assoc_cluster_et
Definition: TestMacroHelpers.h:61
CP::IsoCorrectionTestHelper::m_phi
MuonVal::VectorBranch< float > & m_phi
Definition: TestMacroHelpers.h:52
CP::IsoCorrectionTestHelper::IsoCorrectionTestHelper
IsoCorrectionTestHelper(MuonVal::MuonTesterTree &outTree, const std::string &ContainerName, const std::vector< std::unique_ptr< IsolationWP >> &WP)
Definition: TestMacroHelpers.cxx:34
EgammaxAODHelpers.h
MuonVal::MuonTesterTree
Definition: MuonTesterTree.h:30
CP::IsoCorrectionTestHelper::SetIsolationDecorator
void SetIsolationDecorator(const std::string &acc)
Pipe the name of te decorator encoding whether the object already passed the vanilla isolation.
Definition: TestMacroHelpers.cxx:57
CP::IsoCorrectionTestHelper::Charge
float Charge(const xAOD::IParticle *P) const
Definition: TestMacroHelpers.cxx:159
CP::IsoCorrectionTestHelper::m_clusters
ClusterSet m_clusters
Definition: TestMacroHelpers.h:83
CP::IsoCorrectionTestHelper::m_assoc_cluster_phi
MuonVal::VectorBranch< float > & m_assoc_cluster_phi
Definition: TestMacroHelpers.h:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
IsoVariableHelper.h
xAOD::Iso::IsolationType
IsolationType
Overall enumeration for isolation types in xAOD files.
Definition: IsolationType.h:26
makePlot.Particles
Particles
Definition: makePlot.py:25
checkCorrelInHIST.prefix
dictionary prefix
Definition: checkCorrelInHIST.py:391
CP::IsoCorrectionTestHelper::m_pt
MuonVal::VectorBranch< float > & m_pt
Definition: TestMacroHelpers.h:50
plotIsoValidation.el
el
Definition: plotIsoValidation.py:197
CP::IsoCorrectionTestHelper::m_assoc_pflow_et
MuonVal::VectorBranch< float > & m_assoc_pflow_et
Definition: TestMacroHelpers.h:65
AthenaPoolTestRead.acc
acc
Definition: AthenaPoolTestRead.py:16
add
bool add(const std::string &hname, TKey *tobj)
Definition: fastadd.cxx:55
CP::IsoCorrectionTestHelper::m_assoc_cluster_eta
MuonVal::VectorBranch< float > & m_assoc_cluster_eta
Definition: TestMacroHelpers.h:62
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
TestMacroHelpers.h
MuonVal::VectorBranch::push_back
void push_back(const T &value)
Adds a new element at the end of the vector.
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
CP::IsolationCloseByCorrectionTool::caloDecors
static caloDecorNames caloDecors()
Returns an array with the calo cluster decoration ames [0]-> eta, [1]->phi, [2]->energy....
Definition: IsolationCloseByCorrectionTool.cxx:24
CP::FlowElementPtr
For the flow elements we need a special derivate which also contains the weights.
Definition: PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/Defs.h:59
CP::IsoCorrectionTestHelper::m_iso_branches
std::vector< IsolationBranches > m_iso_branches
Definition: TestMacroHelpers.h:77
xAOD::Electron_v1
Definition: Electron_v1.h:34
CP::IsoCorrectionTestHelper::m_e
MuonVal::VectorBranch< float > & m_e
Definition: TestMacroHelpers.h:53
CP::IsoCorrectionTestHelper::fill
bool fill(const EventContext &ctx) override final
The fill method checks if enough information is provided such that the branch is cleared from the inf...
Definition: TestMacroHelpers.cxx:32
CP::ClusterSet
std::set< CaloClusterPtr > ClusterSet
Definition: PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/Defs.h:73
Muon
struct TBPatternUnitContext Muon
RTTAlgmain.branch
branch
Definition: RTTAlgmain.py:61
CP::CorrectionCode::Ok
@ Ok
The correction was done successfully.
Definition: CorrectionCode.h:38
getIsolationAccessor.h
a
TList * a
Definition: liststreamerinfos.cxx:10
CP::IsoCorrectionTestHelper::m_acc_used_for_corr
std::optional< CharAccessor > m_acc_used_for_corr
Definition: TestMacroHelpers.h:79
known
Definition: TrigBStoxAODTool.cxx:107
IsolationHelpers.h
IsolationWP.h
HLTSeedingRoIToolDefs::eFexEM::ContainerName
const char ContainerName[]
Definition: HLTSeedingRoIToolDefs.cxx:9
CP::IsoCorrectionTestHelper::m_eta
MuonVal::VectorBranch< float > & m_eta
Definition: TestMacroHelpers.h:51
RunTileMonitoring.clusters
clusters
Definition: RunTileMonitoring.py:133
CP::IsoCorrectionTestHelper::IsolationBranches
Definition: TestMacroHelpers.h:68
CP::FloatAccessor
SG::AuxElement::ConstAccessor< float > FloatAccessor
Definition: PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/Defs.h:21
xAOD::EgammaHelpers::getOriginalTrackParticle
const xAOD::TrackParticle * getOriginalTrackParticle(const xAOD::Electron *el)
Helper function for getting the "Original" Track Particle (i.e before GSF) via the electron.
Definition: ElectronxAODHelpers.cxx:11
SG::ConstAccessor::isAvailable
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
pickleTool.object
object
Definition: pickleTool.py:30
Electron.h
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
CP::IsoCorrectionTestHelper::m_acc_passCorrected
std::optional< CharAccessor > m_acc_passCorrected
Definition: TestMacroHelpers.h:81
CheckAppliedSFs.WPs
WPs
Definition: CheckAppliedSFs.py:206
CaloNoise_fillDB.mu
mu
Definition: CaloNoise_fillDB.py:53
CP::IsoCorrectionTestHelper::SetClusters
void SetClusters(const ClusterSet &clusters)
set the list of all clusters from the Cluster container matched by the IsolationCloseByCorrectionTool...
Definition: TestMacroHelpers.cxx:53
CP::IsoCorrectionTestHelper::SetSelectionDecorator
void SetSelectionDecorator(const std::string &acc)
Pipe the name of the decorator selecting the objects dumped to the TTree.
Definition: TestMacroHelpers.cxx:54
CP::IsoCorrectionTestHelper::init
bool init() override final
The init method checks whether the branch name has already registered to the MuonTree and tries then ...
Definition: TestMacroHelpers.cxx:31
CP::CharAccessor
SG::AuxElement::ConstAccessor< char > CharAccessor
Definition: PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/Defs.h:18
CP::IsoCorrectionTestHelper::m_acc_passDefault
std::optional< CharAccessor > m_acc_passDefault
Definition: TestMacroHelpers.h:80
CP::IsoCorrectionTestHelper::m_orig_passIso
MuonVal::VectorBranch< bool > & m_orig_passIso
Definition: TestMacroHelpers.h:56
CP::IsoCorrectionTestHelper::Fill
StatusCode Fill(const xAOD::IParticleContainer *Particles)
Definition: TestMacroHelpers.cxx:69