The Gaudi Framework  v30r3 (a5ef0a68)
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 {
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 
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 //-----------------------------------------------------------------------------
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 //-----------------------------------------------------------------------------
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 //-----------------------------------------------------------------------------
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 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
bool isSuccess() const
Definition: StatusCode.h:287
#define DECLARE_CONVERTER(x)
Definition: Converter.h:155
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:73
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:51
Create persistent and transient representations of data store directories.
Definition: RDirectoryCnv.h:17
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
constexpr static const auto SUCCESS
Definition: StatusCode.h:87
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:253
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:978
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:209