The Gaudi Framework  v31r0 (aeb156f0)
RDirectoryCnv.cpp
Go to the documentation of this file.
1 // Include files
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  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 } // namespace
34 
36 
37 //-----------------------------------------------------------------------------
38 StatusCode RootHistCnv::RDirectoryCnv::createObj( IOpaqueAddress* /* pAddress */, DataObject*& refpObject )
39 //-----------------------------------------------------------------------------
40 {
41  refpObject = new NTuple::Directory();
42  return StatusCode::SUCCESS;
43 }
44 
45 //-----------------------------------------------------------------------------
47 //-----------------------------------------------------------------------------
48 {
49  const std::string& loc = pObject->registry()->identifier();
50  if ( createDirectory( loc ).isSuccess() ) {
51  setDirectory( loc );
52  setDiskDirectory( loc );
53  // return createAddress(pObject, pObject->registry()->name(), refpAddress);
54  return createAddress( pObject, gDirectory, nullptr, refpAddress );
55  }
56  refpAddress = nullptr;
57  return StatusCode::FAILURE;
58 }
59 
60 //-----------------------------------------------------------------------------
62 //-----------------------------------------------------------------------------
63 {
64  const std::string& loc = pObject->registry()->identifier();
65  if ( createDirectory( loc ).isSuccess() ) {
66  setDirectory( loc );
67  return StatusCode::SUCCESS;
68  }
69  return StatusCode::FAILURE;
70 }
71 
72 //-----------------------------------------------------------------------------
74  MsgStream log( msgSvc(), "RDirectoryCnv" );
75  IRegistry* pReg = pObj->registry();
76  std::string full = pReg->identifier();
77  const std::string& fname = pAddr->par()[0];
78 
79  TFile* tf = nullptr;
80  findTFile( full, tf ).ignore();
81 
82  // cd to TFile:
83  setDirectory( full );
84  TIter nextkey( gDirectory->GetListOfKeys() );
85  while ( TKey* key = (TKey*)nextkey() ) {
86  IOpaqueAddress* pA = nullptr;
87  TObject* obj = key->ReadObj();
88  std::string title = obj->GetTitle();
89  std::string sid = obj->GetName();
90  std::string f2 = full + "/" + sid;
91  int idh = maybe_stol( sid ).get_value_or( 0 );
92  // introduced by Grigori Rybkine
93  std::string clname = key->GetClassName();
94  std::string clnm = clname.substr( 0, 3 );
95  TClass* isa = obj->IsA();
96  if ( isa->InheritsFrom( "TTree" ) ) {
97  createAddress( full, CLID_ColumnWiseTuple, idh, obj, pA ).ignore();
98  TTree* tree = (TTree*)obj;
99  tree->Print();
100  log << MSG::DEBUG << "Reg CWNT \"" << obj->GetTitle() << "\" as " << f2 << endmsg;
101  title = "/" + sid;
102  } else if ( isa->InheritsFrom( "TDirectory" ) ) {
103  createAddress( full, CLID_NTupleDirectory, title, obj, pA ).ignore();
104  } else if ( isa == TProfile::Class() ) {
105  createAddress( full, CLID_ProfileH, idh, obj, pA ).ignore();
106  title = sid;
107  } else if ( isa == TProfile2D::Class() ) {
108  createAddress( full, CLID_ProfileH2, idh, obj, pA ).ignore();
109  title = sid;
110  } else if ( isa == TH1C::Class() ) {
111  createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
112  title = sid;
113  } else if ( isa == TH1S::Class() ) {
114  createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
115  title = sid;
116  } else if ( isa == TH1I::Class() ) {
117  createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
118  title = sid;
119  } else if ( isa == TH1F::Class() ) {
120  createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
121  title = sid;
122  } else if ( isa == TH1D::Class() ) {
123  createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
124  title = sid;
125  } else if ( isa == TH2C::Class() ) {
126  createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
127  title = sid;
128  } else if ( isa == TH2S::Class() ) {
129  createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
130  title = sid;
131  } else if ( isa == TH2I::Class() ) {
132  createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
133  title = sid;
134  } else if ( isa == TH2F::Class() ) {
135  createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
136  title = sid;
137  } else if ( isa == TH2D::Class() ) {
138  createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
139  title = sid;
140  } else if ( isa == TH3C::Class() ) {
141  createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
142  title = sid;
143  } else if ( isa == TH3S::Class() ) {
144  createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
145  title = sid;
146  } else if ( isa == TH3I::Class() ) {
147  createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
148  title = sid;
149  } else if ( isa == TH3F::Class() ) {
150  createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
151  title = sid;
152  } else if ( isa == TH3D::Class() ) {
153  createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
154  title = sid;
155  } else {
156  log << MSG::ERROR << "Encountered an unknown object with key: " << obj->GetName() << " in ROOT file " << fname
157  << endmsg;
158  return StatusCode::FAILURE;
159  }
160  if ( pA ) {
161  StatusCode sc = dataManager()->registerAddress( pReg, title, pA );
162  if ( !sc.isSuccess() ) {
163  log << MSG::ERROR << "Failed to register address for " << full << endmsg;
164  return sc;
165  }
166  log << MSG::VERBOSE << "Created address for " << clnm << "'" << title << "' in " << full << endmsg;
167  }
168  }
169  return StatusCode::SUCCESS;
170 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
bool isSuccess() const
Definition: StatusCode.h:267
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.
virtual const std::string * par() const =0
Retrieve String parameters.
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:72
STL class.
virtual const id_type & identifier() const =0
Full identifier (or key)
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
T find_first_of(T...args)
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
StatusCode fillObjRefs(IOpaqueAddress *pAddr, DataObject *refpObj) override
Update the transient object from the other representation.
virtual Out operator()(const vector_of_const_< In > &inputs) const =0
string s
Definition: gaudirun.py:312
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
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