00001
00002 #include "GaudiKernel/MsgStream.h"
00003 #include "RootDedxCalibDataCnv.h"
00004 #include "CalibData/Dedx/DedxCalibData.h"
00005 #include "CalibDataSvc/IInstrumentName.h"
00006
00007 #include "TFile.h"
00008 #include "TTree.h"
00009 #include "TDirectory.h"
00010 #include "TObject.h"
00011 #include <iostream>
00012 #include <fstream>
00013 #include <string>
00014
00015 #include "GaudiKernel/CnvFactory.h"
00016 #include "GaudiKernel/IOpaqueAddress.h"
00017 #include "GaudiKernel/DataObject.h"
00018 #include "GaudiKernel/IAddressCreator.h"
00019 #include "GaudiKernel/IDataProviderSvc.h"
00020 #include "GaudiKernel/IConversionSvc.h"
00021 #include "GaudiKernel/GenericAddress.h"
00022
00023 #include "CalibDataSvc/ICalibRootSvc.h"
00024 #include "CalibDataSvc/ICalibMetaCnvSvc.h"
00025 #include "CalibData/CalibBase1.h"
00026
00027
00028 #include "CalibData/CalibModel.h"
00029 using namespace CalibData;
00030
00031
00032
00033
00034
00035 RootDedxCalibDataCnv::RootDedxCalibDataCnv( ISvcLocator* svc) :
00036 RootCalBaseCnv(svc, CLID_Calib_DedxCal) {
00037 }
00038
00039
00040 const CLID& RootDedxCalibDataCnv::objType() const {
00041 return CLID_Calib_DedxCal;
00042 }
00043
00044 const CLID& RootDedxCalibDataCnv::classID() {
00045 return CLID_Calib_DedxCal;
00046 }
00047
00048 StatusCode RootDedxCalibDataCnv::i_createObj(const std::string& fname,
00049 DataObject*& refpObject) {
00050
00051 MsgStream log(msgSvc(), "RootDedxCalibDataCnv");
00052 log<<MSG::DEBUG<<"SetProperty"<<endreq;
00053 StatusCode sc = openRead(fname);
00054 if(!sc)
00055 { log<<MSG::ERROR<<"unable to open files"<<endreq;
00056 }
00057
00058 CalibData::DedxCalibData *tmpObject = new CalibData::DedxCalibData;
00059
00060 int i;
00061
00062 double rungain;
00063 double runmean;
00064 int runno;
00065 double runresol;
00066 TTree *rungtree = (TTree*)m_inFile -> Get("runcalib");
00067 rungtree -> SetBranchAddress("rungain", &rungain);
00068 rungtree -> SetBranchAddress("runmean", &runmean);
00069 rungtree -> SetBranchAddress("runno", &runno);
00070 rungtree -> SetBranchAddress("runresol", &runresol);
00071 int N = rungtree -> GetEntries();
00072 tmpObject -> setrunNO(N);
00073
00074 for(i=0; i<N; i++){
00075 rungtree -> GetEntry(i);
00076
00077 tmpObject -> setrung(rungain,0,i);
00078 tmpObject -> setrung(runmean,1,i);
00079 tmpObject -> setrung(runno,2,i);
00080 tmpObject -> setrung(runresol,3,i);
00081 }
00082
00083
00084
00085
00086 double ddg0[43];
00087 double ddg1[43];
00088 double ddg2[43];
00089 double ddg3[43];
00090 double id_doca[1600];
00091 double iner_chi[1600];
00092 double iner_gain[1600];
00093 double iner_hits[1600];
00094 double ip_eangle[1600];
00095 double out_chi[1600];
00096 double out_gain[1600];
00097 double out_hits[1600];
00098
00099 TTree *ddgtree = (TTree*)m_inFile -> Get("ddgcalib");
00100 ddgtree -> SetBranchAddress("ddg0", ddg0);
00101 ddgtree -> SetBranchAddress("ddg1", ddg1);
00102 ddgtree -> SetBranchAddress("ddg2", ddg2);
00103 ddgtree -> SetBranchAddress("ddg3", ddg3);
00104 TBranch *bbb = ddgtree->FindBranch("Id_doca");
00105 if(bbb){
00106 ddgtree -> SetBranchAddress("Id_doca", id_doca);
00107 ddgtree -> SetBranchAddress("Iner_chi", iner_chi);
00108 ddgtree -> SetBranchAddress("Iner_gain", iner_gain);
00109 ddgtree -> SetBranchAddress("Iner_hits", iner_hits);
00110 ddgtree -> SetBranchAddress("Ip_eangle", ip_eangle);
00111 ddgtree -> SetBranchAddress("Out_chi", out_chi);
00112 ddgtree -> SetBranchAddress("Out_gain", out_gain);
00113 ddgtree -> SetBranchAddress("Out_hits", out_hits);
00114 }
00115 ddgtree -> GetEntry(0);
00116 for(i=0; i<43; i++){
00117 tmpObject -> setddg(ddg0[i],0,i);
00118 tmpObject -> setddg(ddg1[i],1,i);
00119 tmpObject -> setddg(ddg2[i],2,i);
00120 tmpObject -> setddg(ddg3[i],3,i);
00121 }
00122
00123 for(i=0; i<1600; i++){
00124 if(!bbb){
00125 id_doca[i]=0;
00126 iner_chi[i]=0;
00127 iner_gain[i]=0;
00128 iner_hits[i]=0;
00129 ip_eangle[i]=0;
00130 out_chi[i]=0;
00131 out_gain[i]=0;
00132 out_hits[i]=0;
00133 }
00134 tmpObject -> set_id_doca(id_doca[i],i);
00135 tmpObject -> set_iner_chi(iner_chi[i],i);
00136 tmpObject -> set_iner_gain(iner_gain[i],i);
00137 tmpObject -> set_iner_hits(iner_hits[i],i);
00138 tmpObject -> set_ip_eangle(ip_eangle[i],i);
00139 tmpObject -> set_out_chi(out_chi[i],i);
00140 tmpObject -> set_out_gain(out_gain[i],i);
00141 tmpObject -> set_out_hits(out_hits[i],i);
00142 }
00143
00144
00145 double entra0[43];
00146 double entra1[43];
00147 double entra2[43];
00148 double entra3[43];
00149 double engle[100];
00150 int engle_no;
00151 TTree *entratree = (TTree*)m_inFile -> Get("entracalib");
00152 entratree -> SetBranchAddress("entra0", entra0);
00153 entratree -> SetBranchAddress("entra1", entra1);
00154 entratree -> SetBranchAddress("entra2", entra2);
00155 entratree -> SetBranchAddress("entra3", entra3);
00156 entratree -> SetBranchAddress("1denangle", engle);
00157 entratree -> SetBranchAddress("1denangle_entry", &engle_no);
00158 entratree -> GetEntry(0);
00159 for(i=0; i<43; i++){
00160 tmpObject -> setenta(entra0[i],0,i);
00161 tmpObject -> setenta(entra1[i],1,i);
00162 tmpObject -> setenta(entra2[i],2,i);
00163 tmpObject -> setenta(entra3[i],3,i);
00164 }
00165 tmpObject -> set_enanglesize(engle_no);
00166 for(i=0; i<engle_no; i++){
00167 tmpObject -> set_enangle(engle[i],i);
00168 }
00169
00170
00171
00172
00173 double ggs0[43];
00174 double ggs1[43];
00175 double ggs2[43];
00176 double ggs3[43];
00177 double gcostheta[80];
00178 int hadron_entry;
00179 double hadron[20];
00180 TTree *ggstree = (TTree*)m_inFile -> Get("ggscalib");
00181 ggstree -> SetBranchAddress("ggs0", ggs0);
00182 ggstree -> SetBranchAddress("ggs1", ggs1);
00183 ggstree -> SetBranchAddress("ggs2", ggs2);
00184 ggstree -> SetBranchAddress("ggs3", ggs3);
00185 ggstree -> SetBranchAddress("hadron", hadron);
00186 ggstree -> SetBranchAddress("hadronNo", &hadron_entry);
00187 if(bbb){
00188 ggstree -> SetBranchAddress("costheta", gcostheta);
00189 }
00190 ggstree -> GetEntry(0);
00191 for(i=0; i<43;i++){
00192 tmpObject -> setggs(ggs0[i],0,i);
00193 tmpObject -> setggs(ggs1[i],1,i);
00194 tmpObject -> setggs(ggs2[i],2,i);
00195 tmpObject -> setggs(ggs3[i],3,i);
00196 }
00197
00198 for(i=0; i<80;i++){
00199 if(!bbb) gcostheta[i]=0;
00200 tmpObject ->set_costheta(gcostheta[i],i);
00201 }
00202
00203 if(hadron_entry>20){
00204 log<<MSG::FATAL<<"hadron entry is larger than 20, larger than designed"<<endreq;
00205 return StatusCode::FAILURE;
00206 }
00207
00208 tmpObject->set_hadronNo(hadron_entry);
00209
00210 for(i=0;i<hadron_entry;i++){
00211 tmpObject->set_hadron(hadron[i],i);
00212 }
00213
00214
00215
00216 double zdep0[43];
00217 double zdep1[43];
00218 double zdep2[43];
00219 double zdep3[43];
00220 TTree *zdeptree = (TTree*)m_inFile -> Get("zdepcalib");
00221 zdeptree -> SetBranchAddress("zdep0", zdep0);
00222 zdeptree -> SetBranchAddress("zdep1", zdep1);
00223 zdeptree -> SetBranchAddress("zdep2", zdep2);
00224 zdeptree -> SetBranchAddress("zdep3", zdep3);
00225 zdeptree -> GetEntry(0);
00226
00227 for(i=0; i<43;i++){
00228 tmpObject -> setzdep(zdep0[i],0,i);
00229 tmpObject -> setzdep(zdep1[i],1,i);
00230 tmpObject -> setzdep(zdep2[i],2,i);
00231 tmpObject -> setzdep(zdep3[i],3,i);
00232 }
00233
00234
00235 double gain;
00236 double gt0[35],gdedx[35];
00237 TTree *gaintree = (TTree*)m_inFile -> Get("gaincalib");
00238 gaintree -> SetBranchAddress("gain", &gain);
00239 if(bbb){
00240 gaintree -> SetBranchAddress("t0", gt0);
00241 gaintree -> SetBranchAddress("dedx", gdedx);
00242 }
00243 gaintree -> GetEntry(0);
00244 tmpObject -> setgain(gain);
00245 for(i=0; i<35;i++){
00246 if(!bbb){
00247 gt0[i]=0;
00248 gdedx[i]=0;
00249 }
00250 tmpObject->set_t0(gt0[i],i);
00251 tmpObject->set_dedx(gdedx[i],i);
00252 }
00253
00254
00255 double resol;
00256 TTree *resoltree = (TTree*)m_inFile -> Get("resolcalib");
00257 resoltree -> SetBranchAddress("resol", &resol);
00258 resoltree -> GetEntry(0);
00259 tmpObject -> setresol(resol);
00260
00261
00262 double wireg[6796];
00263 TTree *wiregtree = (TTree*)m_inFile -> Get("wiregcalib");
00264 wiregtree -> SetBranchAddress("wireg",wireg);
00265 wiregtree -> GetEntry(0);
00266 for(i=0;i<6796;i++){
00267 tmpObject -> setwireg(wireg[i],i);
00268 }
00269
00270
00271 double layerg[43];
00272 TTree *layergtree = (TTree*)m_inFile -> Get("layergcalib");
00273 layergtree -> SetBranchAddress("layerg",layerg);
00274 layergtree -> GetEntry(0);
00275
00276 for(i=0;i<43;i++){
00277 tmpObject -> setlayerg(layerg[i],i);
00278 }
00279
00280 refpObject=tmpObject;
00281
00282
00283
00284
00285
00286
00287 return StatusCode::SUCCESS;
00288 }
00289
00290 StatusCode RootDedxCalibDataCnv::createRoot(const std::string& fname,
00291 CalibData::CalibBase1* pTDSObj) {
00292
00293 MsgStream log(msgSvc(), "RootDedxCalibDataCnv");
00294
00295
00296 StatusCode sc = openWrite(fname);
00297 if(!sc)
00298 { log<<MSG::ERROR<<"unable to open files"<<endreq;
00299 }
00300
00301 int i;
00302 CalibData::DedxCalibData* tmpObject = dynamic_cast<CalibData::DedxCalibData*>(pTDSObj);
00303
00304 double rungain;
00305 double runmean;
00306 double runno;
00307 double runresol;
00308 TTree *rungcalibtree = new TTree("rungcalib", "rungCalib");
00309 rungcalibtree -> Branch("rungain", &rungain, "S/D");
00310 rungcalibtree -> Branch("runmean", &runmean, "S/D");
00311 rungcalibtree -> Branch("runno", &runno, "S/D");
00312 rungcalibtree -> Branch("runresol", &runresol, "S/D");
00313 int N = tmpObject->getrunNO();
00314 for(i=0; i<N; i++){
00315 rungain = tmpObject->getrung(0,i);
00316 runmean = tmpObject->getrung(1,i);
00317 runno = tmpObject->getrung(2,i);
00318 runresol = tmpObject->getrung(3,i);
00319 rungcalibtree -> Fill();
00320 }
00321
00322
00323
00324
00325 double ddg0;
00326 double ddg1;
00327 double ddg2;
00328 double ddg3;
00329 TTree *ddgcalibtree = new TTree("ddgcalib", "ddgCalib");
00330 ddgcalibtree -> Branch("ddg0", &ddg0, "S/D");
00331 ddgcalibtree -> Branch("ddg1", &ddg1, "S/D");
00332 ddgcalibtree -> Branch("ddg2", &ddg2, "S/D");
00333 ddgcalibtree -> Branch("ddg3", &ddg3, "S/D");
00334 for(i=0; i<43; i++){
00335 ddg0 = tmpObject->getddg(0,i);
00336 ddg1 = tmpObject->getddg(1,i);
00337 ddg2 = tmpObject->getddg(2,i);
00338 ddg3 = tmpObject->getddg(3,i);
00339 ddgcalibtree -> Fill();
00340 }
00341
00342
00343 double ggs0;
00344 double ggs1;
00345 double ggs2;
00346 double ggs3;
00347 TTree *ggscalibtree = new TTree("ggscalib", "ggsCalib");
00348 ggscalibtree -> Branch("ggs0", &ggs0, "S/D");
00349 ggscalibtree -> Branch("ggs1", &ggs1, "S/D");
00350 ggscalibtree -> Branch("ggs2", &ggs2, "S/D");
00351 ggscalibtree -> Branch("ggs3", &ggs3, "S/D");
00352 for(i=0; i<43; i++){
00353 ggs0 = tmpObject->getggs(0,i);
00354 ggs1 = tmpObject->getggs(1,i);
00355 ggs2 = tmpObject->getggs(2,i);
00356 ggs3 = tmpObject->getggs(3,i);
00357 ggscalibtree -> Fill();
00358 }
00359
00360
00361 double zdep0;
00362 double zdep1;
00363 double zdep2;
00364 double zdep3;
00365 TTree *zdepcalibtree = new TTree("zdepcalib", "zdepCalib");
00366 zdepcalibtree -> Branch("zdep0", &zdep0, "S/D");
00367 zdepcalibtree -> Branch("zdep1", &zdep1, "S/D");
00368 zdepcalibtree -> Branch("zdep2", &zdep2, "S/D");
00369 zdepcalibtree -> Branch("zdep3", &zdep3, "S/D");
00370 for(i=0; i<43; i++){
00371 zdep0 = tmpObject->getzdep(0,i);
00372 zdep1 = tmpObject->getzdep(1,i);
00373 zdep2 = tmpObject->getzdep(2,i);
00374 zdep3 = tmpObject->getzdep(3,i);
00375 zdepcalibtree -> Fill();
00376 }
00377
00378
00379 double enta0;
00380 double enta1;
00381 double enta2;
00382 double enta3;
00383 TTree *entacalibtree = new TTree("entacalib", "entaCalib");
00384 entacalibtree -> Branch("enta0", &enta0, "S/D");
00385 entacalibtree -> Branch("enta1", &enta1, "S/D");
00386 entacalibtree -> Branch("enta2", &enta2, "S/D");
00387 entacalibtree -> Branch("enta3", &enta3, "S/D");
00388 for(i=0; i<43; i++){
00389 enta0 = tmpObject->getenta(0,i);
00390 enta1 = tmpObject->getenta(1,i);
00391 enta2 = tmpObject->getenta(2,i);
00392 enta3 = tmpObject->getenta(3,i);
00393 entacalibtree -> Fill();
00394 }
00395
00396
00397
00398
00399 double gain;
00400 TTree *gaintree = new TTree("gaincalib", "gainCalib");
00401 gaintree -> Branch("gain", &gain, "S/D");
00402 gain = tmpObject->getgain();
00403 gaintree -> Fill();
00404
00405
00406 double resol;
00407 TTree *resoltree = new TTree("resolcalib", "resolCalib");
00408 resoltree -> Branch("resol", &resol, "S/D");
00409 resol = tmpObject->getresol();
00410 resoltree -> Fill();
00411
00412
00413
00414 double wireg;
00415 TTree *wiregcalibtree = new TTree("wiregcalib", "wiregCalib");
00416 wiregcalibtree -> Branch("wireg", &wireg, "S/D");
00417 for(i=0; i<6796; i++){
00418 wireg = tmpObject->getwireg(i);
00419 wiregcalibtree -> Fill();
00420 }
00421
00422
00423 double layerg;
00424 TTree *layergcalibtree = new TTree("layergcalib", "layergCalib");
00425 layergcalibtree -> Branch("layerg", &layerg, "S/D");
00426 for(i=0; i<43; i++){
00427 layerg = tmpObject->getlayerg(i);
00428 layergcalibtree -> Fill();
00429 }
00430
00431
00432 rungcalibtree -> Write();
00433 ddgcalibtree -> Write();
00434 ggscalibtree -> Write();
00435 zdepcalibtree -> Write();
00436 entacalibtree -> Write();
00437 gaintree -> Write();
00438 resoltree -> Write();
00439 wiregcalibtree -> Write();
00440 layergcalibtree -> Write();
00441
00442 delete rungcalibtree;
00443 delete ddgcalibtree;
00444 delete ggscalibtree;
00445 delete zdepcalibtree;
00446 delete entacalibtree;
00447 delete gaintree;
00448 delete resoltree;
00449 delete wiregcalibtree;
00450 delete layergcalibtree;
00451 closeWrite();
00452 log<<MSG::INFO<<"successfully create RootFile"<<endreq;
00453 return sc;
00454
00455 }