19 base_class(
type, name, parent)
29 return StatusCode::SUCCESS;
36 unsigned int total = 0, seed = 0, grow = 0, term = 0, invalid = 0, shared = 0;
38 friend Str &
operator << (Str & s,
const size_struct & sst)
40 s << sst.total <<
" " << sst.seed <<
" " << sst.grow <<
" " << sst.term <<
" " << sst.invalid <<
" " << sst.shared;
45struct cluster_info_struct
48 float seed_snr = -9e99;
49 float seed_energy = -9e99;
52 friend Str &
operator << (Str & s,
const cluster_info_struct & cis)
54 s << cis.seed_index <<
" " << cis.size <<
" (" << cis.seed_snr <<
" " << cis.seed_energy <<
")";
65 if ( !cell_collection.
isValid() )
67 ATH_MSG_ERROR(
" Cannot retrieve CaloCellContainer: " << cell_collection.
name() );
68 return StatusCode::FAILURE;
73 const CaloNoise * noise_tool = *noise_handle;
77 size_struct global_counts, global_cluster_counts;
83 const float energy = cell->energy();
85 float SNR = energy / noise_tool->
getNoise(
m_calo_id->calo_cell_hash(cell->ID()), cell->gain());
103 ++global_counts.term;
107 ++global_counts.invalid;
111 struct cluster_cell_info
114 double w_1 = -1, w_2 = -1, energy = -9e99, SNR = -9e99;
115 void add_cluster(
const int cell_id,
const xAOD::CaloCluster * cl,
const double w)
122 else if (cl_2 ==
nullptr)
129 std::cout <<
"WARNING! Multiple shared cell: " << cell_id <<
" " << cl_1 <<
" " << cl_2 <<
" " << cl << std::endl;
133 bool is_shared()
const
135 return cl_1 !=
nullptr && cl_2 !=
nullptr;
140 std::map<int, cluster_cell_info> cluster_cells;
149 ATH_MSG_ERROR(
"Can't get valid links to CaloCells (CaloClusterCellLink)!");
150 return StatusCode::FAILURE;
153 for (
auto it = cell_links->
begin(); it != cell_links->
end(); ++it)
156 const float weight = it.weight();
158 const float this_energy = std::abs(cell->energy());
160 const float this_snr = std::abs(this_energy / noise_tool->
getNoise(
m_calo_id->calo_cell_hash(cell->ID()), cell->gain()));
164 auto & info = cluster_cells[this_hash];
166 info.energy = this_energy;
169 info.add_cluster(this_hash, cluster, weight);
174 std::unordered_map<const xAOD::CaloCluster *, cluster_info_struct> cluster_sizes;
176 auto update_clusters = [&](
const cluster_cell_info & cci,
const int cell)
182 auto & c_info = cluster_sizes[cl];
198 ++c_info.size.invalid;
203 ++c_info.size.shared;
207 if (cci.SNR > c_info.seed_snr || (cci.SNR == c_info.seed_snr && cell > c_info.seed_index))
209 c_info.seed_index = cell;
210 c_info.seed_snr = cci.SNR;
211 c_info.seed_energy = cci.energy;
217 if (cci.cl_1 !=
nullptr || cci.cl_2 !=
nullptr)
219 ++global_cluster_counts.total;
222 ++global_cluster_counts.seed;
226 ++global_cluster_counts.grow;
230 ++global_cluster_counts.term;
234 ++global_cluster_counts.invalid;
238 ++global_cluster_counts.shared;
242 update_one(cci.cl_1);
243 update_one(cci.cl_2);
246 for (
auto & it : cluster_cells)
248 update_clusters(it.second, it.first);
251 std::vector<cluster_info_struct> sorted_info;
253 sorted_info.reserve(cluster_sizes.size());
255 for (
auto & v : cluster_sizes)
257 sorted_info.push_back(v.second);
260 std::sort(sorted_info.begin(), sorted_info.end(),
261 [](
const auto &
a,
const auto & b)
263 return a.seed_index < b.seed_index;
270 return StatusCode::FAILURE;
276 std::ofstream out_file(save_file);
278 if (!out_file.is_open())
280 return StatusCode::FAILURE;
283 out_file <<
"Cell counts: " << global_counts <<
"\n\n";
285 out_file <<
"Cells in clusters count: " << global_cluster_counts <<
"\n\n";
286 out_file <<
"Clusters:\n\n";
288 for (
const auto & info : sorted_info)
290 out_file << info <<
"\n";
293 out_file << std::endl;
295 if (!out_file.good())
297 return StatusCode::FAILURE;
302 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
defines an "iterator" over instances of a given type in StoreGateSvc
std::ostream & operator<<(std::ostream &lhs, const TestGaudiProperty &rhs)
Data object for each calorimeter readout cell.
SG::ReadHandleKey< CaloCellContainer > m_cellsKey
vector of names of the cell containers to use as input.
Gaudi::Property< float > m_growThreshold
Value to consider for the seed threshold.
Gaudi::Property< float > m_cellThreshold
Value to consider for the seed threshold.
SG::ReadCondHandleKey< CaloNoise > m_noiseCDOKey
Key of the CaloNoise Conditions data object.
virtual StatusCode initialize() override
Gaudi::Property< unsigned int > m_numWidth
The number of digits to reserve for the events.
virtual StatusCode execute(const EventContext &ctx, xAOD::CaloClusterContainer *cluster_collection) const override
const CaloCell_ID * m_calo_id
Pointer to Calo ID Helper.
Gaudi::Property< std::string > m_savePath
The path specifying the folder to which the files should be saved.
CaloCellsCounterCPU(const std::string &type, const std::string &name, const IInterface *parent)
Gaudi::Property< std::string > m_filePrefix
The prefix of the saved files.
Gaudi::Property< float > m_seedThreshold
Value to consider for the seed threshold.
Gaudi::Property< std::string > m_fileSuffix
The suffix of the saved files.
Bookkeeping of cells that make up a cluster Simplified replacement for CaloCellLink,...
const_iterator end() const
const end method
const_iterator begin() const
const begin method
float getNoise(const IdentifierHash h, const int gain) const
Accessor by IdentifierHash and gain.
static constexpr GainType from_standard_gain(const int gain)
static constexpr GainType min_gain_value()
static constexpr GainType num_gain_values()
DataModel_detail::const_iterator< DataVector > const_iterator
This is a "hash" representation of an Identifier.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const std::string & name() const
Return the StoreGate ID for the referenced object.
Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
CaloClusterContainer_v1 CaloClusterContainer
Define the latest version of the calorimeter cluster container.
static std::string build_filename(const std::string &prefix, const std::string &text, const std::string &suffix, const std::string &ext)
static ErrorState prepare_folder_for_output(const std::filesystem::path &folder, const bool output_errors=true)