00001 #include "GaudiKernel/MsgStream.h"
00002 #include "TreeDedxCalibDataCnv.h"
00003 #include "CalibData/Dedx/DedxCalibData.h"
00004 #include "CalibDataSvc/IInstrumentName.h"
00005 #include "CalibMySQLCnv/TreeAddress.h"
00006 #include "TFile.h"
00007 #include "TTree.h"
00008 #include "TDirectory.h"
00009 #include "TObject.h"
00010 #include "TBuffer.h"
00011 #include "TBufferFile.h"
00012
00013 #include "GaudiKernel/CnvFactory.h"
00014 #include "GaudiKernel/IOpaqueAddress.h"
00015 #include "GaudiKernel/DataObject.h"
00016 #include "GaudiKernel/IAddressCreator.h"
00017 #include "GaudiKernel/IDataProviderSvc.h"
00018 #include "GaudiKernel/IConversionSvc.h"
00019 #include "GaudiKernel/GenericAddress.h"
00020
00021 #include "CalibDataSvc/ICalibTreeSvc.h"
00022 #include "CalibDataSvc/ICalibMetaCnvSvc.h"
00023
00024
00025 #include "CalibData/CalibModel.h"
00026 using namespace CalibData;
00027
00028
00029
00030
00031
00032 TreeDedxCalibDataCnv::TreeDedxCalibDataCnv( ISvcLocator* svc) :
00033 TreeCalBaseCnv(svc, CLID_Calib_DedxCal) {
00034
00035 }
00036
00037
00038 const CLID& TreeDedxCalibDataCnv::objType() const {
00039 return CLID_Calib_DedxCal;
00040 }
00041
00042 const CLID& TreeDedxCalibDataCnv::classID() {
00043 return CLID_Calib_DedxCal;
00044 }
00045
00046 StatusCode TreeDedxCalibDataCnv::i_createObj(IOpaqueAddress* addr,
00047 DataObject*& refpObject) {
00048
00049 MsgStream log(msgSvc(), "TreeDedxCalibDataCnv");
00050 log<<MSG::DEBUG<<"SetProperty"<<endreq;
00051
00052 CalibData::DedxCalibData *tmpObject = new CalibData::DedxCalibData;
00053 TreeAddress* add = dynamic_cast<TreeAddress*>(addr);
00054 DatabaseRecord *records=add->pp();
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 TBufferFile *buf1 = new TBufferFile(TBuffer::kRead);
00067 TBufferFile *buf2 = new TBufferFile(TBuffer::kRead);
00068 TBufferFile *buf3 = new TBufferFile(TBuffer::kRead);
00069 TBufferFile *buf4 = new TBufferFile(TBuffer::kRead);
00070 TBufferFile *buf5 = new TBufferFile(TBuffer::kRead);
00071 TBufferFile *buf6 = new TBufferFile(TBuffer::kRead);
00072 TBufferFile *buf7 = new TBufferFile(TBuffer::kRead);
00073 TBufferFile *buf8 = new TBufferFile(TBuffer::kRead);
00074 TBufferFile *buf9 = new TBufferFile(TBuffer::kRead);
00075
00076 buf1->SetBuffer((*records)["DriftDist"],512000,kFALSE);
00077 buf2->SetBuffer((*records)["EntranceAng"],512000,kFALSE);
00078 buf3->SetBuffer((*records)["MeanGain"],512000,kFALSE);
00079 buf4->SetBuffer((*records)["GasGain"],512000,kFALSE);
00080 buf5->SetBuffer((*records)["LayerGain"],512000,kFALSE);
00081 buf6->SetBuffer((*records)["Resolution"],512000,kFALSE);
00082 buf7->SetBuffer((*records)["WireGain"],512000,kFALSE);
00083 buf8->SetBuffer((*records)["ZDep"],512000,kFALSE);
00084 buf9->SetBuffer((*records)["RunGain"],512000,kFALSE);
00085
00086
00087
00088 std::cout<<" SftVer is "<<(*records)["SftVer"];
00089 std::cout<<" CalVerSft is "<<(*records)["CalParVer"];
00090 std::cout<<" File name is "<<(*records)["FileName"]<<std::endl;
00091
00092
00093
00094 TTree* ddgtree = new TTree();
00095 ddgtree->Streamer(*buf1);
00096
00097 TTree* entratree = new TTree();
00098 entratree->Streamer(*buf2);
00099
00100 TTree* gaintree= new TTree();
00101 gaintree->Streamer(*buf3);
00102
00103 TTree* ggstree = new TTree();
00104 ggstree->Streamer(*buf4);
00105
00106 TTree* layergtree = new TTree();
00107 layergtree->Streamer(*buf5);
00108
00109 TTree* resoltree = new TTree();
00110 resoltree->Streamer(*buf6);
00111
00112 TTree* wiregtree = new TTree();
00113 wiregtree->Streamer(*buf7);
00114
00115 TTree* zdeptree = new TTree();
00116 zdeptree->Streamer(*buf8);
00117
00118 TTree *rungtree = new TTree();
00119 rungtree->Streamer(*buf9);
00120
00121 double rungain;
00122 double runmean;
00123 int runno;
00124 double runresol;
00125
00126 rungtree -> SetBranchAddress("rungain", &rungain);
00127 rungtree -> SetBranchAddress("runmean", &runmean);
00128 rungtree -> SetBranchAddress("runno", &runno);
00129 rungtree -> SetBranchAddress("runresol", &runresol);
00130 int N = rungtree -> GetEntries();
00131 tmpObject -> setrunNO(N);
00132 for(int i=0; i<N; i++){
00133 rungtree -> GetEntry(i);
00134 tmpObject -> setrung(rungain,0,i);
00135 tmpObject -> setrung(runmean,1,i);
00136 tmpObject -> setrung(runno,2,i);
00137 tmpObject -> setrung(runresol,3,i);
00138 }
00139
00140
00141 double ddg0[43];
00142 double ddg1[43];
00143 double ddg2[43];
00144 double ddg3[43];
00145 double id_doca[1600];
00146 double iner_chi[1600];
00147 double iner_gain[1600];
00148 double iner_hits[1600];
00149 double ip_eangle[1600];
00150 double out_chi[1600];
00151 double out_gain[1600];
00152 double out_hits[1600];
00153
00154 ddgtree -> SetBranchAddress("ddg0", ddg0);
00155 ddgtree -> SetBranchAddress("ddg1", ddg1);
00156 ddgtree -> SetBranchAddress("ddg2", ddg2);
00157 ddgtree -> SetBranchAddress("ddg3", ddg3);
00158 TBranch *bbb = ddgtree->FindBranch("Id_doca");
00159 if(bbb){
00160 ddgtree -> SetBranchAddress("Id_doca", id_doca);
00161 ddgtree -> SetBranchAddress("Iner_chi", iner_chi);
00162 ddgtree -> SetBranchAddress("Iner_gain", iner_gain);
00163 ddgtree -> SetBranchAddress("Iner_hits", iner_hits);
00164 ddgtree -> SetBranchAddress("Ip_eangle", ip_eangle);
00165 ddgtree -> SetBranchAddress("Out_chi", out_chi);
00166 ddgtree -> SetBranchAddress("Out_gain", out_gain);
00167 ddgtree -> SetBranchAddress("Out_hits", out_hits);
00168 }
00169
00170 ddgtree -> GetEntry(0);
00171 for(int i=0; i<43; i++){
00172
00173 tmpObject -> setddg(ddg0[i],0,i);
00174 tmpObject -> setddg(ddg1[i],1,i);
00175 tmpObject -> setddg(ddg2[i],2,i);
00176 tmpObject -> setddg(ddg3[i],3,i);
00177 }
00178
00179 for(int i=0; i<1600; i++){
00180 if(!bbb){
00181 id_doca[i]=0;
00182 iner_chi[i]=0;
00183 iner_gain[i]=0;
00184 iner_hits[i]=0;
00185 ip_eangle[i]=0;
00186 out_chi[i]=0;
00187 out_gain[i]=0;
00188 out_hits[i]=0;
00189 }
00190 tmpObject -> set_id_doca(id_doca[i],i);
00191 tmpObject -> set_iner_chi(iner_chi[i],i);
00192 tmpObject -> set_iner_gain(iner_gain[i],i);
00193 tmpObject -> set_iner_hits(iner_hits[i],i);
00194 tmpObject -> set_ip_eangle(ip_eangle[i],i);
00195 tmpObject -> set_out_chi(out_chi[i],i);
00196 tmpObject -> set_out_gain(out_gain[i],i);
00197 tmpObject -> set_out_hits(out_hits[i],i);
00198 }
00199
00200
00201 double entra0[43];
00202 double entra1[43];
00203 double entra2[43];
00204 double entra3[43];
00205 double engle[100];
00206 int engle_no;
00207 entratree -> SetBranchAddress("entra0", entra0);
00208 entratree -> SetBranchAddress("entra1", entra1);
00209 entratree -> SetBranchAddress("entra2", entra2);
00210 entratree -> SetBranchAddress("entra3", entra3);
00211 entratree -> SetBranchAddress("1denangle", engle);
00212 entratree -> SetBranchAddress("1denangle_entry", &engle_no);
00213 entratree -> GetEntry(0);
00214 for(int i=0; i<43; i++){
00215 tmpObject -> setenta(entra0[i],0,i);
00216 tmpObject -> setenta(entra1[i],1,i);
00217 tmpObject -> setenta(entra2[i],2,i);
00218 tmpObject -> setenta(entra3[i],3,i);
00219 }
00220
00221 tmpObject -> set_enanglesize(engle_no);
00222 for(int i=0; i<engle_no; i++){
00223 tmpObject -> set_enangle(engle[i],i);
00224 }
00225
00226
00227
00228
00229
00230 double ggs0[43];
00231 double ggs1[43];
00232 double ggs2[43];
00233 double ggs3[43];
00234 double gcostheta[80];
00235 int hadron_entry;
00236 double hadron[20];
00237 ggstree -> SetBranchAddress("ggs0", ggs0);
00238 ggstree -> SetBranchAddress("ggs1", ggs1);
00239 ggstree -> SetBranchAddress("ggs2", ggs2);
00240 ggstree -> SetBranchAddress("ggs3", ggs3);
00241 ggstree -> SetBranchAddress("hadron", hadron);
00242 ggstree -> SetBranchAddress("hadronNo", &hadron_entry);
00243 if(bbb){
00244 ggstree -> SetBranchAddress("costheta", gcostheta);}
00245 ggstree -> GetEntry(0);
00246 for(int i=0; i<43;i++){
00247 tmpObject -> setggs(ggs0[i],0,i);
00248 tmpObject -> setggs(ggs1[i],1,i);
00249 tmpObject -> setggs(ggs2[i],2,i);
00250 tmpObject -> setggs(ggs3[i],3,i);
00251 }
00252 for(int i=0; i<80;i++){
00253 if(!bbb) gcostheta[i]=0;
00254 tmpObject ->set_costheta(gcostheta[i],i);
00255 }
00256 if(hadron_entry>20){
00257 log<<MSG::FATAL<<"hadron entry is larger than 20, larger than designed"<<endreq;
00258 return StatusCode::FAILURE;
00259 }
00260 tmpObject->set_hadronNo(hadron_entry);
00261 for(int i=0;i<hadron_entry;i++){
00262 tmpObject->set_hadron(hadron[i],i);
00263 }
00264
00265
00266
00267 double zdep0[43];
00268 double zdep1[43];
00269 double zdep2[43];
00270 double zdep3[43];
00271 zdeptree -> SetBranchAddress("zdep0", zdep0);
00272 zdeptree -> SetBranchAddress("zdep1", zdep1);
00273 zdeptree -> SetBranchAddress("zdep2", zdep2);
00274 zdeptree -> SetBranchAddress("zdep3", zdep3);
00275 zdeptree -> GetEntry(0);
00276
00277 for(int i=0; i<43;i++){
00278 tmpObject -> setzdep(zdep0[i],0,i);
00279 tmpObject -> setzdep(zdep1[i],1,i);
00280 tmpObject -> setzdep(zdep2[i],2,i);
00281 tmpObject -> setzdep(zdep3[i],3,i);
00282 }
00283
00284 double gain;
00285 double gt0[35],gdedx[35];
00286 gaintree -> SetBranchAddress("gain", &gain);
00287 if(bbb){
00288 gaintree -> SetBranchAddress("t0", gt0);
00289 gaintree -> SetBranchAddress("dedx", gdedx);}
00290 gaintree -> GetEntry(0);
00291 tmpObject -> setgain(gain);
00292 for(int i=0; i<35;i++){
00293 if(!bbb){
00294 gt0[i]=0;
00295 gdedx[i]=0;
00296 }
00297 tmpObject->set_t0(gt0[i],i);
00298 tmpObject->set_dedx(gdedx[i],i);
00299 }
00300
00301
00302 double resol;
00303 resoltree -> SetBranchAddress("resol", &resol);
00304 resoltree -> GetEntry(0);
00305 tmpObject -> setresol(resol);
00306
00307
00308 double wireg[6796];
00309 wiregtree -> SetBranchAddress("wireg",wireg);
00310 wiregtree -> GetEntry(0);
00311 for(int i=0;i<6796;i++){
00312 if(wireg[i]>5||wireg[i]<0.2) wireg[i]=0;
00313 tmpObject -> setwireg(wireg[i],i);
00314 }
00315
00316
00317 double layerg[43];
00318 layergtree -> SetBranchAddress("layerg",layerg);
00319 layergtree -> GetEntry(0);
00320
00321 for(int i=0;i<43;i++){
00322 tmpObject -> setlayerg(layerg[i],i);
00323 }
00324
00325
00326
00327
00328
00329
00330 refpObject=tmpObject;
00331
00332 delete ddgtree;
00333 delete entratree;
00334 delete gaintree;
00335 delete ggstree;
00336 delete layergtree;
00337 delete resoltree;
00338 delete wiregtree;
00339 delete zdeptree;
00340 delete rungtree;
00341
00342 return StatusCode::SUCCESS;
00343
00344
00345 }
00346