ATLAS Offline Software
Loading...
Searching...
No Matches
MixingEventSelector.h
Go to the documentation of this file.
1/* -*- C++ -*- */
2
3/*
4 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
5*/
6
7#ifndef ATHENASERVICES_MIXINGEVENTSELECTOR_H
8#define ATHENASERVICES_MIXINGEVENTSELECTOR_H
14
16ATLAS_NO_CHECK_FILE_THREAD_SAFETY; // non-MT EventSelector
17
18#include <cassert>
19#include <memory>
20#include <vector>
21
26
27#include "GaudiKernel/ServiceHandle.h"
28#include "GaudiKernel/IEvtSelector.h"
29#include "GaudiKernel/IConverter.h"
30#include "GaudiKernel/ToolHandle.h"
31#include "GaudiKernel/StatusCode.h"
32#include "Gaudi/Property.h" /*StringArrayProperty*/
33
34class ISvcLocator;
35
36class MixingEventIterator;
37
38class StoreGateSvc;
39
40namespace CLHEP {
41 class RandFlat;
42}
43
44
69 : public extends<AthService, IEvtSelector, IConverter, IAddressProvider>
70{
71public:
75 struct Context : public IEvtSelector::Context {
76 virtual ~Context() {}
77 virtual void* identifier() const {
78 return (void*)0;
79 }
80 } ;
81
82
83 virtual StatusCode next(IEvtSelector::Context& refCtxt) const override;
84 virtual StatusCode createAddress(const IEvtSelector::Context& refCtxt,
85 IOpaqueAddress*&) const override;
86
87 virtual StatusCode createContext(IEvtSelector::Context*& refpCtxt) const override;
88 virtual StatusCode last(IEvtSelector::Context&) const override;
89 virtual StatusCode next(IEvtSelector::Context&, int) const override;
90 virtual StatusCode previous(IEvtSelector::Context&) const override;
91 virtual StatusCode previous(IEvtSelector::Context&,int) const override;
92 virtual StatusCode rewind(IEvtSelector::Context& refCtxt) const override;
93 virtual StatusCode releaseContext(IEvtSelector::Context*& refCtxt) const override;
94 virtual StatusCode resetCriteria(const std::string& cr,IEvtSelector::Context& c) const override;
96
98
99 virtual StatusCode preLoadAddresses(StoreID::type storeID ,
100 IAddressProvider::tadList& tads ) override;
101 virtual StatusCode loadAddresses(StoreID::type storeID ,
102 IAddressProvider::tadList& tads ) override;
103 virtual StatusCode updateAddress(StoreID::type storeID ,
105 const EventContext& ctx) override;
107
108
110
111 virtual const CLID& objType() const override;
112 virtual long repSvcType() const override;
113 virtual StatusCode createObj(IOpaqueAddress* pAddress, DataObject*& refpObject) override;
114
115 // The rest of these are dummies.
116 virtual StatusCode setDataProvider(IDataProviderSvc* pService) override;
117 virtual SmartIF<IDataProviderSvc>& dataProvider() const override;
118 virtual StatusCode setConversionSvc(IConversionSvc* pService) override;
119 virtual SmartIF<IConversionSvc>& conversionSvc() const override;
120 virtual StatusCode setAddressCreator(IAddressCreator* creator) override;
121 virtual SmartIF<IAddressCreator>& addressCreator() const override;
122 virtual StatusCode fillObjRefs(IOpaqueAddress* pAddress, DataObject* pObject) override;
123 virtual StatusCode updateObj(IOpaqueAddress* pAddress, DataObject* refpObject) override;
124 virtual StatusCode updateObjRefs(IOpaqueAddress* pAddress, DataObject* pObject) override;
125 virtual StatusCode createRep(DataObject* pObject, IOpaqueAddress*& refpAddress) override;
126 virtual StatusCode fillRepRefs(IOpaqueAddress* pAddress, DataObject* pObject) override;
127 virtual StatusCode updateRep(IOpaqueAddress* pAddress, DataObject* pObject) override;
128 virtual StatusCode updateRepRefs(IOpaqueAddress* pAddress, DataObject* pObject) override;
130
131
133
134 virtual StatusCode initialize() override;
135 virtual StatusCode finalize() override;
137
140 void setUpTriggerList(Gaudi::Details::PropertyBase& trigList);
142 void decodeTrigger(const std::string & triggDescr);
143
145
146 MixingEventSelector(const std::string& name, ISvcLocator* svc);
147 virtual ~MixingEventSelector();
149
150private:
151 bool validTrigger() const { return (m_trigList.end()!=m_pCurrentTrigger);}
152
154
155 Gaudi::Property<std::string> m_statusFileName{this, "StreamStatusFileName", {},
156 "Name of the file recording the last event used and how many were available for each stream. Default is to produce no file."};
157
158 Gaudi::Property<std::vector<std::string>> m_triggerListProp{this, "TriggerList", {}, &MixingEventSelector::setUpTriggerList,
159 "List of triggers (streams) to be used. Format is SelectorType/SelectorName:firstEventToUse:lastEventToUse. "
160 "One assumes events are consecutively numbered."};
161
162 Gaudi::Property<int> m_outputRunNumber{this, "OutputRunNumber", 123456789};
163
164 Gaudi::Property<std::vector<unsigned long>> m_eventNumbers{this, "EventNumbers", {},
165 "List of event numbers to be used for output stream. If list empty or not long enough, event numbers are "
166 "assigned consucutively after last one in list."};
167
168 Gaudi::Property<std::string> m_mergedEventInfoKey{this, "MergedEventInfoKey", "MergedEventInfo",
169 "StoreGate key for output (merged) event info object. Default is MergedEventInfo"};
170
171 Gaudi::Property<std::string> m_randomStreamName{this, "RndmStreamName", "MixingEventSelectorStream",
172 "IAtRndmGenSvc stream used as engine for our random distributions"};
173
174 ToolHandleArray<IAthenaSelectorTool> m_helperTools{this, "HelperTools", {},
175 "Collection of selector tools"};
176
177 ServiceHandle<IAtRndmGenSvc> m_atRndmSvc{this, "RndmGenSvc", "AtRndmGenSvc",
178 "IAtRndmGenSvc controlling the order with which events are takes from streams"};
179
181
182
186 class Trigger {
187 private:
188 IEvtSelector* m_pSelector;
189 unsigned int m_firstEvent;
190 unsigned int m_toRead;
191 unsigned int m_todo;
192 mutable unsigned int m_reads;
193 mutable IEvtSelector::Context* m_current;
194
195 public:
196 Trigger(IEvtSelector* pSel,
197 //IEvtSelector::Context* pContext,
198 unsigned int firstEvt, unsigned int lastEvt);
199
200 unsigned int todo() const { return m_todo; }
201 unsigned int toRead() const { return m_toRead; }
202 unsigned int read() const { return m_reads; }
203 bool done() const;
204
205 StatusCode next() const;
206 StatusCode previous() const;
207 StatusCode createAddress(IOpaqueAddress*&) const;
208 StatusCode createContext(IEvtSelector::Context*& pCtxt) const;
209
210 bool operator == (const Trigger& rhs) const {
211 return ( m_pSelector == rhs.m_pSelector );
212 }
213 bool operator != (const Trigger& rhs) const {
214 return ( m_pSelector != rhs.m_pSelector );
215 }
216 bool operator < (const Trigger& rhs) const {
217 return ( m_todo < rhs.m_todo ||
218 ((m_todo == rhs.m_todo) && (m_pSelector < rhs.m_pSelector)) );
219 }
220
221 const std::string& name() const {
222 return dynamic_cast<IService&>(selector()).name();
223 }
224 std::string toString() const ;
225
226 private:
227 IEvtSelector::Context& currentContext() const; //throws GaudiException
228 IEvtSelector& selector() const {
229 assert( m_pSelector );
230 return *m_pSelector;
231 }
232
233 };
234
239 private:
240 std::vector<Trigger> m_trigs;
241 std::vector<unsigned int> m_rangeEnd;
242 unsigned int m_todo;
243 public:
245 typedef std::vector<Trigger>::const_iterator const_iterator;
246 typedef std::vector<Trigger>::iterator iterator;
247 bool add(const Trigger&);
248 bool remove(iterator);
249 iterator begin() { return m_trigs.begin(); }
250 iterator end() { return m_trigs.end(); }
251 const_iterator begin() const { return m_trigs.begin(); }
252 const_iterator end() const { return m_trigs.end(); }
253 bool empty() const { return m_trigs.empty(); }
254 iterator elementInRange(unsigned int);
255 unsigned int todo() const { return m_todo; }
256 std::string toString() const;
257 };
258
260
262
263
268
270
271
272 unsigned long getEventNo() const;
273 mutable unsigned long m_eventPos{0};
276 std::unique_ptr<CLHEP::RandFlat> m_chooseRangeRand;
277
278};
279#endif // ATHENASERVICES_MIXINGEVENTSELECTOR_H
280
uint32_t CLID
The Class ID type.
This file contains the class definition for the IAthenaSelectorTool class.
Define macros for attributes used to control the static checker.
#define ATLAS_NO_CHECK_FILE_THREAD_SAFETY
std::list< SG::TransientAddress * > tadList
the list of available selectors with their frequency range
std::vector< Trigger >::iterator iterator
std::vector< unsigned int > m_rangeEnd
std::vector< Trigger >::const_iterator const_iterator
a selector with an associated frequency
bool operator<(const Trigger &rhs) const
StatusCode createContext(IEvtSelector::Context *&pCtxt) const
Trigger(IEvtSelector *pSel, unsigned int firstEvt, unsigned int lastEvt)
const std::string & name() const
StatusCode createAddress(IOpaqueAddress *&) const
bool operator==(const Trigger &rhs) const
bool operator!=(const Trigger &rhs) const
IEvtSelector & selector() const
IEvtSelector::Context * m_current
IEvtSelector::Context & currentContext() const
Gaudi::Property< std::string > m_mergedEventInfoKey
virtual StatusCode setConversionSvc(IConversionSvc *pService) override
TriggerList::iterator currentTrigger() const
"intelligent" accessor to the above
Gaudi::Property< std::string > m_statusFileName
virtual StatusCode createContext(IEvtSelector::Context *&refpCtxt) const override
virtual StatusCode initialize() override
TriggerList::iterator setCurrentTrigger() const
choose current trigger at random. Actually modifies state (use mutables)
virtual StatusCode next(IEvtSelector::Context &refCtxt) const override
virtual SmartIF< IDataProviderSvc > & dataProvider() const override
virtual StatusCode createAddress(const IEvtSelector::Context &refCtxt, IOpaqueAddress *&) const override
virtual StatusCode rewind(IEvtSelector::Context &refCtxt) const override
Gaudi::Property< int > m_outputRunNumber
virtual StatusCode previous(IEvtSelector::Context &) const override
Gaudi::Property< std::vector< unsigned long > > m_eventNumbers
unsigned long getEventNo() const
setup and lookup m_evtsNotUsedSoFar. Returns next event no
virtual StatusCode updateObj(IOpaqueAddress *pAddress, DataObject *refpObject) override
virtual StatusCode last(IEvtSelector::Context &) const override
MixingEventSelector(const std::string &name, ISvcLocator *svc)
void decodeTrigger(const std::string &triggDescr)
functor that creates a Trigger object and adds it to m_trigList
Gaudi::Property< std::string > m_randomStreamName
virtual StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress) override
Gaudi::Property< std::vector< std::string > > m_triggerListProp
virtual StatusCode setAddressCreator(IAddressCreator *creator) override
virtual StatusCode updateObjRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
virtual StatusCode updateAddress(StoreID::type storeID, SG::TransientAddress *tad, const EventContext &ctx) override
virtual StatusCode releaseContext(IEvtSelector::Context *&refCtxt) const override
virtual const CLID & objType() const override
TriggerList m_trigList
the ingredients
virtual StatusCode updateRepRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
virtual StatusCode fillRepRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
virtual StatusCode fillObjRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
virtual StatusCode finalize() override
virtual StatusCode loadAddresses(StoreID::type storeID, IAddressProvider::tadList &tads) override
virtual StatusCode updateRep(IOpaqueAddress *pAddress, DataObject *pObject) override
virtual SmartIF< IAddressCreator > & addressCreator() const override
virtual StatusCode preLoadAddresses(StoreID::type storeID, IAddressProvider::tadList &tads) override
TriggerList::iterator m_pCurrentTrigger
the current trigger
ServiceHandle< StoreGateSvc > m_pEventStore
virtual StatusCode setDataProvider(IDataProviderSvc *pService) override
ServiceHandle< IAtRndmGenSvc > m_atRndmSvc
virtual long repSvcType() const override
unsigned long m_eventPos
the internal event number
void setUpTriggerList(Gaudi::Details::PropertyBase &trigList)
TriggerList property call-back.
std::unique_ptr< CLHEP::RandFlat > m_chooseRangeRand
ToolHandleArray< IAthenaSelectorTool > m_helperTools
virtual StatusCode createObj(IOpaqueAddress *pAddress, DataObject *&refpObject) override
Create the transient representation of an object.
virtual SmartIF< IConversionSvc > & conversionSvc() const override
virtual StatusCode resetCriteria(const std::string &cr, IEvtSelector::Context &c) const override
The Athena Transient Store API.
virtual void * identifier() const