ATLAS Offline Software
Loading...
Searching...
No Matches
Athena::RootSvc Class Reference

This class provides the interface to the ROOT software. More...

#include <RootSvc.h>

Inheritance diagram for Athena::RootSvc:
Collaboration diagram for Athena::RootSvc:

Public Member Functions

 RootSvc (const std::string &name, ISvcLocator *pSvcLocator)
 Standard Service Constructor.
StatusCode initialize ()
 Gaudi Service Interface method implementations:
StatusCode finalize ()
StatusCode open (const std::string &fname, const std::string &mode)
 Open the file fname with open mode mode
StatusCode connect (const std::string &fname)
 Connect the file fname to the service.
StatusCode commitOutput ()
 Commit data and flush buffer.
StatusCode disconnect (const std::string &fname)
 Disconnect the file fname from the service.
Athena::RootConnectionconnection (const std::string &fname)
 Get the RootConnection associated with file fname
virtual ~RootSvc ()
 Destructor.
RootType getType (const std::type_info &type) const
 Load the type (dictionary) from Root.
void * readObject (const Token &token, void *&pObj)
 Read object from Root.
const TokenwriteObject (const Placement &placement, const RootType &type, const void *pObj)
 Write object of a given class to Root.
void * createObject (const RootType &type) const
 Create an object of a given RootType.
void destructObject (const RootType &type, void *pObj) const
 Destruct a given object of type RootType.

Private Types

typedef std::map< Guid, Athena::RootConnection * > ConnMap_t

Private Member Functions

 RootSvc ()
 Default constructor:
 RootSvc (const RootSvc &)
RootSvcoperator= (const RootSvc &)

Private Attributes

pool::IFileCatalogm_catalog
ConnMap_t m_conns
 Map of file name keys and connection values.
Athena::RootConnectionm_wconn
ServiceHandle< ::IDictLoaderSvcm_dictSvc
 ServiceHandle to the dictionary service.

Detailed Description

This class provides the interface to the ROOT software.

Definition at line 39 of file RootSvc.h.

Member Typedef Documentation

◆ ConnMap_t

Definition at line 94 of file RootSvc.h.

Constructor & Destructor Documentation

◆ RootSvc() [1/3]

Athena::RootSvc::RootSvc ( const std::string & name,
ISvcLocator * pSvcLocator )

Standard Service Constructor.

Definition at line 27 of file RootSvc.cxx.

27 :
28 base_class(name, pSvcLocator),
29 m_catalog(0),
30 m_conns(),
31 m_wconn(0),
32 m_dictSvc("AthDictLoaderSvc", name) {
33}
ConnMap_t m_conns
Map of file name keys and connection values.
Definition RootSvc.h:96
pool::IFileCatalog * m_catalog
Definition RootSvc.h:92
Athena::RootConnection * m_wconn
Definition RootSvc.h:97
ServiceHandle< ::IDictLoaderSvc > m_dictSvc
ServiceHandle to the dictionary service.
Definition RootSvc.h:100

◆ ~RootSvc()

Athena::RootSvc::~RootSvc ( )
virtual

Destructor.

Definition at line 35 of file RootSvc.cxx.

35 {
36 for (ConnMap_t::iterator itr = m_conns.begin(), iend = m_conns.end(); itr != iend; ++itr) {
37 delete itr->second; itr->second = 0;
38 }
39 m_conns.clear();
40}

◆ RootSvc() [2/3]

Athena::RootSvc::RootSvc ( )
private

Default constructor:

◆ RootSvc() [3/3]

Athena::RootSvc::RootSvc ( const RootSvc & )
private

Member Function Documentation

◆ commitOutput()

StatusCode Athena::RootSvc::commitOutput ( )

Commit data and flush buffer.

Definition at line 155 of file RootSvc.cxx.

155 {
156 ATH_MSG_VERBOSE("RootSvc::commitOutput");
157 if (m_wconn == 0) {
158 ATH_MSG_ERROR("Cannot commit without RootConnection.");
159 return StatusCode::FAILURE;
160 }
161 if (!m_wconn->commit().isSuccess()) {
162 ATH_MSG_ERROR("Cannot commit RootConnection.");
163 return StatusCode::FAILURE;
164 }
165 return StatusCode::SUCCESS;
166}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)

◆ connect()

StatusCode Athena::RootSvc::connect ( const std::string & fname)

Connect the file fname to the service.

Definition at line 140 of file RootSvc.cxx.

140 {
141 ATH_MSG_VERBOSE("connect(" << fname << ")...");
142 Athena::RootConnection* conn = this->connection(fname);
143 if (conn == 0) {
144 ATH_MSG_ERROR("No open RootConnection for file " << fname);
145 return StatusCode::FAILURE;
146 }
147 if (!conn->connectWrite("recreate").isSuccess()) {
148 ATH_MSG_ERROR("Cannot connect to file " << fname);
149 return StatusCode::FAILURE;
150 }
151 m_wconn = conn;
152 return StatusCode::SUCCESS;
153}
Athena::RootConnection * connection(const std::string &fname)
Get the RootConnection associated with file fname
Definition RootSvc.cxx:188

◆ connection()

Athena::RootConnection * Athena::RootSvc::connection ( const std::string & fname)

Get the RootConnection associated with file fname

Returns
NULL if no such file is known to this service

Definition at line 188 of file RootSvc.cxx.

188 {
189// Catalog to get fid...
190 Guid fid = Guid::null();
191 if (m_catalog != 0) {
192 std::string fidString, ftype;
193 m_catalog->lookupFileByPFN(fname, fidString, ftype);
194 if( fidString.empty() ) {
195 m_catalog->registerPFN(fname, "ROOT_All", fidString);
196 }
197 fid.fromString(fidString);
198 }
199 Athena::RootConnection* conn = 0;
200 ConnMap_t::const_iterator fitr = m_conns.find(fid);
201 if (fitr != m_conns.end()) {
202 conn = fitr->second;
203 }
204 return conn;
205}
constexpr void fromString(std::string_view s)
Automatic conversion from string representation.
Definition Guid.h:143
static const Guid & null() noexcept
NULL-Guid: static class method.
Definition Guid.cxx:14

◆ createObject()

void * Athena::RootSvc::createObject ( const RootType & type) const

Create an object of a given RootType.

Definition at line 103 of file RootSvc.cxx.

103 {
104 void* pObj = type.Construct();
105 return pObj;
106}

◆ destructObject()

void Athena::RootSvc::destructObject ( const RootType & type,
void * pObj ) const

Destruct a given object of type RootType.

Definition at line 109 of file RootSvc.cxx.

109 {
110}

◆ disconnect()

StatusCode Athena::RootSvc::disconnect ( const std::string & fname)

Disconnect the file fname from the service.

Definition at line 169 of file RootSvc.cxx.

169 {
170 ATH_MSG_VERBOSE("disconnect(" << fname << ")...");
171 Athena::RootConnection* conn = this->connection(fname);
172 if (conn == 0) {
173 ATH_MSG_ERROR("No open RootConnection for file " << fname);
174 return StatusCode::FAILURE;
175 }
176 if (!conn->disconnect().isSuccess()) {
177 ATH_MSG_ERROR("Cannot disconnect to file " << fname);
178 return StatusCode::FAILURE;
179 }
180 if (m_wconn == conn) {
181 m_wconn = 0;
182 }
183 return StatusCode::SUCCESS;
184}

◆ finalize()

StatusCode Athena::RootSvc::finalize ( )

Definition at line 60 of file RootSvc.cxx.

60 {
61 for (ConnMap_t::const_iterator itr = m_conns.begin(), iend = m_conns.end(); itr != iend; ++itr) {
62 if (!itr->second->disconnect().isSuccess()) {
63 ATH_MSG_WARNING("Cannot disconnect file = " << itr->first.toString());
64 }
65 }
66 if (m_catalog != 0) {
67 m_catalog->commit();
68 delete m_catalog; m_catalog = 0;
69 }
70 return ::AthService::finalize();
71}
#define ATH_MSG_WARNING(x)

◆ getType()

RootType Athena::RootSvc::getType ( const std::type_info & type) const

Load the type (dictionary) from Root.

RootType-base interface Load the type (dictionary) from Root.

Definition at line 74 of file RootSvc.cxx.

74 {
75 return m_dictSvc->load_type(type);
76}

◆ initialize()

StatusCode Athena::RootSvc::initialize ( )

Gaudi Service Interface method implementations:

Definition at line 42 of file RootSvc.cxx.

42 {
43 ATH_MSG_INFO("Initializing " << name());
44 if (!::AthService::initialize().isSuccess()) {
45 ATH_MSG_FATAL("Cannot initialize ConversionSvc base class.");
46 return StatusCode::FAILURE;
47 }
48 m_catalog = new pool::IFileCatalog;
49 try {
50 m_catalog->setWriteCatalog("xmlcatalog_file:RootFileCatalog.xml"); // FIXME: Make config
51 m_catalog->start();
52 } catch (std::exception& e) {
53 ATH_MSG_FATAL ("Set up Catalog - caught exception: " << e.what());
54 return StatusCode::FAILURE;
55 }
56 ATH_CHECK(m_dictSvc.retrieve());
57 return StatusCode::SUCCESS;
58}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)

◆ open()

StatusCode Athena::RootSvc::open ( const std::string & fname,
const std::string & mode )

Open the file fname with open mode mode

Definition at line 113 of file RootSvc.cxx.

113 {
114// Catalog to get fid...
115 Guid fid = Guid::null();
116 if (m_catalog != 0) {
117 std::string fidString, ftype;
118 m_catalog->lookupFileByPFN(fname, fidString, ftype);
119 if( fidString.empty() ) {
120 m_catalog->registerPFN(fname, "ROOT_All", fidString);
121 }
122 fid.fromString(fidString);
123 }
124 Athena::RootConnection* conn = 0;
125 ConnMap_t::const_iterator fitr = m_conns.find(fid);
126 if (fitr == m_conns.end()) {
127 conn = new Athena::RootConnection(this, fname);
128 m_conns.insert(std::make_pair(fid, conn));
129 } else {
130 conn = fitr->second;
131 }
132 if (conn == 0) {
133 ATH_MSG_ERROR("Cannot get RootConnection for file " << fid.toString());
134 return StatusCode::FAILURE;
135 }
136 return StatusCode::SUCCESS;
137}
constexpr void toString(std::span< char, StrLen > buf, bool uppercase=true) const noexcept
Automatic conversion to string representation.

◆ operator=()

RootSvc & Athena::RootSvc::operator= ( const RootSvc & )
private

◆ readObject()

void * Athena::RootSvc::readObject ( const Token & token,
void *& pObj )

Read object from Root.

Definition at line 79 of file RootSvc.cxx.

79 {
80 return 0;
81}

◆ writeObject()

const Token * Athena::RootSvc::writeObject ( const Placement & placement,
const RootType & type,
const void * pObj )

Write object of a given class to Root.

Definition at line 84 of file RootSvc.cxx.

84 {
85 ATH_MSG_VERBOSE("RootSvc::writeObject pObj = " << pObj);
86 if (m_wconn == 0) {
87 ATH_MSG_ERROR("Cannot write without RootConnection for placement " << placement.containerName());
88 return 0;
89 }
90 if (!m_wconn->setContainer(placement.containerName(), type.Name()).isSuccess()) {
91 ATH_MSG_ERROR("Cannot set container [" << placement.containerName() << "]");
92 return 0;
93 }
94 unsigned long ientry = 0;
95 if (!m_wconn->write(pObj, ientry).isSuccess()) {
96 ATH_MSG_ERROR("Cannot write Object to placement [" << placement.containerName() << "]");
97 return 0;
98 }
99 return new Token();
100}
const std::string & containerName() const
Access container name.
Definition Placement.h:32

Member Data Documentation

◆ m_catalog

pool::IFileCatalog* Athena::RootSvc::m_catalog
private

Definition at line 92 of file RootSvc.h.

◆ m_conns

ConnMap_t Athena::RootSvc::m_conns
private

Map of file name keys and connection values.

Definition at line 96 of file RootSvc.h.

◆ m_dictSvc

ServiceHandle< ::IDictLoaderSvc> Athena::RootSvc::m_dictSvc
private

ServiceHandle to the dictionary service.

Definition at line 100 of file RootSvc.h.

◆ m_wconn

Athena::RootConnection* Athena::RootSvc::m_wconn
private

Definition at line 97 of file RootSvc.h.


The documentation for this class was generated from the following files: