The Gaudi Framework  v38r1p1 (ae26267b)
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-2019 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 \***********************************************************************************/
11 // Include files
16 #include "GaudiKernel/INTupleSvc.h"
17 #include "GaudiKernel/IRegistry.h"
20 #include "GaudiKernel/NTuple.h"
22 #include "GaudiKernel/SmartIF.h"
23 
25 
26 #include <memory>
27 
29 
30 
36 public:
38 
39 private:
40  GenericAddress* m_pAddressBuffer = nullptr;
41  const EventCollectionSelector* m_pSelector = nullptr;
44  ListName::const_iterator m_fileIterator;
46 
47 public:
51  ~EventCollectionContext() override;
52  const std::string& currentInput() const { return m_currentInput; }
53  void setCurrentInput( const std::string& v ) { m_currentInput = v; }
54  ListName& files() { return m_files; }
55  void* identifier() const override { return (void*)m_pSelector; }
56  void setCriteria( const std::string& crit ) { m_criteria = crit; }
57  ListName::const_iterator fileIterator() { return m_fileIterator; }
58  void setFileIterator( ListName::const_iterator new_iter ) { m_fileIterator = new_iter; }
59 };
60 
62 
63 EventCollectionContext::EventCollectionContext( const EventCollectionSelector* pSelector ) : m_pSelector( pSelector ) {
66 }
67 
68 // IService implementation: Db event selector override
70  // Initialize base class
72  if ( !status.isSuccess() ) {
73  error() << "Error initializing base class Service!" << endmsg;
74  return status;
75  }
76  m_pAddrCreator = serviceLocator()->service( "EventPersistencySvc" );
77  if ( !m_pAddrCreator ) {
78  error() << "Unable to locate IAddressCreator interface of "
79  << "EventPersistencySvc" << endmsg;
80  return status;
81  }
83  if ( !m_tupleSvc ) {
84  error() << "Unable to locate INTupleSvc interface of " << m_tupleSvcName << endmsg;
85  return status;
86  }
87  return status;
88 }
89 
90 // Connect collection to selector
94  if ( svc && !db.empty() ) {
95  std::string ident = name() + ' ';
96  ident += "DATAFILE='" + m_database.value().substr( 5 ) + "' ";
97  if ( !m_dbSvc.empty() )
98  ident += "SVC='" + m_dbSvc + "' ";
99  else
100  ident += "TYP='" + m_dbType + "' ";
101  ident += "OPT='READ' ";
102  if ( m_authentication.length() > 0 ) { ident += "AUTH='" + m_authentication + "' "; }
103  status = svc->connect( ident );
104  }
105  return status;
106 }
107 
110  NTuple::Tuple*& tup, NTuple::Item<IOpaqueAddress*>*& item ) const {
111  std::string top = "/NTUPLES/" + name() + '/' + nam;
112  StatusCode status = m_tupleSvc->retrieveObject( top, (DataObject*&)tup );
113  if ( status.isSuccess() ) {
114  item = new NTuple::Item<IOpaqueAddress*>();
115  status = tup->item( itName, *item );
116  if ( status.isSuccess() ) return status;
117  error() << "Item " << itName << " is not part of the collection:" << top << endmsg;
118  delete item;
119  item = nullptr;
120  } else {
121  error() << "Cannot connect to collection:" << top << endmsg;
122  }
123  tup = nullptr;
124  return status;
125 }
126 
129  INTuple* tuple ) const {
130  std::string seltyp = typ;
131  if ( !seltyp.empty() || !crit.empty() ) {
132  if ( !crit.empty() && seltyp.length() == 0 ) seltyp = "NTuple::Selector";
133  SmartIF<ISelectStatement> stmt( ObjFactory::create( seltyp, serviceLocator() ).release() );
134  if ( stmt ) {
135  if ( !crit.empty() ) stmt->setCriteria( crit );
136  tuple->attachSelector( stmt ).ignore();
137  return StatusCode::SUCCESS;
138  }
139  return StatusCode::FAILURE;
140  }
141  return StatusCode::SUCCESS;
142 }
143 
147  if ( tuple ) {
148  do {
149  status = m_tupleSvc->readRecord( tuple );
150  if ( status.isSuccess() ) {
151  ISelectStatement* statement = tuple->selector();
152  bool use_it = ( statement ) ? ( *statement )( tuple ) : true;
153  if ( use_it ) { return status; }
154  }
155  } while ( status.isSuccess() );
156  }
157  return status;
158 }
159 
163  if ( tuple ) {
164  IRegistry* pReg = tuple->registry();
165  if ( pReg ) {
166  IOpaqueAddress* pAddr = pReg->address();
167  if ( pAddr ) {
168  long* ip = (long*)pAddr->ipar();
169  do {
170  if ( ip[1] > 1 ) {
171  ip[1] -= 2;
172  status = m_tupleSvc->readRecord( tuple );
173  if ( status.isSuccess() ) {
174  ISelectStatement* statement = tuple->selector();
175  bool use_it = ( statement ) ? ( *statement )( tuple ) : true;
176  if ( use_it ) { return status; }
177  }
178  } else {
179  return StatusCode::FAILURE;
180  }
181  } while ( status.isSuccess() );
182  }
183  }
184  }
185  return StatusCode::FAILURE;
186 }
187 
188 // Connect collection to selector
190  if ( ctxt ) {
192  if ( status.isSuccess() ) {
193  status = connectTuple( m_cntName, m_itemName, ctxt->tuple, ctxt->item );
194  if ( status.isSuccess() ) {
195  status = connectStatement( m_statement, m_criteria, ctxt->tuple );
196  if ( status.isSuccess() ) {
197  *( ctxt->item ) = 0;
198  return status;
199  }
200  }
201  }
202  return status;
203  }
204  return StatusCode::FAILURE;
205 }
206 
207 // Finalize service
209  // release services
210  m_pAddrCreator = nullptr;
211  m_tupleSvc = nullptr;
212  return Service::finalize();
213 }
214 
215 // FIXME - method below generates leak errors with sanitizer
216 //
217 // clang-format off
218 // Direct leak of 48 byte(s) in 2 object(s) allocated from:
219 // #0 0x7f36dab12da8 in operator new(unsigned long) /afs/cern.ch/cms/CAF/CMSCOMM/COMM_ECAL/dkonst/GCC/build/contrib/gcc-8.2.0/src/gcc/8.2.0/libsanitizer/lsan/lsan_interceptors.cc:229
220 // #1 0x7f36cca8cf7e in EventCollectionSelector::connectTuple(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, NTuple::Tuple*&, NTuple::Item<IOpaqueAddress*>*&) const ../GaudiCoreSvc/src/EventSelector/EventCollectionSelector.cpp:104
221 // #2 0x7f36cca8c27f in EventCollectionSelector::connectCollection(EventCollectionSelector::MyContextType*) const ../GaudiCoreSvc/src/EventSelector/EventCollectionSelector.cpp:183
222 // #3 0x7f36cca8c808 in EventCollectionSelector::createContext(IEvtSelector::Context*&) const ../GaudiCoreSvc/src/EventSelector/EventCollectionSelector.cpp:209
223 // clang-format on
224 //
225 // These leaks are currently suppressed in Gaudi/job/Gaudi-LSan.supp - remove entry there to reactivate
226 
229  refpCtxt = nullptr;
230  auto ctxt = std::make_unique<MyContextType>();
231  StatusCode status = connectCollection( ctxt.get() );
232  if ( !status.isSuccess() ) {
233  error() << "Unable to connect Collection file \"" << m_database << "\"" << endmsg;
234  return status;
235  }
236  refpCtxt = ctxt.release();
237  return StatusCode::SUCCESS;
238 }
239 
241 StatusCode EventCollectionSelector::next( Context& refCtxt ) const { return next( refCtxt, 1 ); }
242 
244 StatusCode EventCollectionSelector::next( Context& refCtxt, int jump ) const {
245  MyContextType* ctxt = dynamic_cast<MyContextType*>( &refCtxt );
246  if ( ctxt ) {
247  *( ctxt->item ) = ctxt->addressBuffer;
249  for ( int i = 0; i < jump && sc.isSuccess(); ++i ) { sc = getNextRecord( ctxt->tuple ); }
250  return sc;
251  }
252  return StatusCode::FAILURE;
253 }
254 
256 StatusCode EventCollectionSelector::previous( Context& refCtxt ) const { return previous( refCtxt, 1 ); }
257 
259 StatusCode EventCollectionSelector::previous( Context& refCtxt, int jump ) const {
260  MyContextType* ctxt = dynamic_cast<MyContextType*>( &refCtxt );
261  if ( ctxt ) {
262  *( ctxt->item ) = ctxt->addressBuffer;
264  for ( int i = 0; i < jump && sc.isSuccess(); ++i ) { sc = getPreviousRecord( ctxt->tuple ); }
265  return sc;
266  }
267  return StatusCode::FAILURE;
268 }
269 
271 StatusCode EventCollectionSelector::rewind( Context& /* refCtxt */ ) const { return StatusCode::FAILURE; }
272 
274 StatusCode EventCollectionSelector::createAddress( const Context& refCtxt, IOpaqueAddress*& refpAddr ) const {
275  const MyContextType* ctxt = dynamic_cast<const MyContextType*>( &refCtxt );
276  if ( ctxt ) {
277  IOpaqueAddress* pA = *( ctxt->item );
278  if ( pA ) {
279  IOpaqueAddress* pAddress = nullptr;
280  StatusCode status = m_pAddrCreator->createAddress( pA->svcType(), pA->clID(), pA->par(), pA->ipar(), pAddress );
281  if ( status.isSuccess() ) {
282  refpAddr = pAddress;
283  return StatusCode::SUCCESS;
284  } else {
285  error() << "Failed to access " << pA->par()[0] << ":" << pA->par()[1] << " SvcTyp:" << long( pA->svcType() )
286  << " CLID:" << pA->clID() << endmsg;
287  }
288  }
289  }
290  return StatusCode::FAILURE;
291 }
292 
295  MyContextType* ctxt = dynamic_cast<MyContextType*>( refCtxt );
296  if ( ctxt ) {
297  delete ctxt;
298  ctxt = nullptr;
299  return StatusCode::SUCCESS;
300  }
301  return StatusCode::FAILURE;
302 }
303 
306 StatusCode EventCollectionSelector::resetCriteria( const std::string& cr, Context& refCtxt ) const {
307  MyContextType* ctxt = dynamic_cast<MyContextType*>( &refCtxt );
308  if ( ctxt ) {
309  ctxt->criteria = cr;
310  return StatusCode::SUCCESS;
311  }
312  return StatusCode::FAILURE;
313 }
314 
316 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:306
EventCollectionSelector::finalize
StatusCode finalize() override
Service override: Finalize Service.
Definition: EventCollectionSelector.cpp:208
EventCollectionSelector::m_dbType
Gaudi::Property< std::string > m_dbType
Definition: EventCollectionSelector.h:96
Service::initialize
StatusCode initialize() override
Definition: Service.cpp:118
std::string
STL class.
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:91
EventCollectionContext::m_currentInput
std::string m_currentInput
Definition: EventCollectionSelector.cpp:45
EventSelectorDataStream.h
std::list< std::string >
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
EventCollectionSelector::MyContextType::criteria
std::string criteria
Definition: EventCollectionSelector.h:56
EventCollectionSelector::m_tupleSvc
SmartIF< INTupleSvc > m_tupleSvc
Reference to Tuple service.
Definition: EventCollectionSelector.h:85
EventCollectionSelector::MyContextType::addressBuffer
IOpaqueAddress * addressBuffer
Definition: EventCollectionSelector.h:59
EventCollectionSelector::MyContextType
Definition: EventCollectionSelector.h:54
EventCollectionSelector.h
IOpaqueAddress
Definition: IOpaqueAddress.h:33
EventCollectionContext::m_criteria
std::string m_criteria
Definition: EventCollectionSelector.cpp:43
std::string::length
T length(T... args)
IOpaqueAddress::svcType
virtual long svcType() const =0
Retrieve service type.
IAddressCreator.h
IEvtSelector
Definition: IEvtSelector.h:28
EventCollectionContext::EventCollectionContext
EventCollectionContext(const EventCollectionSelector *pSelector)
Standard constructor.
Definition: EventCollectionSelector.cpp:63
EventCollectionSelector::m_database
Gaudi::Property< std::string > m_database
Definition: EventCollectionSelector.h:95
EventCollectionContext::m_pAddressBuffer
GenericAddress * m_pAddressBuffer
Definition: EventCollectionSelector.cpp:40
ISelectStatement
Definition: ISelectStatement.h:42
conf.release
string release
Definition: conf.py:27
EventCollectionSelector::m_itemName
Gaudi::Property< std::string > m_itemName
Definition: EventCollectionSelector.h:93
IRegistry
Definition: IRegistry.h:32
class
#define class
Definition: HistogramPersistencySvc.cpp:54
ObjectFactory.h
EventCollectionSelector::MyContextType::tuple
NTuple::Tuple * tuple
Definition: EventCollectionSelector.h:57
EventCollectionSelector::next
StatusCode next(Context &refCtxt) const override
Get next iteration item from the event loop context.
Definition: EventCollectionSelector.cpp:241
Service::finalize
StatusCode finalize() override
Definition: Service.cpp:222
EventCollectionSelector::createAddress
StatusCode createAddress(const Context &refCtxt, IOpaqueAddress *&refpAddr) const override
Create new Opaque address corresponding to the current record.
Definition: EventCollectionSelector.cpp:274
EventCollectionSelector::initialize
StatusCode initialize() override
Service override: Initialize service.
Definition: EventCollectionSelector.cpp:69
EventCollectionContext::m_files
ListName m_files
Definition: EventCollectionSelector.cpp:42
GenericAddress.h
IDataSourceMgr.h
SmartIF.h
GenericAddress
Definition: GenericAddress.h:30
EventCollectionSelector::rewind
StatusCode rewind(Context &refCtxt) const override
Rewind the dataset.
Definition: EventCollectionSelector.cpp:271
EventCollectionSelector::m_pAddrCreator
SmartIF< IAddressCreator > m_pAddrCreator
Definition: EventCollectionSelector.h:86
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:332
StatusCode
Definition: StatusCode.h:65
IOpaqueAddress::clID
virtual const CLID & clID() const =0
Retrieve class information from link.
Gaudi::Property::value
const ValueType & value() const
Definition: Property.h:239
NTuple.h
EventCollectionSelector::MyContextType::item
NTuple::Item< IOpaqueAddress * > * item
Definition: EventCollectionSelector.h:58
EventCollectionSelector::previous
StatusCode previous(Context &refCtxt) const override
Get previous iteration item from the event loop context.
Definition: EventCollectionSelector.cpp:256
INTuple
Definition: INTuple.h:91
ISelectStatement.h
SmartIF
Definition: IConverter.h:25
EventCollectionSelector::getNextRecord
virtual StatusCode getNextRecord(NTuple::Tuple *tuple) const
Read next record of the N-tuple.
Definition: EventCollectionSelector.cpp:145
EventCollectionSelector::createContext
StatusCode createContext(Context *&refpCtxt) const override
Create a new event loop context.
Definition: EventCollectionSelector.cpp:228
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:203
EventCollectionContext::fileIterator
ListName::const_iterator fileIterator()
Definition: EventCollectionSelector.cpp:57
EventCollectionContext::~EventCollectionContext
~EventCollectionContext() override
Standard destructor.
Definition: EventCollectionSelector.cpp:61
EventCollectionContext::identifier
void * identifier() const override
Definition: EventCollectionSelector.cpp:55
IRegistry.h
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:128
EventCollectionSelector::connectCollection
virtual StatusCode connectCollection(MyContextType *ctxt) const
Connect collection to selector.
Definition: EventCollectionSelector.cpp:189
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:100
EventCollectionContext::setCurrentInput
void setCurrentInput(const std::string &v)
Definition: EventCollectionSelector.cpp:53
EventCollectionSelector::getPreviousRecord
virtual StatusCode getPreviousRecord(NTuple::Tuple *tuple) const
Read next record of the N-tuple.
Definition: EventCollectionSelector.cpp:161
GenericAddress::release
unsigned long release() override
release reference to object
Definition: GenericAddress.h:71
NTuple::Tuple
Abstract base class which allows the user to interact with the actual N tuple implementation.
Definition: NTuple.h:387
DECLARE_COMPONENT
#define DECLARE_COMPONENT(type)
Definition: PluginServiceV1.h:46
EventCollectionSelector::m_cntName
Gaudi::Property< std::string > m_cntName
Definition: EventCollectionSelector.h:92
EventCollectionSelector
Definition of class EventCollectionSelector.
Definition: EventCollectionSelector.h:52
EventCollectionSelector::m_dbSvc
Gaudi::Property< std::string > m_dbSvc
Definition: EventCollectionSelector.h:97
DataObject
Definition: DataObject.h:40
EventCollectionContext
Definition: EventCollectionSelector.cpp:35
EventCollectionContext::setCriteria
void setCriteria(const std::string &crit)
Definition: EventCollectionSelector.cpp:56
std::string::empty
T empty(T... args)
EventCollectionContext::setFileIterator
void setFileIterator(ListName::const_iterator new_iter)
Definition: EventCollectionSelector.cpp:58
Properties.v
v
Definition: Properties.py:122
GenericAddress::addRef
unsigned long addRef() override
Add reference to object.
Definition: GenericAddress.h:69
GaudiConfig2.semantics.ident
ident
Definition: semantics.py:198
EventCollectionSelector::m_tupleSvcName
Gaudi::Property< std::string > m_tupleSvcName
Definition: EventCollectionSelector.h:89
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
EventCollectionSelector::connectTuple
virtual StatusCode connectTuple(const std::string &nam, const std::string &itName, NTuple::Tuple *&tup, NTuple::Item< IOpaqueAddress * > *&item) const
Connect to existing N-tuple.
Definition: EventCollectionSelector.cpp:109
EventCollectionSelector::m_criteria
Gaudi::Property< std::string > m_criteria
Definition: EventCollectionSelector.h:94
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:294
EventCollectionContext::files
ListName & files()
Definition: EventCollectionSelector.cpp:54
DataObject::registry
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:82
EventCollectionSelector::last
StatusCode last(Context &refCtxt) const override
Access last item in the iteration.
Definition: EventCollectionSelector.cpp:316
EventCollectionContext::ListName
std::list< std::string > ListName
Definition: EventCollectionSelector.cpp:37
EventCollectionSelector::m_statement
Gaudi::Property< std::string > m_statement
Definition: EventCollectionSelector.h:98
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:335
EventCollectionSelector::m_authentication
Gaudi::Property< std::string > m_authentication
Definition: EventCollectionSelector.h:91
NTuple::Item< IOpaqueAddress * >
EventCollectionContext::currentInput
const std::string & currentInput() const
Definition: EventCollectionSelector.cpp:52
EventCollectionContext::m_fileIterator
ListName::const_iterator m_fileIterator
Definition: EventCollectionSelector.cpp:44