| The Gaudi Framework v27r1

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