#include <RootEstTofCalibDataCnv.h>
Inheritance diagram for RootEstTofCalibDataCnv:
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 () |
ICalibRootSvc * | getCalibRootSvc () |
virtual StatusCode | initialize () |
const CLID & | objType () const |
destination * | operator (const source &) const |
destination * | operator (const source &) const |
virtual StatusCode | readRootObj (TTree *tree, const std::string &branch, TObject *&pCalib, unsigned index=0) |
virtual StatusCode | readRootObj (const std::string &treename, const std::string &branch, TObject *&pCalib, unsigned index=0) |
virtual long | repSvcType () const |
RootEstTofCalibDataCnv (ISvcLocator *svc) | |
virtual | ~RootEstTofCalibDataCnv () |
Static Public Member Functions | |
const CLID & | classID () |
const unsigned char | storageType () |
Protected Member Functions | |
StatusCode | closeRead () |
StatusCode | closeWrite () |
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 (const std::string &fname, 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 (const std::string &fname, DataObject *&refpObject, IOpaqueAddress *address) |
StatusCode | openRead (const std::string &fname) |
virtual StatusCode | openWrite (const std::string &fname) |
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 |
ICalibRootSvc * | m_rootSvc |
int | m_runfrm |
int | m_runto |
TDirectory * | m_saveDir |
int | m_serNo |
TTree * | m_ttree |
ITime * | m_vend |
ITime * | m_vstart |
Friends | |
class | CnvFactory<RootEstTofCalibDataCnv> |
|
|
|
|
|
|
|
|
|
00039 : 00040 RootCalBaseCnv(svc, CLID_Calib_EstTofCal) { 00041 }
|
|
00029 {};
|
|
00048 {
00049 return CLID_Calib_EstTofCal;
00050 }
|
|
Clean up when we've finished reading in 00132 { 00133 m_inFile->Close(); 00134 00135 delete m_inFile; 00136 m_inFile = 0; 00137 00138 if (m_saveDir) { 00139 m_saveDir->cd(); 00140 m_saveDir = 0; 00141 } 00142 return StatusCode::SUCCESS; 00143 }
|
|
Finish up writing file opened with openWrite: fill the tree write the file close the file Delete TFile (causes associated Tree to be deleted) 00179 { 00180 00181 MsgStream log(msgSvc(), "RootCalBaseCnv"); 00182 00183 StatusCode ret = StatusCode::SUCCESS; 00184 00185 m_outFile->cd(); 00186 m_outFile->Close(); 00187 delete m_outFile; 00188 m_outFile = 0; 00189 if (m_saveDir) m_saveDir->cd(); 00190 m_saveDir = 0; 00191 return ret; 00192 }
|
|
|
|
|
|
Create the transient representation of an object, given an opaque address. This and the following update method comprise the core functionality of calibration converters. 00250 { 00251 // StatusCode ret; 00252 00253 // first do the things we always need: 00254 // First string parameter of opaque address is file ident 00255 MsgStream log(msgSvc(), "RootCalBaseCnv"); 00256 log << MSG::DEBUG<<"RootCalBaseCnv::createObj( starting ...."<<endreq; 00257 const std::string* par = addr->par(); 00258 00259 std::string par0 = par[0]; 00260 00261 return internalCreateObj(par0, refpObject, addr); 00262 00263 }
|
|
Create ROOT file corresponding to TDS object input. Default implementation is to return an error. Must be separately implemented for each calibration type.
Reimplemented from RootCalBaseCnv. 00151 { 00152 MsgStream log(msgSvc(), "RootEstTofCalibDataCnv"); 00153 00154 // Open the file, create the branch 00155 StatusCode sc = openWrite(fname); 00156 if(!sc) 00157 { log<<MSG::ERROR<<"unable to open files"<<endreq; 00158 } 00159 // write the Data in the TCDS to RootFile 00160 CalibData::TofCalibData* btof = dynamic_cast<CalibData::TofCalibData*>(pTDSObj); 00161 00162 // write btoftree---------------------------------------------------------------- 00163 double cnvBarPar1[nBarPar]; 00164 double cnvBarPar2[nBarPar]; 00165 00166 char brname[8], ibrname[8]; 00167 TTree *btoftree = new TTree("BarTofPar", "BarTofPar"); 00168 for( unsigned int i=0; i<nBarPar; i++ ) { 00169 sprintf( brname, "P%i", i ); 00170 sprintf( ibrname, "P%i/D", i ); 00171 btoftree -> Branch( brname, &cnvBarPar1[i], ibrname ); 00172 } 00173 00174 for( int i=0; i<176; i++ ) { 00175 for( int j=0;j<static_cast<int>(nBarPar);j++){ 00176 cnvBarPar1[j] = btof->getBTofPleft(i,j); 00177 cnvBarPar2[j] = btof->getBTofPright(i,j); 00178 } 00179 btoftree -> Fill(); 00180 } 00181 00182 //write etoftree---------------------------------------------------------------- 00183 double cnvEndPar[nEndPar]; 00184 00185 char ecname[8], iecname[8]; 00186 TTree *etoftree = new TTree("EndTofPar", "EndTofPar"); 00187 for( unsigned int i=0; i<nEndPar; i++ ) { 00188 sprintf( ecname, "P%i", i ); 00189 sprintf( iecname, "P%i/D", i ); 00190 etoftree -> Branch( ecname, &cnvEndPar[i], iecname ); 00191 } 00192 00193 for(int i=0; i<96; i++){ 00194 for(int j=0;j<static_cast<int>(nEndPar);j++){ 00195 cnvEndPar[j] = btof->getETofP(i,j); 00196 } 00197 etoftree->Fill(); 00198 } 00199 00200 // write all the trees 00201 btoftree -> Write(); 00202 etoftree -> Write(); 00203 delete btoftree; 00204 delete etoftree; 00205 closeWrite(); 00206 log<<MSG::INFO<<"successfully create RootFile"<<endreq; 00207 00208 return sc; 00209 }
|
|
Given a pointer to a TDS object which can be cast to "our" type, fill in corresponding information in the corresponding root class
00239 { 00240 00241 // Get instrument name from InstrumentName service Now handled by 00242 // RootCalBaseCnv 00243 // TString instr = TString((m_instrSvc->getInstrumentName()).c_str()); 00244 // pRootObj->setInstrument(instr); 00245 return StatusCode::SUCCESS; 00246 }
|
|
00079 {
00080 return Converter::finalize();
00081 }
|
|
00058 {
00059 return m_rootSvc;
00060 }
|
|
Read in object from specified branch. Don't need tree name; it's always Calib Reimplemented from RootCalBaseCnv. 00053 { 00054 00055 MsgStream log(msgSvc(), "RootEstTofCalibDataCnv"); 00056 log<<MSG::DEBUG<<"SetProperty"<<endreq; 00057 00058 // open the file 00059 StatusCode sc = openRead(fname); 00060 if(!sc) 00061 { log<<MSG::ERROR<<"unable to open files"<<endreq; 00062 } 00063 00064 CalibData::bTofCalibBase bTof; 00065 CalibData::eTofCalibBase eTof; 00066 CalibData::bTofCommonCalibBase bTofCommon; 00067 CalibData::tofCalibInfoBase tofinfo; 00068 00069 std::vector<CalibData::bTofCalibBase> tmpbTof; 00070 std::vector<CalibData::eTofCalibBase> tmpeTof; 00071 std::vector<CalibData::bTofCommonCalibBase> tmpbTofCommon; 00072 std::vector<CalibData::tofCalibInfoBase> tofinfoCol; 00073 00074 // Read in the object 00075 int cnt; 00076 // read btoftree ------------------------------------------------------------ 00077 double cnvBarPar1[nBarPar]; 00078 double cnvBarPar2[nBarPar]; 00079 double cnvBarParOff1[nBarParOff]; 00080 double cnvBarParOff2[nBarParOff]; 00081 00082 TTree *btoftree = (TTree*)m_inFile -> Get("BarTofPar"); 00083 00084 char brname[10]; 00085 for( unsigned int i=0; i<nBarPar; i++ ) { 00086 sprintf( brname, "P%i", i ); 00087 btoftree -> SetBranchAddress( brname, &cnvBarPar1[i] ); 00088 } 00089 for( unsigned int i=0; i<nBarPar; i++ ) { 00090 sprintf( brname, "P%i", i+nBarPar ); 00091 btoftree -> SetBranchAddress( brname, &cnvBarPar2[i] ); 00092 } 00093 for( unsigned int i=0; i<nBarParOff; i++ ) { 00094 sprintf( brname, "Poff%i", i ); 00095 btoftree -> SetBranchAddress( brname, &cnvBarParOff1[i] ); 00096 } 00097 for( unsigned int i=0; i<nBarParOff; i++ ) { 00098 sprintf( brname, "Poff%i", i+nBarParOff ); 00099 btoftree -> SetBranchAddress( brname, &cnvBarParOff2[i] ); 00100 } 00101 00102 for(cnt=0; cnt<176; cnt++){ 00103 btoftree -> GetEntry(cnt); 00104 bTof.setP1( cnvBarPar1 ); 00105 bTof.setP2( cnvBarPar2 ); 00106 bTof.setPoff1( cnvBarParOff1 ); 00107 bTof.setPoff2( cnvBarParOff2 ); 00108 tmpbTof.push_back( bTof ); 00109 } 00110 00111 //read etoftree 00112 double cnvEndPar[nEndPar]; 00113 00114 TTree *etoftree = (TTree*)m_inFile -> Get("EndTofPar"); 00115 00116 char ecname[10]; 00117 for( unsigned int i=0; i<nEndPar; i++ ) { 00118 sprintf( ecname, "P%i", i ); 00119 etoftree -> SetBranchAddress( ecname, &cnvEndPar[i] ); 00120 } 00121 00122 for(cnt=0; cnt<96; cnt++){ 00123 etoftree->GetEntry(cnt); 00124 eTof.setP( cnvEndPar ); 00125 tmpeTof.push_back(eTof); 00126 } 00127 00128 //read bTofCommonCalibBase 00129 double cnvBarOffset[nBarOffset]; 00130 TTree *btofcommontree = (TTree*)m_inFile -> Get("BarTofParCommon"); 00131 for( unsigned int i=0; i<nBarOffset; i++ ) { 00132 sprintf( brname, "t0offset%i", i ); 00133 btofcommontree-> SetBranchAddress( brname, &cnvBarOffset[i]); 00134 } 00135 00136 int entries = btofcommontree->GetEntries(); 00137 for(cnt=0;cnt<entries;cnt++){ 00138 btofcommontree->GetEntry(cnt); 00139 bTofCommon.setOffset( cnvBarOffset ); 00140 tmpbTofCommon.push_back(bTofCommon); 00141 } 00142 00143 CalibData::TofCalibData *tmpObject = new CalibData::TofCalibData(&tmpbTof,&tmpbTofCommon,&tmpeTof,&tofinfoCol); 00144 00145 refpObject=tmpObject; 00146 00147 return StatusCode::SUCCESS; 00148 }
|
|
In case there is additional work to do on the created object.
00320 {
00321 return StatusCode::SUCCESS;
00322 }
|
|
00046 { 00047 StatusCode status = Converter::initialize(); 00048 00049 IDataProviderSvc* dp; 00050 00051 // I guess the service names are assigned in jobOptions? 00052 00053 serviceLocator()->getService ("CalibDataSvc", 00054 IID_IDataProviderSvc, 00055 (IInterface*&)dp); 00056 setDataProvider(dp); 00057 00058 // Locate the Root Conversion Service 00059 serviceLocator()->getService ("CalibRootCnvSvc", 00060 IID_ICalibRootSvc, 00061 (IInterface*&) m_rootSvc); 00062 00063 // Locate meta conversion service 00064 // Will anything need to be changed here to accommodate possibility 00065 // of two concrete implementations of ICalibMetaCnvSvc? Would 00066 // have different storage types. Could specify type desired 00067 // as job option. Ditto for name of class? 00068 serviceLocator()->getService("CalibMySQLCnvSvc", 00069 IID_ICalibMetaCnvSvc, 00070 (IInterface*&)m_metaSvc); 00071 00072 serviceLocator()->getService ("CalibDataSvc", 00073 IID_IInstrumentName, 00074 (IInterface*&)m_instrSvc); 00075 00076 return status; 00077 }
|
|
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.
00267 { 00268 MsgStream log(msgSvc(), "RootCalBaseCnv"); 00269 log << MSG::DEBUG<<"RootCalBaseCnv::internalCreateObj( starting ..... "<<endreq; 00270 RootCalBaseCnv* converter = this; 00271 CLID classId = address->clID(); 00272 00273 IConverter* conv = this->conversionSvc()->converter(classId); 00274 if (0 == conv) { 00275 log << MSG::WARNING 00276 << "No proper converter found for classID " << classId 00277 << ", the default converter" 00278 << " will be used. " << endreq; 00279 } else { 00280 converter = dynamic_cast <RootCalBaseCnv*> (conv); 00281 if (0 == converter) { 00282 log << MSG::ERROR 00283 << "The converter found for classID " << classId 00284 << " was not a descendent of RootCalBaseCnv as it should be " 00285 << "( was of type " << typeid (*converter).name() << "). " 00286 << "The default converter will be used" << endreq; 00287 converter = this; 00288 } 00289 } 00290 00291 m_runfrm =*( address->ipar()); 00292 m_runto =*( address->ipar()+1); 00293 // creates an object for the node found 00294 StatusCode sc = converter->i_createObj(fname, refpObject); 00295 if (sc.isFailure()) { 00296 return sc; 00297 } 00298 CalibData::CalibBase1* tmpObject = dynamic_cast <CalibData::CalibBase1*> (refpObject); 00299 setBaseInfo(tmpObject); 00300 // ends up the object construction 00301 sc = converter->i_processObj(refpObject, address); 00302 if (sc.isSuccess()) { 00303 log << MSG::DEBUG << "Successfully created calib. object " << endreq; 00304 } 00305 closeRead(); 00306 return sc; 00307 }
|
|
00044 {
00045 return CLID_Calib_EstTofCal;
00046 }
|
|
Utility for "leaf" converters to call
00095 { 00096 00097 MsgStream log(msgSvc(), "RootCalBaseCnv"); 00098 00099 // Check fname isn't empty 00100 if (fname == std::string("")) return StatusCode::FAILURE; 00101 00102 if (doClean() ) { 00103 log << MSG::WARNING << "Previous operation didn't clean up! " << endreq; 00104 } 00105 m_saveDir = gDirectory; 00106 00107 std::string ourName(fname); 00108 facilities::Util::expandEnvVar(&ourName); 00109 00110 m_inFile = new TFile(ourName.c_str()); 00111 00112 if (!m_inFile->IsOpen() ) { 00113 log << MSG::ERROR << "ROOT file " << ourName 00114 << "could not be opened for reading " << endreq; 00115 delete m_inFile; 00116 m_inFile = 0; 00117 return StatusCode::FAILURE; 00118 } 00119 else { 00120 log << MSG::INFO 00121 << "Successfully opened ROOT file " << fname << " aka " << ourName 00122 << " for reading " << endreq; 00123 } 00124 00125 00126 m_inFile->cd(); // Maybe will need this 00127 00128 00129 return StatusCode::SUCCESS; 00130 }
|
|
Utility used by derived converters to start writing a ROOT file (open TFile, make a TTree, give it a branch)
00145 { 00146 00147 MsgStream log(msgSvc(), "RootCalBaseCnv"); 00148 00149 // Check fname isn't empty 00150 if (fname == std::string("")) return StatusCode::FAILURE; 00151 00152 std::string ourName(fname); 00153 facilities::Util::expandEnvVar(&ourName); 00154 00155 if (doClean() ) { 00156 log << MSG::WARNING << "Previous operation didn't clean up! " << endreq; 00157 } 00158 00159 m_saveDir = gDirectory; 00160 00161 00162 m_outFile = new TFile(ourName.c_str(), "RECREATE"); 00163 if (!m_outFile->IsOpen()) { 00164 log << MSG::ERROR << "ROOT file " << fname << " aka " << ourName 00165 << " could not be opened for writing" << endreq; 00166 delete m_outFile; 00167 m_outFile = 0; 00168 return StatusCode::FAILURE; 00169 } 00170 else { 00171 log << MSG::INFO 00172 << "Successfully opened ROOT file " << fname << " aka " << ourName 00173 << " for writing " << endreq; 00174 } 00175 m_outFile->cd(); 00176 return StatusCode::SUCCESS; 00177 }
|
|
|
|
|
|
00205 { 00206 TBranch* pBranch=pTree->GetBranch(branch.c_str()); 00207 pBranch->SetAddress(&pObj); 00208 int nBytes = pBranch->GetEntry(ix); 00209 return (nBytes > 0) ? StatusCode::SUCCESS : StatusCode::FAILURE; 00210 }
|
|
Read in object (by default the first) from specified branch. 00197 { 00198 TTree* pTree = (TTree*)m_inFile->Get(treename.c_str()); 00199 00200 return readRootObj(pTree, branch, pObj, ix); 00201 }
|
|
00034 {
00035 return CALIBROOT_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. 00325 { 00326 MsgStream log(msgSvc(), "RootCalBaseCnv"); 00327 log << MSG::DEBUG<<"set the runfrm and runto Numbers in the converter"<<endreq; 00328 pObj->setrunfrm(m_runfrm); 00329 pObj->setrunto(m_runto); 00330 }
|
|
00062 {return CALIBROOT_StorageType;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|