The Gaudi Framework  v32r2 (46d42edc)
DataObjectHandleBase Class Reference

DataObjectHandleBase GaudiKernel/DataObjectHandleBase.h. More...

#include <GaudiKernel/DataObjectHandleBase.h>

Inheritance diagram for DataObjectHandleBase:
Collaboration diagram for DataObjectHandleBase:

Public Types

using PropertyType = DataObjectHandleProperty
 
- Public Types inherited from Gaudi::DataHandle
enum  Mode { Reader = 1 << 2, Writer = 1 << 4, Updater = Reader | Writer }
 

Public Member Functions

 DataObjectHandleBase (const DataObjID &k, Gaudi::DataHandle::Mode a, IDataHandleHolder *owner)
 
 DataObjectHandleBase (const std::string &k, Gaudi::DataHandle::Mode a, IDataHandleHolder *owner)
 
virtual ~DataObjectHandleBase ()
 
 DataObjectHandleBase (const DataObjectHandleBase &)=delete
 
 DataObjectHandleBase (DataObjectHandleBase &&)
 
DataObjectHandleBaseoperator= (const DataObjectHandleBase &)
 
template<class OWNER , class K , typename = std::enable_if_t<std::is_base_of_v<IProperty, OWNER>>>
 DataObjectHandleBase (OWNER *owner, Gaudi::DataHandle::Mode m, std::string name, const K &key={}, std::string doc="")
 Autodeclaring constructor with property name, mode, key and documentation. More...
 
std::string toString () const
 
std::string pythonRepr () const override
 
void fromString (const std::string &s)
 
bool isOptional () const
 Check if the data object declared is optional for the algorithm. More...
 
void setOptional (bool optional=true)
 
bool initialized () const
 
bool wasRead () const
 
bool wasWritten () const
 
bool isValid () const
 
- Public Member Functions inherited from Gaudi::DataHandle
 DataHandle (const DataObjID &k, Mode a=Reader, IDataHandleHolder *owner=nullptr)
 
 DataHandle (const DataObjID &k, const bool &isCond, Mode a=Reader, IDataHandleHolder *owner=nullptr)
 
virtual ~DataHandle ()=default
 
virtual void setOwner (IDataHandleHolder *o)
 
virtual IDataHandleHolderowner () const
 
virtual Mode mode () const
 
virtual void setKey (const DataObjID &key) const
 
virtual void updateKey (const std::string &key) const
 
virtual const std::stringobjKey () const
 
virtual const DataObjIDfullKey () const
 
virtual void reset (bool)
 
virtual bool isCondition () const
 

Protected Member Functions

void setRead (bool wasRead=true)
 
void setWritten (bool wasWritten=true)
 
bool init () override
 
DataObjectfetch () const
 

Protected Attributes

SmartIF< IDataProviderSvcm_EDS
 
SmartIF< IMessageSvcm_MS
 
bool m_init = false
 
bool m_optional = false
 
bool m_wasRead = false
 
bool m_wasWritten = false
 
bool m_searchDone = false
 Whether the search part of the fetch method (so dealing with alt names was already executed or not. More...
 
std::mutex m_searchMutex
 A Mutex protecting the calls to the search part of the fetch method, so that we are sure that we only call it once. More...
 
- Protected Attributes inherited from Gaudi::DataHandle
DataObjID m_key = {"NONE"}
 The key of the object behind this DataHandle Although it may look strange to have it mutable, this can actually change in case the object had alternative names, and it should not be visible to the end user, for which the Handle is still the same. More...
 
IDataHandleHolderm_owner = nullptr
 

Static Protected Attributes

static const std::string default_type = "unknown_t"
 

Friends

std::ostreamoperator<< (std::ostream &str, const DataObjectHandleBase &d)
 

Detailed Description

DataObjectHandleBase GaudiKernel/DataObjectHandleBase.h.

Base class for handles to Data Objects in the Event Store, to simplify access via Properties.

Author
Charles Leggett
Date
2015-09-01

Definition at line 26 of file DataObjectHandleBase.h.

Member Typedef Documentation

◆ PropertyType

Constructor & Destructor Documentation

◆ DataObjectHandleBase() [1/5]

DataObjectHandleBase::DataObjectHandleBase ( const DataObjID k,
Gaudi::DataHandle::Mode  a,
IDataHandleHolder owner 
)

Definition at line 47 of file DataObjectHandleBase.cpp.

48  : Gaudi::DataHandle( k, a, owner ) {
49  m_owner->declare( *this );
50 }
virtual void declare(Gaudi::DataHandle &)=0
virtual IDataHandleHolder * owner() const
Definition: DataHandle.h:40
IDataHandleHolder * m_owner
Definition: DataHandle.h:66

◆ DataObjectHandleBase() [2/5]

DataObjectHandleBase::DataObjectHandleBase ( const std::string k,
Gaudi::DataHandle::Mode  a,
IDataHandleHolder owner 
)

Definition at line 54 of file DataObjectHandleBase.cpp.

55  : DataObjectHandleBase( DataObjID( k ), a, owner ) {}
virtual IDataHandleHolder * owner() const
Definition: DataHandle.h:40
DataObjectHandleBase(const DataObjID &k, Gaudi::DataHandle::Mode a, IDataHandleHolder *owner)

◆ ~DataObjectHandleBase()

DataObjectHandleBase::~DataObjectHandleBase ( )
virtual

Definition at line 58 of file DataObjectHandleBase.cpp.

58 { owner()->renounce( *this ); }
virtual IDataHandleHolder * owner() const
Definition: DataHandle.h:40
virtual void renounce(Gaudi::DataHandle &)=0

◆ DataObjectHandleBase() [3/5]

DataObjectHandleBase::DataObjectHandleBase ( const DataObjectHandleBase )
delete

◆ DataObjectHandleBase() [4/5]

DataObjectHandleBase::DataObjectHandleBase ( DataObjectHandleBase &&  other)

Definition at line 18 of file DataObjectHandleBase.cpp.

19  : Gaudi::DataHandle( other )
20  , m_EDS( std::move( other.m_EDS ) )
21  , m_MS( std::move( other.m_MS ) )
22  , m_init( other.m_init )
23  , m_optional( other.m_optional )
24  , m_wasRead( other.m_wasRead )
25  , m_wasWritten( other.m_wasWritten )
26  , m_searchDone( other.m_searchDone ) {
27  m_owner->declare( *this );
28 }
virtual void declare(Gaudi::DataHandle &)=0
SmartIF< IDataProviderSvc > m_EDS
bool m_searchDone
Whether the search part of the fetch method (so dealing with alt names was already executed or not.
IDataHandleHolder * m_owner
Definition: DataHandle.h:66
T move(T... args)
SmartIF< IMessageSvc > m_MS

◆ DataObjectHandleBase() [5/5]

template<class OWNER , class K , typename = std::enable_if_t<std::is_base_of_v<IProperty, OWNER>>>
DataObjectHandleBase::DataObjectHandleBase ( OWNER *  owner,
Gaudi::DataHandle::Mode  m,
std::string  name,
const K &  key = {},
std::string  doc = "" 
)
inline

Autodeclaring constructor with property name, mode, key and documentation.

Note
the use std::enable_if is required to avoid ambiguities

Definition at line 40 of file DataObjectHandleBase.h.

40  {},
41  std::string doc = "" )
42  : DataObjectHandleBase( key, m, owner ) {
43  auto p = owner->declareProperty( std::move( name ), *this, std::move( doc ) );
44  p->template setOwnerType<OWNER>();
45  }
virtual IDataHandleHolder * owner() const
Definition: DataHandle.h:40
STL class.
constexpr double m
Definition: SystemOfUnits.h:92
T move(T... args)
DataObjectHandleBase(const DataObjID &k, Gaudi::DataHandle::Mode a, IDataHandleHolder *owner)

Member Function Documentation

◆ fetch()

DataObject * DataObjectHandleBase::fetch ( ) const
protected

Definition at line 61 of file DataObjectHandleBase.cpp.

61  {
62  DataObject* p = nullptr;
63  if ( LIKELY( m_searchDone ) ) { // fast path: searchDone, objKey is in its final state
64  m_EDS->retrieveObject( objKey(), p ).ignore();
65  return p;
66  }
67 
68  // slow path -- move into seperate function to improve code generation?
69 
70  // convenience towards users -- remind them to register
71  // but as m_MS is not yet set, we cannot use a MsgStream...
72  if ( !m_init ) {
73  std::cerr << ( owner() ? owner()->name() : "<UNKNOWN>:" ) << "DataObjectHandle: uninitialized data handle"
74  << std::endl;
75  }
76 
77  // as m_searchDone is not true yet, objKey may change... so in this
78  // branch we _first_ grab the mutex, to avoid objKey changing while we use it
79 
80  // take a lock to be sure we only execute this once at a time
82 
83  StatusCode sc = m_EDS->retrieveObject( objKey(), p );
84  if ( m_searchDone ) { // another thread has done the search while we were blocked
85  // on the mutex. As a result, nothing left to do but return...
86  sc.ignore();
87  return p;
88  }
89 
90  if ( !sc.isSuccess() ) {
91  auto tokens = boost::tokenizer<boost::char_separator<char>>{objKey(), boost::char_separator<char>{":"}};
92  // let's try our alternatives (if any)
93  auto alt = std::find_if( tokens.begin(), tokens.end(),
94  [&]( const std::string& n ) { return m_EDS->retrieveObject( n, p ).isSuccess(); } );
95  if ( alt != tokens.end() ) {
96  MsgStream log( m_MS, owner()->name() + ":DataObjectHandle" );
97  log << MSG::DEBUG << ": could not find \"" << objKey() << "\" -- using alternative source: \"" << *alt
98  << "\" instead" << endmsg;
99  // found something -- set it as default; this is not atomic, but
100  // at least in `fetch` there is no use of `objKey` that races with
101  // this assignment... (but there may be others!)
102  setKey( *alt );
103  }
104  }
105  m_searchDone = true;
106  return p;
107 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
virtual IDataHandleHolder * owner() const
Definition: DataHandle.h:40
T endl(T... args)
virtual const std::string & objKey() const
Definition: DataHandle.h:47
SmartIF< IDataProviderSvc > m_EDS
virtual void setKey(const DataObjID &key) const
Definition: DataHandle.h:44
bool m_searchDone
Whether the search part of the fetch method (so dealing with alt names was already executed or not.
STL class.
virtual const std::string & name() const =0
Retrieve the name of the instance.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
bool isSuccess() const
Definition: StatusCode.h:267
#define LIKELY(x)
Definition: Kernel.h:95
T find_if(T... args)
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:153
virtual StatusCode retrieveObject(IRegistry *pDirectory, std::string_view path, DataObject *&pObject)=0
Retrieve object identified by its directory entry.
std::mutex m_searchMutex
A Mutex protecting the calls to the search part of the fetch method, so that we are sure that we only...
SmartIF< IMessageSvc > m_MS
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192

◆ fromString()

void DataObjectHandleBase::fromString ( const std::string s)

Definition at line 131 of file DataObjectHandleBase.cpp.

131 { Gaudi::Parsers::parse( *this, s ).ignore(); }
StatusCode parse(GaudiUtils::HashMap< K, V > &result, const std::string &input)
Basic parser for the types of HashMap used in DODBasicMapper.
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:153
string s
Definition: gaudirun.py:318

◆ init()

bool DataObjectHandleBase::init ( )
overrideprotectedvirtual

Reimplemented from Gaudi::DataHandle.

Definition at line 135 of file DataObjectHandleBase.cpp.

135  {
136 
137  assert( !m_init );
138 
139  if ( !owner() ) return false;
140 
141  setRead( false );
142  setWritten( false );
143 
144  Gaudi::Algorithm* algorithm = dynamic_cast<Gaudi::Algorithm*>( owner() );
145  if ( algorithm ) {
146  // Fetch the event Data Service from the algorithm
147  m_EDS = algorithm->evtSvc();
148  m_MS = algorithm->msgSvc();
149  } else {
150  AlgTool* tool = dynamic_cast<AlgTool*>( owner() );
151  if ( tool ) {
152  m_EDS = tool->evtSvc();
153  m_MS = tool->msgSvc();
154  } else {
155  throw GaudiException( "owner is neither AlgTool nor Gaudi::Algorithm", "Invalid Cast", StatusCode::FAILURE );
156  }
157  }
158  m_init = true;
159  return true;
160 }
void setWritten(bool wasWritten=true)
Define general base for Gaudi exception.
const SmartIF< IMessageSvc > & msgSvc() const
The standard message service.
virtual IDataHandleHolder * owner() const
Definition: DataHandle.h:40
SmartIF< IDataProviderSvc > m_EDS
SmartIF< IDataProviderSvc > & evtSvc() const
shortcut for method eventSvc
Definition: Algorithm.h:265
void setRead(bool wasRead=true)
Base class from which all the concrete tool classes should be derived.
Definition: AlgTool.h:47
Base class from which all concrete algorithm classes should be derived.
Definition: Algorithm.h:79
constexpr static const auto FAILURE
Definition: StatusCode.h:86
SmartIF< IMessageSvc > m_MS
IDataProviderSvc * evtSvc() const
accessor to event service service
Definition: AlgTool.cpp:88

◆ initialized()

bool DataObjectHandleBase::initialized ( ) const
inline

Definition at line 59 of file DataObjectHandleBase.h.

59 { return m_init; }

◆ isOptional()

bool DataObjectHandleBase::isOptional ( ) const
inline

Check if the data object declared is optional for the algorithm.

Definition at line 56 of file DataObjectHandleBase.h.

56 { return m_optional; }

◆ isValid()

bool DataObjectHandleBase::isValid ( ) const

Definition at line 164 of file DataObjectHandleBase.cpp.

164 { return fullKey() != INVALID_DATAOBJID; }
virtual const DataObjID & fullKey() const
Definition: DataHandle.h:48
const DataObjID INVALID_DATAOBJID

◆ operator=()

DataObjectHandleBase & DataObjectHandleBase::operator= ( const DataObjectHandleBase other)

Definition at line 31 of file DataObjectHandleBase.cpp.

31  {
32  // avoid modification of searchDone in other while we are copying
34  // FIXME: operator= should not change our owner, only our 'value'
35  Gaudi::DataHandle::operator=( other );
36  m_EDS = other.m_EDS;
37  m_MS = other.m_MS;
38  m_init = other.m_init;
39  m_optional = other.m_optional;
40  m_wasRead = other.m_wasRead;
41  m_wasWritten = other.m_wasWritten;
42  m_searchDone = other.m_searchDone;
43  return *this;
44 }
SmartIF< IDataProviderSvc > m_EDS
bool m_searchDone
Whether the search part of the fetch method (so dealing with alt names was already executed or not.
std::mutex m_searchMutex
A Mutex protecting the calls to the search part of the fetch method, so that we are sure that we only...
SmartIF< IMessageSvc > m_MS

◆ pythonRepr()

std::string DataObjectHandleBase::pythonRepr ( ) const
overridevirtual

Reimplemented from Gaudi::DataHandle.

Reimplemented in DataObjectHandle<::details::Payload_t< T > >, and DataObjectHandle< DataObject >.

Definition at line 114 of file DataObjectHandleBase.cpp.

114  {
115  std::string m;
116  switch ( mode() ) {
118  m = "R";
119  break;
120  case Gaudi::DataHandle::Mode::Writer:
121  m = "W";
122  break;
123  default:
124  m = "UNKNOWN";
125  break;
126  }
127  return "DataObjectHandleBase('" + toString() + "', '" + m + "', '" + default_type + "')";
128 }
virtual Mode mode() const
Definition: DataHandle.h:42
static const std::string default_type
STL class.
constexpr double m
Definition: SystemOfUnits.h:92
std::string toString() const
def Reader(readerType, filename, qacross, qToEngine)

◆ setOptional()

void DataObjectHandleBase::setOptional ( bool  optional = true)
inline

Definition at line 57 of file DataObjectHandleBase.h.

57 { m_optional = optional; }

◆ setRead()

void DataObjectHandleBase::setRead ( bool  wasRead = true)
inlineprotected

Definition at line 66 of file DataObjectHandleBase.h.

◆ setWritten()

void DataObjectHandleBase::setWritten ( bool  wasWritten = true)
inlineprotected

Definition at line 67 of file DataObjectHandleBase.h.

◆ toString()

std::string DataObjectHandleBase::toString ( ) const

Definition at line 111 of file DataObjectHandleBase.cpp.

111 { return objKey(); }
virtual const std::string & objKey() const
Definition: DataHandle.h:47

◆ wasRead()

bool DataObjectHandleBase::wasRead ( ) const
inline

Definition at line 60 of file DataObjectHandleBase.h.

60 { return m_wasRead; }

◆ wasWritten()

bool DataObjectHandleBase::wasWritten ( ) const
inline

Definition at line 61 of file DataObjectHandleBase.h.

Friends And Related Function Documentation

◆ operator<<

std::ostream& operator<< ( std::ostream str,
const DataObjectHandleBase d 
)
friend

Definition at line 168 of file DataObjectHandleBase.cpp.

168  {
169 
170  str << d.fullKey() << " m: " << d.mode();
171  if ( d.owner() ) str << " o: " << d.owner()->name();
172  str << " opt: " << d.isOptional();
173  return str;
174 }
virtual Mode mode() const
Definition: DataHandle.h:42
virtual IDataHandleHolder * owner() const
Definition: DataHandle.h:40
virtual const std::string & name() const =0
Retrieve the name of the instance.
virtual const DataObjID & fullKey() const
Definition: DataHandle.h:48
bool isOptional() const
Check if the data object declared is optional for the algorithm.

Member Data Documentation

◆ default_type

std::string const DataObjectHandleBase::default_type = "unknown_t"
staticprotected

Definition at line 95 of file DataObjectHandleBase.h.

◆ m_EDS

SmartIF<IDataProviderSvc> DataObjectHandleBase::m_EDS
protected

Definition at line 74 of file DataObjectHandleBase.h.

◆ m_init

bool DataObjectHandleBase::m_init = false
protected

Definition at line 77 of file DataObjectHandleBase.h.

◆ m_MS

SmartIF<IMessageSvc> DataObjectHandleBase::m_MS
protected

Definition at line 75 of file DataObjectHandleBase.h.

◆ m_optional

bool DataObjectHandleBase::m_optional = false
protected

Definition at line 78 of file DataObjectHandleBase.h.

◆ m_searchDone

bool DataObjectHandleBase::m_searchDone = false
mutableprotected

Whether the search part of the fetch method (so dealing with alt names was already executed or not.

On subsequent calls (when this is true), it will be skipped.

Definition at line 87 of file DataObjectHandleBase.h.

◆ m_searchMutex

std::mutex DataObjectHandleBase::m_searchMutex
mutableprotected

A Mutex protecting the calls to the search part of the fetch method, so that we are sure that we only call it once.

Definition at line 93 of file DataObjectHandleBase.h.

◆ m_wasRead

bool DataObjectHandleBase::m_wasRead = false
protected

Definition at line 79 of file DataObjectHandleBase.h.

◆ m_wasWritten

bool DataObjectHandleBase::m_wasWritten = false
protected

Definition at line 80 of file DataObjectHandleBase.h.


The documentation for this class was generated from the following files: