| The Gaudi Framework v32r1 (f65d50dc)

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