ATLAS Offline Software
Loading...
Searching...
No Matches
MixingEventSelector.h
Go to the documentation of this file.
1/* -*- C++ -*- */
2
3/*
4 Copyright (C) 2002-2025 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 <ostream>
21#include <vector>
22
27
28#include "GaudiKernel/ServiceHandle.h"
29#include "GaudiKernel/IEvtSelector.h"
30#include "GaudiKernel/IConverter.h"
31#include "GaudiKernel/ToolHandle.h"
32#include "GaudiKernel/StatusCode.h"
33#include "Gaudi/Property.h" /*StringArrayProperty*/
34
35class ISvcLocator;
36
37class MixingEventIterator;
38
39class StoreGateSvc;
40
41namespace CLHEP {
42 class RandFlat;
43}
44
45
70 : public extends<AthService, IEvtSelector, IConverter, IAddressProvider>
71{
72public:
76 struct Context : public IEvtSelector::Context {
77 virtual ~Context() {}
78 virtual void* identifier() const {
79 return (void*)0;
80 }
81 } ;
82
83
84 virtual StatusCode next(IEvtSelector::Context& refCtxt) const override;
85 virtual StatusCode createAddress(const IEvtSelector::Context& refCtxt,
86 IOpaqueAddress*&) const override;
87
88 virtual StatusCode createContext(IEvtSelector::Context*& refpCtxt) const override;
89 virtual StatusCode last(IEvtSelector::Context&) const override;
90 virtual StatusCode next(IEvtSelector::Context&, int) const override;
91 virtual StatusCode previous(IEvtSelector::Context&) const override;
92 virtual StatusCode previous(IEvtSelector::Context&,int) const override;
93 virtual StatusCode rewind(IEvtSelector::Context& refCtxt) const override;
94 virtual StatusCode releaseContext(IEvtSelector::Context*& refCtxt) const override;
95 virtual StatusCode resetCriteria(const std::string& cr,IEvtSelector::Context& c) const override;
97
99
100 virtual StatusCode preLoadAddresses(StoreID::type storeID ,
101 IAddressProvider::tadList& tads ) override;
102 virtual StatusCode loadAddresses(StoreID::type storeID ,
103 IAddressProvider::tadList& tads ) override;
104 virtual StatusCode updateAddress(StoreID::type storeID ,
106 const EventContext& ctx) override;
108
109
111
112 virtual const CLID& objType() const override;
113 virtual long repSvcType() const override;
114 virtual StatusCode createObj(IOpaqueAddress* pAddress, DataObject*& refpObject) override;
115
116 // The rest of these are dummies.
117 virtual StatusCode setDataProvider(IDataProviderSvc* pService) override;
118 virtual SmartIF<IDataProviderSvc>& dataProvider() const override;
119 virtual StatusCode setConversionSvc(IConversionSvc* pService) override;
120 virtual SmartIF<IConversionSvc>& conversionSvc() const override;
121 virtual StatusCode setAddressCreator(IAddressCreator* creator) override;
122 virtual SmartIF<IAddressCreator>& addressCreator() const override;
123 virtual StatusCode fillObjRefs(IOpaqueAddress* pAddress, DataObject* pObject) override;
124 virtual StatusCode updateObj(IOpaqueAddress* pAddress, DataObject* refpObject) override;
125 virtual StatusCode updateObjRefs(IOpaqueAddress* pAddress, DataObject* pObject) override;
126 virtual StatusCode createRep(DataObject* pObject, IOpaqueAddress*& refpAddress) override;
127 virtual StatusCode fillRepRefs(IOpaqueAddress* pAddress, DataObject* pObject) override;
128 virtual StatusCode updateRep(IOpaqueAddress* pAddress, DataObject* pObject) override;
129 virtual StatusCode updateRepRefs(IOpaqueAddress* pAddress, DataObject* pObject) override;
131
132
134
135 virtual StatusCode initialize() override;
136 virtual StatusCode finalize() override;
138
141 void setUpTriggerList(Gaudi::Details::PropertyBase& trigList);
143 void decodeTrigger(std::string triggDescr);
144
146
147 MixingEventSelector(const std::string& name, ISvcLocator* svc);
148 virtual ~MixingEventSelector();
150
151private:
152 bool validTrigger() const { return (m_trigList.end()!=m_pCurrentTrigger);}
153
155
156 Gaudi::Property<std::string> m_statusFileName{this, "StreamStatusFileName", {},
157 "Name of the file recording the last event used and how many were available for each stream. Default is to produce no file."};
158
159 Gaudi::Property<std::vector<std::string>> m_triggerListProp{this, "TriggerList", {}, &MixingEventSelector::setUpTriggerList,
160 "List of triggers (streams) to be used. Format is SelectorType/SelectorName:firstEventToUse:lastEventToUse. "
161 "One assumes events are consecutively numbered."};
162
163 Gaudi::Property<int> m_outputRunNumber{this, "OutputRunNumber", 123456789};
164
165 Gaudi::Property<std::vector<unsigned long>> m_eventNumbers{this, "EventNumbers", {},
166 "List of event numbers to be used for output stream. If list empty or not long enough, event numbers are "
167 "assigned consucutively after last one in list."};
168
169 Gaudi::Property<std::string> m_mergedEventInfoKey{this, "MergedEventInfoKey", "MergedEventInfo",
170 "StoreGate key for output (merged) event info object. Default is MergedEventInfo"};
171
172 Gaudi::Property<std::string> m_randomStreamName{this, "RndmStreamName", "MixingEventSelectorStream",
173 "IAtRndmGenSvc stream used as engine for our random distributions"};
174
175 ToolHandleArray<IAthenaSelectorTool> m_helperTools{this, "HelperTools", {},
176 "Collection of selector tools"};
177
178 ServiceHandle<IAtRndmGenSvc> m_atRndmSvc{this, "RndmGenSvc", "AtRndmGenSvc",
179 "IAtRndmGenSvc controlling the order with which events are takes from streams"};
180
182
183
187 class Trigger {
188 private:
189 IEvtSelector* m_pSelector;
190 unsigned int m_firstEvent;
191 unsigned int m_toRead;
192 unsigned int m_todo;
193 mutable unsigned int m_reads;
194 mutable IEvtSelector::Context* m_current;
195
196 public:
197 Trigger(IEvtSelector* pSel,
198 //IEvtSelector::Context* pContext,
199 unsigned int firstEvt, unsigned int lastEvt);
200
201 unsigned int todo() const { return m_todo; }
202 unsigned int toRead() const { return m_toRead; }
203 unsigned int read() const { return m_reads; }
204 bool done() const;
205
206 StatusCode next() const;
207 StatusCode previous() const;
208 StatusCode createAddress(IOpaqueAddress*&) const;
209 StatusCode createContext(IEvtSelector::Context*& pCtxt) const;
210
211 bool operator == (const Trigger& rhs) const {
212 return ( m_pSelector == rhs.m_pSelector );
213 }
214 bool operator != (const Trigger& rhs) const {
215 return ( m_pSelector != rhs.m_pSelector );
216 }
217 bool operator < (const Trigger& rhs) const {
218 return ( m_todo < rhs.m_todo ||
219 ((m_todo == rhs.m_todo) && (m_pSelector < rhs.m_pSelector)) );
220 }
221
222 const std::string& name() const {
223 return dynamic_cast<IService&>(selector()).name();
224 }
225 std::string toString() const ;
226
227 private:
228 IEvtSelector::Context& currentContext() const; //throws GaudiException
229 IEvtSelector& selector() const {
230 assert( m_pSelector );
231 return *m_pSelector;
232 }
233
234 };
235
240 private:
241 std::vector<Trigger> m_trigs;
242 std::vector<unsigned int> m_rangeEnd;
243 unsigned int m_todo;
244 public:
246 typedef std::vector<Trigger>::const_iterator const_iterator;
247 typedef std::vector<Trigger>::iterator iterator;
248 bool add(const Trigger&);
249 bool remove(iterator);
250 iterator begin() { return m_trigs.begin(); }
251 iterator end() { return m_trigs.end(); }
252 const_iterator begin() const { return m_trigs.begin(); }
253 const_iterator end() const { return m_trigs.end(); }
254 bool empty() const { return m_trigs.empty(); }
255 iterator elementInRange(unsigned int);
256 unsigned int todo() const { return m_todo; }
257 std::string toString() const;
258 };
259
261
263
264
269
271
272
273 unsigned long getEventNo() const;
274 mutable unsigned long m_eventPos{0};
277 std::unique_ptr<CLHEP::RandFlat> m_chooseRangeRand;
278
279};
280#endif // ATHENASERVICES_MIXINGEVENTSELECTOR_H
281
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
void decodeTrigger(std::string triggDescr)
functor that creates a Trigger object and adds it to m_trigList
virtual StatusCode updateObj(IOpaqueAddress *pAddress, DataObject *refpObject) override
virtual StatusCode last(IEvtSelector::Context &) const override
MixingEventSelector(const std::string &name, ISvcLocator *svc)
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