All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
PersSvc.cpp
Go to the documentation of this file.
1 // Include files
7 #include "RootObjAddress.h"
8 #include "RConverter.h"
9 #include "TFile.h"
10 
11 namespace RootHistCnv {
12  static std::string stat_dir = "/stat";
13  static std::string undefFileName = "UndefinedROOTOutputFileName";
14 }
15 
16 #include "PersSvc.h"
17 
18 //-----------------------------------------------------------------------------
19 //
20 // Implementation of class : RootHistCnv::PersSvc
21 //
22 // Author : Charles Leggett
23 //
24 //-----------------------------------------------------------------------------
25 
26 // Instantiation of a static factory class used by clients to create
27 // instances of this service
30 
31 
32 //-----------------------------------------------------------------------------
34 //-----------------------------------------------------------------------------
35 {
36  MsgStream log( msgSvc(), name() );
37 
39  if( status.isFailure() ) return status;
40 
41  // Get my properties from the JobOptionsSvc
42  if (setProperties().isFailure()) {
43  log << MSG::ERROR << "Could not set my properties" << endmsg;
44  return StatusCode::FAILURE;
45  }
46  if (m_outputEnabled) {
47  // Initialize ROOT if output file name is defined
48  if( undefFileName != m_defFileName ) {
49  m_hfile.reset( TFile::Open(m_defFileName.value().c_str(),"RECREATE","GAUDI Histograms") );
50  } else {
51  m_hfile.reset();
52  }
53  log << MSG::INFO << "Writing ROOT histograms to: " << m_defFileName.value()
54  << endmsg;
55  }
56  else {
57  log << MSG::INFO << "Writing ROOT histograms disabled." << endmsg;
58  }
59  return StatusCode(StatusCode::SUCCESS,true);
60 }
61 
62 
63 //-----------------------------------------------------------------------------
65 //-----------------------------------------------------------------------------
66 {
67  // Close ROOT only if the output file name is defined
68  MsgStream log( msgSvc(), name() );
69  log << MSG::DEBUG << "RootHistCnv::PersSvc::finalize()" << endmsg;
70  if( undefFileName != m_defFileName ) {
71  m_hfile->Write("",TObject::kOverwrite);
72  m_hfile->Close();
73  }
74  return ConversionSvc::finalize();
75 }
76 
77 //-----------------------------------------------------------------------------
79  IOpaqueAddress*& refpAddress)
80 //-----------------------------------------------------------------------------
81 {
82  // There are objects in the HDS to be stored
83  if( m_outputEnabled && undefFileName != m_defFileName ) {
84  SmartDataPtr<DataObject> top(dataProvider(), stat_dir);
85  if ( 0 != top ) {
86  IRegistry* pReg = top->registry();
87  if ( pReg ) {
88  if ( top.ptr() == pObject ) {
89  TDirectory* pDir = m_hfile.get();
90  refpAddress = new RootObjAddress( repSvcType(),
91  CLID_DataObject,
92  stat_dir,
93  m_defFileName,
94  long(pDir),
95  long(0));
96  return StatusCode::SUCCESS;
97  }
98  else {
99  StatusCode sc = ConversionSvc::createRep(pObject, refpAddress);
100  if( sc.isFailure() ) {
101  MsgStream log( msgSvc(), name() );
102  log << MSG::ERROR
103  << "Error while creating persistent Histogram:"
104  << pReg->identifier()
105  << endmsg;
106  }
107  return sc;
108  }
109  }
110  }
111  MsgStream err( msgSvc(), name() );
112  err << MSG::ERROR
113  << "Internal error while creating Histogram persistent representations"
114  << endmsg;
115  return StatusCode::FAILURE;
116  } else {
117  if (m_outputEnabled && !m_prtWar) {
118  m_prtWar = true;
119  MsgStream log( msgSvc(), name() );
120  log << MSG::WARNING
121  << "no ROOT output file name, "
122  << "Histograms cannot be persistified" << endmsg;
123  }
124  }
125  return StatusCode::SUCCESS;
126 }
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
StatusCode finalize() override
Finalise the service.
Definition: PersSvc.cpp:64
StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress) override
Implementation of IConverter: Convert the transient object to the requested representation.
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:74
#define DECLARE_COMPONENT(type)
Definition: PluginService.h:36
StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress) override
Convert a collection of transient data objects into another representation.
Definition: PersSvc.cpp:78
STL class.
TYPE * ptr()
Automatic conversion to data type.
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
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
A small class used to access easily (and efficiently) data items residing in data stores...
Definition: SmartDataPtr.h:46
Persistency service - to store histograms in ROOT format.
Definition: PersSvc.h:19
Opaque address interface definition.
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
StatusCode finalize() override
stop the service.
StatusCode initialize() override
Initialize the service.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244