ATLAS Offline Software
Loading...
Searching...
No Matches
EventSelectorAthenaPool Class Reference

This class is the EventSelector for event data. More...

#include <EventSelectorAthenaPool.h>

Inheritance diagram for EventSelectorAthenaPool:

Public Member Functions

 EventSelectorAthenaPool (const std::string &name, ISvcLocator *pSvcLocator)
 Standard Service Constructor.
virtual ~EventSelectorAthenaPool ()
 Destructor.
virtual StatusCode initialize () override
 Required of all Gaudi Services.
virtual StatusCode start () override
virtual StatusCode stop () override
virtual StatusCode finalize () override
virtual StatusCode createContext (IEvtSelector::Context *&ctxt) const override
 create context
virtual StatusCode next (IEvtSelector::Context &ctxt) const override
virtual StatusCode next (IEvtSelector::Context &ctxt, int jump) const override
virtual StatusCode previous (IEvtSelector::Context &ctxt) const override
virtual StatusCode previous (IEvtSelector::Context &ctxt, int jump) const override
virtual StatusCode last (IEvtSelector::Context &ctxt) const override
virtual StatusCode rewind (IEvtSelector::Context &ctxt) const override
virtual StatusCode createAddress (const IEvtSelector::Context &ctxt, IOpaqueAddress *&iop) const override
virtual StatusCode releaseContext (IEvtSelector::Context *&ctxt) const override
virtual StatusCode resetCriteria (const std::string &criteria, IEvtSelector::Context &ctxt) const override
 Set a selection criteria.
virtual StatusCode seek (Context &ctxt, int evtnum) const override
 Seek to a given event number.
virtual int curEvent (const Context &ctxt) const override
 Return the current event number.
virtual int size (Context &ctxt) const override
 Return the size of the collection.
virtual StatusCode io_reinit () override
 Callback method to reinitialize the internal state of the component for I/O purposes (e.g. upon fork(2)).
virtual StatusCode io_finalize () override
 Callback method to finalize the internal state of the component for I/O purposes (e.g. before fork(2)).
virtual void handle (const Incident &incident) override
 Incident service handle listening for BeginProcessing and EndProcessing.

Protected Member Functions

virtual StatusCode nextHandleFileTransition (IEvtSelector::Context &ctxt) const override
 Handle file transition at the next iteration.
virtual StatusCode nextWithSkip (IEvtSelector::Context &ctxt) const override
 Go to next event and skip if necessary.
virtual StatusCode recordAttributeList () const override
 Record AttributeList in StoreGate.
virtual StatusCode fillAttributeList (coral::AttributeList *attrList, const std::string &suffix, bool copySource) const override
 Fill AttributeList with specific items from the selector and a suffix.
virtual bool disconnectIfFinished (const SG::SourceID &fid) const override
 Disconnect DB if all events from the source FID were processed and the Selector moved to another file.

Private Types

typedef std::mutex CallMutex

Private Member Functions

StoreGateSvc * eventStore () const
 Return pointer to active event SG.
StatusCode reinit () const
 Reinitialize the service when a fork() occurred/was-issued.
std::unique_ptr< PoolCollectionConverter > getCollectionCnv (bool throwIncidents=false) const
 Return pointer to new PoolCollectionConverter.
int findEvent (int evtNum) const
 Search for event with number evtNum.
void inputCollectionsHandler (Gaudi::Details::PropertyBase &)

Private Attributes

EventContextAthenaPool * m_endIter {}
std::unique_ptr< PoolCollectionConverter > m_poolCollectionConverter ATLAS_THREAD_SAFE {}
std::unique_ptr< pool::ICollectionCursor > m_headerIterator ATLAS_THREAD_SAFE {}
Guid m_guid ATLAS_THREAD_SAFE {}
std::map< SG::SourceID, int > m_activeEventsPerSource ATLAS_THREAD_SAFE
std::optional< InputFileIncidentGuard > m_inputFileGuard ATLAS_THREAD_SAFE
 RAII guard: guarantees a matching EndInputFile for every BeginInputFile.
ServiceHandle< IAthenaPoolCnvSvc > m_athenaPoolCnvSvc {this, "ConversionService", "AthenaPoolCnvSvc", ""}
ServiceHandle< IPoolSvc > m_poolSvc {this, "PoolSvc", "PoolSvc", ""}
ServiceHandle< IIncidentSvc > m_incidentSvc {this, "IncidentSvc", "IncidentSvc", ""}
Gaudi::Property< bool > m_isSecondary {this, "IsSecondary", false, ""}
 IsSecondary, know if this is an instance of secondary event selector.
Gaudi::Property< bool > m_processMetadata {this, "ProcessMetadata", true, ""}
 ProcessMetadata, switch on firing of FileIncidents which will trigger processing of metadata: default = true.
std::string m_attrListKey {"Input"}
 AttributeList SG key.
Gaudi::Property< std::vector< std::string > > m_inputCollectionsProp {this, "InputCollections", {}, ""}
 InputCollections, vector with names of the input collections.
std::vector< std::string >::const_iterator m_inputCollectionsIterator ATLAS_THREAD_SAFE
bool m_inputCollectionsChanged ATLAS_THREAD_SAFE
 flag to notify the EvSel that the inputs were changed and reinit() needs to be called ASAP
Gaudi::Property< bool > m_keepInputFilesOpen {this, "KeepInputFilesOpen", false, ""}
 KeepInputFilesOpen, boolean flag to keep files open after PoolCollection reaches end: default = false.
ToolHandleArray< IAthenaSelectorTool > m_helperTools ATLAS_THREAD_SAFE {this, "HelperTools", {}, ""}
 HelperTools, vector of names of AlgTools that are executed by the EventSelector.
ToolHandle< IAthenaSelectorTool > m_counterTool {this, "CounterTool", "", ""}
Gaudi::CheckedProperty< uint32_t > m_runNo {this, "RunNumber", 0, ""}
 The following are included for compatibility with McEventSelector and are not really used.
Gaudi::CheckedProperty< uint32_t > m_oldRunNo {this, "OldRunNumber", 0, ""}
Gaudi::Property< bool > m_overrideRunNumber {this, "OverrideRunNumber", false, ""}
Gaudi::Property< bool > m_overrideRunNumberFromInput {this, "OverrideRunNumberFromInput", false, ""}
Gaudi::CheckedProperty< uint64_t > m_firstEventNo {this, "FirstEvent", 1, ""}
Gaudi::CheckedProperty< uint64_t > m_eventsPerRun {this, "EventsPerRun", 1000000, ""}
Gaudi::CheckedProperty< uint32_t > m_firstLBNo {this, "FirstLB", 0, ""}
Gaudi::CheckedProperty< uint32_t > m_eventsPerLB {this, "EventsPerLB", 1000, ""}
Gaudi::CheckedProperty< uint32_t > m_initTimeStamp {this, "InitialTimeStamp", 0, ""}
Gaudi::Property< uint32_t > m_timeStampInterval {this, "TimeStampInterval", 0, ""}
std::atomic_long m_curCollection {}
std::vector< int > m_numEvt ATLAS_THREAD_SAFE
std::vector< int > m_firstEvt ATLAS_THREAD_SAFE
Gaudi::Property< int > m_skipEvents {this, "SkipEvents", 0, ""}
 SkipEvents, numbers of events to skip: default = 0.
Gaudi::Property< std::vector< long > > m_skipEventSequenceProp {this, "SkipEventSequence", {}, ""}
Gaudi::Property< std::string > m_skipEventRangesProp {this, "SkipEventRanges", {}, ""}
 Skip Events - comma separated list of event to skip, ranges with '-': <start> - <end>.
std::vector< std::pair< long, long > > m_skipEventRanges ATLAS_THREAD_SAFE
std::atomic_int m_evtCount {}
std::atomic_bool m_firedIncident {}
CallMutex m_callLock
SG::SlotSpecificObj< SG::SourceID > m_sourceID

Friends

class DoubleEventSelectorAthenaPool
 make the DoubleEventSelectorAthenaPool a friend so it can access the internal EventSelectorAthenaPool methods and members
class EventSelectorAthenaPoolSharedIO
 make the EventSelectorAthenaPoolSharedIO a friend so it can access the internal EventSelectorAthenaPool methods and members

Detailed Description

This class is the EventSelector for event data.

Definition at line 51 of file EventSelectorAthenaPool.h.

Member Typedef Documentation

◆ CallMutex

typedef std::mutex EventSelectorAthenaPool::CallMutex
private

Definition at line 220 of file EventSelectorAthenaPool.h.

Constructor & Destructor Documentation

◆ EventSelectorAthenaPool()

EventSelectorAthenaPool::EventSelectorAthenaPool ( const std::string & name,
ISvcLocator * pSvcLocator )

Standard Service Constructor.

Definition at line 44 of file EventSelectorAthenaPool.cxx.

44 :
45 base_class(name, pSvcLocator)
46{
47 // TODO: validate if those are even used
48 m_runNo.verifier().setLower(0);
49 m_oldRunNo.verifier().setLower(0);
50 m_eventsPerRun.verifier().setLower(0);
51 m_firstEventNo.verifier().setLower(1);
52 m_firstLBNo.verifier().setLower(0);
53 m_eventsPerLB.verifier().setLower(0);
54 m_initTimeStamp.verifier().setLower(0);
55
57 m_inputCollectionsChanged = false;
58}
Gaudi::CheckedProperty< uint64_t > m_firstEventNo
Gaudi::CheckedProperty< uint32_t > m_initTimeStamp
void inputCollectionsHandler(Gaudi::Details::PropertyBase &)
Gaudi::CheckedProperty< uint64_t > m_eventsPerRun
Gaudi::CheckedProperty< uint32_t > m_eventsPerLB
Gaudi::CheckedProperty< uint32_t > m_oldRunNo
Gaudi::Property< std::vector< std::string > > m_inputCollectionsProp
InputCollections, vector with names of the input collections.
Gaudi::CheckedProperty< uint32_t > m_runNo
The following are included for compatibility with McEventSelector and are not really used.
Gaudi::CheckedProperty< uint32_t > m_firstLBNo

◆ ~EventSelectorAthenaPool()

EventSelectorAthenaPool::~EventSelectorAthenaPool ( )
virtual

Destructor.

Definition at line 66 of file EventSelectorAthenaPool.cxx.

66 {
67}

Member Function Documentation

◆ createAddress()

StatusCode EventSelectorAthenaPool::createAddress ( const IEvtSelector::Context & ctxt,
IOpaqueAddress *& iop ) const
overridevirtual
Parameters
ctxt[IN] current event context.
iop[OUT] pointer to IOpaqueAddress reference of selection context.

Definition at line 557 of file EventSelectorAthenaPool.cxx.

558 {
559 std::string tokenStr;
560 SG::ReadHandle<AthenaAttributeList> attrList(m_attrListKey, eventStore()->name());
561 if (attrList.isValid()) {
562 try {
563 tokenStr = (*attrList)["eventRef"].data<std::string>();
564 ATH_MSG_DEBUG("found AthenaAttribute, name = eventRef = " << tokenStr);
565 } catch (std::exception &e) {
566 ATH_MSG_ERROR(e.what());
567 return StatusCode::FAILURE;
568 }
569 } else {
570 ATH_MSG_WARNING("Cannot find AthenaAttribute, key = " << m_attrListKey);
571 tokenStr = m_headerIterator->eventRef().toString();
572 }
573 auto token = std::make_unique<Token>();
574 token->fromString(tokenStr);
575 m_incidentSvc->fireIncident(Incident(tokenStr, "ProcessEventAttributes"));
576 iop = new TokenAddress(pool::POOL_StorageType.type(), ClassID_traits<DataHeader>::ID(), "", "EventSelector", IPoolSvc::kInputStream, std::move(token));
577 return StatusCode::SUCCESS;
578}
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
StoreGateSvc * eventStore() const
Return pointer to active event SG.
ServiceHandle< IIncidentSvc > m_incidentSvc
std::string m_attrListKey
AttributeList SG key.
@ kInputStream
Definition IPoolSvc.h:39
static const DbType POOL_StorageType
Definition DbType.h:84

◆ createContext()

StatusCode EventSelectorAthenaPool::createContext ( IEvtSelector::Context *& ctxt) const
overridevirtual

create context

Definition at line 342 of file EventSelectorAthenaPool.cxx.

342 {
343 ctxt = new EventContextAthenaPool(this);
344 return StatusCode::SUCCESS;
345}

◆ curEvent()

int EventSelectorAthenaPool::curEvent ( const Context & ctxt) const
overridevirtual

Return the current event number.

Parameters
ctxt[IN/OUT] current event context.

Definition at line 651 of file EventSelectorAthenaPool.cxx.

651 {
652 return(m_evtCount);
653}

◆ disconnectIfFinished()

bool EventSelectorAthenaPool::disconnectIfFinished ( const SG::SourceID & fid) const
overrideprotectedvirtual

Disconnect DB if all events from the source FID were processed and the Selector moved to another file.

Definition at line 888 of file EventSelectorAthenaPool.cxx.

889{
890 if( m_activeEventsPerSource.find(fid) != m_activeEventsPerSource.end()
891 && m_activeEventsPerSource[fid] <= 0 && m_guid != fid ) {
892 // Explicitly disconnect file corresponding to old FID to release memory.
893 // EndInputFile is handled by the InputFileIncidentGuard.
894 if( !m_keepInputFilesOpen.value() ) {
895 ATH_MSG_INFO("Disconnecting input sourceID: " << fid );
896 m_poolSvc->disconnectDb("FID:" + fid, IPoolSvc::kInputStream).ignore();
897 m_activeEventsPerSource.erase( fid );
898 return true;
899 }
900 }
901 return false;
902}
#define ATH_MSG_INFO(x,...)
ServiceHandle< IPoolSvc > m_poolSvc
Gaudi::Property< bool > m_keepInputFilesOpen
KeepInputFilesOpen, boolean flag to keep files open after PoolCollection reaches end: default = false...

◆ eventStore()

StoreGateSvc * EventSelectorAthenaPool::eventStore ( ) const
private

Return pointer to active event SG.

Definition at line 69 of file EventSelectorAthenaPool.cxx.

69 {
71}
static StoreGateSvc * currentStoreGate()
get current StoreGate

◆ fillAttributeList()

StatusCode EventSelectorAthenaPool::fillAttributeList ( coral::AttributeList * attrList,
const std::string & suffix,
bool copySource ) const
overrideprotectedvirtual

Fill AttributeList with specific items from the selector and a suffix.

Definition at line 760 of file EventSelectorAthenaPool.cxx.

761{
762 const auto& row = m_headerIterator->currentRow();
763 attrList->extend( row.tokenName() + suffix, "string" );
764 (*attrList)[ row.tokenName() + suffix ].data<std::string>() = row.token().toString();
765 ATH_MSG_DEBUG("record AthenaAttribute, name = " << row.tokenName() + suffix << " = " << row.token().toString() << ".");
766
767 std::string eventRef = "eventRef";
768 if (m_isSecondary.value()) {
769 eventRef.append(suffix);
770 }
771 attrList->extend(eventRef, "string");
772 (*attrList)[eventRef].data<std::string>() = m_headerIterator->eventRef().toString();
773 ATH_MSG_DEBUG("record AthenaAttribute, name = " + eventRef + " = " << m_headerIterator->eventRef().toString() << ".");
774
775 if (copySource) {
776 const coral::AttributeList& sourceAttrList = m_headerIterator->currentRow().attributeList();
777 for (const auto &attr : sourceAttrList) {
778 attrList->extend(attr.specification().name() + suffix, attr.specification().type());
779 (*attrList)[attr.specification().name() + suffix] = attr;
780 }
781 }
782
783 return StatusCode::SUCCESS;
784}
Gaudi::Property< bool > m_isSecondary
IsSecondary, know if this is an instance of secondary event selector.
row
Appending html table to final .html summary file.

◆ finalize()

StatusCode EventSelectorAthenaPool::finalize ( )
overridevirtual

Definition at line 323 of file EventSelectorAthenaPool.cxx.

323 {
324 if (!m_counterTool.empty() && !m_counterTool->preFinalize().isSuccess()) {
325 ATH_MSG_WARNING("Failed to preFinalize() CounterTool");
326 }
327 for (auto& tool : m_helperTools) {
328 if (!tool->preFinalize().isSuccess()) {
329 ATH_MSG_WARNING("Failed to preFinalize() " << tool->name());
330 }
331 }
332 delete m_endIter; m_endIter = nullptr;
333 m_headerIterator = nullptr;
334 if (m_poolCollectionConverter) {
335 m_poolCollectionConverter.reset();
336 }
337 // Finalize the Service base class.
338 return ::AthService::finalize();
339}
ToolHandle< IAthenaSelectorTool > m_counterTool
EventContextAthenaPool * m_endIter

◆ findEvent()

int EventSelectorAthenaPool::findEvent ( int evtNum) const
private

Search for event with number evtNum.

Definition at line 659 of file EventSelectorAthenaPool.cxx.

659 {
660 for (std::size_t i = 0, imax = m_numEvt.size(); i < imax; i++) {
661 if (m_numEvt[i] == -1) {
662 PoolCollectionConverter pcc(
663 m_inputCollectionsProp.value()[i],
665 m_poolSvc.get());
666 if (!pcc.initialize().isSuccess()) {
667 break;
668 }
669 int collection_size = 0;
670 if (pcc.isValid()) {
671 std::unique_ptr<pool::ICollectionCursor> hi = pcc.selectAll();
672 collection_size = hi->size();
673 }
674 else {
675 ATH_MSG_ERROR( pcc.lastError() );
676 }
677 if (i > 0) {
678 m_firstEvt[i] = m_firstEvt[i - 1] + m_numEvt[i - 1];
679 } else {
680 m_firstEvt[i] = 0;
681 }
682 m_numEvt[i] = collection_size;
683 }
684 if (evtNum >= m_firstEvt[i] && evtNum < m_firstEvt[i] + m_numEvt[i]) {
685 return(i);
686 }
687 }
688 return(-1);
689}
int imax(int i, int j)

◆ getCollectionCnv()

std::unique_ptr< PoolCollectionConverter > EventSelectorAthenaPool::getCollectionCnv ( bool throwIncidents = false) const
private

Return pointer to new PoolCollectionConverter.

Definition at line 699 of file EventSelectorAthenaPool.cxx.

699 {
700 while (m_inputCollectionsIterator != m_inputCollectionsProp.value().end()) {
701 if (m_curCollection != 0) {
702 m_numEvt[m_curCollection] = m_evtCount - m_firstEvt[m_curCollection];
704 m_firstEvt[m_curCollection] = m_evtCount;
705 }
706 ATH_MSG_DEBUG("Try item: \"" << *m_inputCollectionsIterator << "\" from the collection list.");
707 auto pCollCnv = std::make_unique<PoolCollectionConverter>(
708 *m_inputCollectionsIterator,
710 m_poolSvc.get());
711 StatusCode status = pCollCnv->initialize();
712 if (!status.isSuccess()) {
713 // Close previous collection.
714 pCollCnv.reset();
715 if (!status.isRecoverable()) {
716 ATH_MSG_ERROR("Unable to initialize PoolCollectionConverter.");
717 throw GaudiException("Unable to read: " + *m_inputCollectionsIterator, name(), StatusCode::FAILURE);
718 } else {
719 ATH_MSG_ERROR("Unable to open: " << *m_inputCollectionsIterator);
720 throw GaudiException("Unable to open: " + *m_inputCollectionsIterator, name(), StatusCode::FAILURE);
721 }
722 } else {
723 if (!pCollCnv->isValid().isSuccess()) {
724 pCollCnv.reset();
725 ATH_MSG_DEBUG("No events found in: " << *m_inputCollectionsIterator << " skipped!!!");
726 if (throwIncidents && m_processMetadata.value()) {
727 // Scoped guard: fires BeginInputFile now, EndInputFile at scope exit
729 *m_inputCollectionsIterator, {},
730 "eventless " + *m_inputCollectionsIterator);
731 }
732 m_poolSvc->disconnectDb(*m_inputCollectionsIterator).ignore();
733 ++m_inputCollectionsIterator;
734 } else {
735 return(pCollCnv);
736 }
737 }
738 }
739 return(nullptr);
740}
Gaudi::Property< bool > m_processMetadata
ProcessMetadata, switch on firing of FileIncidents which will trigger processing of metadata: default...
static InputFileIncidentGuard begin(IIncidentSvc &incSvc, std::string_view source, std::string_view beginFileName, std::string_view guid, std::string_view endFileName={}, std::string_view beginType=IncidentType::BeginInputFile, std::string_view endType=IncidentType::EndInputFile)
Factory: fire the begin incident and return a guard whose destructor fires the matching end incident.
::StatusCode StatusCode
StatusCode definition for legacy code.
status
Definition merge.py:16

◆ handle()

void EventSelectorAthenaPool::handle ( const Incident & incident)
overridevirtual

Incident service handle listening for BeginProcessing and EndProcessing.

Reimplemented in DoubleEventSelectorAthenaPool.

Definition at line 847 of file EventSelectorAthenaPool.cxx.

848{
849 SG::SourceID fid;
850 if (inc.type() == IncidentType::BeginProcessing) {
851 if ( Atlas::hasExtendedEventContext(inc.context()) ) {
852 fid = Atlas::getExtendedEventContext(inc.context()).proxy()->sourceID();
853 }
854 *m_sourceID.get(inc.context()) = fid;
855 }
856 else {
857 fid = *m_sourceID.get(inc.context());
858 }
859
860 if( fid.empty() ) {
861 ATH_MSG_WARNING("could not read event source ID from incident event context");
862 return;
863 }
864 if( m_activeEventsPerSource.find( fid ) == m_activeEventsPerSource.end()) {
865 ATH_MSG_DEBUG("Incident handler ignoring unknown input FID: " << fid );
866 return;
867 }
868 ATH_MSG_DEBUG("** MN Incident handler " << inc.type() << " Event source ID=" << fid );
869 if( inc.type() == IncidentType::BeginProcessing ) {
870 // increment the events-per-file counter for FID
871 m_activeEventsPerSource[fid]++;
872 } else if( inc.type() == IncidentType::EndProcessing ) {
873 m_activeEventsPerSource[fid]--;
875 *m_sourceID.get(inc.context()) = "";
876 }
877 if( msgLvl(MSG::DEBUG) ) {
878 for( auto& source: m_activeEventsPerSource )
879 msg(MSG::DEBUG) << "SourceID: " << source.first << " active events: " << source.second << endmsg;
880 }
881}
#define endmsg
SG::SlotSpecificObj< SG::SourceID > m_sourceID
virtual bool disconnectIfFinished(const SG::SourceID &fid) const override
Disconnect DB if all events from the source FID were processed and the Selector moved to another file...
const ExtendedEventContext & getExtendedEventContext(const EventContext &ctx)
Retrieve an extended context from a context object.
bool hasExtendedEventContext(const EventContext &ctx)
Test whether a context object has an extended context installed.
MsgStream & msg
Definition testRead.cxx:32

◆ initialize()

StatusCode EventSelectorAthenaPool::initialize ( )
overridevirtual

Required of all Gaudi Services.

Reimplemented in DoubleEventSelectorAthenaPool.

Definition at line 73 of file EventSelectorAthenaPool.cxx.

73 {
74
75 m_autoRetrieveTools = false;
76 m_checkToolDeps = false;
77
78 if (m_isSecondary.value()) {
79 ATH_MSG_DEBUG("Initializing secondary event selector " << name());
80 } else {
81 ATH_MSG_DEBUG("Initializing " << name());
82 }
83
84 ATH_CHECK(::AthService::initialize());
85 // Check for input collection
86 if (m_inputCollectionsProp.value().empty()) {
87 ATH_MSG_FATAL("Use the property: EventSelector.InputCollections = "
88 << "[ \"<collectionName>\" ] (list of collections)");
89 return StatusCode::FAILURE;
90 }
92 for( const std::string& r: ranges ) {
93 auto fromto = CxxUtils::tokenize(r, '-');
94 auto from_iter = fromto.begin();
95 long from = std::stol(*from_iter);
96 long to = from;
97 if( ++from_iter != fromto.end() ) {
98 to = std::stol(*from_iter);
99 }
100 m_skipEventRanges.emplace_back(from, to);
101 }
102
103 for( auto v : m_skipEventSequenceProp.value() ) {
104 m_skipEventRanges.emplace_back(v, v);
105 }
106 std::sort(m_skipEventRanges.begin(), m_skipEventRanges.end());
107 if( msgLvl(MSG::DEBUG) ) {
108 std::string skip_ranges_str;
109 for( const auto& [first, second] : m_skipEventRanges ) {
110 if( !skip_ranges_str.empty() ) skip_ranges_str += ", ";
111 skip_ranges_str += std::to_string(first);
112 if( first != second) skip_ranges_str += std::format("-{}", second);
113 }
114 if( !skip_ranges_str.empty() )
115 ATH_MSG_DEBUG("Events to skip: " << skip_ranges_str);
116 }
117
118 // Get AthenaPoolCnvSvc
119 ATH_CHECK(m_athenaPoolCnvSvc.retrieve());
120 ATH_CHECK(m_poolSvc.retrieve());
121 // Get CounterTool (if configured)
122 if (!m_counterTool.empty()) {
123 ATH_CHECK(m_counterTool.retrieve());
124 }
125 // Get HelperTools
126 ATH_CHECK(m_helperTools.retrieve());
127
128 // Ensure the xAODCnvSvc is listed in the EventPersistencySvc
129 ServiceHandle<IProperty> epSvc("EventPersistencySvc", name());
130 std::vector<std::string> propVal;
131 ATH_CHECK(Gaudi::Parsers::parse(propVal , epSvc->getProperty("CnvServices").toString()));
132 bool foundCnvSvc = false;
133 for (const auto& property : propVal) {
134 if (property == m_athenaPoolCnvSvc.type()) { foundCnvSvc = true; }
135 }
136 if (!foundCnvSvc) {
137 propVal.push_back(m_athenaPoolCnvSvc.type());
138 if (!epSvc->setProperty("CnvServices", Gaudi::Utils::toString(propVal)).isSuccess()) {
139 ATH_MSG_FATAL("Cannot set EventPersistencySvc Property for CnvServices");
140 return StatusCode::FAILURE;
141 }
142 }
143
144 // Register this service for 'I/O' events
145 ServiceHandle<IIoComponentMgr> iomgr("IoComponentMgr", name());
146 ATH_CHECK(iomgr.retrieve());
147 ATH_CHECK(iomgr->io_register(this));
148 // Register input file's names with the I/O manager
149 const std::vector<std::string>& incol = m_inputCollectionsProp.value();
150 bool allGood = true;
151 for (const auto& inputCollection : incol) {
152 if (!iomgr->io_register(this, IIoComponentMgr::IoMode::READ, inputCollection, inputCollection).isSuccess()) {
153 ATH_MSG_FATAL("could not register [" << inputCollection << "] for output !");
154 allGood = false;
155 } else {
156 ATH_MSG_VERBOSE("io_register[" << this->name() << "](" << inputCollection << ") [ok]");
157 }
158 }
159 if (!allGood) {
160 return StatusCode::FAILURE;
161 }
162
163 // Connect to PersistencySvc
164 if (!m_poolSvc->connect(Io::READ, IPoolSvc::kInputStream).isSuccess()) {
165 ATH_MSG_FATAL("Cannot connect to POOL PersistencySvc.");
166 return StatusCode::FAILURE;
167 }
168 // Jump to reinit() to execute common init/reinit actions
169 m_guid = Guid::null();
170 if (!reinit().isSuccess()) {
171 return StatusCode::FAILURE;
172 }
173 // Get IncidentSvc
174 ATH_CHECK(m_incidentSvc.retrieve());
175 // Listen to the Event Processing incidents
176 m_incidentSvc->addListener(this, IncidentType::BeginProcessing, 0);
177 m_incidentSvc->addListener(this, IncidentType::EndProcessing, 0);
178 return StatusCode::SUCCESS;
179}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_FATAL(x,...)
Gaudi::Property< std::vector< long > > m_skipEventSequenceProp
StatusCode reinit() const
Reinitialize the service when a fork() occurred/was-issued.
ServiceHandle< IAthenaPoolCnvSvc > m_athenaPoolCnvSvc
Gaudi::Property< std::string > m_skipEventRangesProp
Skip Events - comma separated list of event to skip, ranges with '-': <start> - <end>.
static const Guid & null() noexcept
NULL-Guid: static class method.
Definition Guid.cxx:14
int r
Definition globals.cxx:22
std::vector< std::string > tokenize(std::string_view the_str, std::string_view delimiters)
Splits the string into smaller substrings.
StatusCode parse(std::tuple< Tup... > &tup, const Gaudi::Parsers::InputData &input)
bool allGood
Loop over the SDOs & Digits.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.

◆ inputCollectionsHandler()

void EventSelectorAthenaPool::inputCollectionsHandler ( Gaudi::Details::PropertyBase & )
private

Definition at line 60 of file EventSelectorAthenaPool.cxx.

60 {
61 if (this->FSMState() != Gaudi::StateMachine::OFFLINE) {
62 m_inputCollectionsChanged = true;
63 }
64}

◆ io_finalize()

StatusCode EventSelectorAthenaPool::io_finalize ( )
overridevirtual

Callback method to finalize the internal state of the component for I/O purposes (e.g. before fork(2)).

Definition at line 830 of file EventSelectorAthenaPool.cxx.

830 {
831 ATH_MSG_INFO("I/O finalization...");
832 // Fire EndInputFile before disconnecting — file data is still accessible here
833 m_inputFileGuard.reset();
834 if (m_poolCollectionConverter) {
835 m_poolCollectionConverter->disconnectDb().ignore();
836 m_poolCollectionConverter.reset();
837 }
838 return StatusCode::SUCCESS;
839}

◆ io_reinit()

StatusCode EventSelectorAthenaPool::io_reinit ( )
overridevirtual

Callback method to reinitialize the internal state of the component for I/O purposes (e.g. upon fork(2)).

Definition at line 786 of file EventSelectorAthenaPool.cxx.

786 {
787 ATH_MSG_INFO("I/O reinitialization...");
788 if (m_poolCollectionConverter) {
789 m_poolCollectionConverter->disconnectDb().ignore();
790 m_poolCollectionConverter.reset();
791 }
792 m_headerIterator = nullptr;
793 ServiceHandle<IIoComponentMgr> iomgr("IoComponentMgr", name());
794 if (!iomgr.retrieve().isSuccess()) {
795 ATH_MSG_FATAL("Could not retrieve IoComponentMgr !");
796 return StatusCode::FAILURE;
797 }
798 if (!iomgr->io_hasitem(this)) {
799 ATH_MSG_FATAL("IoComponentMgr does not know about myself !");
800 return StatusCode::FAILURE;
801 }
802 std::vector<std::string> inputCollections = m_inputCollectionsProp.value();
803 std::set<std::size_t> updatedIndexes;
804 for (std::size_t i = 0, imax = m_inputCollectionsProp.value().size(); i < imax; i++) {
805 if (updatedIndexes.find(i) != updatedIndexes.end()) continue;
806 std::string savedName = inputCollections[i];
807 std::string &fname = inputCollections[i];
808 if (!iomgr->io_contains(this, fname)) {
809 ATH_MSG_ERROR("IoComponentMgr does not know about [" << fname << "] !");
810 return StatusCode::FAILURE;
811 }
812 if (!iomgr->io_retrieve(this, fname).isSuccess()) {
813 ATH_MSG_FATAL("Could not retrieve new value for [" << fname << "] !");
814 return StatusCode::FAILURE;
815 }
816 updatedIndexes.insert(i);
817 for (std::size_t j = i + 1; j < imax; j++) {
818 if (inputCollections[j] == savedName) {
820 updatedIndexes.insert(j);
821 }
822 }
823 }
824 // all good... copy over.
826 m_guid = Guid::null();
827 return reinit();
828}
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)

◆ last()

StatusCode EventSelectorAthenaPool::last ( IEvtSelector::Context & ctxt) const
overridevirtual
Parameters
ctxt[IN/OUT] current event context is interated to last event.

Definition at line 543 of file EventSelectorAthenaPool.cxx.

543 {
544 if (ctxt.identifier() == m_endIter->identifier()) {
545 ATH_MSG_DEBUG("last(): Last event in InputStream.");
546 return StatusCode::SUCCESS;
547 }
548 return StatusCode::FAILURE;
549}

◆ next() [1/2]

StatusCode EventSelectorAthenaPool::next ( IEvtSelector::Context & ctxt) const
overridevirtual
Parameters
ctxt[IN/OUT] current event context is interated to next event.

Reimplemented in DoubleEventSelectorAthenaPool.

Definition at line 347 of file EventSelectorAthenaPool.cxx.

347 {
348 std::lock_guard<CallMutex> lockGuard(m_callLock);
349 for (const auto& tool : m_helperTools) {
350 if (!tool->preNext().isSuccess()) {
351 ATH_MSG_WARNING("Failed to preNext() " << tool->name());
352 }
353 }
354 for (;;) {
355 // Handle possible file transition
357 if (sc.isRecoverable()) {
358 continue; // handles empty files
359 }
360 if (sc.isFailure()) {
361 return StatusCode::FAILURE;
362 }
363 // Increase event count
364 ++m_evtCount;
365 if (!m_counterTool.empty() && !m_counterTool->preNext().isSuccess()) {
366 ATH_MSG_WARNING("Failed to preNext() CounterTool.");
367 }
369 && (m_skipEventRanges.empty() || m_evtCount < m_skipEventRanges.front().first))
370 {
371 if (!m_isSecondary.value()) {
372 if (!this->recordAttributeList().isSuccess()) {
373 ATH_MSG_ERROR("Failed to record AttributeList.");
374 return StatusCode::FAILURE;
375 }
376 }
377 StatusCode status = StatusCode::SUCCESS;
378 for (const auto& tool : m_helperTools) {
379 StatusCode toolStatus = tool->postNext();
380 if (toolStatus.isRecoverable()) {
381 ATH_MSG_INFO("Request skipping event from: " << tool->name());
382 if (status.isSuccess()) {
383 status = StatusCode::RECOVERABLE;
384 }
385 } else if (toolStatus.isFailure()) {
386 ATH_MSG_WARNING("Failed to postNext() " << tool->name());
387 status = StatusCode::FAILURE;
388 }
389 }
390 if (status.isRecoverable()) {
391 ATH_MSG_INFO("skipping event " << m_evtCount);
392 } else if (status.isFailure()) {
393 ATH_MSG_WARNING("Failed to postNext() HelperTool.");
394 } else {
395 if (!m_counterTool.empty() && !m_counterTool->postNext().isSuccess()) {
396 ATH_MSG_WARNING("Failed to postNext() CounterTool.");
397 }
398 break;
399 }
400 } else {
401 while( !m_skipEventRanges.empty() && m_evtCount >= m_skipEventRanges.front().second ) {
402 m_skipEventRanges.erase(m_skipEventRanges.begin());
403 }
404 ATH_MSG_INFO("skipping event " << m_evtCount);
405 }
406 }
407 return StatusCode::SUCCESS;
408}
static Double_t sc
Gaudi::Property< int > m_skipEvents
SkipEvents, numbers of events to skip: default = 0.
virtual StatusCode nextHandleFileTransition(IEvtSelector::Context &ctxt) const override
Handle file transition at the next iteration.
virtual StatusCode recordAttributeList() const override
Record AttributeList in StoreGate.

◆ next() [2/2]

StatusCode EventSelectorAthenaPool::next ( IEvtSelector::Context & ctxt,
int jump ) const
overridevirtual
Parameters
ctxt[IN/OUT] current event context is interated to next event.
jump[IN] number of events to jump (currently not supported).

Reimplemented in DoubleEventSelectorAthenaPool.

Definition at line 410 of file EventSelectorAthenaPool.cxx.

410 {
411 if (jump > 0) {
412 for (int i = 0; i < jump; i++) {
413 ATH_CHECK(next(ctxt));
414 }
415 return StatusCode::SUCCESS;
416 }
417 return StatusCode::FAILURE;
418}
virtual StatusCode next(IEvtSelector::Context &ctxt) const override

◆ nextHandleFileTransition()

StatusCode EventSelectorAthenaPool::nextHandleFileTransition ( IEvtSelector::Context & ctxt) const
overrideprotectedvirtual

Handle file transition at the next iteration.

Definition at line 420 of file EventSelectorAthenaPool.cxx.

421{
422 if( m_inputCollectionsChanged ) {
423 StatusCode rc = reinit();
424 if( rc != StatusCode::SUCCESS ) return rc;
425 }
426 else { // advance to the next (not needed after reinit)
427 // Check if we're at the end of file
428 if (m_headerIterator == nullptr || m_headerIterator->next() == 0) {
429 m_headerIterator = nullptr;
430 // Close previous collection.
431 m_poolCollectionConverter.reset();
432
433 // Fire EndInputFile while data is still accessible, then disconnect
434 m_inputFileGuard.reset();
435 const SG::SourceID old_guid = m_guid.toString();
436 m_guid = Guid::null();
437 disconnectIfFinished( old_guid );
438
439 // check if somebody updated Inputs in the EOF incident (like VP1 does)
440 if( m_inputCollectionsChanged ) {
441 StatusCode rc = reinit();
442 if( rc != StatusCode::SUCCESS ) return rc;
443 } else {
444 // Open next file from inputCollections list.
445 ++m_inputCollectionsIterator;
446 // Create PoolCollectionConverter for input file
447 m_poolCollectionConverter = getCollectionCnv(true);
448 if (!m_poolCollectionConverter) {
449 // Return end iterator
450 ctxt = *m_endIter;
451 // This is not a real failure but a Gaudi way of handling "end of job"
452 return StatusCode::FAILURE;
453 }
454 // Get DataHeader iterator
455 m_headerIterator = m_poolCollectionConverter->selectAll();
456
457 // Return RECOVERABLE to mark we should still continue
458 return StatusCode::RECOVERABLE;
459 }
460 }
461 }
462 const Token& headRef = m_headerIterator->eventRef();
463 const Guid guid = headRef.dbID();
464 ATH_MSG_VERBOSE("next(): DataHeder Token=" << headRef.toString() );
465
466 if (guid != m_guid) {
467 // we are starting reading from a new DB. Check if the old one needs to be retired
468 if (m_guid != Guid::null()) {
469 // zero the current DB ID (m_guid) before trying disconnect() to indicate it is no longer in use
470 const SG::SourceID old_guid = m_guid.toString();
471 m_guid = Guid::null();
472 // EndInputFile is fired by the guard transition() below; just disconnect here
473 disconnectIfFinished( old_guid );
474 }
475 m_guid = guid;
476 m_activeEventsPerSource[guid.toString()] = 0;
477 if (!m_athenaPoolCnvSvc->setInputAttributes(*m_inputCollectionsIterator).isSuccess()) {
478 ATH_MSG_ERROR("Failed to set input attributes.");
479 return StatusCode::FAILURE;
480 }
481 if(m_processMetadata.value()) {
483 *m_inputCollectionsIterator, m_guid.toString(),
484 /*endFileName=*/{});
485 }
486 } // end if (guid != m_guid)
487 return StatusCode::SUCCESS;
488}
static Double_t rc
std::unique_ptr< PoolCollectionConverter > getCollectionCnv(bool throwIncidents=false) const
Return pointer to new PoolCollectionConverter.
static void transition(std::optional< InputFileIncidentGuard > &guard, IIncidentSvc &incSvc, std::string_view source, std::string_view beginFileName, std::string_view guid, std::string_view endFileName={}, std::string_view beginType=IncidentType::BeginInputFile, std::string_view endType=IncidentType::EndInputFile)
Replace the guard in an optional, with strict End-before-Begin ordering.
const std::string toString() const
Retrieve the string representation of the token.
Definition Token.cxx:135
const Guid & dbID() const
Access database identifier.
Definition Token.h:65

◆ nextWithSkip()

StatusCode EventSelectorAthenaPool::nextWithSkip ( IEvtSelector::Context & ctxt) const
overrideprotectedvirtual

Go to next event and skip if necessary.

Definition at line 490 of file EventSelectorAthenaPool.cxx.

490 {
491 ATH_MSG_DEBUG("EventSelectorAthenaPool::nextWithSkip");
492
493 for (;;) {
494 // Check if we're at the end of file
496 if (sc.isRecoverable()) {
497 continue; // handles empty files
498 }
499 if (sc.isFailure()) {
500 return StatusCode::FAILURE;
501 }
502
503 // Increase event count
504 ++m_evtCount;
505
506 if (!m_counterTool.empty() && !m_counterTool->preNext().isSuccess()) {
507 ATH_MSG_WARNING("Failed to preNext() CounterTool.");
508 }
510 && (m_skipEventRanges.empty() || m_evtCount < m_skipEventRanges.front().first))
511 {
512 return StatusCode::SUCCESS;
513 } else {
514 while( !m_skipEventRanges.empty() && m_evtCount >= m_skipEventRanges.front().second ) {
515 m_skipEventRanges.erase(m_skipEventRanges.begin());
516 }
517 if (m_isSecondary.value()) {
518 ATH_MSG_INFO("skipping secondary event " << m_evtCount);
519 } else {
520 ATH_MSG_INFO("skipping event " << m_evtCount);
521 }
522 }
523 }
524
525 return StatusCode::SUCCESS;
526}

◆ previous() [1/2]

StatusCode EventSelectorAthenaPool::previous ( IEvtSelector::Context & ctxt) const
overridevirtual
Parameters
ctxt[IN/OUT] current event context is interated to previous event.

Definition at line 528 of file EventSelectorAthenaPool.cxx.

528 {
529 ATH_MSG_ERROR("previous() not implemented");
530 return StatusCode::FAILURE;
531}

◆ previous() [2/2]

StatusCode EventSelectorAthenaPool::previous ( IEvtSelector::Context & ctxt,
int jump ) const
overridevirtual
Parameters
ctxt[IN/OUT] current event context is interated to previous event.
jump[IN] number of events to jump (currently not supported).

Definition at line 533 of file EventSelectorAthenaPool.cxx.

533 {
534 if (jump > 0) {
535 for (int i = 0; i < jump; i++) {
536 ATH_CHECK(previous(ctxt));
537 }
538 return StatusCode::SUCCESS;
539 }
540 return StatusCode::FAILURE;
541}
virtual StatusCode previous(IEvtSelector::Context &ctxt) const override

◆ recordAttributeList()

StatusCode EventSelectorAthenaPool::recordAttributeList ( ) const
overrideprotectedvirtual

Record AttributeList in StoreGate.

Reimplemented in DoubleEventSelectorAthenaPool.

Definition at line 742 of file EventSelectorAthenaPool.cxx.

742 {
743 if (!eventStore()->clearStore().isSuccess()) {
744 ATH_MSG_WARNING("Cannot clear Store");
745 }
746 // Get access to AttributeList
747 ATH_MSG_DEBUG("Get AttributeList from the collection");
748 // MN: accessing only attribute list, ignoring token list
749 const coral::AttributeList& attrList = m_headerIterator->currentRow().attributeList();
750 ATH_MSG_DEBUG("AttributeList size " << attrList.size());
751 std::unique_ptr<AthenaAttributeList> athAttrList(new AthenaAttributeList(attrList));
752 // Fill the new attribute list
753 ATH_CHECK(fillAttributeList(athAttrList.get(), "", false));
754 // Write the AttributeList
755 SG::WriteHandle<AthenaAttributeList> wh(m_attrListKey, eventStore()->name());
756 ATH_CHECK(wh.record(std::move(athAttrList)));
757 return StatusCode::SUCCESS;
758}
virtual StatusCode fillAttributeList(coral::AttributeList *attrList, const std::string &suffix, bool copySource) const override
Fill AttributeList with specific items from the selector and a suffix.
str wh
Definition parseDir.py:45

◆ reinit()

StatusCode EventSelectorAthenaPool::reinit ( ) const
private

Reinitialize the service when a fork() occurred/was-issued.

Definition at line 181 of file EventSelectorAthenaPool.cxx.

181 {
182 ATH_MSG_DEBUG("reinitialization...");
183
184 // reset markers
185 m_numEvt.resize(m_inputCollectionsProp.value().size(), -1);
186 m_firstEvt.resize(m_inputCollectionsProp.value().size(), -1);
187
188 // Initialize InputCollectionsIterator
189 m_inputCollectionsIterator = m_inputCollectionsProp.value().begin();
190 m_curCollection = 0;
191 if (!m_firstEvt.empty()) {
192 m_firstEvt[0] = 0;
193 }
194 m_inputCollectionsChanged = false;
195 m_evtCount = 0;
196 m_headerIterator = 0;
197 bool retError = false;
198 for (auto& tool : m_helperTools) {
199 if (!tool->postInitialize().isSuccess()) {
200 ATH_MSG_FATAL("Failed to postInitialize() " << tool->name());
201 retError = true;
202 }
203 }
204 if (retError) {
205 ATH_MSG_FATAL("Failed to postInitialize() helperTools");
206 return StatusCode::FAILURE;
207 }
208
209 // Create an m_poolCollectionConverter to read the objects in
210 m_poolCollectionConverter = getCollectionCnv();
211 if (!m_poolCollectionConverter) {
212 ATH_MSG_INFO("No Events found in any Input Collections");
213 if (m_processMetadata.value()) {
214 m_inputCollectionsIterator = m_inputCollectionsProp.value().end();
215 if (!m_inputCollectionsProp.value().empty()) --m_inputCollectionsIterator;
216 //NOTE (wb may 2016): this will make the FirstInputFile incident correspond to last file in the collection ... if want it to be first file then move iterator to begin and then move above two lines below this incident firing
217 if( !m_firedIncident && !m_inputCollectionsProp.value().empty() ) {
218 FileIncident firstInputFileIncident(name(), "FirstInputFile", *m_inputCollectionsIterator);
219 m_incidentSvc->fireIncident(firstInputFileIncident);
220 m_firedIncident = true;
221 }
222 }
223 return StatusCode::SUCCESS;
224 }
225 // Get DataHeader iterator
226 try {
227 m_headerIterator = m_poolCollectionConverter->selectAll();
228 } catch (std::exception &e) {
229 ATH_MSG_FATAL("Cannot open input collection - check data/software version.");
230 ATH_MSG_ERROR(e.what());
231 return StatusCode::FAILURE;
232 }
233 while (m_headerIterator == nullptr || m_headerIterator->next() == 0) { // no selected events
234 if (m_poolCollectionConverter) {
235 m_poolCollectionConverter->disconnectDb().ignore();
236 m_poolCollectionConverter.reset();
237 }
238 ++m_inputCollectionsIterator;
239 m_poolCollectionConverter = getCollectionCnv();
240 if (m_poolCollectionConverter) {
241 m_headerIterator = m_poolCollectionConverter->selectAll();
242 } else {
243 break;
244 }
245 }
246 if (!m_poolCollectionConverter || m_headerIterator == nullptr) { // no event selected in any collection
247 m_inputCollectionsIterator = m_inputCollectionsProp.value().begin();
248 m_curCollection = 0;
249 m_poolCollectionConverter = getCollectionCnv();
250 if (!m_poolCollectionConverter) {
251 return StatusCode::SUCCESS;
252 }
253 m_headerIterator = m_poolCollectionConverter->selectAll();
254 while (m_headerIterator == nullptr || m_headerIterator->next() == 0) { // empty collection
255 if (m_poolCollectionConverter) {
256 m_poolCollectionConverter->disconnectDb().ignore();
257 m_poolCollectionConverter.reset();
258 }
259 ++m_inputCollectionsIterator;
260 m_poolCollectionConverter = getCollectionCnv();
261 if (m_poolCollectionConverter) {
262 m_headerIterator = m_poolCollectionConverter->selectAll();
263 } else {
264 break;
265 }
266 }
267 }
268 if (!m_poolCollectionConverter || m_headerIterator == nullptr) {
269 return StatusCode::SUCCESS;
270 }
271 const Token& headRef = m_headerIterator->eventRef();
272 const std::string fid = headRef.dbID().toString();
273 const int tech = headRef.technology();
274 ATH_MSG_VERBOSE("reinit(): First DataHeder Token=" << headRef.toString() );
275
276 // Check if File is BS, for which Incident is thrown by SingleEventInputSvc
277 if (tech != 0x00001000 && m_processMetadata.value() && !m_firedIncident) {
278 FileIncident firstInputFileIncident(name(), "FirstInputFile", "FID:" + fid, fid);
279 m_incidentSvc->fireIncident(firstInputFileIncident);
280 m_firedIncident = true;
281 }
282 return StatusCode::SUCCESS;
283}
constexpr void toString(std::span< char, StrLen > buf, bool uppercase=true) const noexcept
Automatic conversion to string representation.
int technology() const
Access technology type.
Definition Token.h:78

◆ releaseContext()

StatusCode EventSelectorAthenaPool::releaseContext ( IEvtSelector::Context *& ctxt) const
overridevirtual
Parameters
ctxt[IN] current event context is released.

Definition at line 580 of file EventSelectorAthenaPool.cxx.

580 {
581 return StatusCode::SUCCESS;
582}

◆ resetCriteria()

StatusCode EventSelectorAthenaPool::resetCriteria ( const std::string & criteria,
IEvtSelector::Context & ctxt ) const
overridevirtual

Set a selection criteria.

Parameters
criteriafilter predicate (SQL-style WHERE clause)
ctxt[IN] current event context.

Definition at line 584 of file EventSelectorAthenaPool.cxx.

585 {
586 return StatusCode::SUCCESS;
587}

◆ rewind()

StatusCode EventSelectorAthenaPool::rewind ( IEvtSelector::Context & ctxt) const
overridevirtual
Parameters
ctxt[IN/OUT] current event context is rewound to first event.

Definition at line 551 of file EventSelectorAthenaPool.cxx.

551 {
552 ATH_CHECK(reinit());
553 ctxt = EventContextAthenaPool(this);
554 return StatusCode::SUCCESS;
555}

◆ seek()

StatusCode EventSelectorAthenaPool::seek ( Context & ctxt,
int evtnum ) const
overridevirtual

Seek to a given event number.

Parameters
ctxt[IN/OUT] current event context.
evtnum[IN] The event number to which to seek.

Reimplemented in DoubleEventSelectorAthenaPool.

Definition at line 589 of file EventSelectorAthenaPool.cxx.

589 {
590
591 if( m_inputCollectionsChanged ) {
592 StatusCode rc = reinit();
593 if( rc != StatusCode::SUCCESS ) return rc;
594 }
595
596 long newColl = findEvent(evtNum);
597 if (newColl == -1 && evtNum >= m_firstEvt[m_curCollection] && evtNum < m_evtCount - 1) {
598 newColl = m_curCollection;
599 }
600 if (newColl == -1) {
601 m_headerIterator = nullptr;
602 ATH_MSG_INFO("seek: Reached end of Input.");
603 m_inputFileGuard.reset();
604 return StatusCode::RECOVERABLE;
605 }
606 if (newColl != m_curCollection) {
607 if (!m_keepInputFilesOpen.value() && m_poolCollectionConverter) {
608 m_poolCollectionConverter->disconnectDb().ignore();
609 }
610 m_poolCollectionConverter.reset();
611 m_curCollection = newColl;
612 try {
613 ATH_MSG_DEBUG("Seek to item: \""
615 << "\" from the collection list.");
616 // Reset input collection iterator to the right place
617 m_inputCollectionsIterator = m_inputCollectionsProp.value().begin();
618 m_inputCollectionsIterator += m_curCollection;
619 m_poolCollectionConverter = std::make_unique<PoolCollectionConverter>(
622 m_poolSvc.get());
623 if (!m_poolCollectionConverter || !m_poolCollectionConverter->initialize().isSuccess()) {
624 m_headerIterator = nullptr;
625 ATH_MSG_ERROR("seek: Unable to initialize PoolCollectionConverter.");
626 return StatusCode::FAILURE;
627 }
628 // Create DataHeader iterators
629 m_headerIterator = m_poolCollectionConverter->selectAll();
630 EventContextAthenaPool* beginIter = new EventContextAthenaPool(this);
631 m_evtCount = m_firstEvt[m_curCollection];
632 next(*beginIter).ignore();
633 ATH_MSG_DEBUG("Token " << m_headerIterator->eventRef().toString());
634 } catch (std::exception &e) {
635 m_headerIterator = nullptr;
636 ATH_MSG_ERROR(e.what());
637 return StatusCode::FAILURE;
638 }
639 }
640
641 if (m_headerIterator->seek(evtNum - m_firstEvt[m_curCollection]) == 0) {
642 m_headerIterator = nullptr;
643 ATH_MSG_ERROR("Did not find event, evtNum = " << evtNum);
644 return StatusCode::FAILURE;
645 } else {
646 m_evtCount = evtNum + 1;
647 }
648 return StatusCode::SUCCESS;
649}
int findEvent(int evtNum) const
Search for event with number evtNum.

◆ size()

int EventSelectorAthenaPool::size ( Context & ctxt) const
overridevirtual

Return the size of the collection.

Parameters
ctxt[IN/OUT] current event context.

Reimplemented in DoubleEventSelectorAthenaPool.

Definition at line 692 of file EventSelectorAthenaPool.cxx.

692 {
693 // Fetch sizes of all collections.
694 findEvent(-1);
695 return std::accumulate(m_numEvt.begin(), m_numEvt.end(), 0);
696}

◆ start()

StatusCode EventSelectorAthenaPool::start ( )
overridevirtual

Definition at line 285 of file EventSelectorAthenaPool.cxx.

285 {
286 if (m_poolCollectionConverter) {
287 // Reset iterators and apply new query
288 m_poolCollectionConverter->disconnectDb().ignore();
289 m_poolCollectionConverter.reset();
290 }
291 m_inputCollectionsIterator = m_inputCollectionsProp.value().begin();
292 m_curCollection = 0;
293 m_poolCollectionConverter = getCollectionCnv(true);
294 if (!m_poolCollectionConverter) {
295 ATH_MSG_INFO("No Events found in any Input Collections");
296 m_inputCollectionsIterator = m_inputCollectionsProp.value().end();
297 if (!m_inputCollectionsProp.value().empty()) {
298 --m_inputCollectionsIterator; //leave iterator in state of last input file
299 }
300 } else {
301 m_headerIterator = m_poolCollectionConverter->selectAll();
302 }
303 m_evtCount = 0;
304 delete m_endIter;
305 m_endIter = nullptr;
306 m_endIter = new EventContextAthenaPool(nullptr);
307 return StatusCode::SUCCESS;
308}

◆ stop()

StatusCode EventSelectorAthenaPool::stop ( )
overridevirtual

Definition at line 310 of file EventSelectorAthenaPool.cxx.

310 {
311 // Fire EndInputFile for any file still open (the event loop may end
312 // before the file is fully read).
313 m_inputFileGuard.reset();
314
315 IEvtSelector::Context* ctxt(nullptr);
316 if (!releaseContext(ctxt).isSuccess()) {
317 ATH_MSG_WARNING("Cannot release context");
318 }
319 return StatusCode::SUCCESS;
320}
virtual StatusCode releaseContext(IEvtSelector::Context *&ctxt) const override

◆ DoubleEventSelectorAthenaPool

friend class DoubleEventSelectorAthenaPool
friend

make the DoubleEventSelectorAthenaPool a friend so it can access the internal EventSelectorAthenaPool methods and members

Definition at line 227 of file EventSelectorAthenaPool.h.

◆ EventSelectorAthenaPoolSharedIO

friend class EventSelectorAthenaPoolSharedIO
friend

make the EventSelectorAthenaPoolSharedIO a friend so it can access the internal EventSelectorAthenaPool methods and members

Definition at line 231 of file EventSelectorAthenaPool.h.

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/11]

std::vector<std::pair<long,long> > m_skipEventRanges EventSelectorAthenaPool::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 215 of file EventSelectorAthenaPool.h.

◆ ATLAS_THREAD_SAFE [2/11]

std::vector<int> m_firstEvt EventSelectorAthenaPool::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 208 of file EventSelectorAthenaPool.h.

◆ ATLAS_THREAD_SAFE [3/11]

std::vector<int> m_numEvt EventSelectorAthenaPool::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 207 of file EventSelectorAthenaPool.h.

◆ ATLAS_THREAD_SAFE [4/11]

ToolHandleArray<IAthenaSelectorTool> m_helperTools EventSelectorAthenaPool::ATLAS_THREAD_SAFE {this, "HelperTools", {}, ""}
mutableprivate

HelperTools, vector of names of AlgTools that are executed by the EventSelector.

Definition at line 187 of file EventSelectorAthenaPool.h.

187{this, "HelperTools", {}, ""};

◆ ATLAS_THREAD_SAFE [5/11]

bool m_inputCollectionsChanged EventSelectorAthenaPool::ATLAS_THREAD_SAFE
mutableprivate

flag to notify the EvSel that the inputs were changed and reinit() needs to be called ASAP

Definition at line 180 of file EventSelectorAthenaPool.h.

◆ ATLAS_THREAD_SAFE [6/11]

std::vector<std::string>::const_iterator m_inputCollectionsIterator EventSelectorAthenaPool::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 177 of file EventSelectorAthenaPool.h.

◆ ATLAS_THREAD_SAFE [7/11]

std::optional<InputFileIncidentGuard> m_inputFileGuard EventSelectorAthenaPool::ATLAS_THREAD_SAFE
mutableprivate

RAII guard: guarantees a matching EndInputFile for every BeginInputFile.

Definition at line 160 of file EventSelectorAthenaPool.h.

◆ ATLAS_THREAD_SAFE [8/11]

std::map<SG::SourceID, int> m_activeEventsPerSource EventSelectorAthenaPool::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 158 of file EventSelectorAthenaPool.h.

◆ ATLAS_THREAD_SAFE [9/11]

Guid m_guid EventSelectorAthenaPool::ATLAS_THREAD_SAFE {}
mutableprivate

Definition at line 157 of file EventSelectorAthenaPool.h.

157{};

◆ ATLAS_THREAD_SAFE [10/11]

std::unique_ptr<pool::ICollectionCursor> m_headerIterator EventSelectorAthenaPool::ATLAS_THREAD_SAFE {}
mutableprivate

Definition at line 156 of file EventSelectorAthenaPool.h.

156{};

◆ ATLAS_THREAD_SAFE [11/11]

std::unique_ptr<PoolCollectionConverter> m_poolCollectionConverter EventSelectorAthenaPool::ATLAS_THREAD_SAFE {}
mutableprivate

Definition at line 155 of file EventSelectorAthenaPool.h.

155{};

◆ m_athenaPoolCnvSvc

ServiceHandle<IAthenaPoolCnvSvc> EventSelectorAthenaPool::m_athenaPoolCnvSvc {this, "ConversionService", "AthenaPoolCnvSvc", ""}
private

Definition at line 162 of file EventSelectorAthenaPool.h.

162{this, "ConversionService", "AthenaPoolCnvSvc", ""};

◆ m_attrListKey

std::string EventSelectorAthenaPool::m_attrListKey {"Input"}
private

AttributeList SG key.

Definition at line 173 of file EventSelectorAthenaPool.h.

173{"Input"};

◆ m_callLock

CallMutex EventSelectorAthenaPool::m_callLock
mutableprivate

Definition at line 221 of file EventSelectorAthenaPool.h.

◆ m_counterTool

ToolHandle<IAthenaSelectorTool> EventSelectorAthenaPool::m_counterTool {this, "CounterTool", "", ""}
private

Definition at line 188 of file EventSelectorAthenaPool.h.

188{this, "CounterTool", "", ""};

◆ m_curCollection

std::atomic_long EventSelectorAthenaPool::m_curCollection {}
mutableprivate

Definition at line 206 of file EventSelectorAthenaPool.h.

206{};

◆ m_endIter

EventContextAthenaPool* EventSelectorAthenaPool::m_endIter {}
private

Definition at line 154 of file EventSelectorAthenaPool.h.

154{};

◆ m_eventsPerLB

Gaudi::CheckedProperty<uint32_t> EventSelectorAthenaPool::m_eventsPerLB {this, "EventsPerLB", 1000, ""}
private

Definition at line 202 of file EventSelectorAthenaPool.h.

202{this, "EventsPerLB", 1000, ""};

◆ m_eventsPerRun

Gaudi::CheckedProperty<uint64_t> EventSelectorAthenaPool::m_eventsPerRun {this, "EventsPerRun", 1000000, ""}
private

Definition at line 200 of file EventSelectorAthenaPool.h.

200{this, "EventsPerRun", 1000000, ""};

◆ m_evtCount

std::atomic_int EventSelectorAthenaPool::m_evtCount {}
mutableprivate

Definition at line 217 of file EventSelectorAthenaPool.h.

217{}; // internal count of events

◆ m_firedIncident

std::atomic_bool EventSelectorAthenaPool::m_firedIncident {}
mutableprivate

Definition at line 218 of file EventSelectorAthenaPool.h.

218{};

◆ m_firstEventNo

Gaudi::CheckedProperty<uint64_t> EventSelectorAthenaPool::m_firstEventNo {this, "FirstEvent", 1, ""}
private

Definition at line 198 of file EventSelectorAthenaPool.h.

198{this, "FirstEvent", 1, ""};

◆ m_firstLBNo

Gaudi::CheckedProperty<uint32_t> EventSelectorAthenaPool::m_firstLBNo {this, "FirstLB", 0, ""}
private

Definition at line 201 of file EventSelectorAthenaPool.h.

201{this, "FirstLB", 0, ""};

◆ m_incidentSvc

ServiceHandle<IIncidentSvc> EventSelectorAthenaPool::m_incidentSvc {this, "IncidentSvc", "IncidentSvc", ""}
private

Definition at line 164 of file EventSelectorAthenaPool.h.

164{this, "IncidentSvc", "IncidentSvc", ""};

◆ m_initTimeStamp

Gaudi::CheckedProperty<uint32_t> EventSelectorAthenaPool::m_initTimeStamp {this, "InitialTimeStamp", 0, ""}
private

Definition at line 203 of file EventSelectorAthenaPool.h.

203{this, "InitialTimeStamp", 0, ""};

◆ m_inputCollectionsProp

Gaudi::Property<std::vector<std::string> > EventSelectorAthenaPool::m_inputCollectionsProp {this, "InputCollections", {}, ""}
private

InputCollections, vector with names of the input collections.

Definition at line 176 of file EventSelectorAthenaPool.h.

176{this, "InputCollections", {}, ""};

◆ m_isSecondary

Gaudi::Property<bool> EventSelectorAthenaPool::m_isSecondary {this, "IsSecondary", false, ""}
private

IsSecondary, know if this is an instance of secondary event selector.

Definition at line 168 of file EventSelectorAthenaPool.h.

168{this, "IsSecondary", false, ""};

◆ m_keepInputFilesOpen

Gaudi::Property<bool> EventSelectorAthenaPool::m_keepInputFilesOpen {this, "KeepInputFilesOpen", false, ""}
private

KeepInputFilesOpen, boolean flag to keep files open after PoolCollection reaches end: default = false.

Needed for PilUp to run without PoolFileCatalog. Relies on POOL to close files when reaching DB_AGE_LIMIT.

Definition at line 184 of file EventSelectorAthenaPool.h.

184{this, "KeepInputFilesOpen", false, ""};

◆ m_oldRunNo

Gaudi::CheckedProperty<uint32_t> EventSelectorAthenaPool::m_oldRunNo {this, "OldRunNumber", 0, ""}
private

Definition at line 194 of file EventSelectorAthenaPool.h.

194{this, "OldRunNumber", 0, ""};

◆ m_overrideRunNumber

Gaudi::Property<bool> EventSelectorAthenaPool::m_overrideRunNumber {this, "OverrideRunNumber", false, ""}
private

Definition at line 195 of file EventSelectorAthenaPool.h.

195{this, "OverrideRunNumber", false, ""};

◆ m_overrideRunNumberFromInput

Gaudi::Property<bool> EventSelectorAthenaPool::m_overrideRunNumberFromInput {this, "OverrideRunNumberFromInput", false, ""}
private

Definition at line 196 of file EventSelectorAthenaPool.h.

196{this, "OverrideRunNumberFromInput", false, ""};

◆ m_poolSvc

ServiceHandle<IPoolSvc> EventSelectorAthenaPool::m_poolSvc {this, "PoolSvc", "PoolSvc", ""}
private

Definition at line 163 of file EventSelectorAthenaPool.h.

163{this, "PoolSvc", "PoolSvc", ""};

◆ m_processMetadata

Gaudi::Property<bool> EventSelectorAthenaPool::m_processMetadata {this, "ProcessMetadata", true, ""}
private

ProcessMetadata, switch on firing of FileIncidents which will trigger processing of metadata: default = true.

Definition at line 170 of file EventSelectorAthenaPool.h.

170{this, "ProcessMetadata", true, ""};

◆ m_runNo

Gaudi::CheckedProperty<uint32_t> EventSelectorAthenaPool::m_runNo {this, "RunNumber", 0, ""}
private

The following are included for compatibility with McEventSelector and are not really used.

However runNo, oldRunNo and overrideRunNumberFromInput are used to reset run number for simulated events, needed to use condition

Definition at line 193 of file EventSelectorAthenaPool.h.

193{this, "RunNumber", 0, ""};

◆ m_skipEventRangesProp

Gaudi::Property<std::string> EventSelectorAthenaPool::m_skipEventRangesProp {this, "SkipEventRanges", {}, ""}
private

Skip Events - comma separated list of event to skip, ranges with '-': <start> - <end>.

Definition at line 214 of file EventSelectorAthenaPool.h.

214{this, "SkipEventRanges", {}, ""};

◆ m_skipEvents

Gaudi::Property<int> EventSelectorAthenaPool::m_skipEvents {this, "SkipEvents", 0, ""}
private

SkipEvents, numbers of events to skip: default = 0.

Definition at line 211 of file EventSelectorAthenaPool.h.

211{this, "SkipEvents", 0, ""};

◆ m_skipEventSequenceProp

Gaudi::Property<std::vector<long> > EventSelectorAthenaPool::m_skipEventSequenceProp {this, "SkipEventSequence", {}, ""}
private

Definition at line 212 of file EventSelectorAthenaPool.h.

212{this, "SkipEventSequence", {}, ""};

◆ m_sourceID

SG::SlotSpecificObj<SG::SourceID> EventSelectorAthenaPool::m_sourceID
private

Definition at line 223 of file EventSelectorAthenaPool.h.

◆ m_timeStampInterval

Gaudi::Property<uint32_t> EventSelectorAthenaPool::m_timeStampInterval {this, "TimeStampInterval", 0, ""}
private

Definition at line 204 of file EventSelectorAthenaPool.h.

204{this, "TimeStampInterval", 0, ""};

The documentation for this class was generated from the following files: