ATLAS Offline Software
Loading...
Searching...
No Matches
MetaDataAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4#include "MetaDataAlg.h"
5
13
14
15namespace {
16 std::string ReplaceExpInString(std::string str, const std::string &exp, const std::string &rep) {
17 size_t ExpPos = str.find(exp);
18 if (ExpPos == std::string::npos) return str;
19 str.replace(ExpPos,exp.size(),rep);
20 if (str.find(exp) != std::string::npos) return ReplaceExpInString(std::move(str), exp, rep);
21 return str;
22 }
23
24}
25namespace MuonVal{
26
28 ATH_MSG_INFO("Initializing " << name() << "...");
29 ATH_CHECK(m_infoKey.initialize());
30 m_MetaDataTree = std::make_unique<MuonTesterTree>("MetaDataTree", m_stream);
31 ATH_CHECK(m_MetaDataTree->init(this));
32
33 if (!m_prwTool.empty()) {
34 ATH_CHECK(m_prwTool.retrieve());
35 m_hasPrwTool = true;
36 }
37 if (m_storeLHE && !m_isData) {
38 std::map<std::string, int> weight_names{};
39 AthAnalysisHelper::retrieveMetadata("/Generation/Parameters", "HepMCWeightNames", weight_names).isSuccess();
40 EventInfoBranch::setNumLHE(weight_names.size());
41 }
42 return StatusCode::SUCCESS;
43}
44
46 if (m_sim_meta.empty() == m_run_meta.empty()) {
47 ATH_MSG_FATAL("Found run and simulation meta data");
48 return StatusCode::FAILURE;
49 }
51 m_MetaDataTree->newScalar<bool>("isData", m_isData);
52 m_MetaDataTree->newScalar<bool>("isDerivedAOD", m_isDerivedAOD);
55 ATH_CHECK(m_MetaDataTree->write());
56 m_MetaDataTree.reset();
57
58 return StatusCode::SUCCESS;
59}
60
62 const EventContext& ctx = Gaudi::Hive::currentContext();
63 ATH_MSG_DEBUG("Executing " << name() << "...");
64 setFilterPassed(true);
65
67 if (!evtInfo.isValid()) {
68 ATH_MSG_FATAL("Failed to retrieve " << m_infoKey.fullKey());
69 return StatusCode::FAILURE;
70 }
71
72 bool isData = !evtInfo->eventType(xAOD::EventInfo::IS_SIMULATION);
73
74 int mc_channel = !isData ? evtInfo->mcChannelNumber() : 0.;
75 unsigned int run_number = evtInfo->runNumber();
76 if (isData) {
77 std::string trigger_stream{};
78 ATH_CHECK(AthAnalysisHelper::retrieveMetadata("/TagInfo", "triggerStreamOfFile", trigger_stream));
79
80 std::vector<RunMetaData>::iterator itr =
81 std::find_if(m_run_meta.begin(), m_run_meta.end(), [&run_number, &trigger_stream](const RunMetaData& meta) {
82 return meta.run_number == run_number && meta.trigger_stream == trigger_stream;
83 });
84 if (itr == m_run_meta.end()) {
85 ATH_MSG_WARNING("No meta data information is available for " << run_number << ". Please check on which stream you're running");
86 m_run_meta.emplace_back(run_number, trigger_stream);
87 itr = m_run_meta.end() - 1;
88 }
89 itr->proc_events += 1;
90 itr->processed_blocks.insert(evtInfo->lumiBlock());
91 if (!itr->has_book_keeper) {
92 itr->total_lumi_blocks.insert(evtInfo->lumiBlock());
93 itr->tot_events += 1;
94 }
95 } else {
96 const unsigned int num_lhe = !m_storeLHE ? 1 : evtInfo->mcEventWeights().size();
97 for (unsigned int lhe_var = 0; lhe_var < num_lhe; ++lhe_var) {
98 std::vector<SimMetaData>::iterator itr =
99 std::find_if(m_sim_meta.begin(), m_sim_meta.end(), [&mc_channel, &run_number, &lhe_var](const SimMetaData& meta) {
100 return meta.mc_channel == mc_channel && meta.prw_channel == run_number && meta.variation_number == lhe_var;
101 });
102 if (itr == m_sim_meta.end()) {
103 ATH_MSG_WARNING("Failed to retrieve a proper meta data for dsid: " << mc_channel << " period: " << run_number
104 << " lhe weight: " << lhe_var);
105 m_sim_meta.emplace_back(mc_channel, run_number);
106 itr = m_sim_meta.end() - 1;
107 itr->weight_name = "IncompleteMetaData";
108 itr->variation_number = lhe_var;
109 }
110 itr->proc_events += 1;
111 if (itr->has_book_keeper) continue;
112 if (!itr->warned) {
113 ATH_MSG_WARNING("Cut book keeper has not been loaded for sample DSID: "
114 << itr->mc_channel << " period: " << itr->prw_channel << " lhe variation: " << lhe_var);
115 itr->warned = true;
116 }
117 itr->tot_events += 1;
118 const double weight = evtInfo->mcEventWeight(lhe_var);
119 itr->sum_w += weight;
120 itr->sum_w_squared += weight * weight;
121 }
122 }
123
124 return StatusCode::SUCCESS;
125}
126const xAOD::CutBookkeeper* MetaDataAlg::RetrieveCutBookKeeper(const std::string& Stream, const std::string& cbk_name) const {
127 const xAOD::CutBookkeeper* all = nullptr;
129 const xAOD::CutBookkeeperContainer* bks = nullptr;
130 if (!inputMetaStore()->retrieve(bks, "CutBookkeepers").isSuccess()) {
131 ATH_MSG_WARNING("Could not retrieve the CutBookKeeperContainer. Although it should be there");
132 return all;
133 }
134 int maxCycle = -1; // need to find the max cycle where input stream is StreamAOD and the name is AllExecutedEvents
135 for (const xAOD::CutBookkeeper* cbk : *bks) {
136 ATH_MSG_INFO("Check cutbook keeper "<<cbk->inputStream()<<" name: "<<cbk->name()<<" cycle: "<<cbk->cycle());
137 if (cbk->inputStream() == Stream && cbk->name() == cbk_name && cbk->cycle() > maxCycle) {
138 maxCycle = cbk->cycle();
139 all = cbk;
140 }
141 }
142 } else ATH_MSG_WARNING("The CutBookkeepers are not present in the file ");
143 if (!all) ATH_MSG_DEBUG("Failed to retrieve cut book keeper for Stream: "<<Stream<<" cbk_name: "<<cbk_name);
144 return all;
145}
147 //
148 // This method is called at the start of each input file, even if
149 // the input file contains no events. Accumulate metadata information here
150 //
151 const EventStreamInfo* esi = nullptr;
152 ATH_CHECK(inputMetaStore()->retrieve(esi));
153 if (esi->getEventTypes().size() > 1) { ATH_MSG_WARNING("There seem to be more event types than one"); }
154 if (esi->getEventTypes().size() == 0) {
155 ATH_MSG_FATAL("The EventTypes() container of the EventStreamInfo is empty! Something wrong with the input file?");
156 return StatusCode::FAILURE;
157 }
158
159 bool isData = !esi->getEventTypes().begin()->test(EventType::IS_SIMULATION);
160
161 const xAOD::FileMetaData* fmd = nullptr;
162 if (inputMetaStore()->contains<xAOD::FileMetaData>("FileMetaData")) ATH_CHECK(inputMetaStore()->retrieve(fmd, "FileMetaData"));
163 if (!fmd) {
164 ATH_MSG_WARNING("FileMetaData not found in input file, setting m_isDerivedAOD=false.");
165 // m_isDerivedAOD = false;
166 } else {
167 std::string dataType{};
168 if (!(fmd->value(xAOD::FileMetaData::MetaDataType::dataType, dataType))) {
169 ATH_MSG_WARNING("MetaDataType::dataType not found in xAOD::FileMetaData, setting m_isDerivedAOD=false.");
170 // m_isDerivedAOD = false;
171 }
172 ATH_MSG_DEBUG("Data type is " << dataType);
173 }
174 const xAOD::CutBookkeeper* all{nullptr};
175 std::string cbk_stream{};
176 using namespace std::literals;
177 for (const std::string & trial: {"StreamAOD"s, "StreamESD"s, "unknownStream"s }) {
178 all = RetrieveCutBookKeeper(trial);
179 cbk_stream = trial;
180 if (all) break;
181 }
182 const bool contains_keeper = all != nullptr;
183 if (!contains_keeper) {
184 ATH_MSG_WARNING("No Common CutBook keeper has been found");
185 }
187 if (isData) {
188 std::string trigger_stream{};
189 ATH_CHECK(AthAnalysisHelper::retrieveMetadata("/TagInfo", "triggerStreamOfFile", trigger_stream));
190 unsigned int run_number = (*esi->getRunNumbers().begin());
191 std::vector<RunMetaData>::iterator itr =
192 std::find_if(m_run_meta.begin(), m_run_meta.end(), [&run_number, &trigger_stream](const RunMetaData& meta) {
193 return meta.run_number == run_number && trigger_stream == meta.trigger_stream;
194 });
196 if (itr == m_run_meta.end()) {
197 m_run_meta.emplace_back(run_number, trigger_stream);
198 itr = m_run_meta.end() - 1;
199 }
200
202 for (const auto& Lumi : esi->getLumiBlockNumbers()) { itr->total_lumi_blocks.insert(Lumi); }
203 itr->has_book_keeper = contains_keeper;
204 if (contains_keeper) itr->tot_events += all->nAcceptedEvents();
205 } else {
206 int dsid = esi->getEventTypes().begin()->mc_channel_number();
207 unsigned int run = (*esi->getRunNumbers().begin());
208 ATH_MSG_DEBUG("DSID: "<<dsid<<" prw number: "<<run);
210 std::vector<std::string> weight_names{};
211 if (m_storeLHE) {
212 std::map<std::string, int> weight_map{};
213 AthAnalysisHelper::retrieveMetadata("/Generation/Parameters", "HepMCWeightNames", weight_map).isSuccess();
214 weight_names.resize(weight_map.size());
215 for (const auto& w_pair : weight_map) { weight_names[w_pair.second] = w_pair.first; }
216 if (weight_names.empty()) {
217 ATH_MSG_WARNING("No weight names extracted from the meta data ");
218 weight_names.push_back("");
219 }
220 } else
221 weight_names.push_back("");
222
223 for (unsigned int lhe_var = 0; lhe_var < weight_names.size(); ++lhe_var) {
224 const std::string& lhe_weight = weight_names[lhe_var];
225 std::vector<SimMetaData>::iterator itr =
226 std::find_if(m_sim_meta.begin(), m_sim_meta.end(), [&dsid, &run, &lhe_var](const SimMetaData& meta) {
227 return meta.mc_channel == dsid && meta.prw_channel == run && meta.variation_number == lhe_var;
228 });
229 if (itr == m_sim_meta.end()) {
230 m_sim_meta.emplace_back(dsid, run);
231 itr = m_sim_meta.end() - 1;
232 itr->weight_name = weight_names[lhe_var];
233 itr->variation_number = lhe_var;
234 if (m_hasPrwTool) itr->prw_lumi = m_prwTool->expert()->GetIntegratedLumi(run, 0, -1);
235 }
236
237 const xAOD::CutBookkeeper* mc_keeper = lhe_var == 0 ? all : nullptr;
238 if (lhe_var) {
239 std::vector<std::string> cb_names;
240 cb_names.emplace_back(lhe_weight);
241 cb_names.emplace_back("LHE3Weight_" + ReplaceExpInString(lhe_weight, ".", ""));
242 cb_names.push_back(ReplaceExpInString(cb_names.back(), " ", ""));
243 cb_names.emplace_back("AllExecutedEvents_NonNominalMCWeight_" + std::to_string(lhe_var));
244 for (const std::string& cb_name : cb_names) {
245 mc_keeper = RetrieveCutBookKeeper(cbk_stream, cb_name);
246 if (mc_keeper) {
247 ATH_MSG_DEBUG("Found LHE cut book keeper " << cb_name);
248 break;
249 }
250 }
251 }
252
253 itr->has_book_keeper = mc_keeper != nullptr;
254
255 if (itr->has_book_keeper) {
256 itr->tot_events += mc_keeper->nAcceptedEvents();
257 itr->sum_w += mc_keeper->sumOfEventWeights();
258 itr->sum_w_squared += mc_keeper->sumOfEventWeightsSquared();
259 }
260 }
261 }
262 std::sort(m_sim_meta.begin(), m_sim_meta.end());
263 std::sort(m_run_meta.begin(), m_run_meta.end());
264 if (m_sim_meta.empty() == m_run_meta.empty()) {
265 ATH_MSG_FATAL("Found run and simulation meta data");
266 return StatusCode::FAILURE;
267 }
268 if (m_run_meta.empty() == m_isData) {
269 ATH_MSG_FATAL("Metadata is inconsistent with the configuration");
270 return StatusCode::FAILURE;
271 }
272 return StatusCode::SUCCESS;
273}
275
276 ScalarBranch<Long64_t>& tot_ev {m_MetaDataTree->newScalar<Long64_t>("TotalEvents")};
277 ScalarBranch<Long64_t>& proc_ev {m_MetaDataTree->newScalar<Long64_t>("ProcessedEvents")};
278 ScalarBranch<unsigned int>& run_number{m_MetaDataTree->newScalar<unsigned int>("runNumber")};
279
280 SetBranch<unsigned int>& tot_lumi{m_MetaDataTree->newSet<unsigned int>("TotalLumiBlocks")};
281 SetBranch<unsigned int>& proc_lumi{m_MetaDataTree->newSet<unsigned int>("ProcessedLumiBlocks")};
282 ScalarBranch<std::string>& stream_name{m_MetaDataTree->newScalar<std::string>("triggerStream")};
283 ATH_CHECK(m_MetaDataTree->init(this));
284 for (const RunMetaData& meta : m_run_meta) {
285 run_number = meta.run_number;
286 tot_ev = meta.tot_events;
287 proc_ev = meta.proc_events;
288 stream_name = meta.trigger_stream;
289 tot_lumi = meta.total_lumi_blocks;
290 proc_lumi = meta.processed_blocks;
291 m_MetaDataTree->fill(Gaudi::Hive::currentContext());
292 }
293 return StatusCode::SUCCESS;
294}
296 m_MetaDataTree->newScalar<bool>("isAF2", m_isAF2);
297 ScalarBranch<Long64_t>& tot_ev {m_MetaDataTree->newScalar<Long64_t>("TotalEvents")};
298 ScalarBranch<Long64_t>& proc_ev {m_MetaDataTree->newScalar<Long64_t>("ProcessedEvents")};
299 ScalarBranch<unsigned int>& run_number{m_MetaDataTree->newScalar<unsigned int>("runNumber")};
300
301 ScalarBranch<double>& sum_w{m_MetaDataTree->newScalar<double>("TotalSumW")};
302 ScalarBranch<double>& sum_w2{m_MetaDataTree->newScalar<double>("TotalSumW2")};
303 ScalarBranch<double>& prw_lumi{m_MetaDataTree->newScalar<double>("prwLuminosity")};
304
305 ScalarBranch<int>& mc_dsid{m_MetaDataTree->newScalar<int>("mcChannelNumber")};
306 ScalarBranch<unsigned int>& lhe_var{m_MetaDataTree->newScalar<unsigned int>("LheId")};
307 ScalarBranch<std::string>& stream_name{m_MetaDataTree->newScalar<std::string>("LheWeightName")};
308
309 if (!m_hasPrwTool) m_MetaDataTree->disableBranch(prw_lumi.name());
310 ATH_CHECK(m_MetaDataTree->init(this));
311
312 for (const SimMetaData& meta : m_sim_meta) {
313 run_number = meta.prw_channel;
314 mc_dsid = meta.mc_channel;
315 lhe_var = meta.variation_number;
316
317 prw_lumi = meta.prw_lumi;
318 sum_w = meta.sum_w;
319 sum_w2 = meta.sum_w_squared;
320 stream_name = meta.weight_name;
321
322 tot_ev = meta.tot_events;
323 proc_ev = meta.proc_events;
324 m_MetaDataTree->fill(Gaudi::Hive::currentContext());
325 }
326 return StatusCode::SUCCESS;
327}
328}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
This file contains the class definition for the EventStreamInfo class.
Handle class for reading from StoreGate.
const ServiceHandle< StoreGateSvc > & inputMetaStore() const
Const accessor for the input metadata store.
static std::string retrieveMetadata(const std::string &folder, const std::string &key, const ServiceHandle< StoreGateSvc > &inputMetaStore)
method that always returns as a string you can use from, e.g, pyROOT with evt = ROOT....
This class provides the summary information stored for data written as a Event Stream.
const std::set< unsigned int > & getLumiBlockNumbers() const
const std::set< unsigned int > & getRunNumbers() const
const std::set< EventType > & getEventTypes() const
static const EventTypeCode IS_SIMULATION
true: IS_SIMULATION, false: IS_DATA
Definition EventType.h:156
static void setNumLHE(unsigned int numLHE) ATLAS_THREAD_SAFE
Specify the number of LHE variations that are available in the sample.
std::vector< SimMetaData > m_sim_meta
StatusCode beginInputFile() override
Function called when a new input file is opened user can read input metadata from inputMetaStore()
Gaudi::Property< bool > m_isData
Definition MetaDataAlg.h:32
const xAOD::CutBookkeeper * RetrieveCutBookKeeper(const std::string &stream, const std::string &cbk_name="AllExecutedEvents") const
StatusCode finalize() override
StatusCode fillSimulationTree()
StatusCode execute() override
StatusCode initialize() override
std::vector< RunMetaData > m_run_meta
std::unique_ptr< MuonTesterTree > m_MetaDataTree
Meta data tree object.
Definition MetaDataAlg.h:43
SG::ReadHandleKey< xAOD::EventInfo > m_infoKey
Definition MetaDataAlg.h:27
Gaudi::Property< bool > m_storeLHE
Store LHE weights.
Definition MetaDataAlg.h:38
Gaudi::Property< bool > m_isAF2
On AFII simulation.
Definition MetaDataAlg.h:36
StatusCode fillDataTree()
Gaudi::Property< bool > m_isDerivedAOD
Is derived DAOD property.
Definition MetaDataAlg.h:34
ToolHandle< CP::IPileupReweightingTool > m_prwTool
Definition MetaDataAlg.h:40
Gaudi::Property< std::string > m_stream
Output file stream.
Definition MetaDataAlg.h:29
std::string name() const override final
Returns the name of the branch.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
double sumOfEventWeightsSquared() const
Get the sum-of-(event-weights-squared) that this CutBookkeeper has seen.
double sumOfEventWeights() const
Get the sum-of-event-weights that this CutBookkeeper has seen.
uint64_t nAcceptedEvents() const
Get the number of accepted events that this CutBookkeeper has seen.
@ IS_SIMULATION
true: simulation, false: data
@ dataType
Data type that's in the file [string].
bool value(MetaDataType type, std::string &val) const
Get a pre-defined string value out of the object.
bool contains(const std::string &s, const std::string &regx)
does a string contain the substring
Definition hcg.cxx:114
std::string ReplaceExpInString(std::string str, const std::string &exp, const std::string &rep)
Replaces all expressions an string by something else.
Class to store array like branches into the n-tuples.
Definition HitValAlg.cxx:19
-diff
Definition run.py:1
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
CutBookkeeper_v1 CutBookkeeper
Define the latest version of the CutBookkeeper class.
FileMetaData_v1 FileMetaData
Declare the latest version of the class.
CutBookkeeperContainer_v1 CutBookkeeperContainer
Define the latest version of the CutBookkeeperContainer class.
Helper structs to cache the meta-data for simulation and recorded data.
Definition MetaDataAlg.h:47