00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00049
00050
00051
00053
00054 #include <Stiostream.h>
00055 #include <fstream>
00056 #include <cmath>
00057 #include "PhysicalConstants.h"
00058
00059 #include "StMessMgr.h"
00060 #include "StFtpcCalibMaker.h"
00061 #include "StFtpcLaserCalib.hh"
00062 #include "StFtpcLaserTrafo.hh"
00063
00064 #include "St_DataSetIter.h"
00065 #include "St_DataSet.h"
00066 #include "StMessMgr.h"
00067
00068 #include "TH1.h"
00069 #include "TH2.h"
00070 #include "TH3.h"
00071 #include "TObjArray.h"
00072
00073 ClassImp(StFtpcCalibMaker)
00074
00075
00076
00077
00078 StFtpcCalibMaker::StFtpcCalibMaker(const char *name):
00079 StMaker(name)
00080 {
00081
00082 }
00083
00084
00085
00086 StFtpcCalibMaker::~StFtpcCalibMaker(){
00087
00088 }
00089
00090
00091
00092 void StFtpcCalibMaker::GetRunInfo(TString filename){
00093
00094 StFtpcLaser *j = new StFtpcLaser();
00095
00096 j->Init(filename);
00097 j->GetTreeEntry(0);
00098 LOG_DEBUG<<"StFtpcCalibMaker::GetRunInfo j->Run.run = "<<j->Run.run<<" j->Run.date = "<<j->Run.date<<" j->Run.time = "<<j->Run.time<<" j->Run.micropertimebin = "<<j->Run.micropertimebin<<" j->Run.normalizedNowPressure = "<<j->Run.normalizedNowPressure <<" j->Run.standardPressure = "<<j->Run.standardPressure<<" j->Run.baseTemperature = "<<j->Run.baseTemperature<<" j->Run.gasTemperatureWest = "<<j->Run.gasTemperatureWest<<" j->Run.gasTemperatureEast = "<<j->Run.gasTemperatureEast<<endm;
00099 run = j->Run.run;
00100 date = j->Run.date;
00101 time = j->Run.time;
00102 micropertime = j->Run.micropertimebin;
00103 normalizedNowPressure = j->Run.normalizedNowPressure;
00104 standardPressure = j->Run.standardPressure;
00105 baseTemperature = j->Run.baseTemperature;
00106 gasTemperatureWest = j->Run.gasTemperatureWest;
00107 gasTemperatureEast = j->Run.gasTemperatureEast;
00108 delete j;
00109 return;
00110
00111 }
00112
00113
00114
00121 Int_t StFtpcCalibMaker::DbInit(float mbfield)
00122 {
00123 St_DataSet *ftpc_db = NULL;
00124
00125 if ( mbfield > 0.8 ) {
00126 SetFlavor("ffp10kv","ftpcVDrift");
00127 SetFlavor("ffp10kv","ftpcdVDriftdP");
00128 SetFlavor("ffp10kv","ftpcDeflection");
00129 SetFlavor("ffp10kv","ftpcdDeflectiondP");
00130 LOG_INFO << "StFtpcCalibMaker::DbInit - flavor set to ffp10kv"<<endm;
00131 }
00132 else if ( mbfield > 0.2 ) {
00133 SetFlavor("hfp10kv","ftpcVDrift");
00134 SetFlavor("hfp10kv","ftpcdVDriftdP");
00135 SetFlavor("hfp10kv","ftpcDeflection");
00136 SetFlavor("hfp10kv","ftpcdDeflectiondP");
00137 LOG_INFO << "StFtpcCalibMaker::DbInit - flavor set to hfp10kv"<<endm;
00138 }
00139 else if ( mbfield > -0.2 ) {
00140 SetFlavor("zf10kv","ftpcVDrift");
00141 SetFlavor("zf10kv","ftpcdVDriftdP");
00142 SetFlavor("zf10kv","ftpcDeflection");
00143 SetFlavor("zf10kv","ftpcdDeflectiondP");
00144 LOG_INFO << "StFtpcCalibMaker::DbInit - flavor set to zf10kv"<<endm;
00145 }
00146 else if ( mbfield > -0.8 ) {
00147 SetFlavor("hfn10kv","ftpcVDrift");
00148 SetFlavor("hfn10kv","ftpcdVDriftdP");
00149 SetFlavor("hfn10kv","ftpcDeflection");
00150 SetFlavor("hfn10kv","ftpcdDeflectiondP");
00151 LOG_INFO << "StFtpcCalibMaker::DbInit - flavor set to hfn10kv"<<endm;
00152 }
00153 else {
00154 SetFlavor("ffn10kv","ftpcVDrift");
00155 SetFlavor("ffn10kv","ftpcdVDriftdP");
00156 SetFlavor("ffn10kv","ftpcDeflection");
00157 SetFlavor("ffn10kv","ftpcdDeflectiondP");
00158 LOG_INFO << "StFtpcCalibMaker::DbInit - flavor set to ffn10kv"<<endm;
00159 }
00160
00161 ftpc_db = GetDataBase("ftpc");
00162 if (!ftpc_db) {
00163 LOG_WARN << "StFtpcCalibMaker::DbInit - run parameter database StarDb/ftpc not found"<<endm;
00164 return kStWarn;
00165 }
00166 St_DataSetIter local(ftpc_db);
00167
00168 m_clusterpars = (St_ftpcClusterPars *)local("ftpcClusterPars");
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178 St_DataSet *ftpc_geometry_db = GetDataBase("Geometry/ftpc");
00179 St_DataSetIter dblocal_geometry(ftpc_geometry_db);
00180
00181 m_dimensions = (St_ftpcDimensions *)dblocal_geometry("ftpcDimensions");
00182 m_padrow_z = (St_ftpcPadrowZ *)dblocal_geometry("ftpcPadrowZ");
00183
00184 St_DataSet *ftpc_calibrations_db = GetDataBase("Calibrations/ftpc");
00185 St_DataSetIter dblocal_calibrations(ftpc_calibrations_db);
00186
00187 m_gas= (St_ftpcGas *)dblocal_calibrations("ftpcGas");
00188 m_efield = (St_ftpcEField *)dblocal_calibrations("ftpcEField");
00189
00190
00191
00192
00193 m_vdrift = (St_ftpcVDrift *)dblocal_calibrations("ftpcVDrift");
00194 m_deflection = (St_ftpcDeflection *)dblocal_calibrations("ftpcDeflection");
00195 m_dvdriftdp = (St_ftpcdVDriftdP *)dblocal_calibrations("ftpcdVDriftdP");
00196 m_ddeflectiondp = (St_ftpcdDeflectiondP *)dblocal_calibrations("ftpcdDeflectiondP");
00197
00198 m_driftfield = (St_ftpcDriftField *)dblocal_calibrations("ftpcDriftField");
00199 m_electronics = (St_ftpcElectronics *)dblocal_calibrations("ftpcElectronics");
00200
00201
00202 paramReader = new StFtpcParamReader(m_clusterpars);
00203
00204
00205
00206
00207 dbReader = new StFtpcDbReader(m_dimensions,
00208 m_padrow_z,
00209 m_efield,
00210 m_vdrift,
00211 m_deflection,
00212 m_dvdriftdp,
00213 m_ddeflectiondp,
00214 m_electronics,
00215 m_gas,
00216 m_driftfield);
00217
00218
00219
00220 return kStOK;
00221
00222 }
00223
00224
00231 void StFtpcCalibMaker::DoLaserCalib(TString filename,int ftpc, int lsec, int straight, int gfit, int minz, int maxz, int minrad, int maxrad, char* t0, char* gas, float gastemp, float mbfield)
00232 {
00233 if (ftpc == 1) LOG_INFO<<"StFtpcCalibMaker::DoLaserCalib - entered for FTPC West"<<endm;
00234 if (ftpc == 2) LOG_INFO<<"StFtpcCalibMaker::DoLaserCalib - entered for FTPC East"<<endm;
00235 Int_t i=0;
00236 Int_t ntracksold=0;
00237 Int_t neventold=2;
00238
00239 if (ftpc == 1){
00240 Float_t adjustedAirPressureWest = normalizedNowPressure*((baseTemperature+STP_Temperature)/(gasTemperatureWest+gastemp+STP_Temperature));
00241 deltap = adjustedAirPressureWest - standardPressure;
00242 LOG_INFO << "d_TempWest = " << gastemp << " adjustedAirPressureWest = " << adjustedAirPressureWest << " deltap West = " << deltap << endm;
00243 }
00244 if (ftpc == 2) {
00245 Float_t adjustedAirPressureEast = normalizedNowPressure*((baseTemperature+STP_Temperature)/(gasTemperatureEast+gastemp+STP_Temperature));
00246 deltap = adjustedAirPressureEast - standardPressure;
00247 LOG_INFO << "d_TempEast = " << gastemp << " adjustedAirPressureEast = " << adjustedAirPressureEast << " deltap East = " << deltap << endm;
00248 }
00249
00250 Bool_t laserRun = kTRUE;
00251 dbReader->setLaserRun(laserRun);
00252
00253
00254 tZero = dbReader->laserTZero();
00255 LOG_INFO<<"StFtpcCalibMaker::DoLaserCalib() - laserTZero = "<<tZero<<endm;
00256
00257 LOG_INFO<<"StFtpcCalibMaker::DoLaserCalib() ..."<<endm;
00258
00259
00260
00261 LOG_INFO<<" "<<endm;
00262 LOG_INFO<<"StFtpcCalibMaker::DoLaserCalib() - Reading Magnetic-Field maps..."<<endm;
00263 LOG_INFO<<" "<<endm;
00264
00265 StarMagField *m_magf=new StarMagField(StarMagField::kMapped, mbfield, kTRUE);
00266
00267
00268
00269
00270
00271 trafo=new StFtpcLaserTrafo(dbReader,paramReader,atof(t0),atof(gas),micropertime,deltap,mbfield,tZero);
00272 if (trafo->calcpadtrans()) {
00273 LOG_INFO<<"StFtpcCalibMaker::DoLaserCalib - calcpadtrans done !"<<endm;
00274 }
00275 else{
00276 LOG_FATAL<<"StFtpcCalibMaker::DoLaserCalib - fatal error in calcpadtrans !"<<endm;
00277 delete trafo;
00278 return;
00279 }
00280
00281
00282 StFtpcLaserCalib *l=new StFtpcLaserCalib(ftpc,lsec,straight,gfit,minz,maxz,minrad,maxrad,atof(t0),atof(gas),gastemp,trafo,m_magf);
00283
00284 l->Init(filename);
00285 l->MakeOutput(filename,t0,gas,gastemp);
00286
00287 Int_t maxentries=l->btcluster->GetEntries();
00288 LOG_INFO<<" "<<endm;
00289 LOG_INFO<<"StFtpcCalibMaker::DoLaserCalib() - processing Cluster-on-Track-Tree with "<<maxentries<<" clusters... please be patient"<<endm;
00290 LOG_INFO<<" "<<endm;
00291
00292 for (int k=0;k<=maxentries;k++)
00293 {
00294 if (k%(maxentries/10)==0 && k>0) {
00295
00296 }
00297 l->GetTreeEntry(k);
00298
00299
00300 int hardsec = 6*(int)((l->tcluster.row-1)/2) + l->tcluster.sec;
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 if (l->tevent.nevent==neventold)
00311 {
00312 if (l->tcluster.ntracks==ntracksold)
00313 {
00314 l->fillarray(l->thit.x,l->thit.y,l->thit.z,l->thit.ex,l->thit.ey,i,hardsec,l->tcluster.padpos,l->tcluster.padpossigma,l->tcluster.sec,l->tcluster.row,l->tcluster.timepos,l->tcluster.padlength,l->tcluster.timelength,l->tcluster.peakheight,l->tcluster.charge);
00315 i++;
00316 }
00317 else
00318 {
00319 if (l->laser_straight(l->radius,i)==l->STRAIGHT || l->STRAIGHT==3)
00320 if (l->laser_fit(i)==0) {}
00321
00322 i=0;
00323 l->fillarray(l->thit.x,l->thit.y,l->thit.z,l->thit.ex,l->thit.ey,i,hardsec,l->tcluster.padpos,l->tcluster.padpossigma,l->tcluster.sec,l->tcluster.row,l->tcluster.timepos,l->tcluster.padlength,l->tcluster.timelength,l->tcluster.peakheight,l->tcluster.charge);
00324 i++;
00325 }
00326 }
00327 else
00328 {
00329 if (l->laser_straight(l->radius,i)==l->STRAIGHT || l->STRAIGHT==3)
00330 if (l->laser_fit(i)==0) {}
00331
00332 i=0;
00333 l->fillarray(l->thit.x,l->thit.y,l->thit.z,l->thit.ex,l->thit.ey,i,hardsec,l->tcluster.padpos,l->tcluster.padpossigma,l->tcluster.sec,l->tcluster.row,l->tcluster.timepos,l->tcluster.padlength,l->tcluster.timelength,l->tcluster.peakheight,l->tcluster.charge);
00334 i++;
00335 }
00336
00337 neventold=l->tevent.nevent;
00338 ntracksold=l->tcluster.ntracks;
00339 }
00340
00341 if (l->laser_straight(l->radius,i)==l->STRAIGHT || l->STRAIGHT==3)
00342 if (l->laser_fit(i)==0) {}
00343
00344 l->MakePs();
00345 l->PositionLog();
00346
00347 l->analyse_defl();
00348
00349 delete l;
00350
00351 if (t0!=0)
00352 delete trafo;
00353
00354 delete m_magf;
00355
00356 LOG_INFO<<" "<<endm;
00357 LOG_INFO<<"Laser calibration done :-) !"<<endm;
00358 LOG_INFO<<" "<<endm;
00359 }
00360
00361
00362
00369 void StFtpcCalibMaker::DoT0Calib(TString filename, char* t0, char* gas, float mbfield)
00370 {
00371
00372
00373 Bool_t laserRun = kFALSE;
00374 dbReader->setLaserRun(laserRun);
00375
00376 tZero = dbReader->tZero();
00377 LOG_INFO<<"StFtpcCalibMaker::DoT0Calib entered with filename "<<filename<<" t0 "<<t0<<" gas "<<gas<<" mbfield "<<mbfield<<" and tZero = "<<tZero<<endm;
00378
00379
00380
00381
00382
00383
00384 deltap = deltapW;
00385 LOG_INFO<<"StFtpcCalibMaker::DoT0Calib deltap = deltapW = "<<deltap<<endm;
00386
00387
00388 trafo = new StFtpcLaserTrafo(dbReader,paramReader,atof(t0),atof(gas),micropertime,deltap,mbfield,tZero);
00389
00390 if (trafo->calcpadtrans()) {
00391 LOG_INFO<<"StFtpcCalibMaker::DoT0Calib - calcpadtrans (west) done !"<<endm;
00392 }
00393 else {
00394 LOG_FATAL<<"StFtpcCalibMaker::DoT0Calib - fatal error in calcpadtrans west !"<<endm;
00395 delete trafo;
00396 return;
00397 }
00398
00399
00400
00401 deltap = deltapE;
00402 LOG_INFO<<"StFtpcCalibMaker::DoT0Calib deltap = deltapE = "<<deltap<<endm;
00403
00404 trafo2 = new StFtpcLaserTrafo(dbReader,paramReader,atof(t0),atof(gas),micropertime,deltap,mbfield,tZero);
00405
00406 if (trafo2->calcpadtrans()) {
00407 LOG_INFO<<"StFtpcCalibMaker::DoT0Calib - calcpadtrans (east) done !"<<endm;
00408 }
00409 else {
00410 LOG_FATAL<<"StFtpcCalibMaker::DoT0Calib - fatal error in calcpadtrans east !"<<endm;
00411 delete trafo2;
00412 return;
00413 }
00414
00415
00416
00417
00418 LOG_INFO<<"StFtpcCalibMaker::DoT0Calib() ..."<<endm;
00419
00420 HistInit(4,filename,t0,gas);
00421
00422 StFtpcLaser *l=new StFtpcLaser();
00423
00424 l->Init(filename);
00425
00426 Int_t maxentries=(int) l->bcluster->GetEntries();
00427
00428 LOG_INFO<<" "<<endm;
00429 LOG_INFO<<"StFtpcCalibMaker::DoT0Calib() - processing Cluster-Tree with "<<maxentries<<" clusters... please be patient"<<endm;
00430 LOG_INFO<<" "<<endm;
00431
00432 Float_t x,y,rad;
00433
00434 for (int k=0;k<=maxentries;k++) {
00435
00436 if (k%(maxentries/10)==0 && k>0) {
00437
00438 }
00439
00440 l->GetClusterTreeEntry(k);
00441
00442
00443
00444 if (l->cluster.sec<31)
00445 trafo->padtrans(l->cluster.row,l->cluster.sec,l->cluster.timepos,l->cluster.padpos,&x,&y);
00446 else
00447 trafo2->padtrans(l->cluster.row,l->cluster.sec,l->cluster.timepos,l->cluster.padpos,&x,&y);
00448
00449
00450
00451
00452
00453
00454 rad=sqrt(x*x+y*y);
00455
00456 if (l->cluster.sec<31) {
00457 hradwall->Fill(rad);
00458 hradw->Fill(rad);
00459 htimew->Fill(l->cluster.timepos);
00460 }
00461 else {
00462 hradeall->Fill(rad);
00463 hrade->Fill(rad);
00464 htimee->Fill(l->cluster.timepos);
00465 }
00466
00467 }
00468
00469 delete l;
00470
00471 if (t0!=0)
00472 {
00473 delete trafo;delete trafo2;
00474 }
00475
00476 MakeT0Ps(4,filename,t0,gas);
00477
00478
00479 anaf->Write();
00480 anaf->Close();
00481
00482 LOG_INFO<<" "<<endm;
00483 LOG_INFO<<"T0 calibration done :-) !"<<endm;
00484 LOG_INFO<<" "<<endm;
00485 }
00486
00487
00488
00495 void StFtpcCalibMaker::HistInit(int nradbins,TString fname, char* t0, char* gas)
00496 {
00497
00498 TString outname=fname;
00499 outname +="_";
00500 outname +=t0;
00501 outname +="_";
00502 outname +=gas;
00503 outname +="_t0.root";
00504
00505
00506
00507
00508 LOG_INFO<<"StFtpcCalibMaker::HistInit - Store histograms in ROOT-file : "<<outname<<endm;
00509
00510 anaf=new TFile(outname,"RECREATE");
00511
00512 hradeall=new TH1F("rad_east_all","radius FTPC East",nradbins*31,0.5,31.5);
00513 hradwall=new TH1F("rad_west_all","radius FTPC West",nradbins*31,0.5,31.5);
00514
00515 hrade=new TH1F("rad_east","radius FTPC East",nradbins*7,5,12);
00516 hradw=new TH1F("rad_west","radius FTPC West",nradbins*7,5,12);
00517
00518 htimee=new TH1F("time_east","Timepos. FTPC East",45,140,185);
00519 htimew=new TH1F("time_west","Timepos. FTPC West",45,140,185);
00520
00521 }
00522
00523
00524
00531 void StFtpcCalibMaker::MakeT0Ps(int nradbins,TString psname, char* t0, char* gas)
00532 {
00533
00534 TString outname=psname;
00535 outname +="_";
00536 outname +=t0;
00537 outname +="_";
00538 outname +=gas;
00539 outname +="_t0.ps";
00540
00541 LOG_INFO<<" "<<endl;
00542 LOG_INFO<<"StFtpcCalibMaker::MakeT0Ps - make ps file "<<outname<<endm;
00543 LOG_INFO<<" "<<endm;
00544
00545 TCanvas *c1 = new TCanvas("c1","ps",200,10,700,500);
00546
00547 TPostScript *fps=new TPostScript(outname,112);
00548
00549 fps->NewPage();
00550
00551 c1->Divide(2,2);
00552
00553 TLine *inner=new TLine();
00554
00555 c1->cd(1);
00556 hradwall->Draw();inner=new TLine(7.8,0,7.8,hradwall->GetMaximum());inner->SetLineColor(2);inner->Draw();
00557 c1->cd(2);
00558 hradeall->Draw();inner=new TLine(7.8,0,7.8,hradeall->GetMaximum());inner->SetLineColor(2);inner->Draw();
00559 c1->cd(3);
00560 hradw->Draw();inner=new TLine(7.8,0,7.8,hradw->GetMaximum());inner->SetLineColor(2);inner->Draw();
00561 c1->cd(4);
00562 hrade->Draw();inner=new TLine(7.8,0,7.8,hrade->GetMaximum());inner->SetLineColor(2);inner->Draw();
00563
00564 c1->Update();
00565
00566
00567
00568 fps->NewPage();
00569
00570 c1->cd(1);
00571
00572 hradw->Scale(1/hradw->Integral(0,nradbins*7));
00573 hrade->Scale(1/hrade->Integral(0,nradbins*7));
00574
00575 hrade->Draw();hradw->SetLineColor(3);hradw->Draw("same");
00576 inner=new TLine(7.8,0,7.8,hrade->GetMaximum());inner->SetLineColor(2);inner->Draw();
00577
00578 c1->cd(2);
00579 htimee->Scale(1/htimee->GetEntries());htimew->Scale(1/htimew->GetEntries());
00580 htimee->DrawCopy();htimew->SetLineColor(3);htimew->DrawCopy("same");
00581
00582
00583
00584
00585 c1->Update();
00586
00587 fps->Close();
00588
00589 delete c1;
00590 }