Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  master (d98a2936)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
EventCollectionSelector.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
16 #include <GaudiKernel/INTupleSvc.h>
17 #include <GaudiKernel/IRegistry.h>
20 #include <GaudiKernel/NTuple.h>
22 #include <GaudiKernel/SmartIF.h>
23 #include <memory>
24 
26 
27 
33 public:
34  typedef std::list<std::string> ListName;
35 
36 private:
37  GenericAddress* m_pAddressBuffer = nullptr;
38  const EventCollectionSelector* m_pSelector = nullptr;
40  std::string m_criteria;
41  ListName::const_iterator m_fileIterator;
42  std::string m_currentInput;
43 
44 public:
48  ~EventCollectionContext() override;
52 
53  const std::string& currentInput() const { return m_currentInput; }
54  void setCurrentInput( const std::string& v ) { m_currentInput = v; }
55  ListName& files() { return m_files; }
56  void* identifier() const override { return (void*)m_pSelector; }
57  void setCriteria( const std::string& crit ) { m_criteria = crit; }
58  ListName::const_iterator fileIterator() { return m_fileIterator; }
59  void setFileIterator( ListName::const_iterator new_iter ) { m_fileIterator = new_iter; }
60 };
61 
63 
64 EventCollectionContext::EventCollectionContext( const EventCollectionSelector* pSelector ) : m_pSelector( pSelector ) {
67 }
68 
69 // IService implementation: Db event selector override
71  // Initialize base class
73  if ( !status.isSuccess() ) {
74  error() << "Error initializing base class Service!" << endmsg;
75  return status;
76  }
77  m_pAddrCreator = serviceLocator()->service( "EventPersistencySvc" );
78  if ( !m_pAddrCreator ) {
79  error() << "Unable to locate IAddressCreator interface of "
80  << "EventPersistencySvc" << endmsg;
81  return status;
82  }
84  if ( !m_tupleSvc ) {
85  error() << "Unable to locate INTupleSvc interface of " << m_tupleSvcName << endmsg;
86  return status;
87  }
88  return status;
89 }
90 
91 // Connect collection to selector
92 StatusCode EventCollectionSelector::connectDataSource( const std::string& db, const std::string& /* typ */ ) const {
95  if ( svc && !db.empty() ) {
96  std::string ident = name() + ' ';
97  ident += "DATAFILE='" + m_database.value().substr( 5 ) + "' ";
98  if ( !m_dbSvc.empty() )
99  ident += "SVC='" + m_dbSvc + "' ";
100  else
101  ident += "TYP='" + m_dbType + "' ";
102  ident += "OPT='READ' ";
103  if ( m_authentication.length() > 0 ) { ident += "AUTH='" + m_authentication + "' "; }
104  status = svc->connect( ident );
105  }
106  return status;
107 }
108 
110 StatusCode EventCollectionSelector::connectTuple( const std::string& nam, const std::string& itName,
111  NTuple::Tuple*& tup,
112  std::optional<NTuple::Item<IOpaqueAddress*>>& item ) const {
113  std::string top = "/NTUPLES/" + name() + '/' + nam;
114  StatusCode status = m_tupleSvc->retrieveObject( top, (DataObject*&)tup );
115  if ( status.isSuccess() ) {
116  item.emplace();
117  status = tup->item( itName, *item );
118  if ( status.isSuccess() ) return status;
119  error() << "Item " << itName << " is not part of the collection:" << top << endmsg;
120  item.reset();
121  } else {
122  error() << "Cannot connect to collection:" << top << endmsg;
123  }
124  tup = nullptr;
125  return status;
126 }
127 
129 StatusCode EventCollectionSelector::connectStatement( const std::string& typ, const std::string& crit,
130  INTuple* tuple ) const {
131  std::string seltyp = typ;
132  if ( !seltyp.empty() || !crit.empty() ) {
133  if ( !crit.empty() && seltyp.length() == 0 ) seltyp = "NTuple::Selector";
134  SmartIF<ISelectStatement> stmt( ObjFactory::create( seltyp, serviceLocator() ).release() );
135  if ( stmt ) {
136  if ( !crit.empty() ) stmt->setCriteria( crit );
137  tuple->attachSelector( stmt ).ignore();
138  return StatusCode::SUCCESS;
139  }
140  return StatusCode::FAILURE;
141  }
142  return StatusCode::SUCCESS;
143 }
144 
148  if ( tuple ) {
149  do {
150  status = m_tupleSvc->readRecord( tuple );
151  if ( status.isSuccess() ) {
152  ISelectStatement* statement = tuple->selector();
153  bool use_it = ( statement ) ? ( *statement )( tuple ) : true;
154  if ( use_it ) { return status; }
155  }
156  } while ( status.isSuccess() );
157  }
158  return status;
159 }
160 
164  if ( tuple ) {
165  IRegistry* pReg = tuple->registry();
166  if ( pReg ) {
167  IOpaqueAddress* pAddr = pReg->address();
168  if ( pAddr ) {
169  long* ip = (long*)pAddr->ipar();
170  do {
171  if ( ip[1] > 1 ) {
172  ip[1] -= 2;
173  status = m_tupleSvc->readRecord( tuple );
174  if ( status.isSuccess() ) {
175  ISelectStatement* statement = tuple->selector();
176  bool use_it = ( statement ) ? ( *statement )( tuple ) : true;
177  if ( use_it ) { return status; }
178  }
179  } else {
180  return StatusCode::FAILURE;
181  }
182  } while ( status.isSuccess() );
183  }
184  }
185  }
186  return StatusCode::FAILURE;
187 }
188 
189 // Connect collection to selector
191  if ( ctxt ) {
193  if ( status.isSuccess() ) {
194  status = connectTuple( m_cntName, m_itemName, ctxt->tuple, ctxt->item );
195  if ( status.isSuccess() ) {
196  status = connectStatement( m_statement, m_criteria, ctxt->tuple );
197  if ( status.isSuccess() ) {
198  *( ctxt->item ) = 0;
199  return status;
200  }
201  }
202  }
203  return status;
204  }
205  return StatusCode::FAILURE;
206 }
207 
208 // Finalize service
210  // release services
211  m_pAddrCreator = nullptr;
212  m_tupleSvc = nullptr;
213  return Service::finalize();
214 }
215 
218  refpCtxt = nullptr;
219  auto ctxt = std::make_unique<MyContextType>();
220  StatusCode status = connectCollection( ctxt.get() );
221  if ( !status.isSuccess() ) {
222  error() << "Unable to connect Collection file \"" << m_database << "\"" << endmsg;
223  return status;
224  }
225  refpCtxt = ctxt.release();
226  return StatusCode::SUCCESS;
227 }
228 
230 StatusCode EventCollectionSelector::next( Context& refCtxt ) const { return next( refCtxt, 1 ); }
231 
233 StatusCode EventCollectionSelector::next( Context& refCtxt, int jump ) const {
234  MyContextType* ctxt = dynamic_cast<MyContextType*>( &refCtxt );
235  if ( ctxt ) {
236  *( ctxt->item ) = ctxt->addressBuffer;
238  for ( int i = 0; i < jump && sc.isSuccess(); ++i ) { sc = getNextRecord( ctxt->tuple ); }
239  return sc;
240  }
241  return StatusCode::FAILURE;
242 }
243 
245 StatusCode EventCollectionSelector::previous( Context& refCtxt ) const { return previous( refCtxt, 1 ); }
246 
248 StatusCode EventCollectionSelector::previous( Context& refCtxt, int jump ) const {
249  MyContextType* ctxt = dynamic_cast<MyContextType*>( &refCtxt );
250  if ( ctxt ) {
251  *( ctxt->item ) = ctxt->addressBuffer;
253  for ( int i = 0; i < jump && sc.isSuccess(); ++i ) { sc = getPreviousRecord( ctxt->tuple ); }
254  return sc;
255  }
256  return StatusCode::FAILURE;
257 }
258 
260 StatusCode EventCollectionSelector::rewind( Context& /* refCtxt */ ) const { return StatusCode::FAILURE; }
261 
263 StatusCode EventCollectionSelector::createAddress( const Context& refCtxt, IOpaqueAddress*& refpAddr ) const {
264  const MyContextType* ctxt = dynamic_cast<const MyContextType*>( &refCtxt );
265  if ( ctxt ) {
266  IOpaqueAddress* pA = *( ctxt->item );
267  if ( pA ) {
268  IOpaqueAddress* pAddress = nullptr;
269  StatusCode status = m_pAddrCreator->createAddress( pA->svcType(), pA->clID(), pA->par(), pA->ipar(), pAddress );
270  if ( status.isSuccess() ) {
271  refpAddr = pAddress;
272  return StatusCode::SUCCESS;
273  } else {
274  error() << "Failed to access " << pA->par()[0] << ":" << pA->par()[1] << " SvcTyp:" << long( pA->svcType() )
275  << " CLID:" << pA->clID() << endmsg;
276  }
277  }
278  }
279  return StatusCode::FAILURE;
280 }
281 
284  MyContextType* ctxt = dynamic_cast<MyContextType*>( refCtxt );
285  if ( ctxt ) {
286  delete ctxt;
287  ctxt = nullptr;
288  return StatusCode::SUCCESS;
289  }
290  return StatusCode::FAILURE;
291 }
292 
295 StatusCode EventCollectionSelector::resetCriteria( const std::string& cr, Context& refCtxt ) const {
296  MyContextType* ctxt = dynamic_cast<MyContextType*>( &refCtxt );
297  if ( ctxt ) {
298  ctxt->criteria = cr;
299  return StatusCode::SUCCESS;
300  }
301  return StatusCode::FAILURE;
302 }
303 
305 StatusCode EventCollectionSelector::last( Context& /* refCtxt */ ) const { return StatusCode::FAILURE; }
EventCollectionSelector::resetCriteria
StatusCode resetCriteria(const std::string &cr, Context &c) const override
Will set a new criteria for the selection of the next list of events and will change the state of the...
Definition: EventCollectionSelector.cpp:295
EventCollectionSelector::finalize
StatusCode finalize() override
Service override: Finalize Service.
Definition: EventCollectionSelector.cpp:209
EventCollectionSelector::m_dbType
Gaudi::Property< std::string > m_dbType
Definition: EventCollectionSelector.h:81
Service::initialize
StatusCode initialize() override
Definition: Service.cpp:118
IOpaqueAddress::par
virtual const std::string * par() const =0
Retrieve String parameters.
EventCollectionSelector::connectDataSource
virtual StatusCode connectDataSource(const std::string &db, const std::string &typ) const
Connect collection's data source to selector.
Definition: EventCollectionSelector.cpp:92
EventCollectionContext::m_currentInput
std::string m_currentInput
Definition: EventCollectionSelector.cpp:42
EventSelectorDataStream.h
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
EventCollectionSelector::MyContextType::criteria
std::string criteria
Definition: EventCollectionSelector.h:45
EventCollectionSelector::m_tupleSvc
SmartIF< INTupleSvc > m_tupleSvc
Reference to Tuple service.
Definition: EventCollectionSelector.h:70
EventCollectionSelector::MyContextType::addressBuffer
IOpaqueAddress * addressBuffer
Definition: EventCollectionSelector.h:48
EventCollectionSelector::MyContextType
Definition: EventCollectionSelector.h:43
EventCollectionSelector.h
IOpaqueAddress
Definition: IOpaqueAddress.h:28
EventCollectionContext::m_criteria
std::string m_criteria
Definition: EventCollectionSelector.cpp:40
IOpaqueAddress::svcType
virtual long svcType() const =0
Retrieve service type.
IAddressCreator.h
IEvtSelector
Definition: IEvtSelector.h:26
EventCollectionContext::EventCollectionContext
EventCollectionContext(const EventCollectionSelector *pSelector)
Standard constructor.
Definition: EventCollectionSelector.cpp:64
EventCollectionSelector::m_database
Gaudi::Property< std::string > m_database
Definition: EventCollectionSelector.h:80
EventCollectionContext::m_pAddressBuffer
GenericAddress * m_pAddressBuffer
Definition: EventCollectionSelector.cpp:37
ISelectStatement
Definition: ISelectStatement.h:38
conf.release
string release
Definition: conf.py:27
EventCollectionSelector::m_itemName
Gaudi::Property< std::string > m_itemName
Definition: EventCollectionSelector.h:78
IRegistry
Definition: IRegistry.h:29
EventCollectionSelector::MyContextType::item
std::optional< NTuple::Item< IOpaqueAddress * > > item
Definition: EventCollectionSelector.h:47
class
#define class
Definition: HistogramPersistencySvc.cpp:54
EventCollectionContext::EventCollectionContext
EventCollectionContext(const EventCollectionContext &)=delete
No copy.
ObjectFactory.h
EventCollectionSelector::MyContextType::tuple
NTuple::Tuple * tuple
Definition: EventCollectionSelector.h:46
EventCollectionSelector::next
StatusCode next(Context &refCtxt) const override
Get next iteration item from the event loop context.
Definition: EventCollectionSelector.cpp:230
Service::finalize
StatusCode finalize() override
Definition: Service.cpp:223
EventCollectionSelector::createAddress
StatusCode createAddress(const Context &refCtxt, IOpaqueAddress *&refpAddr) const override
Create new Opaque address corresponding to the current record.
Definition: EventCollectionSelector.cpp:263
EventCollectionSelector::initialize
StatusCode initialize() override
Service override: Initialize service.
Definition: EventCollectionSelector.cpp:70
EventCollectionContext::m_files
ListName m_files
Definition: EventCollectionSelector.cpp:39
GenericAddress.h
IDataSourceMgr.h
SmartIF.h
GenericAddress
Definition: GenericAddress.h:27
EventCollectionSelector::rewind
StatusCode rewind(Context &refCtxt) const override
Rewind the dataset.
Definition: EventCollectionSelector.cpp:260
EventCollectionSelector::m_pAddrCreator
SmartIF< IAddressCreator > m_pAddrCreator
Definition: EventCollectionSelector.h:71
INTuple::attachSelector
virtual StatusCode attachSelector(ISelectStatement *sel)=0
Attach selector.
Service::name
const std::string & name() const override
Retrieve name of the service
Definition: Service.cpp:333
StatusCode
Definition: StatusCode.h:64
IOpaqueAddress::clID
virtual const CLID & clID() const =0
Retrieve class information from link.
Gaudi::Property::value
const ValueType & value() const
Definition: Property.h:229
NTuple.h
EventCollectionSelector::previous
StatusCode previous(Context &refCtxt) const override
Get previous iteration item from the event loop context.
Definition: EventCollectionSelector.cpp:245
INTuple
Definition: INTuple.h:86
ISelectStatement.h
SmartIF
Definition: IConverter.h:22
EventCollectionSelector::getNextRecord
virtual StatusCode getNextRecord(NTuple::Tuple *tuple) const
Read next record of the N-tuple.
Definition: EventCollectionSelector.cpp:146
EventCollectionSelector::createContext
StatusCode createContext(Context *&refpCtxt) const override
Create a new event loop context.
Definition: EventCollectionSelector.cpp:217
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:198
EventCollectionContext::fileIterator
ListName::const_iterator fileIterator()
Definition: EventCollectionSelector.cpp:58
EventCollectionContext::~EventCollectionContext
~EventCollectionContext() override
Standard destructor.
Definition: EventCollectionSelector.cpp:62
EventCollectionContext::identifier
void * identifier() const override
Definition: EventCollectionSelector.cpp:56
IRegistry.h
EventCollectionSelector::connectTuple
virtual StatusCode connectTuple(const std::string &nam, const std::string &itName, NTuple::Tuple *&tup, std::optional< NTuple::Item< IOpaqueAddress * >> &item) const
Connect to existing N-tuple.
Definition: EventCollectionSelector.cpp:110
EventCollectionSelector::connectStatement
virtual StatusCode connectStatement(const std::string &typ, const std::string &crit, INTuple *tuple) const
Connect selection statement to refine data access.
Definition: EventCollectionSelector.cpp:129
EventCollectionSelector::connectCollection
virtual StatusCode connectCollection(MyContextType *ctxt) const
Connect collection to selector.
Definition: EventCollectionSelector.cpp:190
StatusCode::ignore
const StatusCode & ignore() const
Allow discarding a StatusCode without warning.
Definition: StatusCode.h:139
INTuple::selector
virtual ISelectStatement * selector()=0
Access selector.
IRegistry::address
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:99
EventCollectionContext::setCurrentInput
void setCurrentInput(const std::string &v)
Definition: EventCollectionSelector.cpp:54
EventCollectionSelector::getPreviousRecord
virtual StatusCode getPreviousRecord(NTuple::Tuple *tuple) const
Read next record of the N-tuple.
Definition: EventCollectionSelector.cpp:162
GenericAddress::release
unsigned long release() override
release reference to object
Definition: GenericAddress.h:68
NTuple::Tuple
Abstract base class which allows the user to interact with the actual N tuple implementation.
Definition: NTuple.h:380
DECLARE_COMPONENT
#define DECLARE_COMPONENT(type)
Definition: PluginServiceV1.h:45
EventCollectionSelector::m_cntName
Gaudi::Property< std::string > m_cntName
Definition: EventCollectionSelector.h:77
EventCollectionSelector
Definition of class EventCollectionSelector.
Definition: EventCollectionSelector.h:41
EventCollectionSelector::m_dbSvc
Gaudi::Property< std::string > m_dbSvc
Definition: EventCollectionSelector.h:82
DataObject
Definition: DataObject.h:37
EventCollectionContext
Definition: EventCollectionSelector.cpp:32
EventCollectionContext::setCriteria
void setCriteria(const std::string &crit)
Definition: EventCollectionSelector.cpp:57
EventCollectionContext::setFileIterator
void setFileIterator(ListName::const_iterator new_iter)
Definition: EventCollectionSelector.cpp:59
Properties.v
v
Definition: Properties.py:122
GenericAddress::addRef
unsigned long addRef() override
Add reference to object.
Definition: GenericAddress.h:66
GaudiConfig2.semantics.ident
ident
Definition: semantics.py:203
EventCollectionSelector::m_tupleSvcName
Gaudi::Property< std::string > m_tupleSvcName
Definition: EventCollectionSelector.h:74
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:100
EventCollectionSelector::m_criteria
Gaudi::Property< std::string > m_criteria
Definition: EventCollectionSelector.h:79
ISvcLocator.h
AlgSequencer.top
top
Definition: AlgSequencer.py:37
EventCollectionSelector::releaseContext
StatusCode releaseContext(Context *&refCtxt) const override
Release existing event iteration context.
Definition: EventCollectionSelector.cpp:283
EventCollectionContext::files
ListName & files()
Definition: EventCollectionSelector.cpp:55
DataObject::registry
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:79
EventCollectionSelector::last
StatusCode last(Context &refCtxt) const override
Access last item in the iteration.
Definition: EventCollectionSelector.cpp:305
EventCollectionContext::ListName
std::list< std::string > ListName
Definition: EventCollectionSelector.cpp:34
EventCollectionSelector::m_statement
Gaudi::Property< std::string > m_statement
Definition: EventCollectionSelector.h:83
INTupleSvc.h
IOpaqueAddress::ipar
virtual const unsigned long * ipar() const =0
Access to generic link parameters.
Service::serviceLocator
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator
Definition: Service.cpp:336
EventCollectionSelector::m_authentication
Gaudi::Property< std::string > m_authentication
Definition: EventCollectionSelector.h:76
NTuple::Item< IOpaqueAddress * >
EventCollectionContext::currentInput
const std::string & currentInput() const
Definition: EventCollectionSelector.cpp:53
EventCollectionContext::operator=
EventCollectionContext & operator=(const EventCollectionContext &)=delete
EventCollectionContext::m_fileIterator
ListName::const_iterator m_fileIterator
Definition: EventCollectionSelector.cpp:41