The Gaudi Framework  v32r2 (46d42edc)
RDirectoryCnv.cpp
Go to the documentation of this file.
1 // Include files
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 
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 //-----------------------------------------------------------------------------
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 //-----------------------------------------------------------------------------
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 //-----------------------------------------------------------------------------
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 }
virtual const std::string * par() const =0
Retrieve String parameters.
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:72
void setDirectory(const std::string &loc)
Definition: RConverter.cpp:108
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
#define DECLARE_CONVERTER(x)
Definition: Converter.h:150
StatusCode createRep(DataObject *pObj, IOpaqueAddress *&refpAddr) override
Convert the transient object to the requested representation.
StatusCode createDirectory(const std::string &loc)
Definition: RConverter.cpp:24
STL class.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
Create persistent and transient representations of data store directories.
Definition: RDirectoryCnv.h:16
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
bool isSuccess() const
Definition: StatusCode.h:267
StatusCode fillObjRefs(IOpaqueAddress *pAddr, DataObject *refpObj) override
Update the transient object from the other representation.
string s
Definition: gaudirun.py:318
constexpr static const auto FAILURE
Definition: StatusCode.h:86
StatusCode updateRep(IOpaqueAddress *pAddr, DataObject *pObject) override
Convert the transient object to the requested representation.
T substr(T... args)
Small class representing an N tuple directory in the transient store.
Definition: NTuple.h:901
virtual const id_type & identifier() const =0
Full identifier (or key)
Opaque address interface definition.
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
T stol(T... args)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
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
void setDiskDirectory(const std::string &loc)
Definition: RConverter.cpp:141