The Gaudi Framework  v30r2 (9eca68f7)
PersSvc.cpp
Go to the documentation of this file.
1 // Include files
7 #include "RConverter.h"
8 #include "RootObjAddress.h"
9 #include "TFile.h"
10 
11 namespace RootHistCnv
12 {
13  static std::string stat_dir = "/stat";
14  static std::string undefFileName = "UndefinedROOTOutputFileName";
15 }
16 
17 #include "PersSvc.h"
18 
19 //-----------------------------------------------------------------------------
20 //
21 // Implementation of class : RootHistCnv::PersSvc
22 //
23 // Author : Charles Leggett
24 //
25 //-----------------------------------------------------------------------------
26 
27 // Instantiation of a static factory class used by clients to create
28 // instances of this service
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() << endmsg;
54  } else {
55  log << MSG::INFO << "Writing ROOT histograms disabled." << endmsg;
56  }
57  return StatusCode( StatusCode::SUCCESS, true );
58 }
59 
60 //-----------------------------------------------------------------------------
62 //-----------------------------------------------------------------------------
63 {
64  // Close ROOT only if the output file name is defined
65  MsgStream log( msgSvc(), name() );
66  log << MSG::DEBUG << "RootHistCnv::PersSvc::finalize()" << endmsg;
67  if ( m_outputEnabled ) {
68  if ( undefFileName != m_defFileName ) {
69  m_hfile->Write( "", TObject::kOverwrite );
70  m_hfile->Close();
71  }
72  }
73  return ConversionSvc::finalize();
74 }
75 
76 //-----------------------------------------------------------------------------
78 //-----------------------------------------------------------------------------
79 {
80  // There are objects in the HDS to be stored
81  if ( m_outputEnabled && undefFileName != m_defFileName ) {
82  SmartDataPtr<DataObject> top( dataProvider(), stat_dir );
83  if ( 0 != top ) {
84  IRegistry* pReg = top->registry();
85  if ( pReg ) {
86  if ( top.ptr() == pObject ) {
87  TDirectory* pDir = m_hfile.get();
88  refpAddress =
89  new RootObjAddress( repSvcType(), CLID_DataObject, stat_dir, m_defFileName, long( pDir ), long( 0 ) );
90  return StatusCode::SUCCESS;
91  } else {
92  StatusCode sc = ConversionSvc::createRep( pObject, refpAddress );
93  if ( sc.isFailure() ) {
94  MsgStream log( msgSvc(), name() );
95  log << MSG::ERROR << "Error while creating persistent Histogram:" << pReg->identifier() << endmsg;
96  }
97  return sc;
98  }
99  }
100  }
101  MsgStream err( msgSvc(), name() );
102  err << MSG::ERROR << "Internal error while creating Histogram persistent representations" << endmsg;
103  return StatusCode::FAILURE;
104  } else {
105  if ( m_outputEnabled && !m_prtWar ) {
106  m_prtWar = true;
107  MsgStream log( msgSvc(), name() );
108  log << MSG::WARNING << "no ROOT output file name, "
109  << "Histograms cannot be persistified" << endmsg;
110  }
111  }
112  return StatusCode::SUCCESS;
113 }
constexpr static const auto FAILURE
Definition: StatusCode.h:88
Definition of the MsgStream class used to transmit messages.
Definition: MsgStream.h:24
StatusCode finalize() override
Finalise the service.
Definition: PersSvc.cpp:61
StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress) override
Implementation of IConverter: Convert the transient object to the requested representation.
bool isFailure() const
Definition: StatusCode.h:139
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:73
#define DECLARE_COMPONENT(type)
Definition: PluginService.h:33
StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress) override
Convert a collection of transient data objects into another representation.
Definition: PersSvc.cpp:77
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:51
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
A small class used to access easily (and efficiently) data items residing in data stores...
Definition: SmartDataPtr.h:47
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:209