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 "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 
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 //-----------------------------------------------------------------------------
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 //-----------------------------------------------------------------------------
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 //-----------------------------------------------------------------------------
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 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:74
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:74
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:26
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.
#define DECLARE_NAMESPACE_CONVERTER_FACTORY(n, x)
Definition: Converter.h:184
string s
Definition: gaudirun.py:245
StatusCode updateRep(IOpaqueAddress *pAddr, DataObject *pObject) override
Convert the transient object to the requested representation.
T substr(T...args)
Opaque address interface definition.
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
Small class representing an N tuple directory in the transient store.
Definition: NTuple.h:1068
T stol(T...args)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244