ATLAS Offline Software
Loading...
Searching...
No Matches
EventFormatMetaDataTool.cxx
Go to the documentation of this file.
1// Dear emacs, this is -*- c++ -*-
2/* Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration */
3
4
5// System include(s):
6#include <algorithm>
7#include <stdexcept>
8#include <utility>
9#include <vector>
10
11// Gaudi/Athena include(s):
13
14// Local include(s):
16
17namespace xAODMaker {
18
19
21 const std::string& name,
22 const IInterface* parent):
23 base_class(type, name, parent) { }
24
25StatusCode
27 // Greet the user:
28 ATH_MSG_VERBOSE("Initialising");
31 if (!m_keys.empty()) {
32 ATH_MSG_VERBOSE("Asked to copy EventFormat with keys:");
33 for (const std::string& key : m_keys) {
34 ATH_MSG_VERBOSE(" - " << key);
35 }
36 }
37
38 // Connect to the metadata stores:
39 ATH_CHECK(m_inputMetaStore.retrieve());
40 ATH_CHECK(m_outputMetaStore.retrieve());
41
42 // Return gracefully:
43 return StatusCode::SUCCESS;
44 }
45
46StatusCode
48 // lock the tool, so metaDataStop will wait for write to finish
49 std::lock_guard< std::mutex > guard(m_outputMutex);
50
51 // Create object to hold information from the new file
52 auto format = std::make_unique< xAOD::EventFormat >();
53
55
56 return StatusCode::SUCCESS;
57 }
58
59StatusCode
61 // wait for threads currently writing to finish
62 std::lock_guard< std::mutex > guard(m_outputMutex);
63
64 return StatusCode::SUCCESS;
65 }
66
67StatusCode
69
70 std::vector< std::string > keys = m_keys;
71 if (keys.empty()) {
73 } else {
74 // remove keys not in the InputMetaDataStore
75 keys.erase(
77 keys.begin(), keys.end(),
78 [this](std::string& key) {
79 return !m_inputMetaStore->contains<xAOD::EventFormat>(key);
80 }),
81 keys.end());
82 }
83
84 // If the input file doesn't have any event format metadata,
85 // then finish right away:
86 if (keys.empty()) return StatusCode::SUCCESS;
87
88 // Retrieve the input container:
89 for (const std::string& key : keys) {
90 const xAOD::EventFormat* input = nullptr;
91 if (!m_inputMetaStore->retrieve(input, key).isSuccess()) {
92 ATH_MSG_DEBUG("Failed to retrieve \"" << key << "\" from InputMetaDataStore");
93 continue; // try next key
94 }
95
96 // get output object
97 auto output = m_outputMetaStore->tryRetrieve<xAOD::EventFormat>(key);
98 if (!output) {
99 auto ef = std::make_unique<xAOD::EventFormat>();
100 output = ef.get();
101 if (!m_outputMetaStore->record(std::move(ef), key).isSuccess()) {
102 ATH_MSG_DEBUG("Failed to create output object \""
103 << key << "\" in MetaDataSvc");
104 continue;
105 }
106 }
107
108 ATH_MSG_VERBOSE("Merging of " << key);
109 // Merge the new object into the output one:
110 for (const auto& pair : *input) {
111 if (!output->exists(pair.second.hash())) {
112 output->add(pair.second);
113 }
114 }
115 }
116
117 // Return gracefully:
118 return StatusCode::SUCCESS;
119 }
120
121} // namespace xAODMaker
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_VERBOSE(x,...)
Helpers for checking error return status codes and reporting errors.
STL class.
ServiceHandle< IAthMetaDataSvc > m_outputMetaStore
Connection to the output metadata store.
ServiceHandle< ::StoreGateSvc > m_inputMetaStore
Connection to the input metadata store.
std::mutex m_outputMutex
MetaDataStop need to wait for ongoing writes.
virtual StatusCode initialize() override
Function initialising the tool.
virtual StatusCode metaDataStop() override
Wait for metadata write operations to finish, then return SUCCESS.
StatusCode collectMetaData()
Function collecting the event format metadata from the input file.
EventFormatMetaDataTool(const std::string &type, const std::string &name, const IInterface *parent)
Regular AlgTool constructor.
virtual StatusCode beginInputFile()
Function called when a new input file is opened.
Gaudi::Property< std::vector< std::string > > m_keys
(optional) list of keys to copy, all if empty, default: empty
DataModel_detail::iterator< DVL > remove_if(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end, Predicate pred)
Specialization of remove_if for DataVector/List.
EventFormat_v1 EventFormat
Definition of the current event format version.
Definition EventFormat.h:16