55 MsgStream log(
msgSvc(), name() );
56 log << MSG::INFO <<
"DedxCalibDocaEAng::FillHists()" << endmsg;
58 TFile *
f, *f_test( 0 );
59 TTree *n103, *t_test( 0 );
62 double doca_test( 0 ), eang_test( 0 );
64 double dEdx[100] = { 0 }, pathlength[100] = { 0 }, wid[100] = { 0 }, layid[100] = { 0 },
65 dd_in[100] = { 0 }, eangle[100] = { 0 }, zhit[100] = { 0 };
66 float runNO = 0, evtNO = 0, runFlag = 0, costheta = 0, tes = 0, charge = 0, recalg = 0,
67 ptrk = 0, chidedx = 0;
71 f_test =
new TFile(
"doca_eangle_test.root",
"recreate" );
72 t_test =
new TTree(
"inftest",
"information for test doca eangle calibration" );
73 t_test->Branch(
"idoca", &m_idoca_test,
"idoca/I" );
74 t_test->Branch(
"ieang", &m_ieang_test,
"ieang/I" );
75 t_test->Branch(
"doca", &doca_test,
"doca/D" );
76 t_test->Branch(
"eang", &eang_test,
"eang/D" );
82 cout <<
"runlist: " << runlist.c_str() << endl;
83 f =
new TFile( runlist.c_str() );
84 n103 = (TTree*)
f->Get(
"n103" );
87 cout <<
"the file is empty" << endl;
92 cout <<
"the tree is empty" << endl;
95 n103->SetBranchAddress(
"ndedxhit", &ndedxhit );
96 n103->SetBranchAddress(
"dEdx_hit", dEdx );
97 n103->SetBranchAddress(
"pathlength_hit", pathlength );
98 n103->SetBranchAddress(
"wid_hit", wid );
99 n103->SetBranchAddress(
"layid_hit", layid );
100 n103->SetBranchAddress(
"dd_in_hit", dd_in );
101 n103->SetBranchAddress(
"eangle_hit", eangle );
102 n103->SetBranchAddress(
"zhit_hit", zhit );
103 n103->SetBranchAddress(
"runNO", &runNO );
104 n103->SetBranchAddress(
"evtNO", &evtNO );
105 n103->SetBranchAddress(
"runFlag", &runFlag );
106 n103->SetBranchAddress(
"costheta", &costheta );
107 n103->SetBranchAddress(
"t0", &tes );
108 n103->SetBranchAddress(
"charge", &charge );
109 n103->SetBranchAddress(
"recalg", &recalg );
110 n103->SetBranchAddress(
"ptrk", &ptrk );
111 n103->SetBranchAddress(
"chidedx_e", &chidedx );
113 vector<double> m_phlist_test( 0 );
114 for (
int j = 0; j < n103->GetEntries(); j++ )
117 if ( ptrk > pMax || ptrk < pMin )
continue;
118 if ( tes > 1400 )
continue;
133 for (
int k = 0; k < ndedxhit; k++ )
136 dd_in[k] = dd_in[k] / doca_norm[int( layid[k] )];
137 if ( eangle[k] > 0.25 ) eangle[k] = eangle[k] - 0.5;
138 else if ( eangle[k] < -0.25 ) eangle[k] = eangle[k] + 0.5;
142 if ( layid[k] < 4 )
continue;
151 for (
int i = 0; i < 14; i++ )
153 if ( eangle[k] < Eangle_value_cut[i] || eangle[k] >= Eangle_value_cut[i + 1] )
155 else if ( eangle[k] >= Eangle_value_cut[i] && eangle[k] < Eangle_value_cut[i + 1] )
157 for (
int m = 0; m < i; m++ ) { iEAng += Eangle_cut_bin[m]; }
158 double eangle_bin_cut_step =
159 ( Eangle_value_cut[i + 1] - Eangle_value_cut[i] ) / Eangle_cut_bin[i];
160 int temp_bin = int( ( eangle[k] - Eangle_value_cut[i] ) / eangle_bin_cut_step );
164 if ( m_debug && ( iDoca == m_idoca_test ) && ( iEAng == m_ieang_test ) )
166 doca_test = dd_in[k];
167 eang_test = eangle[k];
169 cout <<
"dedx before cor: " << dEdx[k] * 1.5 / pathlength[k] << endl;
171 dEdx[k] =
exsvc->StandardHitCorrec(
172 0, runFlag, 2, runNO, evtNO, pathlength[k], wid[k], layid[k], dEdx[k],
173 ( dd_in[k] ) * ( doca_norm[
int( layid[k] )] ), eangle[k], costheta );
174 dEdx[k] =
exsvc->StandardTrackCorrec( 0, runFlag, 2, runNO, evtNO, dEdx[k], costheta,
176 m_docaeangle[iDoca][iEAng]->Fill( dEdx[k] );
177 if ( m_debug && ( iDoca == m_idoca_test ) && ( iEAng == m_ieang_test ) )
178 { cout <<
"dedx after cor: " << dEdx[k] << endl << endl; }
195 MsgStream log(
msgSvc(), name() );
196 log << MSG::INFO <<
"DedxCalibDocaEAng::AnalyseHists()" << endmsg;
199 Double_t entry = 0, mean = 0, rms = 0;
201 Double_t lp[3] = { 0 };
202 gStyle->SetOptFit( 1111 );
207 entry = m_docaeangle[id][ip]->GetEntries();
208 if ( entry < 10 )
continue;
209 mean = m_docaeangle[id][ip]->GetMean();
210 rms = m_docaeangle[id][ip]->GetRMS();
211 binmax = m_docaeangle[id][ip]->GetMaximumBin();
212 lp[1] = m_docaeangle[id][ip]->GetBinCenter( binmax );
214 lp[0] = ( m_docaeangle[id][ip]->GetBinContent( binmax ) +
215 m_docaeangle[
id][ip]->GetBinContent( binmax - 1 ) +
216 m_docaeangle[
id][ip]->GetBinContent( binmax + 1 ) ) /
221 func =
new TF1(
"mylan",
mylan, 10, 3000, 4 );
222 func->SetParameters( entry, mean, rms, -0.8 );
223 func->SetParLimits( 0, 0, entry );
224 func->SetParLimits( 1, 0, mean );
225 func->SetParLimits( 2, 10, rms );
226 func->SetParLimits( 3, -1, 0 );
227 func->SetParameters( entry / 36., mean - 200, rms / 2.3, -0.5 );
231 func =
new TF1(
"landaun",
landaun, 10, 3000, 3 );
232 func->SetParameters( lp[0], lp[1], lp[2] );
236 func =
new TF1(
"Landau",
Landau, 10, 3000, 2 );
237 func->SetParameters( 0.7 * mean, rms );
241 func =
new TF1(
"Vavilov",
Vavilov, 10, 3000, 2 );
242 func->SetParameters( 0.05, 0.6 );
246 func =
new TF1(
"AsymGauss",
AsymGauss, 10, 3000, 4 );
247 func->SetParameters( entry, mean, rms, 1.0 );
249 func->SetLineWidth( 2.1 );
250 func->SetLineColor( 2 );
252 m_docaeangle[id][ip]->Fit( func,
"rq" );
258 MsgStream log(
msgSvc(), name() );
259 log << MSG::INFO <<
"DedxCalibDocaEAng::WriteHists()" << endmsg;
262 double Out_entryNo[totalNo] = { 0 }, Out_mean[totalNo] = { 0 }, Out_sigma[totalNo] = { 0 },
263 Out_fitmean[totalNo] = { 0 }, Out_fitmeanerr[totalNo] = { 0 },
264 Out_fitsigma[totalNo] = { 0 }, Out_gain[totalNo] = { 0 };
265 double Iner_entryNo[totalNo] = { 0 }, Iner_mean[totalNo] = { 0 },
266 Iner_sigma[totalNo] = { 0 }, Iner_fitmean[totalNo] = { 0 },
267 Iner_fitmeanerr[totalNo] = { 0 }, Iner_fitsigma[totalNo] = { 0 },
268 Iner_gain[totalNo] = { 0 };
269 double Id_doca[totalNo] = { 0 }, Ip_eangle[totalNo] = { 0 }, doca[totalNo] = { 0 },
270 eangle[totalNo] = { 0 }, chisq[totalNo] = { 0 };
272 double Norm( 0 ),
count( 0 );
281 for ( ; i < 14; i++ )
283 if ( ip >= iE && ip < iE + Eangle_cut_bin[i] )
break;
284 iE = iE + Eangle_cut_bin[i];
288 Eangle_value_cut[i] + ( ip - iE + 0.5 ) *
289 ( Eangle_value_cut[i + 1] - Eangle_value_cut[i] ) /
293 Out_entryNo[
id *
NumSlicesEAng + ip] = m_docaeangle[id][ip]->GetEntries();
294 Out_mean[
id *
NumSlicesEAng + ip] = m_docaeangle[id][ip]->GetMean();
295 Out_sigma[
id *
NumSlicesEAng + ip] = m_docaeangle[id][ip]->GetRMS();
303 m_docaeangle[id][ip]->GetFunction(
"mylan" )->GetParameter( 1 );
305 m_docaeangle[id][ip]->GetFunction(
"mylan" )->GetParError( 1 );
307 m_docaeangle[id][ip]->GetFunction(
"mylan" )->GetParameter( 2 );
311 ( m_docaeangle[id][ip]->GetFunction(
"mylan" )->GetChisquare() ) /
312 ( m_docaeangle[id][ip]->GetFunction(
"mylan" )->GetNDF() );
317 m_docaeangle[id][ip]->GetFunction(
"landaun" )->GetParameter( 1 );
319 m_docaeangle[id][ip]->GetFunction(
"landaun" )->GetParError( 1 );
321 m_docaeangle[id][ip]->GetFunction(
"landaun" )->GetParameter( 2 );
323 ( m_docaeangle[id][ip]->GetFunction(
"landaun" )->GetChisquare() ) /
324 ( m_docaeangle[id][ip]->GetFunction(
"landaun" )->GetNDF() );
329 m_docaeangle[id][ip]->GetFunction(
"Landau" )->GetParameter( 1 );
331 m_docaeangle[id][ip]->GetFunction(
"Landau" )->GetParError( 1 );
333 m_docaeangle[id][ip]->GetFunction(
"Landau" )->GetParameter( 2 );
335 ( m_docaeangle[id][ip]->GetFunction(
"Landau" )->GetChisquare() ) /
336 ( m_docaeangle[id][ip]->GetFunction(
"Landau" )->GetNDF() );
341 m_docaeangle[id][ip]->GetFunction(
"Vavilov" )->GetParameter( 1 );
343 m_docaeangle[id][ip]->GetFunction(
"Vavilov" )->GetParError( 1 );
345 m_docaeangle[id][ip]->GetFunction(
"Vavilov" )->GetParameter( 2 );
347 ( m_docaeangle[id][ip]->GetFunction(
"Vavilov" )->GetChisquare() ) /
348 ( m_docaeangle[id][ip]->GetFunction(
"Vavilov" )->GetNDF() );
353 m_docaeangle[id][ip]->GetFunction(
"AsymGauss" )->GetParameter( 1 );
355 m_docaeangle[id][ip]->GetFunction(
"AsymGauss" )->GetParError( 1 );
357 m_docaeangle[id][ip]->GetFunction(
"AsymGauss" )->GetParameter( 2 );
359 ( m_docaeangle[id][ip]->GetFunction(
"AsymGauss" )->GetChisquare() ) /
360 ( m_docaeangle[id][ip]->GetFunction(
"AsymGauss" )->GetNDF() );
363 m_DocaEAngAverdE->SetBinContent(
id + 1, ip + 1, Out_fitmean[
id *
NumSlicesEAng + ip] );
377 cout <<
"count= " <<
count <<
" average value of doca eangle bins: " << Norm << endl;
378 for ( Int_t i = 0; i < totalNo; i++ )
380 if ( Out_entryNo[i] > 10 && Out_fitmean[i] > 0 && Out_fitsigma[i] > 0 )
381 Out_gain[i] = Out_fitmean[i] / Norm;
382 else Out_gain[i] = 0;
385 log << MSG::INFO <<
"begin generating root file!!! " << endmsg;
386 TFile*
f =
new TFile(
m_rootfile.c_str(),
"recreate" );
389 for ( Int_t ip = 0; ip <
NumSlicesEAng; ip++ ) { m_docaeangle[id][ip]->Write(); }
391 m_DocaEAngAverdE->Write();
393 TTree* ddgcalib =
new TTree(
"ddgcalib",
"ddgcalib" );
394 ddgcalib->Branch(
"Out_hits", Out_entryNo,
"Out_entryNo[1600]/D" );
395 ddgcalib->Branch(
"Out_mean", Out_mean,
"Out_mean[1600]/D" );
396 ddgcalib->Branch(
"Out_sigma", Out_sigma,
"Out_sigma[1600]/D" );
397 ddgcalib->Branch(
"Out_fitmean", Out_fitmean,
"Out_fitmean[1600]/D" );
398 ddgcalib->Branch(
"Out_fitmeanerr", Out_fitmeanerr,
"Out_fitmeanerr[1600]/D" );
399 ddgcalib->Branch(
"Out_chi", Out_fitsigma,
"Out_fitsigma[1600]/D" );
400 ddgcalib->Branch(
"Out_gain", Out_gain,
"Out_gain[1600]/D" );
401 ddgcalib->Branch(
"Iner_hits", Iner_entryNo,
"Iner_entryNo[1600]/D" );
402 ddgcalib->Branch(
"Iner_mean", Iner_mean,
"Iner_mean[1600]/D" );
403 ddgcalib->Branch(
"Iner_sigma", Iner_sigma,
"Iner_sigma[1600]/D" );
404 ddgcalib->Branch(
"Iner_fitmean", Iner_fitmean,
"Iner_fitmean[1600]/D" );
405 ddgcalib->Branch(
"Iner_fitmeanerr", Iner_fitmeanerr,
"Iner_fitmeanerr[1600]/D" );
406 ddgcalib->Branch(
"Iner_chi", Iner_fitsigma,
"Iner_fitsigma[1600]/D" );
407 ddgcalib->Branch(
"Iner_gain", Iner_gain,
"Iner_gain[1600]/D" );
408 ddgcalib->Branch(
"Id_doca", Id_doca,
"Id_doca[1600]/D" );
409 ddgcalib->Branch(
"Ip_eangle", Ip_eangle,
"Ip_eangle[1600]/D" );
410 ddgcalib->Branch(
"chisq", chisq,
"chisq[1600]/D" );
411 ddgcalib->Branch(
"doca", doca,
"doca[1600]/D" );
412 ddgcalib->Branch(
"eangle", eangle,
"eangle[1600]/D" );
417 TCanvas c1(
"c1",
"canvas", 500, 400 );
423 m_docaeangle[id][ip]->Draw();
431 for ( Int_t ip = 0; ip <
NumSlicesEAng; ip++ ) {
delete m_docaeangle[id][ip]; }
433 delete m_DocaEAngAverdE;