File indexing completed on 2025-08-05 08:11:06
0001 #include "get_runstr.h"
0002 #include <iostream>
0003 #include <fstream>
0004 #include <TGraphErrors.h>
0005 #include <TString.h>
0006
0007 int do_zdc = 0;
0008 int do_emcal = 0;
0009 int do_ohcal = 0;
0010 int do_ihcal = 0;
0011 int calc_gain_corr = 1;
0012
0013 const int MAXRUNS = 20000;
0014
0015 int nruns = 0;
0016
0017 void fit_across_runs(TGraphErrors *gainvals[], const char *flist);
0018 void plot_bz();
0019
0020 Double_t bqmeansum[MAXRUNS];
0021 Double_t bqmeansumerr[MAXRUNS];
0022 Double_t bqmeantot[2][MAXRUNS];
0023 Double_t bqmeantoterr[2][MAXRUNS];
0024 Double_t bqmean[128][MAXRUNS];
0025 Double_t bqmeanerr[128][MAXRUNS];
0026 Double_t runindex[MAXRUNS];
0027 TGraphErrors *g_meansum {nullptr};
0028 TGraphErrors *g_meantot[2] {nullptr};
0029 TGraphErrors *g_mean[128] {nullptr};
0030
0031 TFile *tfile[MAXRUNS];
0032 TH1 *h_bbcqsum[MAXRUNS];
0033 TH1 *h_bbcqtot[2][MAXRUNS];
0034 TH1 *h_bbcq[MAXRUNS][128];
0035 TH2 *h2_bbcq[128];
0036
0037 TH1 *h_zdce[MAXRUNS];
0038 TH1 *h_emcale[MAXRUNS];
0039 TH1 *h_ohcale[MAXRUNS];
0040 TH1 *h_ihcale[MAXRUNS];
0041
0042 TH1 *h_bz[MAXRUNS];
0043
0044 TCanvas *cv[100];
0045 int icv = 0;
0046
0047
0048 void fit_across_runs(TGraphErrors *gainvals[], const char *flist)
0049 {
0050 TString meangainfname = "results/"; meangainfname.Append( flist );
0051 meangainfname.ReplaceAll(".list","_qmean.calib");
0052 ofstream meangainfile( meangainfname );
0053 TF1 *f_meangain[128] {nullptr};
0054 Double_t grp_mean[128];
0055 Double_t grp_meanerr[128];
0056 for (int ipmt=0; ipmt<128; ipmt++)
0057 {
0058 TString name = "f_meangain"; name += ipmt;
0059 f_meangain[ipmt] = new TF1(name,"pol0",0,1e9);
0060 gainvals[ipmt]->Fit(f_meangain[ipmt]);
0061 gPad->Update();
0062 gPad->Modified();
0063 grp_mean[ipmt] = f_meangain[ipmt]->GetParameter(0);
0064 grp_meanerr[ipmt] = f_meangain[ipmt]->GetParError(0);
0065
0066 meangainfile << ipmt << "\t" << grp_mean[ipmt] << "\t" << grp_meanerr[ipmt] << endl;
0067 cout << ipmt << "\t" << grp_mean[ipmt] << "\t" << grp_meanerr[ipmt] << endl;
0068 }
0069 meangainfile.close();
0070 }
0071
0072
0073 TH2 *h2_bzvsirun{nullptr};
0074 void plot_bz()
0075 {
0076 int nbinsx = h_bz[0]->GetNbinsX();
0077 double xmin = h_bz[0]->GetBinLowEdge(1);
0078 double xmax = h_bz[0]->GetBinLowEdge(nbinsx+1);
0079 h2_bzvsirun = new TH2F("h2_bzvsirun","MBD_z vs run idx",nruns,0,nruns,nbinsx,xmin,xmax);
0080
0081 for (int irun=0; irun<nruns; irun++)
0082 {
0083 if ( h_bz[irun]->Integral() == 0 )
0084 {
0085 cout << irun << endl;
0086 }
0087 for (int ibin=1; ibin<=nbinsx; ibin++)
0088 {
0089 float val = h_bz[irun]->GetBinContent(ibin);
0090 h2_bzvsirun->SetBinContent(irun+1,ibin,val);
0091 }
0092 }
0093
0094 cv[icv] = new TCanvas("bz","bz",1000,600);
0095 h2_bzvsirun->Draw("colz");
0096 }
0097
0098 void plot_checks(const char *flistname = "c.list")
0099 {
0100
0101 ifstream flist(flistname);
0102
0103 TString dir = "results/plot_checks_"; dir += flistname;
0104 dir.ReplaceAll(".list","/");
0105 TString name = "mkdir -p " + dir;
0106 cout << name << endl;
0107 gSystem->Exec( name );
0108
0109 TString dstfname;
0110 while ( flist >> dstfname )
0111 {
0112 tfile[nruns] = new TFile(dstfname,"READ");
0113
0114 h_bz[nruns] = (TH1*)tfile[nruns]->Get("h_bz");
0115
0116 h_bbcqsum[nruns] = (TH1*)tfile[nruns]->Get("h_bbcqsum");
0117 h_bbcqtot[0][nruns] = (TH1*)tfile[nruns]->Get("h_bbcqtot0");
0118 h_bbcqtot[1][nruns] = (TH1*)tfile[nruns]->Get("h_bbcqtot1");
0119 bqmeansum[nruns] = h_bbcqsum[nruns]->GetMean();
0120 bqmeansumerr[nruns] = h_bbcqsum[nruns]->GetMeanError();
0121 bqmeantot[0][nruns] = h_bbcqtot[0][nruns]->GetMean();
0122 bqmeantoterr[0][nruns] = h_bbcqtot[0][nruns]->GetMeanError();
0123 bqmeantot[1][nruns] = h_bbcqtot[0][nruns]->GetMean();
0124 bqmeantoterr[1][nruns] = h_bbcqtot[0][nruns]->GetMeanError();
0125
0126 h_zdce[nruns] = (TH1*)tfile[nruns]->Get("h_zdce");
0127 h_emcale[nruns] = (TH1*)tfile[nruns]->Get("h_emcale");
0128 h_ohcale[nruns] = (TH1*)tfile[nruns]->Get("h_ohcale");
0129 h_ihcale[nruns] = (TH1*)tfile[nruns]->Get("h_ihcale");
0130
0131 for (int ipmt=0; ipmt<128; ipmt++)
0132 {
0133 name = "h_q"; name += ipmt;
0134 h_bbcq[nruns][ipmt] = (TH1*)tfile[nruns]->Get(name);
0135 bqmean[ipmt][nruns] = h_bbcq[nruns][ipmt]->GetMean();
0136 bqmeanerr[ipmt][nruns] = h_bbcq[nruns][ipmt]->GetMeanError();
0137 }
0138
0139 runindex[nruns] = nruns;
0140 nruns++;
0141 }
0142 cout << "Processed " << nruns << " runs." << endl;
0143
0144 plot_bz();
0145 return;
0146
0147 TCanvas *bc = new TCanvas("bc","mean fits",800,600);
0148 TString title;
0149 TString meangainfname = dir + flistname;
0150 meangainfname.ReplaceAll(".list","_qmean.calib");
0151 ofstream meanfile( meangainfname );
0152 TF1 *meanfit = new TF1("meanfit","pol0",0,nruns);
0153 double runmean[128];
0154 double runmeanerr[128];
0155 double chi2ndf[128];
0156 for (int ipmt=0; ipmt<128; ipmt++)
0157 {
0158 g_mean[ipmt] = new TGraphErrors(nruns,runindex,bqmean[ipmt],0,bqmeanerr[ipmt]);
0159 name = "q_mean"; name += ipmt;
0160 title = name;
0161 g_mean[ipmt]->SetName( name );
0162 g_mean[ipmt]->SetTitle( title );
0163
0164 g_mean[ipmt]->Draw("ap");
0165 meanfit->SetParameter(0,100);
0166 g_mean[ipmt]->Fit(meanfit,"R");
0167 gPad->Modified();
0168 gPad->Update();
0169
0170 runmean[ipmt] = meanfit->GetParameter(0);
0171 runmeanerr[ipmt] = meanfit->GetParError(0);
0172 Double_t chi2 = meanfit->GetChisquare();
0173 Double_t ndf = meanfit->GetNDF();
0174 chi2ndf[ipmt] = chi2/ndf;
0175
0176 meanfile << ipmt << "\t" << runmean[ipmt] << "\t" << runmeanerr[ipmt] << "\t" << chi2ndf[ipmt] << endl;
0177 cout << ipmt << "\t" << runmean[ipmt] << "\t" << runmeanerr[ipmt] << "\t" << chi2ndf[ipmt] << endl;
0178 }
0179 meanfile.close();
0180
0181
0182 TH2 *h2_bbcqsum_vs_run = new TH2F("h2_bbcqsum_vs_run","bbc qsum vs run",nruns,0,nruns,3000,0,3000);
0183 TH2 *h2_bbcqs_vs_run = new TH2F("h2_bbcqs_vs_run","bbc south qsum vs run",nruns,0,nruns,1400,0,1400);
0184 TH2 *h2_bbcqn_vs_run = new TH2F("h2_bbcqn_vs_run","bbc north qsum vs run",nruns,0,nruns,1400,0,1400);
0185 for (int ipmt=0; ipmt<128; ipmt++)
0186 {
0187 name = "h2_bbcq"; name += ipmt;
0188 h2_bbcq[ipmt] = new TH2F(name,name,nruns,0,nruns,1200,0,60);
0189 }
0190 TH2 *h2_zdce_vs_run {nullptr};
0191 TH2 *h2_emcale_vs_run {nullptr};
0192 TH2 *h2_ohcale_vs_run {nullptr};
0193 TH2 *h2_ihcale_vs_run {nullptr};
0194 if ( do_zdc )
0195 {
0196 int nbinsx = h_zdce[0]->GetNbinsX();
0197 Double_t xmin = h_zdce[0]->GetBinLowEdge(1);
0198 Double_t xmax = h_zdce[0]->GetBinLowEdge(nbinsx+1);
0199 h2_zdce_vs_run = new TH2F("h2_zdce_vs_run","ZDC E vs run",nruns,0,nruns,nbinsx,xmin,xmax);
0200 }
0201 if ( do_emcal )
0202 {
0203 int nbinsx = h_emcale[0]->GetNbinsX();
0204 Double_t xmin = h_emcale[0]->GetBinLowEdge(1);
0205 Double_t xmax = h_emcale[0]->GetBinLowEdge(nbinsx+1);
0206 h2_emcale_vs_run = new TH2F("h2_emcale_vs_run","EMC E vs run",nruns,0,nruns,nbinsx,xmin,xmax);
0207 }
0208 if ( do_ohcal )
0209 {
0210 int nbinsx = h_ohcale[0]->GetNbinsX();
0211 Double_t xmin = h_ohcale[0]->GetBinLowEdge(1);
0212 Double_t xmax = h_ohcale[0]->GetBinLowEdge(nbinsx+1);
0213 h2_ohcale_vs_run = new TH2F("h2_ohcale_vs_run","OHCAL E vs run",nruns,0,nruns,nbinsx,xmin,xmax);
0214 }
0215 if ( do_ihcal )
0216 {
0217 int nbinsx = h_ihcale[0]->GetNbinsX();
0218 Double_t xmin = h_ihcale[0]->GetBinLowEdge(1);
0219 Double_t xmax = h_ihcale[0]->GetBinLowEdge(nbinsx+1);
0220 h2_ihcale_vs_run = new TH2F("h2_ihcale_vs_run","iHCAL E vs run",nruns,0,nruns,nbinsx,xmin,xmax);
0221 }
0222
0223
0224 for (int irun=0; irun<nruns; irun++)
0225 {
0226 int nbinsx = h_bbcqsum[irun]->GetNbinsX();
0227 for (int ibin=1; ibin<=nbinsx; ibin++)
0228 {
0229 Float_t val = h_bbcqsum[irun]->GetBinContent(ibin);
0230 Float_t qsum = h_bbcqsum[irun]->GetBinCenter(ibin);
0231 h2_bbcqsum_vs_run->Fill( irun, qsum, val );
0232
0233 val = h_bbcqtot[0][irun]->GetBinContent(ibin);
0234 qsum = h_bbcqtot[0][irun]->GetBinCenter(ibin);
0235 h2_bbcqs_vs_run->Fill( irun, qsum, val );
0236
0237 val = h_bbcqtot[1][irun]->GetBinContent(ibin);
0238 qsum = h_bbcqtot[1][irun]->GetBinCenter(ibin);
0239 h2_bbcqn_vs_run->Fill( irun, qsum, val );
0240 }
0241
0242 for (int ipmt=0; ipmt<128; ipmt++)
0243 {
0244 int nbinsx = h_bbcq[irun][ipmt]->GetNbinsX();
0245 for (int ibin=1; ibin<=nbinsx; ibin++)
0246 {
0247 Double_t val = h_bbcq[irun][ipmt]->GetBinContent(ibin);
0248 Double_t q = h_bbcq[irun][ipmt]->GetBinCenter(ibin);
0249 h2_bbcq[ipmt]->Fill( (Double_t)irun, q, val );
0250 }
0251 }
0252
0253 if ( do_zdc )
0254 {
0255 int nbinsx = h_zdce[irun]->GetNbinsX();
0256 for (int ibin=1; ibin<=nbinsx; ibin++)
0257 {
0258 Float_t val = h_zdce[irun]->GetBinContent(ibin);
0259 Float_t e = h_zdce[irun]->GetBinCenter(ibin);
0260 h2_zdce_vs_run->Fill( irun, e, val );
0261 }
0262 }
0263
0264 if ( do_emcal )
0265 {
0266 int nbinsx = h_emcale[irun]->GetNbinsX();
0267 for (int ibin=1; ibin<=nbinsx; ibin++)
0268 {
0269 Float_t val = h_emcale[irun]->GetBinContent(ibin);
0270 Float_t emce = h_emcale[irun]->GetBinCenter(ibin);
0271 h2_emcale_vs_run->Fill( irun, emce, val );
0272 }
0273 }
0274
0275 if ( do_ohcal )
0276 {
0277 int nbinsx = h_ohcale[irun]->GetNbinsX();
0278 for (int ibin=1; ibin<=nbinsx; ibin++)
0279 {
0280 Float_t val = h_ohcale[irun]->GetBinContent(ibin);
0281 Float_t e = h_ohcale[irun]->GetBinCenter(ibin);
0282 h2_ohcale_vs_run->Fill( irun, e, val );
0283 }
0284 }
0285
0286 if ( do_ihcal )
0287 {
0288 int nbinsx = h_ihcale[irun]->GetNbinsX();
0289 for (int ibin=1; ibin<=nbinsx; ibin++)
0290 {
0291 Float_t val = h_ihcale[irun]->GetBinContent(ibin);
0292 Float_t e = h_ihcale[irun]->GetBinCenter(ibin);
0293 h2_ihcale_vs_run->Fill( irun, e, val );
0294 }
0295 }
0296
0297
0298 }
0299
0300 TCanvas *ac[100];
0301 int icv = 0;
0302
0303 ac[icv] = new TCanvas("mbdq_vs_run2d","MBD Q vs Run",800,600);
0304 h2_bbcqsum_vs_run->SetMinimum(1e-5);
0305 h2_bbcqsum_vs_run->DrawCopy("colz");
0306 gPad->SetLogz(1);
0307
0308 ac[++icv] = new TCanvas("mbdqs_vs_run2d","MBD Q.S vs Run",800,600);
0309 h2_bbcqs_vs_run->SetMinimum(1e-6);
0310 h2_bbcqs_vs_run->DrawCopy("colz");
0311 gPad->SetLogz(1);
0312
0313 ac[++icv] = new TCanvas("mbdqn_vs_run2d","MBD Q.N vs Run",800,600);
0314 h2_bbcqn_vs_run->SetMinimum(1e-6);
0315 h2_bbcqn_vs_run->DrawCopy("colz");
0316 gPad->SetLogz(1);
0317
0318 ac[++icv] = new TCanvas("mbdq_vs_run","MBD Qsum vs Run",800,600);
0319 g_meansum = new TGraphErrors(nruns,runindex,bqmeansum,0,bqmeansumerr);
0320 name = "q_meansum";
0321 title = name;
0322 g_meansum->SetName( name );
0323 g_meansum->SetTitle( title );
0324 g_meansum->SetMarkerStyle(20);
0325 g_meansum->Draw("ap");
0326
0327 ac[++icv] = new TCanvas("mbdqs_vs_run","MBD Q.S vs Run",800,600);
0328 g_meantot[0] = new TGraphErrors(nruns,runindex,bqmeantot[0],0,bqmeantoterr[0]);
0329 name = "q_meantot0";
0330 title = name;
0331 g_meantot[0]->SetName( name );
0332 g_meantot[0]->SetTitle( title );
0333 g_meantot[0]->SetMarkerStyle(20);
0334 g_meantot[0]->Draw("ap");
0335
0336 ac[++icv] = new TCanvas("mbdqn_vs_run","MBD Q.N vs Run",800,600);
0337 g_meantot[1] = new TGraphErrors(nruns,runindex,bqmeantot[1],0,bqmeantoterr[1]);
0338 name = "q_meantot1";
0339 title = name;
0340 g_meantot[1]->SetName( name );
0341 g_meantot[1]->SetTitle( title );
0342 g_meantot[1]->SetMarkerStyle(20);
0343 g_meantot[1]->Draw("ap");
0344
0345 ac[++icv] = new TCanvas("mbdq_vs_run_ch","MBD Q vs Run",1200,800);
0346 for (int ipmt=0; ipmt<128; ipmt++)
0347 {
0348 h2_bbcq[ipmt]->Draw("colz");
0349 gPad->SetLogz(1);
0350
0351 name = dir; name += h2_bbcq[ipmt]->GetName(); name += ".png";
0352
0353 ac[icv]->Print( name );
0354 }
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369 int run1 = 0;
0370 int run2 = 1;
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380 if ( do_zdc )
0381 {
0382 ac[++icv] = new TCanvas("zdce_vs_run","ZDC E vs Run",800,600);
0383 h2_zdce_vs_run->SetMinimum(1e-6);
0384 h2_zdce_vs_run->Draw("colz");
0385 gPad->SetLogz(1);
0386 }
0387
0388 if ( do_emcal )
0389 {
0390 ac[++icv] = new TCanvas("emce_vs_run","EMC E vs Run",800,600);
0391 h2_emcale_vs_run->SetMinimum(1e-6);
0392 h2_emcale_vs_run->Draw("colz");
0393 gPad->SetLogz(1);
0394
0395 h_emcale[run1]->Rebin(4);
0396 h_emcale[run2]->Rebin(4);
0397 h_emcale[run2]->Scale(0.6);
0398 h_emcale[run1]->Draw("hist");
0399 h_emcale[run2]->SetLineColor(2);
0400 h_emcale[run2]->Draw("histsame");
0401 gPad->SetLogy(1);
0402 }
0403
0404 if ( do_ohcal )
0405 {
0406 ac[++icv] = new TCanvas("ohcal_vs_run","oHCAL E vs Run",800,600);
0407 h2_ohcale_vs_run->SetMinimum(1e-6);
0408 h2_ohcale_vs_run->Draw("colz");
0409 gPad->SetLogz(1);
0410
0411 h_ohcale[run1]->Rebin(4);
0412 h_ohcale[run2]->Rebin(4);
0413 h_ohcale[run2]->Scale(0.6);
0414 h_ohcale[run1]->Draw("hist");
0415 h_ohcale[run2]->SetLineColor(2);
0416 h_ohcale[run2]->Draw("histsame");
0417 gPad->SetLogy(1);
0418 }
0419
0420 if ( do_ihcal )
0421 {
0422 ac[++icv] = new TCanvas("ihcal_vs_run","iHCAL E vs Run",800,600);
0423 h2_ihcale_vs_run->SetMinimum(1e-6);
0424 h2_ihcale_vs_run->Draw("colz");
0425 gPad->SetLogz(1);
0426
0427 h_ihcale[run1]->Rebin(4);
0428 h_ihcale[run2]->Rebin(4);
0429 h_ihcale[run2]->Scale(0.6);
0430 h_ihcale[run1]->Draw("hist");
0431 h_ihcale[run2]->SetLineColor(2);
0432 h_ihcale[run2]->Draw("histsame");
0433 gPad->SetLogy(1);
0434 }
0435
0436
0437
0438 if ( calc_gain_corr )
0439 {
0440
0441 flist.clear();
0442 flist.seekg(0);
0443 int irun = 0;
0444 ofstream gaincorr_calfile;
0445 while ( flist >> dstfname )
0446 {
0447 TString dir = "results/";
0448 dir += get_runstr(dstfname);
0449 dir += "/";
0450 name = "mkdir -p " + dir;
0451 gSystem->Exec( name );
0452 name = dir + "mbd_gaincorrmean.calib";
0453 gaincorr_calfile.open( name );
0454
0455 cout << name << endl;
0456
0457 for (int ipmt=0; ipmt<128; ipmt++)
0458 {
0459 double corr = bqmean[ipmt][irun] / runmean[ipmt];
0460
0461 if ( fabs(corr-1.0)>0.01 )
0462 {
0463 cout << irun << "\t" << ipmt << "\t" << corr << endl;
0464 }
0465 gaincorr_calfile << ipmt << "\t" << corr << endl;
0466 }
0467
0468 gaincorr_calfile.close();
0469
0470 irun++;
0471 }
0472 }
0473
0474 }