BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
TreeCalBaseCnv.cxx
Go to the documentation of this file.
1// $Header: /bes/bes/BossCvs/Calibration/CalibSvc/CalibTreeCnv/src/cnv/TreeCalBaseCnv.cxx,v 1.8
2// 2022/02/21 06:45:17 maqm Exp $
3/**
4 @file TreeCalBaseCnv.cxx
5
6 Implementation file for Root calibration converter base class
7*/
8
9#include "TreeCalBaseCnv.h"
10
11#include "GaudiKernel/DataObject.h"
12#include "GaudiKernel/IAddressCreator.h"
13#include "GaudiKernel/IConversionSvc.h"
14#include "GaudiKernel/IDataProviderSvc.h"
15#include "GaudiKernel/IOpaqueAddress.h"
16#include "GaudiKernel/MsgStream.h"
17
18#include "CalibData/CalibBase.h"
19#include "CalibData/CalibBase1.h"
20#include "CalibDataSvc/ICalibMetaCnvSvc.h"
21#include "CalibDataSvc/ICalibRootSvc.h"
22#include "CalibDataSvc/IInstrumentName.h"
23#include "facilities/Util.h" // for translating env variables
24// Guessing at needed Root includes
25#include "CalibMySQLCnvSvc/TreeAddress.h"
26#include "DatabaseSvc/IDatabaseSvc.h"
27#include "TFile.h"
28#include "TObject.h"
29#include "TROOT.h" // need this for cd??
30#include "TTree.h"
31
33 // release TFile, TTree if they need releasing. With normal
34 // termination they should already have been released.
35
36 // doClean();
37}
38
39// static CnvFactory<TreeCalBaseCnv> s_factory;
40// const ICnvFactory& TreeCalBaseCnvFactory = s_factory;
41TreeCalBaseCnv::TreeCalBaseCnv( ISvcLocator* svc, const CLID& clid )
42 : Converter( CALIBTREE_StorageType, clid, svc )
43 , m_treeSvc( 0 )
44 , m_metaSvc( 0 )
45 , m_instrSvc( 0 )
46 , m_outFile( 0 )
47 , m_ttree( 0 )
48 , m_inFile( 0 )
49 , m_saveDir( 0 ) {}
50
52 StatusCode status = Converter::initialize();
53
54 IDataProviderSvc* dp;
55
56 // I guess the service names are assigned in jobOptions?
57
58 /* serviceLocator()->getService ("CalibDataSvc",
59 IID_IDataProviderSvc,
60 (IInterface*&)dp);*/
61 serviceLocator()->getService( "CalibDataSvc", IDataProviderSvc::interfaceID(),
62 (IInterface*&)dp );
63 setDataProvider( dp );
64
65 // Locate the Root Conversion Service
66 // serviceLocator()->getService ("CalibTreeCnvSvc",
67 // IID_ICalibTreeSvc,
68 // (IInterface*&) m_treeSvc);
69 IInterface* m_treeSvc = serviceLocator()->service( "CalibTreeCnvSvc" );
70 // Locate meta conversion service
71 // Will anything need to be changed here to accommodate possibility
72 // of two concrete implementations of ICalibMetaCnvSvc? Would
73 // have different storage types. Could specify type desired
74 // as job option. Ditto for name of class?
75 /*serviceLocator()->getService("CalibMySQLCnvSvc",
76 IID_ICalibMetaCnvSvc,
77 (IInterface*&)m_metaSvc);
78 */
79 IInterface* m_metaSvc = serviceLocator()->service( "CalibMySQLCnvSvc" );
80 /*serviceLocator()->getService ("CalibDataSvc",
81 IID_IInstrumentName,
82 (IInterface*&)m_instrSvc);*/
83 IInterface* m_instrSvc = serviceLocator()->service( "CalibDataSvc" );
84
85 return status;
86}
87
88StatusCode TreeCalBaseCnv::finalize() { return Converter::finalize(); }
89
90/****** ROOT services *****/
91
92StatusCode TreeCalBaseCnv::createRoot( const std::string& /* fname */,
93 CalibData::CalibBase1* /* pTDSObj */ ) {
94 MsgStream log( msgSvc(), "TreeCalBaseCnv" );
95 log << MSG::ERROR << "createRoot method not implemented for this calibration type" << endmsg;
96 return StatusCode::FAILURE;
97}
98
99// Do our part to write out object -- which is nothing
101 TObject* /* pRootObj */ ) {
102
103 // Get instrument name from InstrumentName service Now handled by
104 // TreeCalBaseCnv
105 // TString instr = TString((m_instrSvc->getInstrumentName()).c_str());
106 // pRootObj->setInstrument(instr);
107 return StatusCode::SUCCESS;
108}
109
110// (To TDS) Conversion stuff
111StatusCode TreeCalBaseCnv::createObj( IOpaqueAddress* addr, DataObject*& refpObject ) {
112 // StatusCode ret;
113
114 // first do the things we always need:
115 // First string parameter of opaque address is file ident
116 MsgStream log( msgSvc(), "TreeCalBaseCnv" );
117 log << MSG::DEBUG << "TreeCalBaseCnv::createObj( starting ...." << endmsg;
118 // const std::string* par = addr->par();
119
120 // std::string par0 = par[0];
121
122 // return internalCreateObj(par0, refpObject, addr);
123 return internalCreateObj( refpObject, addr );
124}
125
126// StatusCode TreeCalBaseCnv::internalCreateObj(const std::string& fname,
127// DataObject*& refpObject,
128// IOpaqueAddress* address) {
129StatusCode TreeCalBaseCnv::internalCreateObj( DataObject*& refpObject,
130 IOpaqueAddress* address ) {
131
132 MsgStream log( msgSvc(), "TreeCalBaseCnv" );
133 log << MSG::DEBUG << "TreeCalBaseCnv::internalCreateObj( starting ..... " << endmsg;
134 TreeCalBaseCnv* converter = this;
135 CLID classId = address->clID();
136
137 IConverter* conv = this->conversionSvc()->converter( classId );
138 if ( 0 == conv )
139 {
140 log << MSG::WARNING << "No proper converter found for classID " << classId
141 << ", the default converter"
142 << " will be used. " << endmsg;
143 }
144 else
145 {
146 converter = dynamic_cast<TreeCalBaseCnv*>( conv );
147 if ( 0 == converter )
148 {
149 log << MSG::ERROR << "The converter found for classID " << classId
150 << " was not a descendent of TreeCalBaseCnv as it should be "
151 << "( was of type " << typeid( *converter ).name() << "). "
152 << "The default converter will be used" << endmsg;
153 converter = this;
154 }
155 }
156
157 TreeAddress* treeAddress = dynamic_cast<TreeAddress*>( address );
158 m_runfrm = treeAddress->getRunFrom();
159 m_runto = treeAddress->getRunTo();
160 // m_runfrm =*( address->ipar());
161 // m_runto =*( address->ipar()+1);
162 // m_runfrm = 100;
163 // m_runto =1000;
164 // creates an object for the node found
165 StatusCode sc = converter->i_createObj( address, refpObject );
166 if ( sc.isFailure() ) { return sc; }
167 CalibData::CalibBase1* tmpObject = dynamic_cast<CalibData::CalibBase1*>( refpObject );
168 setBaseInfo( tmpObject );
169 // ends up the object construction
170 sc = converter->i_processObj( refpObject, address );
171 if ( sc.isSuccess() )
172 { log << MSG::DEBUG << "Successfully created calib. object " << endmsg; }
173 // closeRead();
174 return sc;
175}
176
177/*
178 Base class version of this routine shouldn't really be called
179 since it doesn't correspond to a TDS object.
180*/
181StatusCode TreeCalBaseCnv::i_createObj( IOpaqueAddress* address,
182 DataObject*& /* refpObject */ ) {
183 return StatusCode::FAILURE; // shouldn't ever get here
184}
185
186// Default is to do nothing. Derived classes may override.
187StatusCode TreeCalBaseCnv::i_processObj( DataObject*, // pObject,
188 IOpaqueAddress* ) /* address */ {
189 return StatusCode::SUCCESS;
190}
191
192/// Another utility for derived classes to use
194 MsgStream log( msgSvc(), "TreeCalBaseCnv" );
195 log << MSG::DEBUG << "set the runfrm and runto Numbers in the converter" << endmsg;
196 pObj->setrunfrm( m_runfrm );
197 pObj->setrunto( m_runto );
198}
IMessageSvc * msgSvc()
TDirectory * m_saveDir
virtual StatusCode initialize()
virtual ~TreeCalBaseCnv()
virtual StatusCode fillRoot(CalibData::CalibBase *pTDSObj, TObject *pRootObj)
virtual StatusCode i_processObj(DataObject *pObject, IOpaqueAddress *address)
In case there is additional work to do on the created object.
virtual StatusCode finalize()
TreeCalBaseCnv(ISvcLocator *svc, const CLID &clid)
ICalibMetaCnvSvc * m_metaSvc
virtual StatusCode i_createObj(IOpaqueAddress *address, DataObject *&refpObject)
virtual StatusCode createObj(IOpaqueAddress *addr, DataObject *&refpObject)
IInstrumentName * m_instrSvc
ICalibTreeSvc * m_treeSvc
virtual StatusCode internalCreateObj(DataObject *&refpObject, IOpaqueAddress *address)
virtual StatusCode createRoot(const std::string &fname, CalibData::CalibBase1 *pTDSObj)
void setBaseInfo(CalibData::CalibBase1 *pObj)
Another utility for derived classes to use.