00001
00002 #include "GaudiKernel/MsgStream.h"
00003 #include "RootEstTofCalibDataCnv.h"
00004 #include "CalibData/Tof/TofCalibData.h"
00005 #include "CalibData/Tof/bTofCalibBase.h"
00006 #include "CalibData/Tof/eTofCalibBase.h"
00007 #include "CalibData/Tof/etfCalibBase.h"
00008 #include "CalibDataSvc/IInstrumentName.h"
00009
00010 #include "TFile.h"
00011 #include "TTree.h"
00012 #include "TDirectory.h"
00013 #include "TObject.h"
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
00026
00027 #include "CalibData/CalibModel.h"
00028 using namespace CalibData;
00029
00030
00031
00032 const unsigned int nBarPar = 10;
00033 const unsigned int nBarParOff = 20;
00034 const unsigned int nEndPar = 8;
00035 const unsigned int nEtfPar = 20;
00036 const unsigned int nBarOffset = 2;
00037
00038 RootEstTofCalibDataCnv::RootEstTofCalibDataCnv( ISvcLocator* svc) :
00039 RootCalBaseCnv(svc, CLID_Calib_EstTofCal) {
00040 }
00041
00042
00043 const CLID& RootEstTofCalibDataCnv::objType() const {
00044 return CLID_Calib_EstTofCal;
00045 }
00046
00047 const CLID& RootEstTofCalibDataCnv::classID() {
00048 return CLID_Calib_EstTofCal;
00049 }
00050
00051 StatusCode RootEstTofCalibDataCnv::i_createObj(const std::string& fname,
00052 DataObject*& refpObject) {
00053
00054 MsgStream log(msgSvc(), "RootEstTofCalibDataCnv");
00055 log<<MSG::DEBUG<<"SetProperty"<<endreq;
00056
00057
00058 StatusCode sc = openRead(fname);
00059 if(!sc)
00060 { log<<MSG::ERROR<<"unable to open files"<<endreq;
00061 }
00062
00063 CalibData::bTofCalibBase bTof;
00064 CalibData::eTofCalibBase eTof;
00065 CalibData::etfCalibBase etf;
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::etfCalibBase> tmpetf;
00072 std::vector<CalibData::bTofCommonCalibBase> tmpbTofCommon;
00073 std::vector<CalibData::tofCalibInfoBase> tofinfoCol;
00074
00075
00076 int cnt;
00077
00078 double cnvBarPar1[nBarPar];
00079 double cnvBarPar2[nBarPar];
00080 double cnvBarParOff1_bunch0[nBarParOff];
00081 double cnvBarParOff2_bunch0[nBarParOff];
00082 double cnvBarParOff1_bunch1[nBarParOff];
00083 double cnvBarParOff2_bunch1[nBarParOff];
00084 double cnvBarParOff1_bunch2[nBarParOff];
00085 double cnvBarParOff2_bunch2[nBarParOff];
00086 double cnvBarParOff1_bunch3[nBarParOff];
00087 double cnvBarParOff2_bunch3[nBarParOff];
00088
00089 TTree *btoftree = (TTree*)m_inFile -> Get("BarTofPar");
00090
00091 char brname[10];
00092 for( unsigned int i=0; i<nBarPar; i++ ) {
00093 sprintf( brname, "P%i", i );
00094 btoftree -> SetBranchAddress( brname, &cnvBarPar1[i] );
00095 }
00096 for( unsigned int i=0; i<nBarPar; i++ ) {
00097 sprintf( brname, "P%i", i+nBarPar );
00098 btoftree -> SetBranchAddress( brname, &cnvBarPar2[i] );
00099 }
00100 for( unsigned int i=0; i<nBarParOff; i++ ) {
00101 sprintf( brname, "Bunch0_Poff%i", i );
00102 btoftree -> SetBranchAddress( brname, &cnvBarParOff1_bunch0[i] );
00103 }
00104 for( unsigned int i=0; i<nBarParOff; i++ ) {
00105 sprintf( brname, "Bunch0_Poff%i", i+nBarParOff );
00106 btoftree -> SetBranchAddress( brname, &cnvBarParOff2_bunch0[i] );
00107 }
00108 for( unsigned int i=0; i<nBarParOff; i++ ) {
00109 sprintf( brname, "Bunch1_Poff%i", i );
00110 btoftree -> SetBranchAddress( brname, &cnvBarParOff1_bunch1[i] );
00111 }
00112 for( unsigned int i=0; i<nBarParOff; i++ ) {
00113 sprintf( brname, "Bunch1_Poff%i", i+nBarParOff );
00114 btoftree -> SetBranchAddress( brname, &cnvBarParOff2_bunch1[i] );
00115 }
00116 for( unsigned int i=0; i<nBarParOff; i++ ) {
00117 sprintf( brname, "Bunch2_Poff%i", i );
00118 btoftree -> SetBranchAddress( brname, &cnvBarParOff1_bunch2[i] );
00119 }
00120 for( unsigned int i=0; i<nBarParOff; i++ ) {
00121 sprintf( brname, "Bunch2_Poff%i", i+nBarParOff );
00122 btoftree -> SetBranchAddress( brname, &cnvBarParOff2_bunch2[i] );
00123 }
00124 for( unsigned int i=0; i<nBarParOff; i++ ) {
00125 sprintf( brname, "Bunch3_Poff%i", i );
00126 btoftree -> SetBranchAddress( brname, &cnvBarParOff1_bunch3[i] );
00127 }
00128 for( unsigned int i=0; i<nBarParOff; i++ ) {
00129 sprintf( brname, "Bunch3_Poff%i", i+nBarParOff );
00130 btoftree -> SetBranchAddress( brname, &cnvBarParOff2_bunch3[i] );
00131 }
00132
00133 for(cnt=0; cnt<176; cnt++){
00134 btoftree -> GetEntry(cnt);
00135 bTof.setP1( cnvBarPar1 );
00136 bTof.setP2( cnvBarPar2 );
00137 bTof.setPoff1_bunch0( cnvBarParOff1_bunch0 );
00138 bTof.setPoff2_bunch0( cnvBarParOff2_bunch0 );
00139 bTof.setPoff1_bunch1( cnvBarParOff1_bunch1 );
00140 bTof.setPoff2_bunch1( cnvBarParOff2_bunch1 );
00141 bTof.setPoff1_bunch2( cnvBarParOff1_bunch2 );
00142 bTof.setPoff2_bunch2( cnvBarParOff2_bunch2 );
00143 bTof.setPoff1_bunch3( cnvBarParOff1_bunch3 );
00144 bTof.setPoff2_bunch3( cnvBarParOff2_bunch3 );
00145 tmpbTof.push_back( bTof );
00146 }
00147
00148
00149 double cnvEndPar[nEndPar];
00150
00151 TTree *etoftree = (TTree*)m_inFile -> Get("EndTofPar");
00152
00153 char ecname[10];
00154 for( unsigned int i=0; i<nEndPar; i++ ) {
00155 sprintf( ecname, "P%i", i );
00156 etoftree -> SetBranchAddress( ecname, &cnvEndPar[i] );
00157 }
00158
00159 for(cnt=0; cnt<96; cnt++){
00160 etoftree->GetEntry(cnt);
00161 eTof.setP( cnvEndPar );
00162 tmpeTof.push_back(eTof);
00163 }
00164
00165
00166 double cnvEtfPar[nEtfPar];
00167 double cnvEtfPar1[nEtfPar];
00168 double cnvEtfPar2[nEtfPar];
00169
00170 if( NULL!=m_inFile->Get("EtfTofPar") ) {
00171 TTree *etftree = (TTree*)m_inFile -> Get("EtfTofPar");
00172
00173 char etfname[10];
00174 for( unsigned int i=0; i<nEtfPar; i++ ) {
00175 sprintf( etfname, "P%i", i );
00176 etftree -> SetBranchAddress( etfname, &cnvEtfPar[i] );
00177 }
00178 for( unsigned int i=0; i<nEtfPar; i++ ) {
00179 sprintf( etfname, "P%i", i+nEtfPar );
00180 etftree -> SetBranchAddress( etfname, &cnvEtfPar1[i] );
00181 }
00182 for( unsigned int i=0; i<nEtfPar; i++ ) {
00183 sprintf( etfname, "P%i", i+2*nEtfPar );
00184 etftree -> SetBranchAddress( etfname, &cnvEtfPar2[i] );
00185 }
00186
00187 for(cnt=0; cnt<(72*12); cnt++){
00188 etftree -> GetEntry(cnt);
00189 etf.setP( cnvEtfPar );
00190 etf.setP1( cnvEtfPar1 );
00191 etf.setP2( cnvEtfPar2 );
00192 tmpetf.push_back(etf);
00193 }
00194 }
00195
00196
00197 double cnvBarOffset[nBarOffset];
00198 TTree *btofcommontree = (TTree*)m_inFile -> Get("BarTofParCommon");
00199 for( unsigned int i=0; i<nBarOffset; i++ ) {
00200 sprintf( brname, "t0offset%i", i );
00201 btofcommontree-> SetBranchAddress( brname, &cnvBarOffset[i]);
00202 }
00203
00204 int entries = btofcommontree->GetEntries();
00205 for(cnt=0;cnt<entries;cnt++){
00206 btofcommontree->GetEntry(cnt);
00207 bTofCommon.setOffset( cnvBarOffset );
00208 tmpbTofCommon.push_back(bTofCommon);
00209 }
00210
00211 CalibData::TofCalibData *tmpObject = new CalibData::TofCalibData(&tmpbTof,&tmpbTofCommon,&tmpeTof,&tmpetf,&tofinfoCol);
00212
00213 refpObject=tmpObject;
00214
00215 return StatusCode::SUCCESS;
00216 }
00217
00218 StatusCode RootEstTofCalibDataCnv::createRoot(const std::string& fname,
00219 CalibData::CalibBase1* pTDSObj) {
00220 MsgStream log(msgSvc(), "RootEstTofCalibDataCnv");
00221
00222
00223 StatusCode sc = openWrite(fname);
00224 if(!sc)
00225 { log<<MSG::ERROR<<"unable to open files"<<endreq;
00226 }
00227
00228 CalibData::TofCalibData* btof = dynamic_cast<CalibData::TofCalibData*>(pTDSObj);
00229
00230
00231 double cnvBarPar1[nBarPar];
00232 double cnvBarPar2[nBarPar];
00233
00234 char brname[8], ibrname[8];
00235 TTree *btoftree = new TTree("BarTofPar", "BarTofPar");
00236 for( unsigned int i=0; i<nBarPar; i++ ) {
00237 sprintf( brname, "P%i", i );
00238 sprintf( ibrname, "P%i/D", i );
00239 btoftree -> Branch( brname, &cnvBarPar1[i], ibrname );
00240 }
00241
00242 for( int i=0; i<176; i++ ) {
00243 for( int j=0;j<static_cast<int>(nBarPar);j++){
00244 cnvBarPar1[j] = btof->getBTofPleft(i,j);
00245 cnvBarPar2[j] = btof->getBTofPright(i,j);
00246 }
00247 btoftree -> Fill();
00248 }
00249
00250
00251 double cnvEndPar[nEndPar];
00252
00253 char ecname[8], iecname[8];
00254 TTree *etoftree = new TTree("EndTofPar", "EndTofPar");
00255 for( unsigned int i=0; i<nEndPar; i++ ) {
00256 sprintf( ecname, "P%i", i );
00257 sprintf( iecname, "P%i/D", i );
00258 etoftree -> Branch( ecname, &cnvEndPar[i], iecname );
00259 }
00260
00261 for(int i=0; i<96; i++){
00262 for(int j=0;j<static_cast<int>(nEndPar);j++){
00263 cnvEndPar[j] = btof->getETofP(i,j);
00264 }
00265 etoftree->Fill();
00266 }
00267
00268
00269 double cnvEtfPar[nEtfPar];
00270 double cnvEtfPar1[nEtfPar];
00271 double cnvEtfPar2[nEtfPar];
00272
00273 char etfname[8], ietfname[8];
00274 TTree *etftree = new TTree("EtfTofPar", "EtfTofPar");
00275 for( unsigned int i=0; i<nEtfPar; i++ ) {
00276 sprintf( etfname, "P%i", i );
00277 sprintf( ietfname, "P%i/D", i );
00278 etftree -> Branch( etfname, &cnvEtfPar[i], ietfname );
00279 }
00280 for( unsigned int i=0; i<nEtfPar; i++ ) {
00281 sprintf( etfname, "P%i", i+nEtfPar );
00282 sprintf( ietfname, "P%i/D", i+nEtfPar );
00283 etftree -> Branch( etfname, &cnvEtfPar1[i], ietfname );
00284 }
00285 for( unsigned int i=0; i<nEtfPar; i++ ) {
00286 sprintf( etfname, "P%i", i+2*nEtfPar );
00287 sprintf( ietfname, "P%i/D", i+2*nEtfPar );
00288 etftree -> Branch( etfname, &cnvEtfPar2[i], ietfname );
00289 }
00290
00291 for( int i=0; i<72; i++ ) {
00292 for( int k=0; k<12; k++ ) {
00293 for(int j=0;j<static_cast<int>(nEtfPar);j++){
00294 cnvEtfPar[j] = btof->getEtfPcombine(i,k,j);
00295 cnvEtfPar1[j] = btof->getEtfPleft(i,k,j);
00296 cnvEtfPar2[j] = btof->getEtfPright(i,k,j);
00297 }
00298 etftree -> Fill();
00299 }
00300 }
00301
00302
00303 btoftree -> Write();
00304 etoftree -> Write();
00305 etftree -> Write();
00306 delete btoftree;
00307 delete etoftree;
00308 delete etftree;
00309 closeWrite();
00310 log<<MSG::INFO<<"successfully create RootFile"<<endreq;
00311
00312 return sc;
00313 }