ATLAS Offline Software
Loading...
Searching...
No Matches
ClusterDumper.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5// $Id: ClusterDumper.cxx 767574 2016-08-11 13:52:47Z ssnyder $
6
7// Gaudi/Athena include(s):
9
12
13// Local include(s):
14#include "ClusterDumper.h"
15
16ClusterDumper::ClusterDumper( const std::string& name,
17 ISvcLocator* svcLoc )
18 : AthAlgorithm( name, svcLoc ),
19 m_out(&std::cout)
20{
21 declareProperty( "FileName",m_fileName);
22
23}
24
26 ATH_MSG_INFO( "Initializing" );
27
28 std::lock_guard<std::mutex> fileLock{m_fileMutex};
29 if (!m_fileName.empty()) {
31 if (m_fileOut.is_open()) {
33 ATH_MSG_INFO("Writing to file " << m_fileName);
34 }
35 else {
36 msg(MSG::ERROR) << "Failed to open file " << m_fileName << endmsg;
37 return StatusCode::FAILURE;
38 }
39 }
40 else {
41 ATH_MSG_INFO("Writing to stdout");
42 }
43
44 ATH_CHECK(m_containerName.initialize());
45 return StatusCode::SUCCESS;
46}
47
48
50 if (m_fileOut.is_open()) {
51 m_fileOut.close();
52 }
53 return StatusCode::SUCCESS;
54}
55
57
58 //const xAOD::CaloClusterContainer* clustercontainer = nullptr;
60 ATH_MSG_DEBUG( "Retrieved clusters with key: " << m_containerName.key() );
61
62 const CaloClusterCellLinkContainer* cclptr=nullptr;
64 CHECK(evtStore()->retrieve(cclptr,m_containerName.key()+"_links"));
65 ATH_MSG_INFO("Found corresponding cell-link container with size " << cclptr->size());
66 }
67 else
68 ATH_MSG_INFO("Did not find corresponding cell-link container");
69
70 std::lock_guard<std::mutex> fileLock{m_fileMutex};
71 for (const auto itr: *clustercontainer) {
72 const xAOD::CaloCluster& cluster=*itr;
73 (*m_out) << "Kinematics :" << std::endl;
74 (*m_out) << "E=" << cluster.e() << ", eta=" << cluster.eta() << ", phi=" << cluster.phi() << ", m=" << cluster.m() << ", pt=" << cluster.pt() << std::endl;
75 (*m_out) << "Eta0=" << cluster.eta0() << ", Phi0=" << cluster.phi0() << std::endl;
76
77 (*m_out) << "TLorentzVector :" << std::endl;
78 const xAOD::CaloCluster::FourMom_t& p4=cluster.p4();
79 (*m_out) << " p4.E=" << p4.E() << ", x=" << p4.X() << ", y=" << p4.Y() << ", z=" << p4.Z() << ", m=" << p4.M() << ", pt=" << p4.Pt() << std::endl;
80
81 (*m_out) << "Sampling variables :" << std::endl;
82 for (unsigned iSamp=0;iSamp<CaloSampling::Unknown;++iSamp) {
84 if (cluster.hasSampling(s)) {
85 (*m_out) << " Sampling #" << s << ": E=" << cluster.eSample(s) << ", eta=" << cluster.etaSample(s) << ", phi=" << cluster.phiSample(s) << std::endl;
86 }
87 }
88
89
90
91 //(*m_out) << "Auxiliary variables: " << std::endl;
92 // const SG::auxid_set_t& auxIds=cluster.container()->getAuxIDs(); //->getDynamicAuxIDs();
93 // const size_t idx= cluster.index();
94 // for (auto ai: auxIds) {
95 // const std::string& auxName=SG::AuxTypeRegistry::instance().getName(ai);
96 // const std::type_info* ti=SG::AuxTypeRegistry::instance().getType (ai);
97 // if ((*ti)==typeid(float)) {
98 // const float v=clustercontainer->getData<float>(ai,idx);
99 // (*m_out) << " Index=" <<idx << ", Auxid=" << ai << ", Name=" << auxName << " value=" << v << std::endl;
100 // }
101 // else
102 // (*m_out) << " Index=" <<idx << ", Auxid=" << ai << ", Name=" << auxName << ", unknown type" << ti->name() << std::endl;
103 // }
104
105 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","CELL_SIGNIFICANCE","CELL_SIG_SAMPLING","AVG_LAR_Q","AVG_TILE_Q","EM_PROBABILITY","HAD_WEIGHT","OOC_WEIGHT","DM_WEIGHT","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"});
106 (*m_out) << "Cluster Moments" << std::endl;
107 for (const auto& momName : allMoments) {
109 if (a.isAvailable(cluster)) {
110 float v = a(cluster);
111 (*m_out) << " " << momName << ": " << v << std::endl;
112 }
113 }
114
116 if (a.isAvailable(cluster)) {
117 (*m_out) << "Bad Channel data: " << std::endl;
118 for (const auto& bc : cluster.badChannelList()) {
119 (*m_out) << " eta=" << bc.eta() << ", phi=" << bc.phi() << ", layer=" << bc.layer() << ", word=" << bc.badChannel() << std::endl;
120 }
121 }
122
123 (*m_out) << "Cell-links:" << std::endl;
124 const CaloClusterCellLink* cellLinks=cluster.getCellLinks();
125 if (cellLinks) {
126// (*m_out) << " Total: " << cellLinks->size() << std::endl;
127 CaloClusterCellLink::const_iterator lnk_it=cellLinks->begin();
128 CaloClusterCellLink::const_iterator lnk_it_e=cellLinks->end();
129 for (;lnk_it!=lnk_it_e;++lnk_it) {
130 const CaloCell* cell=*lnk_it;
131 (*m_out) << " ID=" << std::hex << cell->ID() << std::dec << ", E=" << cell->e() << ", weight=" << lnk_it.weight() << std::endl;
132 }
133 }
134 else
135 (*m_out) << " No Cell Links found" << std::endl;
136
137 }//end loop over clusters
138
139 return StatusCode::SUCCESS;
140}
141
#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
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
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.
virtual StatusCode finalize()
virtual StatusCode initialize()
Function initialising the algorithm.
std::mutex m_fileMutex
std::ostream * m_out
virtual StatusCode execute()
Function executing the algorithm.
ClusterDumper(const std::string &name, ISvcLocator *svcLoc)
Regular algorithm constructor.
std::string m_fileName
size_type size() const noexcept
Returns the number of elements in the collection.
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:572
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
STL namespace.
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.