ATLAS Offline Software
Loading...
Searching...
No Matches
ClusterDumper.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Gaudi/Athena include(s):
7
10
11// Local include(s):
12#include "ClusterDumper.h"
13
15 ATH_MSG_INFO( "Initializing" );
16
17 std::lock_guard<std::mutex> fileLock{m_fileMutex};
18 if (!m_fileName.empty()) {
20 if (m_fileOut.is_open()) {
22 ATH_MSG_INFO("Writing to file " << m_fileName);
23 }
24 else {
25 msg(MSG::ERROR) << "Failed to open file " << m_fileName << endmsg;
26 return StatusCode::FAILURE;
27 }
28 }
29 else {
30 ATH_MSG_INFO("Writing to stdout");
31 }
32
33 ATH_CHECK(m_eventInfoKey.initialize());
34 ATH_CHECK(m_containerName.initialize());
35 return StatusCode::SUCCESS;
36}
37
38
40 if (m_fileOut.is_open()) {
41 m_fileOut.close();
42 }
43 return StatusCode::SUCCESS;
44}
45
47
48
50
52 ATH_MSG_DEBUG( "Retrieved clusters with key: " << m_containerName.key() );
53
54 const CaloClusterCellLinkContainer* cclptr=nullptr;
56 CHECK(evtStore()->retrieve(cclptr,m_containerName.key()+"_links"));
57 ATH_MSG_INFO("Found corresponding cell-link container with size " << cclptr->size());
58 }
59 else
60 ATH_MSG_INFO("Did not find corresponding cell-link container");
61
62 std::lock_guard<std::mutex> fileLock{m_fileMutex};
63 (*m_out) << "Run " << eventInfo->runNumber() << ", evt " << eventInfo->eventNumber() << " contains " << clustercontainer->size() << " CaloClusters" << std::endl;
64
65 for (const auto itr: *clustercontainer) {
66 const xAOD::CaloCluster& cluster=*itr;
67 (*m_out) << "Kinematics :" << std::endl;
69 *m_out << std::format ("E={:.0f}, eta={}, phi={}, m={}, pt={:.1f}",
70 cluster.e(), cluster.eta(), cluster.phi(),
71 cluster.m(), cluster.pt())
72 << std::endl;
73 }
74 else {
75 *m_out << std::format ("E={}, eta={}, phi={}, m={}, pt={}",
76 cluster.e(), cluster.eta(), cluster.phi(),
77 cluster.m(), cluster.pt())
78 << std::endl;
79 }
80 (*m_out) << "Eta0=" << cluster.eta0() << ", Phi0=" << cluster.phi0() << std::endl;
81
82 (*m_out) << "TLorentzVector :" << std::endl;
83 const xAOD::CaloCluster::FourMom_t& p4=cluster.p4();
85 double mass = p4.M();
86 if (std::abs(mass) < 1e-2) mass = 0;
87 *m_out << std::format (" p4.E={:.0f}, x={:.0f}, y={:.0f}, z={:.0f}, m={:.2f}, pt={:.1f}",
88 p4.E(), p4.X(), p4.Y(), p4.Z(), mass, p4.Pt())
89 << std::endl;
90 }
91 else {
92 *m_out << std::format (" p4.E={}, x={}, y={}, z={}, m={}, pt={}",
93 p4.E(), p4.X(), p4.Y(), p4.Z(), p4.M(), p4.Pt())
94 << std::endl;
95 }
96
97 (*m_out) << "Sampling variables :" << std::endl;
98 for (unsigned iSamp=0;iSamp<CaloSampling::Unknown;++iSamp) {
100 if (cluster.hasSampling(s)) {
101 (*m_out) << " Sampling #" << s << ": E=" << cluster.eSample(s) << ", eta=" << cluster.etaSample(s) << ", phi=" << cluster.phiSample(s) << std::endl;
102 }
103 }
104
105
106
107 //(*m_out) << "Auxiliary variables: " << std::endl;
108 // const SG::auxid_set_t& auxIds=cluster.container()->getAuxIDs(); //->getDynamicAuxIDs();
109 // const size_t idx= cluster.index();
110 // for (auto ai: auxIds) {
111 // const std::string& auxName=SG::AuxTypeRegistry::instance().getName(ai);
112 // const std::type_info* ti=SG::AuxTypeRegistry::instance().getType (ai);
113 // if ((*ti)==typeid(float)) {
114 // const float v=clustercontainer->getData<float>(ai,idx);
115 // (*m_out) << " Index=" <<idx << ", Auxid=" << ai << ", Name=" << auxName << " value=" << v << std::endl;
116 // }
117 // else
118 // (*m_out) << " Index=" <<idx << ", Auxid=" << ai << ", Name=" << auxName << ", unknown type" << ti->name() << std::endl;
119 // }
120
121 constexpr auto allMoments=std::to_array<const char*>({"FIRST_PHI","FIRST_ETA","SECOND_R","SECOND_LAMBDA","DELTA_PHI","DELTA_THETA","DELTA_ALPHA","CENTER_X","CENTER_Y","CENTER_Z","CENTER_MAG","CENTER_LAMBDA","LATERAL","LONGITUDINAL","ENG_FRAC_EM","ENG_FRAC_MAX","ENG_FRAC_CORE","FIRST_ENG_DENS","SECOND_ENG_DENS","ISOLATION","ENG_BAD_CELLS","N_BAD_CELLS","N_BAD_CELLS_CORR","BAD_CELLS_CORR_E","BADLARQ_FRAC","ENG_POS","SIGNIFICANCE.3","CELL_SIGNIFICANCE.3","CELL_SIG_SAMPLING","AVG_LAR_Q","AVG_TILE_Q","EM_PROBABILITY","HAD_WEIGHT","OOC_WEIGHT","DM_WEIGHT.3","TILE_CONFIDENCE_LEVEL","VERTEX_FRACTION","NVERTEX_FRACTION","ENG_CALIB_TOT","ENG_CALIB_OUT_L","ENG_CALIB_OUT_M","ENG_CALIB_OUT_T","ENG_CALIB_DEAD_L","ENG_CALIB_DEAD_M","ENG_CALIB_DEAD_T","ENG_CALIB_EMB0","ENG_CALIB_EME0","ENG_CALIB_TILEG3","ENG_CALIB_DEAD_TOT","ENG_CALIB_DEAD_EMB0","ENG_CALIB_DEAD_TILE0","ENG_CALIB_DEAD_TILEG3","ENG_CALIB_DEAD_EME0","ENG_CALIB_DEAD_HEC0","ENG_CALIB_DEAD_FCAL","ENG_CALIB_DEAD_LEAKAGE","ENG_CALIB_DEAD_UNCLASS","ENG_CALIB_FRAC_EM","ENG_CALIB_FRAC_HAD","ENG_CALIB_FRAC_REST", "ENERGY_Truth"});
122 (*m_out) << "Cluster Moments" << std::endl;
123 for (std::string momName : allMoments) {
124 int precision = 0;
125 std::string::size_type dpos = momName.find ('.');
126 if (dpos != std::string::npos) {
127 precision = std::stoi (momName.substr (dpos+1));
128 momName.erase (dpos, std::string::npos);
129 }
131 if (a.isAvailable(cluster)) {
132 float v = a(cluster);
133 if (m_reducedPrecision && precision > 0) {
134 *m_out << std::format (" {}: {:.{}f}", momName, v, precision) << std::endl;
135 }
136 else {
137 (*m_out) << " " << momName << ": " << v << std::endl;
138 }
139 }
140 }
141
143 if (a.isAvailable(cluster)) {
144 (*m_out) << "Bad Channel data: " << std::endl;
145 for (const auto& bc : cluster.badChannelList()) {
146 (*m_out) << " eta=" << bc.eta() << ", phi=" << bc.phi() << ", layer=" << bc.layer() << ", word=" << bc.badChannel() << std::endl;
147 }
148 }
149
150 const CaloClusterCellLink* cellLinks = cluster.getCellLinks();
151 if (cellLinks) {
152 if (m_printCellLinks) {
153 (*m_out) << "Cell-links:" << std::endl;
154 CaloClusterCellLink::const_iterator lnk_it = cellLinks->begin();
155 CaloClusterCellLink::const_iterator lnk_it_e = cellLinks->end();
156 for (; lnk_it != lnk_it_e; ++lnk_it) {
157 const CaloCell* cell = *lnk_it;
158 if (m_reducedPrecision) {
159 *m_out << std::format (" ID={}, E={:.2f}, weight={:.3f}",
160 cell->ID().getString(), cell->e(), lnk_it.weight())
161 << std::endl;
162 }
163 else {
164 *m_out << std::format (" ID={}, E={}, weight={}",
165 cell->ID().getString(), cell->e(), lnk_it.weight())
166 << std::endl;
167 }
168 }
169 } else
170 (*m_out) << " Nbr of cells: " << cellLinks->size() << std::endl;
171 } else {
172 (*m_out) << " No Cell Links found" << std::endl;
173 }
174
175 }//end loop over clusters
176
177 return StatusCode::SUCCESS;
178}
179
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
Helpers for checking error return status codes and reporting errors.
#define CHECK(...)
Evaluate an expression and check for errors.
static Double_t a
MsgStream & msg() const
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
std::ofstream m_fileOut
SG::ReadHandleKey< xAOD::CaloClusterContainer > m_containerName
The key for the output xAOD::CaloClusterContainer.
Gaudi::Property< bool > m_reducedPrecision
virtual StatusCode finalize()
virtual StatusCode initialize()
Function initialising the algorithm.
std::mutex m_fileMutex
Gaudi::Property< bool > m_printCellLinks
std::ostream * m_out
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
Gaudi::Property< std::string > m_fileName
virtual StatusCode execute()
Function executing the algorithm.
size_type size() const noexcept
Returns the number of elements in the collection.
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:573
const CaloClusterCellLink * getCellLinks() const
Get a pointer to the CaloClusterCellLink object (const version)
virtual double pt() const
The transverse momentum ( ) of the particle (negative for negative-energy clusters)
float phiSample(const CaloSample sampling) const
Retrieve barycenter in a given sample.
virtual double m() const
The invariant mass of the particle.
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double e() const
The total energy of the particle.
float eSample(const CaloSample sampling) const
virtual double phi() const
The azimuthal angle ( ) of the particle.
float etaSample(const CaloSample sampling) const
Retrieve barycenter in a given sample.
flt_t eta0() const
Returns raw of cluster seed.
virtual FourMom_t p4() const
The full 4-momentum of the particle.
IParticle::FourMom_t FourMom_t
Definition of the 4-momentum type.
CaloSampling::CaloSample CaloSample
bool hasSampling(const CaloSample s) const
Checks if certain smapling contributes to cluster.
const CaloClusterBadChannelList & badChannelList() const
flt_t phi0() const
Returns raw of cluster seed.
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:114
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.