00001 #include "tofcalgsec/TofCalibManager.h"
00002 #include "TTree.h"
00003 #include "TFile.h"
00004
00005 TofCalibManager* TofCalibManager::m_manager=0;
00006 TofCalibManager* TofCalibManager::getManager() {
00007 if( m_manager == 0 ) {
00008 m_manager = new TofCalibManager;
00009 }
00010 return m_manager;
00011 }
00012
00013
00014 TofCalibManager::TofCalibManager() {
00015 m_dataset = new TofDataSet;
00016 return;
00017 }
00018
00019
00020 TofCalibManager::~TofCalibManager() {
00021 if( !calib_barrel_item.empty() ) {
00022 std::vector<TofCalib*>::iterator iter = calib_barrel_item.begin();
00023 for( ; iter != calib_barrel_item.end(); iter++ ) {
00024 if( (*iter) ) delete (*iter);
00025 }
00026 calib_barrel_item.clear();
00027 }
00028 if( !calib_endcap_item.empty() ) {
00029 std::vector<TofCalib*>::iterator iter = calib_endcap_item.begin();
00030 for( ; iter != calib_endcap_item.end(); iter++ ) {
00031 if( (*iter) ) delete (*iter);
00032 }
00033 calib_endcap_item.clear();
00034 }
00035 if( !calib_etf_item.empty() ) {
00036 std::vector<TofCalib*>::iterator iter = calib_etf_item.begin();
00037 for( ; iter != calib_etf_item.end(); iter++ ) {
00038 if( (*iter) ) delete (*iter);
00039 }
00040 calib_etf_item.clear();
00041 }
00042 if( !calibration_barrel_item.empty() ) {
00043 std::vector<TofCalibFit*>::iterator iter = calibration_barrel_item.begin();
00044 for( ; iter != calibration_barrel_item.end(); iter++ ) {
00045 if( (*iter) ) delete (*iter);
00046 }
00047 calibration_barrel_item.clear();
00048 }
00049 if( !calibration_barrel_item2.empty() ) {
00050 std::vector<TofCalibFit*>::iterator iter = calibration_barrel_item2.begin();
00051 for( ; iter != calibration_barrel_item2.end(); iter++ ) {
00052 if( (*iter) ) delete (*iter);
00053 }
00054 calibration_barrel_item2.clear();
00055 }
00056 if( !calibration_endcap_item.empty() ) {
00057 std::vector<TofCalibFit*>::iterator iter = calibration_endcap_item.begin();
00058 for( ; iter != calibration_endcap_item.end(); iter++ ) {
00059 if( (*iter) ) delete (*iter);
00060 }
00061 calibration_endcap_item.clear();
00062 }
00063
00064 delete m_dataset;
00065 return;
00066 }
00067
00068
00069 void TofCalibManager::addCalib( TofCalib* cal_item1, int isbarrel ) {
00070 if( isbarrel==1 ) {
00071 calib_barrel_item.push_back(cal_item1);
00072 }
00073 else if( isbarrel==0 ) {
00074 calib_endcap_item.push_back(cal_item1);
00075 }
00076 else if( isbarrel==2 ) {
00077 calib_etf_item.push_back(cal_item1);
00078 }
00079 else {
00080 cout << "Tof::tofcalgsec::TofCalibManaer: addCalib: isbarrel is OUT of range!" << endl;
00081 }
00082 return;
00083 }
00084
00085
00086 void TofCalibManager::addCalib( TofCalibFit* cal_item2, bool isbarrel ) {
00087 if( isbarrel ) {
00088 if( cal_item2->name()=="calib_barrel_sigma" ) {
00089 calibration_barrel_item2.push_back(cal_item2);
00090 }
00091 else {
00092 calibration_barrel_item.push_back(cal_item2);
00093 }
00094 }
00095 else {
00096
00097 calibration_etf_item.push_back(cal_item2);
00098 }
00099 return;
00100 }
00101
00102
00103 void TofCalibManager::doCalibration() {
00104
00105 if( !calib_barrel_item.empty() || !calibration_barrel_item.empty() ) {
00106 std::cout << "Begin barrel counters calibration..." << std::endl;
00107 std::cout << setiosflags(ios::left) << setw(10) << "TOF ID" << setw(8) << "Entries" << setw(30) << "What Calibration" << std::endl;
00108 HepVector tcorrelation;
00109 for( unsigned int i=0; i<NBarrel; i++ ) {
00110 RecordSet* barrelData = m_dataset->getBarrelData(i);
00111 if( !calib_barrel_item.empty() ) {
00112 std::vector<TofCalib*>::iterator iter1 = calib_barrel_item.begin();
00113 for( ; iter1!=calib_barrel_item.end(); iter1++ ) {
00114 (*iter1)->reset();
00115 (*iter1)->calculate( barrelData, i );
00116 }
00117 }
00118 if( !calibration_barrel_item.empty() ) {
00119 std::vector<TofCalibFit*>::iterator iter2 = calibration_barrel_item.begin();
00120 for( ; iter2!=calibration_barrel_item.end(); iter2++ ) {
00121 (*iter2)->calculate( barrelData, i );
00122 if( i==(NBarrel-1) ) {
00123 if( (*iter2)->name()=="calib_barrel_common" ) {
00124 tcorrelation = (*iter2)->tcorrelation();
00125 }
00126 }
00127 }
00128 }
00129 }
00130
00131 for( unsigned int i=0; i<NBarrel; i++ ) {
00132 RecordSet* barrelData = m_dataset->getBarrelData(i);
00133 if( !calibration_barrel_item2.empty() ) {
00134 std::vector<TofCalibFit*>::iterator iter2 = calibration_barrel_item2.begin();
00135 for( ; iter2!=calibration_barrel_item2.end(); iter2++ ) {
00136 if( i==0 ) {
00137 if( (*iter2)->name()=="calib_barrel_sigma" ) {
00138 (*iter2)->setTCorrelation( tcorrelation );
00139 }
00140 }
00141 (*iter2)->calculate( barrelData, i );
00142 }
00143 }
00144 }
00145 }
00146
00147 if( !calib_endcap_item.empty() || !calibration_endcap_item.empty() ) {
00148 std::cout << "Begin endcap counters calibration..." << std::endl;
00149 std::cout << setiosflags(ios::left) << setw(10)<<"TOF ID" << setw(8) << "Entries" << setw(30) << "What Calibration" << std::endl;
00150 for( unsigned int i=0; i<NEndcap; i++ ) {
00151 RecordSet* endcapData = m_dataset->getEndcapData(i);
00152 if( !calib_endcap_item.empty() ) {
00153 std::vector<TofCalib*>::iterator iter1 = calib_endcap_item.begin();
00154 for( ; iter1!=calib_endcap_item.end(); iter1++ ) {
00155 (*iter1)->reset();
00156 (*iter1)->calculate( endcapData, i );
00157 }
00158 }
00159 if( !calibration_endcap_item.empty() ) {
00160 std::vector<TofCalibFit*>::iterator iter2 = calibration_endcap_item.begin();
00161 for( ; iter2!=calibration_endcap_item.end(); iter2++ ) {
00162 (*iter2)->calculate( endcapData, i );
00163 }
00164 }
00165 }
00166 }
00167
00168 if( !calib_etf_item.empty() || !calibration_etf_item.empty() ) {
00169 std::cout << "Begin ETF(MRPC) calibration..." << std::endl;
00170 std::cout << setiosflags(ios::left) << setw(10) << "TOF ID *12 + STRIP" << setw(8) << "Entries" << setw(30) << "What Calibration" << std::endl;
00171 HepVector tcorrelation;
00172 for( unsigned int i=0; i<NEtf*NStrip; i++ ) {
00173 RecordSet* etfData = m_dataset->getEtfData(i);
00174 if( !calib_etf_item.empty() ) {
00175 std::vector<TofCalib*>::iterator iter1 = calib_etf_item.begin();
00176 for( ; iter1!=calib_etf_item.end(); iter1++ ) {
00177 (*iter1)->reset();
00178 (*iter1)->calculate( etfData, i );
00179 }
00180 }
00181 if( !calibration_etf_item.empty() ) {
00182 std::vector<TofCalibFit*>::iterator iter2 = calibration_etf_item.begin();
00183 for( ; iter2!=calibration_etf_item.end(); iter2++ ) {
00184 (*iter2)->calculate( etfData, i );
00185 }
00186 }
00187 }
00188 }
00189
00190 return;
00191 }
00192
00193
00194 void TofCalibManager::fillTxt( string& dir ) {
00195
00196 if( !calib_barrel_item.empty() ) {
00197 std::vector<TofCalib*>::iterator iter = calib_barrel_item.begin();
00198 for( ; iter != calib_barrel_item.end(); iter++ ) {
00199 string fname = dir + string("/") + (*iter)->name() + string(".txt");
00200 (*iter)->fillTxt( fname.c_str() );
00201 }
00202 }
00203
00204 if( !calib_endcap_item.empty() ) {
00205 std::vector<TofCalib*>::iterator iter = calib_endcap_item.begin();
00206 for( ; iter != calib_endcap_item.end(); iter++ ) {
00207 string fname = dir + string("/") + (*iter)->name() + string(".txt");
00208 (*iter)->fillTxt( fname.c_str() );
00209 }
00210 }
00211
00212 if( !calib_etf_item.empty() ) {
00213 std::vector<TofCalib*>::iterator iter = calib_etf_item.begin();
00214 for( ; iter != calib_etf_item.end(); iter++ ) {
00215 string fname = dir + string("/") + (*iter)->name() + string(".txt");
00216 (*iter)->fillTxt( fname.c_str() );
00217 }
00218 }
00219
00220 if( !calibration_barrel_item.empty() ) {
00221 std::vector<TofCalibFit*>::iterator iter = calibration_barrel_item.begin();
00222 for( ; iter != calibration_barrel_item.end(); iter++ ) {
00223 string fname = dir + string("/") + (*iter)->name() + string(".txt");
00224 (*iter)->fillTxt( fname.c_str() );
00225 }
00226 }
00227 if( !calibration_barrel_item2.empty() ) {
00228 std::vector<TofCalibFit*>::iterator iter = calibration_barrel_item2.begin();
00229 for( ; iter != calibration_barrel_item2.end(); iter++ ) {
00230 string fname = dir + string("/") + (*iter)->name() + string(".txt");
00231 (*iter)->fillTxt( fname.c_str() );
00232 }
00233 }
00234
00235 if( !calibration_endcap_item.empty() ) {
00236 std::vector<TofCalibFit*>::iterator iter = calibration_endcap_item.begin();
00237 for( ; iter != calibration_endcap_item.end(); iter++ ) {
00238 string fname = dir + string("/") + (*iter)->name() + string(".txt");
00239 (*iter)->fillTxt( fname.c_str() );
00240 }
00241 }
00242
00243 if( !calibration_etf_item.empty() ) {
00244 std::vector<TofCalibFit*>::iterator iter = calibration_etf_item.begin();
00245 for( ; iter != calibration_etf_item.end(); iter++ ) {
00246 string fname = dir + string("/") + (*iter)->name() + string(".txt");
00247 (*iter)->fillTxt( fname.c_str() );
00248 }
00249 }
00250
00251 return;
00252 }
00253
00254
00255 void TofCalibManager::fillRoot( string& dir ) {
00256 int count = 1;
00257 char filename1[256];
00258 sprintf( filename1, "%s/barrel%i.root", dir.c_str(), count );
00259 TFile f1(filename1,"RECREATE");
00260 TTree* ntbarrel = new TTree( "btrk", "barrel data after calibration" );
00261
00262 int run;
00263 int event;
00264 int tofid;
00265 int strip;
00266 double qleft;
00267 double qright;
00268 double tleft;
00269 double tright;
00270 double zrhit;
00271 double dt;
00272 double texp;
00273 double path;
00274 double phi;
00275 double theta;
00276 double p;
00277 double t0;
00278 double q0;
00279 int hitcase;
00280
00281 ntbarrel->Branch( "run", &run, "run/I" );
00282 ntbarrel->Branch( "event", &event, "event/I" );
00283 ntbarrel->Branch( "tofid", &tofid, "tofid/I" );
00284 ntbarrel->Branch( "qleft", &qleft, "qleft/D" );
00285 ntbarrel->Branch( "qright", &qright, "qright/D" );
00286 ntbarrel->Branch( "tleft", &tleft, "tleft/D" );
00287 ntbarrel->Branch( "tright", &tright, "tright/D" );
00288 ntbarrel->Branch( "zrhit", &zrhit, "zrhit/D" );
00289 ntbarrel->Branch( "texp", &texp, "texp/D" );
00290 ntbarrel->Branch( "path", &path, "path/D" );
00291 ntbarrel->Branch( "phi", &phi, "phi/D" );
00292 ntbarrel->Branch( "theta", &theta, "theta/D" );
00293 ntbarrel->Branch( "p", &p, "p/D" );
00294 ntbarrel->Branch( "t0", &t0, "t0/D" );
00295 ntbarrel->Branch( "q0", &q0, "q0/D" );
00296 ntbarrel->Branch( "hitcase",&hitcase,"hitcase/I");
00297
00298 int counter = 0;
00299 std::cout << "begin to write..." << filename1 << std::endl;
00300 for( unsigned int i=0; i<NBarrel; i++ ) {
00301 std::cout << "\r\b Writing record ... " << (int((++counter)*100./NBarrel)) << "%";
00302 RecordSet* barrelData = m_dataset->getBarrelData(i);
00303 std::vector<Record*>::iterator iter = barrelData->begin();
00304 for( ; iter!=barrelData->end(); iter++ ) {
00305 run = (*iter)->run();
00306 event = (*iter)->event();
00307 tofid = (*iter)->tofid();
00308 qleft = (*iter)->qleft();
00309 qright = (*iter)->qright();
00310 tleft = (*iter)->tleft();
00311 tright = (*iter)->tright();
00312 zrhit = (*iter)->zrhit();
00313 texp = (*iter)->texp();
00314 path = (*iter)->path();
00315 phi = (*iter)->phi();
00316 theta = (*iter)->theta();
00317 p = (*iter)->p();
00318 t0 = (*iter)->t0();
00319 q0 = (*iter)->q0();
00320 hitcase = (*iter)->hitcase();
00321 ntbarrel->Fill();
00322 }
00323 }
00324 std::cout << std::endl;
00325 ntbarrel->Write();
00326 delete ntbarrel;
00327 f1.Close();
00328
00329 char filename2[256];
00330 sprintf( filename2, "%s/endcap%i.root", dir.c_str(), count );
00331 TFile f2(filename2,"RECREATE");
00332 TTree* ntendcap = new TTree( "etrk", "endcap data after calibration" );
00333
00334 ntendcap->Branch( "run", &run, "run/I" );
00335 ntendcap->Branch( "event", &event, "event/I" );
00336 ntendcap->Branch( "tofid", &tofid, "tofid/I" );
00337 ntendcap->Branch( "qleft", &qleft, "qleft/D" );
00338 ntendcap->Branch( "qright", &qright, "qright/D" );
00339 ntendcap->Branch( "tleft", &tleft, "tleft/D" );
00340 ntendcap->Branch( "tright", &tright, "tright/D" );
00341 ntendcap->Branch( "zrhit", &zrhit, "zrhit/D" );
00342 ntendcap->Branch( "texp", &texp, "texp/D" );
00343 ntendcap->Branch( "path", &path, "path/D" );
00344 ntendcap->Branch( "phi", &phi, "phi/D" );
00345 ntendcap->Branch( "theta", &theta, "theta/D" );
00346 ntendcap->Branch( "p", &p, "p/D" );
00347 ntendcap->Branch( "t0", &t0, "t0/D" );
00348 ntendcap->Branch( "q0", &q0, "q0/D" );
00349 ntendcap->Branch( "hitcase",&hitcase,"hitcase/I");
00350
00351 counter = 0;
00352 std::cout << "begin to write..." << filename2 << std::endl;
00353 for( unsigned int i=0; i<NEndcap; i++ ) {
00354 std::cout << "\r\b Writing record ... " << (int((++counter)*100./NEndcap)) << "%";
00355 RecordSet* endcapData = m_dataset->getEndcapData(i);
00356 std::vector<Record*>::iterator iter = endcapData->begin();
00357 for( ; iter!=endcapData->end(); iter++ ) {
00358 run = (*iter)->run();
00359 event = (*iter)->event();
00360 tofid = (*iter)->tofid();
00361 qleft = (*iter)->qleft();
00362 qright = (*iter)->qright();
00363 tleft = (*iter)->tleft();
00364 tright = (*iter)->tright();
00365 zrhit = (*iter)->zrhit();
00366 texp = (*iter)->texp();
00367 path = (*iter)->path();
00368 phi = (*iter)->phi();
00369 theta = (*iter)->theta();
00370 p = (*iter)->p();
00371 t0 = (*iter)->t0();
00372 q0 = (*iter)->q0();
00373 hitcase = (*iter)->hitcase();
00374 ntendcap->Fill();
00375 }
00376 }
00377 std::cout << std::endl;
00378 ntendcap->Write();
00379 delete ntendcap;
00380 f2.Close();
00381
00382 char filename3[256];
00383 sprintf( filename3, "%s/etf%i.root", dir.c_str(), count );
00384 TFile f3(filename3,"RECREATE");
00385 TTree* ntetf = new TTree( "etf", "en data after calibration" );
00386
00387 ntetf->Branch( "run", &run, "run/I" );
00388 ntetf->Branch( "event", &event, "event/I" );
00389 ntetf->Branch( "tofid", &tofid, "tofid/I" );
00390 ntetf->Branch( "strip", &strip, "strip/I" );
00391 ntetf->Branch( "qleft", &qleft, "qleft/D" );
00392 ntetf->Branch( "qright", &qright, "qright/D" );
00393 ntetf->Branch( "tleft", &tleft, "tleft/D" );
00394 ntetf->Branch( "tright", &tright, "tright/D" );
00395 ntetf->Branch( "zrhit", &zrhit, "zrhit/D" );
00396 ntetf->Branch( "dt", &dt, "dt/D" );
00397 ntetf->Branch( "texp", &texp, "texp/D" );
00398 ntetf->Branch( "path", &path, "path/D" );
00399 ntetf->Branch( "phi", &phi, "phi/D" );
00400 ntetf->Branch( "p", &p, "p/D" );
00401 ntetf->Branch( "t0", &t0, "t0/D" );
00402 ntetf->Branch( "q0", &q0, "q0/D" );
00403 ntetf->Branch( "hitcase",&hitcase,"hitcase/I");
00404
00405 counter = 0;
00406 std::cout << "begin to write..." << filename3 << std::endl;
00407 for( unsigned int i=0; i<NEtf*NStrip; i++ ) {
00408 std::cout << "\r\b Writing record ... " << (int((++counter)*100./(NEtf*NStrip))) << "%";
00409 RecordSet* etfData = m_dataset->getEtfData(i);
00410 std::vector<Record*>::iterator iter = etfData->begin();
00411 for( ; iter!=etfData->end(); iter++ ) {
00412 run = (*iter)->run();
00413 event = (*iter)->event();
00414 tofid = (*iter)->tofid();
00415 strip = (*iter)->strip();
00416 qleft = (*iter)->qleft();
00417 qright = (*iter)->qright();
00418 tleft = (*iter)->tleft();
00419 tright = (*iter)->tright();
00420 zrhit = (*iter)->zrhit();
00421 dt = (*iter)->dt();
00422 texp = (*iter)->texp();
00423 path = (*iter)->path();
00424 phi = (*iter)->phi();
00425 p = (*iter)->p();
00426 t0 = (*iter)->t0();
00427 q0 = (*iter)->q0();
00428 hitcase = (*iter)->hitcase();
00429 ntetf->Fill();
00430 }
00431 }
00432 std::cout << std::endl;
00433 ntetf->Write();
00434 delete ntetf;
00435 f3.Close();
00436
00437 if( !calibration_barrel_item.empty() ) {
00438 std::vector<TofCalibFit*>::iterator iter = calibration_barrel_item.begin();
00439 for( ; iter != calibration_barrel_item.end(); iter++ ) {
00440 string fname = dir + string("/") + (*iter)->name() + string(".root");
00441 (*iter)->fillRoot( fname.c_str() );
00442 }
00443 }
00444 if( !calibration_barrel_item2.empty() ) {
00445 std::vector<TofCalibFit*>::iterator iter = calibration_barrel_item2.begin();
00446 for( ; iter != calibration_barrel_item2.end(); iter++ ) {
00447 string fname = dir + string("/") + (*iter)->name() + string(".root");
00448 (*iter)->fillRoot( fname.c_str() );
00449 }
00450 }
00451
00452 if( !calibration_endcap_item.empty() ) {
00453 std::vector<TofCalibFit*>::iterator iter = calibration_endcap_item.begin();
00454 for( ; iter != calibration_endcap_item.end(); iter++ ) {
00455 string fname = dir + string("/") + (*iter)->name() + string(".root");
00456 (*iter)->fillRoot( fname.c_str() );
00457 }
00458 }
00459
00460 if( !calibration_etf_item.empty() ) {
00461 std::vector<TofCalibFit*>::iterator iter = calibration_etf_item.begin();
00462 for( ; iter != calibration_etf_item.end(); iter++ ) {
00463 string fname = dir + string("/") + (*iter)->name() + string(".root");
00464 (*iter)->fillRoot( fname.c_str() );
00465 }
00466 }
00467
00468 return;
00469 }