ATLAS Offline Software
Loading...
Searching...
No Matches
MakeEventStreamInfo.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
9
10#include "MakeEventStreamInfo.h"
11
12#include "GaudiKernel/IAlgorithm.h"
13
18
19//___________________________________________________________________________
21 const std::string& name,
22 const IInterface* parent) : base_class(type, name, parent)
23{
24}
25//___________________________________________________________________________
27 ATH_MSG_DEBUG("Initializing " << name());
28 // Locate the MetaDataStore
29 ATH_CHECK(m_metaDataSvc.retrieve());
30 ATH_CHECK(m_eventStore.retrieve());
31
32 // Autoconfigure data header key
33 if (m_dataHeaderKey.empty()){
34 if (const auto* parentAlg = dynamic_cast<const IAlgorithm*>(this->parent()); parentAlg) {
35 m_dataHeaderKey.setValue(parentAlg->name());
36 } else {
37 ATH_MSG_ERROR("Unable to get parent Algorithm");
38 return StatusCode::FAILURE;
39 }
40 }
41
42 return StatusCode::SUCCESS;
43}
44//___________________________________________________________________________
46 // Remove EventStreamInfo with same key if it exists
47 bool ignoreIfAbsent = true;
48 if( !m_metaDataSvc->remove<EventStreamInfo>(m_key.value(), ignoreIfAbsent).isSuccess() ) {
49 ATH_MSG_ERROR("Unable to remove EventStreamInfo with key " << m_key.value());
50 return StatusCode::FAILURE;
51 }
52 return StatusCode::SUCCESS;
53}
54//___________________________________________________________________________
56 return StatusCode::SUCCESS;
57}
58//___________________________________________________________________________
60 return StatusCode::SUCCESS;
61}
62//___________________________________________________________________________
65 if (!dataHeader.isValid()) {
66 return StatusCode::SUCCESS;
67 }
68 // Retrieve the EventInfo object
69 EventType evtype;
70 unsigned long long runN = 0;
71 unsigned lumiN = 0;
73 if (xEventInfo.isValid()) {
74 runN = xEventInfo->runNumber();
75 lumiN = xEventInfo->lumiBlock();
76 evtype = eventTypeFromxAOD(xEventInfo.get());
77 } else {
78 ATH_MSG_ERROR("Unable to retrieve xAOD::EventInfo object");
79 return StatusCode::FAILURE;
80 }
81
82 EventStreamInfo* pEventStream = m_metaDataSvc->tryRetrieve<EventStreamInfo>(m_key.value());
83 if( !pEventStream ) {
84 auto esinfo_up = std::make_unique<EventStreamInfo>();
85 pEventStream = esinfo_up.get();
86 if( m_metaDataSvc->record(std::move(esinfo_up), m_key.value()).isFailure() ) {
87 ATH_MSG_ERROR("Could not register EventStreamInfo object");
88 return StatusCode::FAILURE;
89 }
90 }
91 static std::once_flag resetNumberOfEventsFlag;
92 std::call_once(resetNumberOfEventsFlag, [this, pEventStream]() -> void {
93 ATH_MSG_DEBUG("Resetting the EventStreamInfo payload at the first event");
94 pEventStream->reset();
95 });
96 pEventStream->addEvent();
97 pEventStream->insertProcessingTag(dataHeader->getProcessTag());
98 pEventStream->insertLumiBlockNumber( lumiN );
99 pEventStream->insertRunNumber( runN );
100 for (const DataHeaderElement& dhe : *dataHeader) {
101 pEventStream->insertItemList(dhe.getPrimaryClassID(), dhe.getKey());
102 }
103 pEventStream->insertEventType( evtype );
104
106
107 return StatusCode::SUCCESS;
108}
109//___________________________________________________________________________
111 EventStreamInfo* pEventStream = m_metaDataSvc->tryRetrieve<EventStreamInfo>(m_key.value());
112 if (!pEventStream) {
113 auto esinfo_up = std::make_unique<EventStreamInfo>();
114 pEventStream = esinfo_up.get();
115 ATH_CHECK(m_metaDataSvc->record(std::move(esinfo_up), m_key.value()));
116 }
117 if (m_eventCounter > 0 &&
118 m_eventCounter < pEventStream->getNumberOfEvents()) {
119 // The number of events that have been processed by MakeEventStreamInfo
120 // tool is less than the number of events in already existing
121 // EventStreamInfo object. This can happen if the EventStreamInfo object was
122 // updated by CopyEventStreamInfo, for example at beginning of reading the
123 // 2nd (or next) file.
125 "Event count mismatch in EventStreamInfo (likely due to "
126 "multi-file processing). MakeEventStreamInfo processed: "
127 << m_eventCounter << " events, existing EventStreamInfo object has "
128 << pEventStream->getNumberOfEvents()
129 << " events. Setting number of events to what "
130 "MakeEventStreamInfo processed.");
131 pEventStream->setNumberOfEvents(m_eventCounter);
132 } else {
133 // Insert processing tags when no events have been processed
134 pEventStream->insertProcessingTag(m_dataHeaderKey.value());
135 }
136 return (StatusCode::SUCCESS);
137}
138//___________________________________________________________________________
140 ATH_MSG_DEBUG("in finalize()");
141 return StatusCode::SUCCESS;
142}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)
This file contains the class definition for the DataHeader and DataHeaderElement classes.
EventType eventTypeFromxAOD(const xAOD::EventInfo *xaod)
Create EventType object from xAOD::EventInfo.
This file contains the class definition for the EventStreamInfo class.
This file contains the class definition for the MakeEventStreamInfo class.
This class provides a persistent form for the TransientAddress.
Definition DataHeader.h:37
This class provides the summary information stored for data written as a Event Stream.
void insertEventType(const EventType &event)
Insert new Event Type into a set.
void insertLumiBlockNumber(unsigned int lumiBlock)
Insert new Luminosity Block Number into a set.
void insertRunNumber(unsigned int run)
Insert new Run Number into a set.
void addEvent(unsigned int number=1)
Increase Event Counter.
void insertProcessingTag(const std::string &process)
Insert new Processing Tag into a set.
void insertItemList(CLID type, const std::string &key)
Insert new ItemList Entry into a set.
unsigned int getNumberOfEvents() const
void setNumberOfEvents(unsigned int number)
Set number of events.
This class represents the "type of event" where the type is given by one or more "characteristics".
Definition EventType.h:92
MakeEventStreamInfo(const std::string &type, const std::string &name, const IInterface *parent)
Standard AlgTool Constructor.
Gaudi::Property< std::string > m_key
Key, the StoreGate key for the EventStreamInfo object.
ServiceHandle< StoreGateSvc > m_eventStore
virtual StatusCode finalize() override
Called at the end of AthenaOutputStream::finalize() (via release()).
Gaudi::Property< std::string > m_eventInfoKey
Key, the StoreGate key for the xAOD::EventInfo object.
ServiceHandle< IAthMetaDataSvc > m_metaDataSvc
Pointer to the data stores.
virtual StatusCode preFinalize() override
Called at the beginning of AthenaOutputStream::finalize().
Gaudi::Property< std::string > m_dataHeaderKey
Name of DataHeader key.
virtual StatusCode preStream() override
Called before actually streaming objects.
virtual StatusCode postExecute() override
Called at the end of AthenaOutputStream::execute().
virtual StatusCode initialize() override
Required of all IAthenaOutputTools: Called by AthenaOutputStream::initialize() (via ToolSvc retrieve(...
std::atomic< unsigned int > m_eventCounter
Counter of the events in the stream.
virtual StatusCode preExecute() override
Called at the beginning of AthenaOutputStream::execute().
virtual StatusCode postInitialize() override
Called at the end of AthenaOutputStream::initialize().
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type get() const
Dereference the pointer, but don't cache anything.