#include <TreeDedxSimDataCnv.h>
Inheritance diagram for TreeDedxSimDataCnv:
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 |
TreeDedxSimDataCnv (ISvcLocator *svc) | |
virtual | ~TreeDedxSimDataCnv () |
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<TreeDedxSimDataCnv> |
|
|
|
|
|
|
|
|
|
00031 : 00032 TreeCalBaseCnv(svc, CLID_Dedx_Sim) { 00033 00034 }
|
|
00029 {};
|
|
00041 {
00042 return CLID_Dedx_Sim;
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(), "TreeDedxSimDataCnv"); 00049 00050 CalibData::DedxSimData *tmpObject = new CalibData::DedxSimData; 00051 TreeAddress* add = dynamic_cast<TreeAddress*>(addr); 00052 DatabaseRecord *records=add->pp(); 00053 00054 TBuffer *buf1 = new TBuffer(TBuffer::kRead); 00055 TBuffer *buf2 = new TBuffer(TBuffer::kRead); 00056 00057 buf1->SetBuffer((*records)["TH1F_Col"],51200000,kFALSE); 00058 buf2->SetBuffer((*records)["bin"],512000,kFALSE); 00059 00060 std::cout<<" CalVerSft is "<<(*records)["CalParVer"]; 00061 std::cout<<" File name is "<<(*records)["FileName"]<<std::endl; 00062 00063 00064 TClass *myclass=gROOT->GetClass("TTree"); 00065 TTree *tree =(TTree*)buf1->ReadObject(myclass); 00066 00067 TTree* bin = new TTree(); 00068 bin->Streamer(*buf2); 00069 00070 TH1F *h1=new TH1F(); 00071 00072 std::vector<TH1F> hist; 00073 std::vector<double> hRange; 00074 // Read in the object 00075 int cnt; 00076 tree -> SetBranchAddress("TH1F_Col", &h1); 00077 int entries=tree->GetEntries(); 00078 for(cnt=0; cnt<entries; cnt++){ 00079 tree -> GetEntry(cnt); 00080 gROOT->cd(); 00081 TH1F *h2=new TH1F(); 00082 h2=(TH1F*)h1->Clone(); 00083 hist.push_back(*h2); 00084 } 00085 double betagamma[5000]; 00086 int totalNum; 00087 int bgNum; 00088 bin-> SetBranchAddress("totalNum", &totalNum); 00089 bin-> SetBranchAddress("betagamma", betagamma); 00090 bin-> SetBranchAddress("betagammaBounds", &bgNum); 00091 bin->GetEntry(0); 00092 //int tot=totalNum*2; 00093 for(cnt=0; cnt<bgNum; cnt++){ 00094 hRange.push_back(betagamma[cnt]); 00095 } 00096 tmpObject->setRangeNo(bgNum); 00097 tmpObject->setRange(&hRange); 00098 tmpObject->setHistNo(totalNum); 00099 tmpObject->setHist(&hist); 00100 refpObject=tmpObject; 00101 00102 delete tree; 00103 delete bin; 00104 00105 return StatusCode::SUCCESS; 00106 00107 00108 }
|
|
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_Dedx_Sim;
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;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|