ATLAS Offline Software
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
9 
16 ATLAS_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 
35 class ISvcLocator;
36 
37 class MixingEventIterator;
38 
39 class StoreGateSvc;
40 
41 namespace CLHEP {
42  class RandFlat;
43 }
44 
45 
70  : public extends<AthService, IEvtSelector, IConverter, IAddressProvider>
71 {
72 public:
76  struct Context : public IEvtSelector::Context {
77  virtual ~Context() {}
78  virtual void* identifier() const {
79  return (void*)0;
80  }
81  } ;
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 
151 private:
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 
239  class TriggerList {
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;
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 
268 
269 
271 
272  unsigned long getEventNo() const;
274  mutable unsigned long m_eventPos{0};
275 
277  std::unique_ptr<CLHEP::RandFlat> m_chooseRangeRand;
278 
279 };
280 #endif // ATHENASERVICES_MIXINGEVENTSELECTOR_H
281 
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
MixingEventSelector::m_pCurrentTrigger
TriggerList::iterator m_pCurrentTrigger
the current trigger
Definition: MixingEventSelector.h:266
MixingEventSelector::m_trigList
TriggerList m_trigList
the ingredients
Definition: MixingEventSelector.h:260
MixingEventSelector
a stream of events read from different selectors.
Definition: MixingEventSelector.h:71
MixingEventSelector::MixingEventSelector
MixingEventSelector(const std::string &name, ISvcLocator *svc)
Definition: MixingEventSelector.cxx:46
MixingEventSelector::Trigger::toString
std::string toString() const
Definition: MixingEventSelector.cxx:408
MixingEventSelector::conversionSvc
virtual SmartIF< IConversionSvc > & conversionSvc() const override
Definition: MixingEventSelector.cxx:544
MixingEventSelector::m_atRndmSvc
ServiceHandle< IAtRndmGenSvc > m_atRndmSvc
Definition: MixingEventSelector.h:178
MixingEventSelector::TriggerList::remove
bool remove(iterator)
Definition: MixingEventSelector.cxx:322
MixingEventSelector::repSvcType
virtual long repSvcType() const override
Definition: MixingEventSelector.cxx:488
MixingEventSelector::m_statusFileName
Gaudi::Property< std::string > m_statusFileName
Definition: MixingEventSelector.h:156
MixingEventSelector::objType
virtual const CLID & objType() const override
Definition: MixingEventSelector.cxx:484
MixingEventSelector::Context::~Context
virtual ~Context()
Definition: MixingEventSelector.h:77
MixingEventSelector::Trigger::m_todo
unsigned int m_todo
Definition: MixingEventSelector.h:192
MixingEventSelector::releaseContext
virtual StatusCode releaseContext(IEvtSelector::Context *&refCtxt) const override
Definition: MixingEventSelector.cxx:474
MixingEventSelector::TriggerList::m_rangeEnd
std::vector< unsigned int > m_rangeEnd
Definition: MixingEventSelector.h:242
SG::TransientAddress
Definition: TransientAddress.h:32
MixingEventSelector::setDataProvider
virtual StatusCode setDataProvider(IDataProviderSvc *pService) override
Definition: MixingEventSelector.cxx:532
MixingEventSelector::last
virtual StatusCode last(IEvtSelector::Context &) const override
Definition: MixingEventSelector.cxx:459
MixingEventSelector::m_eventNumbers
Gaudi::Property< std::vector< unsigned long > > m_eventNumbers
Definition: MixingEventSelector.h:165
MixingEventSelector::Trigger::operator==
bool operator==(const Trigger &rhs) const
Definition: MixingEventSelector.h:211
MixingEventSelector::setAddressCreator
virtual StatusCode setAddressCreator(IAddressCreator *creator) override
Definition: MixingEventSelector.cxx:548
IAthenaSelectorTool.h
This file contains the class definition for the IAthenaSelectorTool class.
MixingEventSelector::TriggerList::end
iterator end()
Definition: MixingEventSelector.h:251
MixingEventSelector::TriggerList::empty
bool empty() const
Definition: MixingEventSelector.h:254
MixingEventSelector::TriggerList::todo
unsigned int todo() const
Definition: MixingEventSelector.h:256
MixingEventSelector::Trigger::todo
unsigned int todo() const
Definition: MixingEventSelector.h:201
MixingEventSelector::Trigger::selector
IEvtSelector & selector() const
Definition: MixingEventSelector.h:229
MixingEventSelector::next
virtual StatusCode next(IEvtSelector::Context &refCtxt) const override
Definition: MixingEventSelector.cxx:183
MixingEventSelector::currentTrigger
TriggerList::iterator currentTrigger() const
"intelligent" accessor to the above
Definition: MixingEventSelector.cxx:299
MixingEventSelector::Trigger::m_pSelector
IEvtSelector * m_pSelector
Definition: MixingEventSelector.h:189
MixingEventSelector::loadAddresses
virtual StatusCode loadAddresses(StoreID::type storeID, IAddressProvider::tadList &tads) override
Definition: MixingEventSelector.cxx:238
MixingEventSelector::getEventNo
unsigned long getEventNo() const
setup and lookup m_evtsNotUsedSoFar. Returns next event no
Definition: MixingEventSelector.cxx:268
MixingEventSelector::m_eventPos
unsigned long m_eventPos
the internal event number
Definition: MixingEventSelector.h:274
MixingEventSelector::Trigger::read
unsigned int read() const
Definition: MixingEventSelector.h:203
MixingEventSelector::m_helperTools
ToolHandleArray< IAthenaSelectorTool > m_helperTools
Definition: MixingEventSelector.h:175
MixingEventSelector::setConversionSvc
virtual StatusCode setConversionSvc(IConversionSvc *pService) override
Definition: MixingEventSelector.cxx:540
MixingEventSelector::TriggerList::elementInRange
iterator elementInRange(unsigned int)
Definition: MixingEventSelector.cxx:369
MixingEventSelector::Trigger::previous
StatusCode previous() const
Definition: MixingEventSelector.cxx:428
StoreGateSvc
The Athena Transient Store API.
Definition: StoreGateSvc.h:120
MixingEventSelector::createObj
virtual StatusCode createObj(IOpaqueAddress *pAddress, DataObject *&refpObject) override
Create the transient representation of an object.
Definition: MixingEventSelector.cxx:505
MixingEventSelector::TriggerList::iterator
std::vector< Trigger >::iterator iterator
Definition: MixingEventSelector.h:247
MixingEventSelector::decodeTrigger
void decodeTrigger(std::string triggDescr)
functor that creates a Trigger object and adds it to m_trigList
Definition: MixingEventSelector.cxx:113
MixingEventSelector::m_chooseRangeRand
std::unique_ptr< CLHEP::RandFlat > m_chooseRangeRand
Definition: MixingEventSelector.h:277
MixingEventSelector::Trigger::m_toRead
unsigned int m_toRead
Definition: MixingEventSelector.h:191
MixingEventSelector::Context::identifier
virtual void * identifier() const
Definition: MixingEventSelector.h:78
MixingEventSelector::m_randomStreamName
Gaudi::Property< std::string > m_randomStreamName
Definition: MixingEventSelector.h:172
MixingEventSelector::m_pEventStore
ServiceHandle< StoreGateSvc > m_pEventStore
Definition: MixingEventSelector.h:276
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
CLHEP
STD'S.
Definition: CaloNoiseCompCondAlg.h:58
MixingEventSelector::dataProvider
virtual SmartIF< IDataProviderSvc > & dataProvider() const override
Definition: MixingEventSelector.cxx:536
MixingEventSelector::Trigger::operator<
bool operator<(const Trigger &rhs) const
Definition: MixingEventSelector.h:217
MixingEventSelector::Trigger::next
StatusCode next() const
Definition: MixingEventSelector.cxx:416
MixingEventSelector::TriggerList::begin
iterator begin()
Definition: MixingEventSelector.h:250
MixingEventSelector::rewind
virtual StatusCode rewind(IEvtSelector::Context &refCtxt) const override
Definition: MixingEventSelector.cxx:471
Handler::svc
AthROOTErrorHandlerSvc * svc
Definition: AthROOTErrorHandlerSvc.cxx:10
MixingEventSelector::setCurrentTrigger
TriggerList::iterator setCurrentTrigger() const
choose current trigger at random. Actually modifies state (use mutables)
Definition: MixingEventSelector.cxx:276
CLID
uint32_t CLID
The Class ID type.
Definition: Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
MixingEventSelector::TriggerList::m_trigs
std::vector< Trigger > m_trigs
Definition: MixingEventSelector.h:241
MixingEventSelector::TriggerList::m_todo
unsigned int m_todo
Definition: MixingEventSelector.h:243
MixingEventSelector::Trigger::m_firstEvent
unsigned int m_firstEvent
Definition: MixingEventSelector.h:190
IAtRndmGenSvc.h
MixingEventSelector::TriggerList::TriggerList
TriggerList()
Definition: MixingEventSelector.h:245
MixingEventSelector::updateObj
virtual StatusCode updateObj(IOpaqueAddress *pAddress, DataObject *refpObject) override
Definition: MixingEventSelector.cxx:560
MixingEventSelector::updateAddress
virtual StatusCode updateAddress(StoreID::type storeID, SG::TransientAddress *tad, const EventContext &ctx) override
Definition: MixingEventSelector.cxx:261
MixingEventSelector::TriggerList::end
const_iterator end() const
Definition: MixingEventSelector.h:253
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
MixingEventSelector::setUpTriggerList
void setUpTriggerList(Gaudi::Details::PropertyBase &trigList)
TriggerList property call-back.
Definition: MixingEventSelector.cxx:104
MixingEventSelector::finalize
virtual StatusCode finalize() override
Definition: MixingEventSelector.cxx:82
MixingEventSelector::Context
dummy for now
Definition: MixingEventSelector.h:76
MixingEventSelector::TriggerList::toString
std::string toString() const
Definition: MixingEventSelector.cxx:355
MixingEventSelector::Trigger::m_current
IEvtSelector::Context * m_current
Definition: MixingEventSelector.h:194
MixingEventSelector::previous
virtual StatusCode previous(IEvtSelector::Context &) const override
Definition: MixingEventSelector.cxx:465
MixingEventSelector::~MixingEventSelector
virtual ~MixingEventSelector()
Definition: MixingEventSelector.cxx:53
MixingEventSelector::Trigger
a selector with an associated frequency
Definition: MixingEventSelector.h:187
MixingEventSelector::fillRepRefs
virtual StatusCode fillRepRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Definition: MixingEventSelector.cxx:572
MixingEventSelector::TriggerList::add
bool add(const Trigger &)
Definition: MixingEventSelector.cxx:304
MixingEventSelector::TriggerList::const_iterator
std::vector< Trigger >::const_iterator const_iterator
Definition: MixingEventSelector.h:246
MixingEventSelector::Trigger::name
const std::string & name() const
Definition: MixingEventSelector.h:222
MixingEventSelector::Trigger::done
bool done() const
Definition: MixingEventSelector.cxx:450
StoreID::type
type
Definition: StoreID.h:24
MixingEventSelector::TriggerList
the list of available selectors with their frequency range
Definition: MixingEventSelector.h:239
MixingEventSelector::Trigger::toRead
unsigned int toRead() const
Definition: MixingEventSelector.h:202
MixingEventSelector::initialize
virtual StatusCode initialize() override
Definition: MixingEventSelector.cxx:57
MixingEventSelector::createContext
virtual StatusCode createContext(IEvtSelector::Context *&refpCtxt) const override
Definition: MixingEventSelector.cxx:173
MixingEventSelector::preLoadAddresses
virtual StatusCode preLoadAddresses(StoreID::type storeID, IAddressProvider::tadList &tads) override
Definition: MixingEventSelector.cxx:232
MixingEventSelector::Trigger::Trigger
Trigger(IEvtSelector *pSel, unsigned int firstEvt, unsigned int lastEvt)
Definition: MixingEventSelector.cxx:387
MixingEventSelector::Trigger::m_reads
unsigned int m_reads
Definition: MixingEventSelector.h:193
IAddressProvider::tadList
std::list< SG::TransientAddress * > tadList
Definition: IAddressProvider.h:32
AthService.h
MixingEventSelector::createAddress
virtual StatusCode createAddress(const IEvtSelector::Context &refCtxt, IOpaqueAddress *&) const override
Definition: MixingEventSelector.cxx:221
IAddressProvider.h
MixingEventSelector::Trigger::createContext
StatusCode createContext(IEvtSelector::Context *&pCtxt) const
Definition: MixingEventSelector.cxx:440
MixingEventSelector::addressCreator
virtual SmartIF< IAddressCreator > & addressCreator() const override
Definition: MixingEventSelector.cxx:552
ATLAS_NO_CHECK_FILE_THREAD_SAFETY
ATLAS_NO_CHECK_FILE_THREAD_SAFETY
Definition: MixingEventSelector.h:16
MixingEventSelector::Trigger::operator!=
bool operator!=(const Trigger &rhs) const
Definition: MixingEventSelector.h:214
checker_macros.h
Define macros for attributes used to control the static checker.
MixingEventSelector::TriggerList::begin
const_iterator begin() const
Definition: MixingEventSelector.h:252
MixingEventSelector::updateRep
virtual StatusCode updateRep(IOpaqueAddress *pAddress, DataObject *pObject) override
Definition: MixingEventSelector.cxx:576
MixingEventSelector::Trigger::currentContext
IEvtSelector::Context & currentContext() const
Definition: MixingEventSelector.cxx:395
python.compressB64.c
def c
Definition: compressB64.py:93
MixingEventSelector::Trigger::createAddress
StatusCode createAddress(IOpaqueAddress *&) const
Definition: MixingEventSelector.cxx:433
MixingEventSelector::m_mergedEventInfoKey
Gaudi::Property< std::string > m_mergedEventInfoKey
Definition: MixingEventSelector.h:169
MixingEventSelector::fillObjRefs
virtual StatusCode fillObjRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Definition: MixingEventSelector.cxx:556
MixingEventSelector::validTrigger
bool validTrigger() const
Definition: MixingEventSelector.h:152
MixingEventSelector::updateObjRefs
virtual StatusCode updateObjRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Definition: MixingEventSelector.cxx:564
MixingEventSelector::resetCriteria
virtual StatusCode resetCriteria(const std::string &cr, IEvtSelector::Context &c) const override
Definition: MixingEventSelector.cxx:477
MixingEventSelector::createRep
virtual StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress) override
Definition: MixingEventSelector.cxx:568
MixingEventSelector::m_outputRunNumber
Gaudi::Property< int > m_outputRunNumber
Definition: MixingEventSelector.h:163
MixingEventSelector::m_triggerListProp
Gaudi::Property< std::vector< std::string > > m_triggerListProp
Definition: MixingEventSelector.h:159
MixingEventSelector::updateRepRefs
virtual StatusCode updateRepRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Definition: MixingEventSelector.cxx:580
ServiceHandle< IAtRndmGenSvc >