| The Gaudi Framework v29r0 (ff2e7097)

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

RDirectoryCnv.cpp
Go to the documentation of this file.
1 // Include files
2 #include "GaudiKernel/IDataManagerSvc.h"
3 #include "GaudiKernel/IDataProviderSvc.h"
4 #include "GaudiKernel/IOpaqueAddress.h"
5 #include "GaudiKernel/IRegistry.h"
6 #include "GaudiKernel/MsgStream.h"
7 #include "GaudiKernel/NTuple.h"
8
9 #include "boost/optional.hpp"
10
11 #include "RDirectoryCnv.h"
12
13 // Root files
14 #include "TDirectory.h"
15 #include "TFile.h"
16 #include "TH1.h"
17 #include "TH2.h"
18 #include "TH3.h"
19 #include "TKey.h"
20 #include "TObject.h"
21 #include "TProfile.h"
22 #include "TProfile2D.h"
23 #include "TTree.h"
24
25 namespace
26 {
27 constexpr struct maybe_stol_t {
28 boost::optional<int> operator()( const std::string& s ) const
29 {
30 auto pos = s.find_first_of( "0123456789+-" );
31 if ( pos == std::string::npos ) return boost::none;
32 return std::stol( s.substr( pos ) );
33 }
34 } maybe_stol{};
35 }
36
37 DECLARE_NAMESPACE_CONVERTER_FACTORY( RootHistCnv, RDirectoryCnv )
38
39 //-----------------------------------------------------------------------------
40 StatusCode RootHistCnv::RDirectoryCnv::createObj( IOpaqueAddress* /* pAddress */, DataObject*& refpObject )
41 //-----------------------------------------------------------------------------
42 {
43 refpObject = new NTuple::Directory();
44 return StatusCode::SUCCESS;
45 }
46
47 //-----------------------------------------------------------------------------
48 StatusCode RootHistCnv::RDirectoryCnv::createRep( DataObject* pObject, IOpaqueAddress*& refpAddress )
49 //-----------------------------------------------------------------------------
50 {
51 const std::string& loc = pObject->registry()->identifier();
52 if ( createDirectory( loc ).isSuccess() ) {
53 setDirectory( loc );
54 setDiskDirectory( loc );
55 // return createAddress(pObject, pObject->registry()->name(), refpAddress);
56 return createAddress( pObject, gDirectory, nullptr, refpAddress );
57 }
58 refpAddress = nullptr;
59 return StatusCode::FAILURE;
60 }
61
62 //-----------------------------------------------------------------------------
63 StatusCode RootHistCnv::RDirectoryCnv::updateRep( IOpaqueAddress* /* pAddress */, DataObject* pObject )
64 //-----------------------------------------------------------------------------
65 {
66 const std::string& loc = pObject->registry()->identifier();
67 if ( createDirectory( loc ).isSuccess() ) {
68 setDirectory( loc );
69 return StatusCode::SUCCESS;
70 }
71 return StatusCode::FAILURE;
72 }
73
74 //-----------------------------------------------------------------------------
75 StatusCode RootHistCnv::RDirectoryCnv::fillObjRefs( IOpaqueAddress* pAddr, DataObject* pObj )
76 {
77 MsgStream log( msgSvc(), "RDirectoryCnv" );
78 IRegistry* pReg = pObj->registry();
79 std::string full = pReg->identifier();
80 const std::string& fname = pAddr->par()[0];
81
82 TFile* tf = nullptr;
83 findTFile( full, tf ).ignore();
84
85 // cd to TFile:
86 setDirectory( full );
87 TIter nextkey( gDirectory->GetListOfKeys() );
88 while ( TKey* key = (TKey*)nextkey() ) {
89 IOpaqueAddress* pA = nullptr;
90 TObject* obj = key->ReadObj();
91 std::string title = obj->GetTitle();
92 std::string sid = obj->GetName();
93 std::string f2 = full + "/" + sid;
94 int idh = maybe_stol( sid ).get_value_or( 0 );
95 // introduced by Grigori Rybkine
96 std::string clname = key->GetClassName();
97 std::string clnm = clname.substr( 0, 3 );
98 TClass* isa = obj->IsA();
99 if ( isa->InheritsFrom( "TTree" ) ) {
100 createAddress( full, CLID_ColumnWiseTuple, idh, obj, pA ).ignore();
101 TTree* tree = (TTree*)obj;
102 tree->Print();
103 log << MSG::DEBUG << "Reg CWNT \"" << obj->GetTitle() << "\" as " << f2 << endmsg;
104 title = "/" + sid;
105 } else if ( isa->InheritsFrom( "TDirectory" ) ) {
106 createAddress( full, CLID_NTupleDirectory, title, obj, pA ).ignore();
107 } else if ( isa == TProfile::Class() ) {
108 createAddress( full, CLID_ProfileH, idh, obj, pA ).ignore();
109 title = sid;
110 } else if ( isa == TProfile2D::Class() ) {
111 createAddress( full, CLID_ProfileH2, idh, obj, pA ).ignore();
112 title = sid;
113 } else if ( isa == TH1C::Class() ) {
114 createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
115 title = sid;
116 } else if ( isa == TH1S::Class() ) {
117 createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
118 title = sid;
119 } else if ( isa == TH1I::Class() ) {
120 createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
121 title = sid;
122 } else if ( isa == TH1F::Class() ) {
123 createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
124 title = sid;
125 } else if ( isa == TH1D::Class() ) {
126 createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
127 title = sid;
128 } else if ( isa == TH2C::Class() ) {
129 createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
130 title = sid;
131 } else if ( isa == TH2S::Class() ) {
132 createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
133 title = sid;
134 } else if ( isa == TH2I::Class() ) {
135 createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
136 title = sid;
137 } else if ( isa == TH2F::Class() ) {
138 createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
139 title = sid;
140 } else if ( isa == TH2D::Class() ) {
141 createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
142 title = sid;
143 } else if ( isa == TH3C::Class() ) {
144 createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
145 title = sid;
146 } else if ( isa == TH3S::Class() ) {
147 createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
148 title = sid;
149 } else if ( isa == TH3I::Class() ) {
150 createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
151 title = sid;
152 } else if ( isa == TH3F::Class() ) {
153 createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
154 title = sid;
155 } else if ( isa == TH3D::Class() ) {
156 createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
157 title = sid;
158 } else {
159 log << MSG::ERROR << "Encountered an unknown object with key: " << obj->GetName() << " in ROOT file " << fname
160 << endmsg;
161 return StatusCode::FAILURE;
162 }
163 if ( pA ) {
164 StatusCode sc = dataManager()->registerAddress( pReg, title, pA );
165 if ( !sc.isSuccess() ) {
166 log << MSG::ERROR << "Failed to register address for " << full << endmsg;
167 return sc;
168 }
169 log << MSG::VERBOSE << "Created address for " << clnm << "'" << title << "' in " << full << endmsg;
170 }
171 }
172 return StatusCode::SUCCESS;
173 }
MsgStream
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
StatusCode::SUCCESS
Definition: StatusCode.h:31
RDirectoryCnv.h
StatusCode::FAILURE
Definition: StatusCode.h:31
MsgStream.h
NTuple.h
StatusCode::isSuccess
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:75
MSG::DEBUG
Definition: IMessageSvc.h:16
RootHistCnv::RDirectoryCnv::createRep
StatusCode createRep(DataObject *pObj, IOpaqueAddress *&refpAddr) override
Convert the transient object to the requested representation.
Definition: RDirectoryCnv.cpp:48
MSG::VERBOSE
Definition: IMessageSvc.h:16
IOpaqueAddress::par
virtual const std::string * par() const =0
Retrieve String parameters.
DataObject::registry
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:72
std::string
STL class.
IDataManagerSvc.h
IDataProviderSvc.h
IRegistry::identifier
virtual const id_type & identifier() const =0
Full identifier (or key)
StatusCode
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:28
ForwardSchedulerSimpleTest.msgSvc
msgSvc
Definition: ForwardSchedulerSimpleTest.py:112
RootHistCnv::RDirectoryCnv
Create persistent and transient representations of data store directories.
Definition: RDirectoryCnv.h:17
std::string::find_first_of
T find_first_of(T...args)
RootHistCnv
Definition: DirectoryCnv.h:17
IRegistry.h
IRegistry
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
IOpaqueAddress.h
RootHistCnv::RDirectoryCnv::fillObjRefs
StatusCode fillObjRefs(IOpaqueAddress *pAddr, DataObject *refpObj) override
Update the transient object from the other representation.
Definition: RDirectoryCnv.cpp:75
Gaudi::Functional::operator()
virtual Out operator()(const vector_of_const_< In > &inputs) const =0
DECLARE_NAMESPACE_CONVERTER_FACTORY
#define DECLARE_NAMESPACE_CONVERTER_FACTORY(n, x)
Definition: Converter.h:177
gaudirun.s
string s
Definition: gaudirun.py:253
RootHistCnv::RDirectoryCnv::updateRep
StatusCode updateRep(IOpaqueAddress *pAddr, DataObject *pObject) override
Convert the transient object to the requested representation.
Definition: RDirectoryCnv.cpp:63
MSG::ERROR
Definition: IMessageSvc.h:16
std::string::substr
T substr(T...args)
IOpaqueAddress
Opaque address interface definition.
Definition: IOpaqueAddress.h:23
DataObject
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:29
NTuple::Directory
Small class representing an N tuple directory in the transient store.
Definition: NTuple.h:986
std::stol
T stol(T...args)
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
Gaudi.Configuration.log
log
Definition: Configuration.py:13