#include <TreeTofSimCnv.h>
Inheritance diagram for TreeTofSimDataCnv:
Public Types | |
typedef Ty2 | destination |
typedef Ty2 | destination |
typedef Ty1 | source |
typedef Ty1 | source |
Public Member Functions | |
virtual StatusCode | createObj (IOpaqueAddress *addr, DataObject *&refpObject) |
virtual StatusCode | createRoot (const std::string &fname, CalibData::CalibBase1 *pTDSObj) |
virtual StatusCode | finalize () |
ICalibTreeSvc * | getCalibTreeSvc () |
virtual StatusCode | initialize () |
const CLID & | objType () const |
destination * | operator (const source &) const |
destination * | operator (const source &) const |
virtual long | repSvcType () const |
TreeTofSimDataCnv (ISvcLocator *svc) | |
virtual | ~TreeTofSimDataCnv () |
Static Public Member Functions | |
const CLID & | classID () |
const unsigned char | storageType () |
Protected Member Functions | |
virtual destination * | convert (const source &) const =0 |
virtual destination * | convert (const source &) const =0 |
virtual StatusCode | fillRoot (CalibData::CalibBase *pTDSObj, TObject *pRootObj) |
virtual StatusCode | i_createObj (IOpaqueAddress *address, DataObject *&refpObject) |
virtual StatusCode | i_processObj (DataObject *pObject, IOpaqueAddress *address) |
In case there is additional work to do on the created object. | |
virtual StatusCode | internalCreateObj (DataObject *&refpObject, IOpaqueAddress *address) |
void | setBaseInfo (CalibData::CalibBase1 *pObj) |
Another utility for derived classes to use. | |
Protected Attributes | |
TFile * | m_inFile |
IInstrumentName * | m_instrSvc |
ICalibMetaCnvSvc * | m_metaSvc |
TFile * | m_outFile |
int | m_runfrm |
int | m_runto |
TDirectory * | m_saveDir |
int | m_serNo |
ICalibTreeSvc * | m_treeSvc |
TTree * | m_ttree |
Friends | |
class | CnvFactory<TreeTofSimDataCnv> |
|
|
|
|
|
|
|
|
|
00031 : 00032 TreeCalBaseCnv(svc, CLID_Calib_TofSim) { 00033 00034 }
|
|
00029 {};
|
|
00041 {
00042 return CLID_Calib_TofSim;
00043 }
|
|
|
|
|
|
Create the transient representation of an object, given an opaque address. This and the following update method comprise the core functionality of calibration converters. 00108 { 00109 // StatusCode ret; 00110 00111 // first do the things we always need: 00112 // First string parameter of opaque address is file ident 00113 MsgStream log(msgSvc(), "TreeCalBaseCnv"); 00114 log << MSG::DEBUG<<"TreeCalBaseCnv::createObj( starting ...."<<endreq; 00115 // const std::string* par = addr->par(); 00116 00117 // std::string par0 = par[0]; 00118 00119 // return internalCreateObj(par0, refpObject, addr); 00120 return internalCreateObj(refpObject, addr); 00121 00122 }
|
|
Create ROOT file corresponding to TDS object input. Default implementation is to return an error. Must be separately implemented for each calibration type.
00086 { 00087 MsgStream log(msgSvc(), "TreeCalBaseCnv"); 00088 log << MSG::ERROR 00089 << "createRoot method not implemented for this calibration type" 00090 << endreq; 00091 return StatusCode::FAILURE; 00092 }
|
|
Given a pointer to a TDS object which can be cast to "our" type, fill in corresponding information in the corresponding root class
00097 { 00098 00099 // Get instrument name from InstrumentName service Now handled by 00100 // TreeCalBaseCnv 00101 // TString instr = TString((m_instrSvc->getInstrumentName()).c_str()); 00102 // pRootObj->setInstrument(instr); 00103 return StatusCode::SUCCESS; 00104 }
|
|
00078 {
00079 return Converter::finalize();
00080 }
|
|
00057 {
00058 return m_treeSvc;
00059 }
|
|
This creates the transient representation of an object from the corresponding ROOT object. This actually does the "new" operation and deals with the attributes of the node. This base class implementation does nothing; it should not normally be called because it doesn't correspond to any TCDS class. Instead, i_createObj of some derived class will be called.
Reimplemented from TreeCalBaseCnv. 00046 { 00047 00048 MsgStream log(msgSvc(), "TreeTofSimDataCnv"); 00049 log<<MSG::DEBUG<<"SetProperty"<<endreq; 00050 00051 TreeAddress* add = dynamic_cast<TreeAddress*>(addr); 00052 00053 DatabaseRecord *records=add->pp(); 00054 00055 TBuffer *buf1 = new TBuffer(TBuffer::kRead); 00056 TBuffer *buf2 = new TBuffer(TBuffer::kRead); 00057 TBuffer *buf3 = new TBuffer(TBuffer::kRead); 00058 00059 buf1->SetBuffer((*records)["BTofSim"],512000,kFALSE); 00060 buf2->SetBuffer((*records)["ETofSim"],512000,kFALSE); 00061 buf3->SetBuffer((*records)["SimConstants"],512000,kFALSE); 00062 00063 std::cout<<" CalVerSft is "<<(*records)["TofSimParVer"]; 00064 std::cout<<" File name is "<<(*records)["FileName"]<<std::endl; 00065 00066 00067 00068 TTree *btoftree= new TTree(); 00069 TTree *etoftree= new TTree(); 00070 TTree *btofcommontree = new TTree(); 00071 btoftree->Streamer(*buf1); 00072 etoftree->Streamer(*buf2); 00073 btofcommontree->Streamer(*buf3); 00074 00075 CalibData::BTofSimBase bTof; 00076 CalibData::ETofSimBase eTof; 00077 CalibData::TofSimConstBase tofbase; 00078 std::vector<CalibData::BTofSimBase> tmpbTof;//; = new vector<CalibData::bTofCalibBase>; 00079 std::vector<CalibData::ETofSimBase> tmpeTof; 00080 std::vector<CalibData::TofSimConstBase> tofbaseCol; 00081 // Read in the object 00082 int cnt; 00083 // read btoftree ------------------------------------------------------------ 00084 double AttenLength; 00085 double Gain; 00086 double Ratio; 00087 double NoiseSmear; 00088 btoftree -> SetBranchAddress("AttenLength", &AttenLength); 00089 btoftree -> SetBranchAddress("Gain", &Gain); 00090 btoftree -> SetBranchAddress("Ratio", &Ratio); 00091 int entries=btoftree->GetEntries(); 00092 for(cnt=0; cnt<entries; cnt++){ 00093 btoftree -> GetEntry(cnt); 00094 bTof.setGain(Gain); 00095 bTof.setRatio(Ratio); 00096 bTof.setAttenLength(AttenLength); 00097 tmpbTof.push_back(bTof); 00098 } 00099 //read etoftree 00100 etoftree -> SetBranchAddress("Gain", &Gain); 00101 etoftree -> SetBranchAddress("AttenLength", &AttenLength); 00102 etoftree -> SetBranchAddress("NoiseSmear", &NoiseSmear ); 00103 entries=etoftree->GetEntries(); 00104 for(cnt=0; cnt<entries; cnt++){ 00105 etoftree->GetEntry(cnt); 00106 eTof.setGain(Gain); 00107 eTof.setAttenLength(AttenLength); 00108 eTof.setNoiseSmear(NoiseSmear); 00109 tmpeTof.push_back(eTof); 00110 } 00111 //read SimConstants 00112 double BarConstant,BarPMTGain,BarHighThres,BarLowThres,EndConstant,EndPMTGain,EndHighThres,EndLowThres,EndNoiseSwitch; 00113 btofcommontree-> SetBranchAddress("BarConstant", &BarConstant); 00114 btofcommontree-> SetBranchAddress("BarPMTGain", &BarPMTGain); 00115 btofcommontree-> SetBranchAddress("BarHighThres", &BarHighThres); 00116 btofcommontree-> SetBranchAddress("BarLowThres", &BarLowThres); 00117 btofcommontree-> SetBranchAddress("EndConstant", &EndConstant); 00118 btofcommontree-> SetBranchAddress("EndPMTGain", &EndPMTGain); 00119 btofcommontree-> SetBranchAddress("EndHighThres", &EndHighThres); 00120 btofcommontree-> SetBranchAddress("EndLowThres", &EndLowThres); 00121 btofcommontree-> SetBranchAddress("EndNoiseSwitch", &EndNoiseSwitch); 00122 entries = btofcommontree->GetEntries(); 00123 for(cnt=0;cnt<entries;cnt++){ 00124 btofcommontree->GetEntry(cnt); 00125 tofbase.setBarLowThres(BarLowThres); 00126 tofbase.setBarHighThres(BarHighThres); 00127 tofbase.setEndLowThres(EndLowThres); 00128 tofbase.setEndHighThres(EndHighThres); 00129 tofbase.setBarPMTGain(BarPMTGain); 00130 tofbase.setEndPMTGain(EndPMTGain); 00131 tofbase.setBarConstant(BarConstant); 00132 tofbase.setEndConstant(EndConstant); 00133 tofbase.setEndNoiseSwitch(EndNoiseSwitch); 00134 tofbaseCol.push_back(tofbase); 00135 } 00136 00137 CalibData::TofSimData *tmpObject = new CalibData::TofSimData(&tofbaseCol,&tmpbTof,&tmpeTof); 00138 refpObject=tmpObject; 00139 delete btoftree; 00140 delete etoftree; 00141 delete btofcommontree; 00142 00143 return StatusCode::SUCCESS; 00144 00145 00146 }
|
|
In case there is additional work to do on the created object.
00184 {
00185 return StatusCode::SUCCESS;
00186 }
|
|
00045 { 00046 StatusCode status = Converter::initialize(); 00047 00048 IDataProviderSvc* dp; 00049 00050 // I guess the service names are assigned in jobOptions? 00051 00052 serviceLocator()->getService ("CalibDataSvc", 00053 IID_IDataProviderSvc, 00054 (IInterface*&)dp); 00055 setDataProvider(dp); 00056 00057 // Locate the Root Conversion Service 00058 serviceLocator()->getService ("CalibTreeCnvSvc", 00059 IID_ICalibTreeSvc, 00060 (IInterface*&) m_treeSvc); 00061 00062 // Locate meta conversion service 00063 // Will anything need to be changed here to accommodate possibility 00064 // of two concrete implementations of ICalibMetaCnvSvc? Would 00065 // have different storage types. Could specify type desired 00066 // as job option. Ditto for name of class? 00067 serviceLocator()->getService("CalibMySQLCnvSvc", 00068 IID_ICalibMetaCnvSvc, 00069 (IInterface*&)m_metaSvc); 00070 00071 serviceLocator()->getService ("CalibDataSvc", 00072 IID_IInstrumentName, 00073 (IInterface*&)m_instrSvc); 00074 00075 return status; 00076 }
|
|
This creates the transient representation of an object from the corresponding ROOT object it, then fills it and process it. This implementation actually only calls the i_* methods of the "right" converter to do the job; so the very first thing it does is get a pointer to the appropriate derived converter. Converters typically don't need to override this method but only to override/implement some of the i_* methods.
00128 { 00129 00130 MsgStream log(msgSvc(), "TreeCalBaseCnv"); 00131 log << MSG::DEBUG<<"TreeCalBaseCnv::internalCreateObj( starting ..... "<<endreq; 00132 TreeCalBaseCnv* converter = this; 00133 CLID classId = address->clID(); 00134 00135 IConverter* conv = this->conversionSvc()->converter(classId); 00136 if (0 == conv) { 00137 log << MSG::WARNING 00138 << "No proper converter found for classID " << classId 00139 << ", the default converter" 00140 << " will be used. " << endreq; 00141 } else { 00142 converter = dynamic_cast <TreeCalBaseCnv*> (conv); 00143 if (0 == converter) { 00144 log << MSG::ERROR 00145 << "The converter found for classID " << classId 00146 << " was not a descendent of TreeCalBaseCnv as it should be " 00147 << "( was of type " << typeid (*converter).name() << "). " 00148 << "The default converter will be used" << endreq; 00149 converter = this; 00150 } 00151 } 00152 00153 m_runfrm =*( address->ipar()); 00154 m_runto =*( address->ipar()+1); 00155 // m_runfrm = 100; 00156 // m_runto =1000; 00157 // creates an object for the node found 00158 StatusCode sc = converter->i_createObj(address, refpObject); 00159 if (sc.isFailure()) { 00160 return sc; 00161 } 00162 CalibData::CalibBase1* tmpObject = dynamic_cast <CalibData::CalibBase1*> (refpObject); 00163 setBaseInfo(tmpObject); 00164 // ends up the object construction 00165 sc = converter->i_processObj(refpObject, address); 00166 if (sc.isSuccess()) { 00167 log << MSG::DEBUG << "Successfully created calib. object " << endreq; 00168 } 00169 // closeRead(); 00170 return sc; 00171 }
|
|
00037 {
00038 return CLID_Calib_TofSim;
00039 }
|
|
|
|
|
|
00034 {
00035 return CALIBTREE_StorageType;
00036 }
|
|
Another utility for derived classes to use. Another convenience for derived classes: sets information belonging to the calibration base class, namely validity interval and serial number. 00189 { 00190 MsgStream log(msgSvc(), "TreeCalBaseCnv"); 00191 log << MSG::DEBUG<<"set the runfrm and runto Numbers in the converter"<<endreq; 00192 pObj->setrunfrm(m_runfrm); 00193 pObj->setrunto(m_runto); 00194 }
|
|
00061 {return CALIBTREE_StorageType;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|