The Gaudi Framework  master (1304469f)
Loading...
Searching...
No Matches
RDirectoryCnv.cpp
Go to the documentation of this file.
1/***********************************************************************************\
2* (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations *
3* *
4* This software is distributed under the terms of the Apache version 2 licence, *
5* copied verbatim in the file "LICENSE". *
6* *
7* In applying this licence, CERN does not waive the privileges and immunities *
8* granted to it by virtue of its status as an Intergovernmental Organization *
9* or submit itself to any jurisdiction. *
10\***********************************************************************************/
11// Include files
17#include <GaudiKernel/NTuple.h>
18
19#include <optional>
20
21#include "RDirectoryCnv.h"
22
23// Root files
24#include <TDirectory.h>
25#include <TFile.h>
26#include <TH1.h>
27#include <TH2.h>
28#include <TH3.h>
29#include <TKey.h>
30#include <TObject.h>
31#include <TProfile.h>
32#include <TProfile2D.h>
33#include <TTree.h>
34
35namespace {
36 auto maybe_stol = []( const std::string& s ) -> std::optional<int> {
37 auto pos = s.find_first_of( "0123456789+-" );
38 if ( pos == std::string::npos ) return std::nullopt;
39 return std::stol( s.substr( pos ) );
40 };
41} // namespace
42
44
45//-----------------------------------------------------------------------------
47//-----------------------------------------------------------------------------
48{
49 refpObject = new NTuple::Directory();
51}
52
53//-----------------------------------------------------------------------------
55//-----------------------------------------------------------------------------
56{
57 const std::string& loc = pObject->registry()->identifier();
58 if ( createDirectory( loc ).isSuccess() ) {
59 setDirectory( loc );
60 setDiskDirectory( loc );
61 // return createAddress(pObject, pObject->registry()->name(), refpAddress);
62 return createAddress( pObject, gDirectory, nullptr, refpAddress );
63 }
64 refpAddress = nullptr;
66}
67
68//-----------------------------------------------------------------------------
70//-----------------------------------------------------------------------------
71{
72 const std::string& loc = pObject->registry()->identifier();
73 if ( createDirectory( loc ).isSuccess() ) {
74 setDirectory( loc );
76 }
78}
79
80//-----------------------------------------------------------------------------
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 ).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 = dynamic_cast<TTree*>( obj );
107 tree->Print();
108 log << MSG::DEBUG << "Reg CWNT \"" << obj->GetTitle() << "\" as " << f2 << endmsg;
109 title = "/" + sid;
110 } else if ( isa->InheritsFrom( "TDirectory" ) ) {
111 createAddress( full, CLID_NTupleDirectory, title, obj, pA ).ignore();
112 } else if ( isa == TProfile::Class() ) {
113 createAddress( full, CLID_ProfileH, idh, obj, pA ).ignore();
114 title = sid;
115 } else if ( isa == TProfile2D::Class() ) {
116 createAddress( full, CLID_ProfileH2, idh, obj, pA ).ignore();
117 title = sid;
118 } else if ( isa == TH1C::Class() ) {
119 createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
120 title = sid;
121 } else if ( isa == TH1S::Class() ) {
122 createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
123 title = sid;
124 } else if ( isa == TH1I::Class() ) {
125 createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
126 title = sid;
127 } else if ( isa == TH1F::Class() ) {
128 createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
129 title = sid;
130 } else if ( isa == TH1D::Class() ) {
131 createAddress( full, CLID_H1D, idh, obj, pA ).ignore();
132 title = sid;
133 } else if ( isa == TH2C::Class() ) {
134 createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
135 title = sid;
136 } else if ( isa == TH2S::Class() ) {
137 createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
138 title = sid;
139 } else if ( isa == TH2I::Class() ) {
140 createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
141 title = sid;
142 } else if ( isa == TH2F::Class() ) {
143 createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
144 title = sid;
145 } else if ( isa == TH2D::Class() ) {
146 createAddress( full, CLID_H2D, idh, obj, pA ).ignore();
147 title = sid;
148 } else if ( isa == TH3C::Class() ) {
149 createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
150 title = sid;
151 } else if ( isa == TH3S::Class() ) {
152 createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
153 title = sid;
154 } else if ( isa == TH3I::Class() ) {
155 createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
156 title = sid;
157 } else if ( isa == TH3F::Class() ) {
158 createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
159 title = sid;
160 } else if ( isa == TH3D::Class() ) {
161 createAddress( full, CLID_H3D, idh, obj, pA ).ignore();
162 title = sid;
163 } else {
164 log << MSG::ERROR << "Encountered an unknown object with key: " << obj->GetName() << " in ROOT file " << fname
165 << endmsg;
166 return StatusCode::FAILURE;
167 }
168 if ( pA ) {
169 StatusCode sc = dataManager()->registerAddress( pReg, title, pA );
170 if ( !sc.isSuccess() ) {
171 log << MSG::ERROR << "Failed to register address for " << full << endmsg;
172 return sc;
173 }
174 log << MSG::VERBOSE << "Created address for " << clnm << "'" << title << "' in " << full << endmsg;
175 }
176 }
177 return StatusCode::SUCCESS;
178}
#define DECLARE_CONVERTER(x)
Definition Converter.h:142
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition MsgStream.h:198
SmartIF< IMessageSvc > & msgSvc() const
Retrieve pointer to message service.
SmartIF< IDataManagerSvc > & dataManager() const
Get Data Manager service.
Definition Converter.cpp:80
A DataObject is the base class of any identifiable object on any data store.
Definition DataObject.h:37
IRegistry * registry() const
Get pointer to Registry.
Definition DataObject.h:79
Opaque address interface definition.
virtual const std::string * par() const =0
Retrieve String parameters.
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition IRegistry.h:29
virtual const id_type & identifier() const =0
Full identifier (or key)
Definition of the MsgStream class used to transmit messages.
Definition MsgStream.h:29
StatusCode findTFile(const std::string &, TFile *&)
void setDirectory(const std::string &loc)
void setDiskDirectory(const std::string &loc)
StatusCode createDirectory(const std::string &loc)
StatusCode createAddress(DataObject *pObject, TDirectory *pDir, TObject *pTObject, IOpaqueAddress *&refpAddr)
Create address of the transient object according to the requested representation.
Create persistent and transient representations of data store directories.
StatusCode createRep(DataObject *pObj, IOpaqueAddress *&refpAddr) override
Convert the transient object to the requested representation.
RDirectoryCnv(ISvcLocator *svc)
Standard constructor.
StatusCode updateRep(IOpaqueAddress *pAddr, DataObject *pObject) override
Convert the transient object to the requested representation.
StatusCode createObj(IOpaqueAddress *pAddr, DataObject *&refpObj) override
Create the transient representation of an object.
StatusCode fillObjRefs(IOpaqueAddress *pAddr, DataObject *refpObj) override
Update the transient object from the other representation.
This class is used for returning status codes from appropriate routines.
Definition StatusCode.h:64
bool isSuccess() const
Definition StatusCode.h:314
constexpr static const auto SUCCESS
Definition StatusCode.h:99
constexpr static const auto FAILURE
Definition StatusCode.h:100
@ DEBUG
Definition IMessageSvc.h:22
@ ERROR
Definition IMessageSvc.h:22
@ VERBOSE
Definition IMessageSvc.h:22
Small class representing an N tuple directory in the transient store.
Definition NTuple.h:907