ATLAS Offline Software
Loading...
Searching...
No Matches
PhotonsDirectionTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6// PhotonsDirectionTool
7// compute photon et = E(cluster)/cosh(eta of 2nd sampling)
8// eventually E will be after recalibration
10// Author: Giovanni Marchiori (giovanni.marchiori@cern.ch)
11//
12
16
17namespace DerivationFramework {
18
21{
22 ATH_CHECK(m_collName.initialize());
23
24 m_doEta = !(m_sgEta.key().empty());
25 m_doPhi = !(m_sgPhi.key().empty());
26 m_doEt = !(m_sgEt.key().empty());
27 m_doE = !(m_sgE.key().empty());
28 if (!m_doEta && !m_doPhi && !m_doE && !m_doEt) {
29 ATH_MSG_ERROR("You are requesting the PhotonsDirectionTool but have "
30 "provided no SG names for any of the results");
31 return StatusCode::FAILURE;
32 }
33 ATH_CHECK(m_sgEta.initialize(m_doEta));
34 ATH_CHECK(m_sgPhi.initialize(m_doPhi));
35 ATH_CHECK(m_sgEt.initialize(m_doEt));
36 ATH_CHECK(m_sgE.initialize(m_doE));
37 return StatusCode::SUCCESS;
38}
39
40StatusCode
41PhotonsDirectionTool::addBranches(const EventContext& ctx) const
42{
43 // Retrieve photon container
45 // define the pointers to vectors which will hold the additional payloads
46 auto recEta = std::make_unique<std::vector<float>>();
47 auto recPhi = std::make_unique<std::vector<float>>();
48 auto recEt = std::make_unique<std::vector<float>>();
49 auto recE = std::make_unique<std::vector<float>>();
50
51 // Loop over electrons and fill the vectors
52 for (const xAOD::Photon* ph : *photons) {
53 // Prepare variables
54 float eta(0.0), phi(0.0), e(0.0), et(0.0);
55
56 if (ph->nCaloClusters() > 0) {
57 const xAOD::CaloCluster* gCluster = ph->caloCluster(0);
58 eta = gCluster->etaBE(2);
59 phi = gCluster->phi();
60 e = gCluster->e();
61 et = e / cosh(eta);
62 } else {
64 "Couldn't retrieve photon cluster, will use photon 4-momentum");
65 eta = ph->eta();
66 phi = ph->phi();
67 e = ph->e();
68 et = ph->pt();
69 }
70 recEta->push_back(eta);
71 recPhi->push_back(phi);
72 recEt->push_back(et);
73 recE->push_back(e);
74 } // end of loop over photons
75
76 // Write payload to StoreGate for downstream client access
77 if (m_doEta) {
79 ATH_CHECK(etas.record(std::move(recEta)));
80 }
81 if (m_doPhi) {
83 ATH_CHECK(phis.record(std::move(recPhi)));
84 }
85 if (m_doEt) {
87 ATH_CHECK(ets.record(std::move(recEt)));
88 }
89 if (m_doE) {
91 ATH_CHECK(es.record(std::move(recE)));
92 }
93 return StatusCode::SUCCESS;
94}
95
96} // end of namespace
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
float et(const xAOD::jFexSRJetRoI *j)
static const Attributes_t empty
SG::WriteHandleKey< std::vector< float > > m_sgE
SG::WriteHandleKey< std::vector< float > > m_sgPhi
virtual StatusCode initialize() override final
SG::WriteHandleKey< std::vector< float > > m_sgEt
SG::ReadHandleKey< xAOD::PhotonContainer > m_collName
SG::WriteHandleKey< std::vector< float > > m_sgEta
virtual StatusCode addBranches(const EventContext &ctx) const override final
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
virtual double e() const
The total energy of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
float etaBE(const unsigned layer) const
Get the eta in one layer of the EM Calo.
THE reconstruction tool.
::StatusCode StatusCode
StatusCode definition for legacy code.
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Photon_v1 Photon
Definition of the current "egamma version".
Extra patterns decribing particle interation process.