File indexing completed on 2024-04-06 11:58:51
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 #include <TCanvas.h>
0039 #include <TChain.h>
0040 #include <TFile.h>
0041 #include <TFitResult.h>
0042 #include <TFitResultPtr.h>
0043 #include <TGraph.h>
0044 #include <TGraphErrors.h>
0045 #include <TGraphAsymmErrors.h>
0046 #include <TH1.h>
0047 #include <TH2.h>
0048 #include <TMultiGraph.h>
0049 #include <TPaveStats.h>
0050 #include <TPaveText.h>
0051 #include <TProfile.h>
0052 #include <TROOT.h>
0053 #include <TStyle.h>
0054
0055 #include <algorithm>
0056 #include <iostream>
0057 #include <fstream>
0058 #include <vector>
0059
0060 #include "CalibCorr.C"
0061
0062 class EHcalVsRho {
0063 public:
0064 TChain *fChain;
0065 Int_t fCurrent;
0066
0067 EHcalVsRho(const char *inFile, const char *dupFile);
0068 virtual ~EHcalVsRho();
0069 virtual Int_t Cut(Long64_t entry);
0070 virtual Int_t GetEntry(Long64_t entry);
0071 virtual Long64_t LoadTree(Long64_t entry);
0072 virtual void Init(TChain *tree, const char *dupFile);
0073 virtual Bool_t Notify();
0074 virtual void Show(Long64_t entry = -1);
0075 void LoopFill(int maxEta, const char *outFile, const char *logFile);
0076 void LoopTest(int maxEta, const char *inFile, const char *outFile);
0077 double EffCalc(TH1D *, double, double &, double &);
0078 double getEA(const int ieta, const double *par);
0079
0080 private:
0081
0082 Int_t t_Run;
0083 Int_t t_Event;
0084 Int_t t_DataType;
0085 Int_t t_ieta;
0086 Int_t t_iphi;
0087 Double_t t_EventWeight;
0088 Int_t t_nVtx;
0089 Int_t t_nTrk;
0090 Int_t t_goodPV;
0091 Double_t t_l1pt;
0092 Double_t t_l1eta;
0093 Double_t t_l1phi;
0094 Double_t t_l3pt;
0095 Double_t t_l3eta;
0096 Double_t t_l3phi;
0097 Double_t t_p;
0098 Double_t t_pt;
0099 Double_t t_phi;
0100 Double_t t_mindR1;
0101 Double_t t_mindR2;
0102 Double_t t_eMipDR;
0103 Double_t t_eHcal;
0104 Double_t t_eHcal10;
0105 Double_t t_eHcal30;
0106 Double_t t_hmaxNearP;
0107 Double_t t_rhoh;
0108 Bool_t t_selectTk;
0109 Bool_t t_qltyFlag;
0110 Bool_t t_qltyMissFlag;
0111 Bool_t t_qltyPVFlag;
0112 Double_t t_gentrackP;
0113 std::vector<unsigned int> *t_DetIds;
0114 std::vector<double> *t_HitEnergies;
0115 std::vector<bool> *t_trgbits;
0116 std::vector<unsigned int> *t_DetIds1;
0117 std::vector<unsigned int> *t_DetIds3;
0118 std::vector<double> *t_HitEnergies1;
0119 std::vector<double> *t_HitEnergies3;
0120
0121
0122 TBranch *b_t_Run;
0123 TBranch *b_t_Event;
0124 TBranch *b_t_DataType;
0125 TBranch *b_t_ieta;
0126 TBranch *b_t_iphi;
0127 TBranch *b_t_EventWeight;
0128 TBranch *b_t_nVtx;
0129 TBranch *b_t_nTrk;
0130 TBranch *b_t_goodPV;
0131 TBranch *b_t_l1pt;
0132 TBranch *b_t_l1eta;
0133 TBranch *b_t_l1phi;
0134 TBranch *b_t_l3pt;
0135 TBranch *b_t_l3eta;
0136 TBranch *b_t_l3phi;
0137 TBranch *b_t_p;
0138 TBranch *b_t_pt;
0139 TBranch *b_t_phi;
0140 TBranch *b_t_mindR1;
0141 TBranch *b_t_mindR2;
0142 TBranch *b_t_eMipDR;
0143 TBranch *b_t_eHcal;
0144 TBranch *b_t_eHcal10;
0145 TBranch *b_t_eHcal30;
0146 TBranch *b_t_hmaxNearP;
0147 TBranch *b_t_rhoh;
0148 TBranch *b_t_selectTk;
0149 TBranch *b_t_qltyFlag;
0150 TBranch *b_t_qltyMissFlag;
0151 TBranch *b_t_qltyPVFlag;
0152 TBranch *b_t_gentrackP;
0153 TBranch *b_t_DetIds;
0154 TBranch *b_t_HitEnergies;
0155 TBranch *b_t_trgbits;
0156 TBranch *b_t_DetIds1;
0157 TBranch *b_t_DetIds3;
0158 TBranch *b_t_HitEnergies1;
0159 TBranch *b_t_HitEnergies3;
0160
0161 std::vector<Long64_t> entries_;
0162 };
0163
0164 EHcalVsRho::EHcalVsRho(const char *inFile, const char *dupFile) : fChain(0) {
0165 char treeName[400];
0166 sprintf(treeName, "HcalIsoTrkAnalyzer/CalibTree");
0167 TChain *chain = new TChain(treeName);
0168 std::cout << "Create a chain for " << treeName << " from " << inFile << std::endl;
0169 if (!fillChain(chain, inFile)) {
0170 std::cout << "*****No valid tree chain can be obtained*****" << std::endl;
0171 } else {
0172 std::cout << "Proceed with a tree chain with " << chain->GetEntries() << " entries" << std::endl;
0173 Init(chain, dupFile);
0174 }
0175 }
0176
0177 EHcalVsRho::~EHcalVsRho() {
0178 if (!fChain)
0179 return;
0180 delete fChain->GetCurrentFile();
0181 }
0182
0183 Int_t EHcalVsRho::GetEntry(Long64_t entry) {
0184
0185 if (!fChain)
0186 return 0;
0187 return fChain->GetEntry(entry);
0188 }
0189
0190 Long64_t EHcalVsRho::LoadTree(Long64_t entry) {
0191
0192 if (!fChain)
0193 return -5;
0194 Long64_t centry = fChain->LoadTree(entry);
0195 if (centry < 0)
0196 return centry;
0197 if (fChain->GetTreeNumber() != fCurrent) {
0198 fCurrent = fChain->GetTreeNumber();
0199 Notify();
0200 }
0201 return centry;
0202 }
0203
0204 void EHcalVsRho::Init(TChain *tree, const char *dupFile) {
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214 t_DetIds = 0;
0215 t_HitEnergies = 0;
0216 t_trgbits = 0;
0217 t_DetIds1 = 0;
0218 t_DetIds3 = 0;
0219 t_HitEnergies1 = 0;
0220 t_HitEnergies3 = 0;
0221
0222 if (!tree)
0223 return;
0224 fChain = tree;
0225 fCurrent = -1;
0226 fChain->SetMakeClass(1);
0227
0228 fChain->SetBranchAddress("t_Run", &t_Run, &b_t_Run);
0229 fChain->SetBranchAddress("t_Event", &t_Event, &b_t_Event);
0230 fChain->SetBranchAddress("t_DataType", &t_DataType, &b_t_DataType);
0231 fChain->SetBranchAddress("t_ieta", &t_ieta, &b_t_ieta);
0232 fChain->SetBranchAddress("t_iphi", &t_iphi, &b_t_iphi);
0233 fChain->SetBranchAddress("t_EventWeight", &t_EventWeight, &b_t_EventWeight);
0234 fChain->SetBranchAddress("t_nVtx", &t_nVtx, &b_t_nVtx);
0235 fChain->SetBranchAddress("t_nTrk", &t_nTrk, &b_t_nTrk);
0236 fChain->SetBranchAddress("t_goodPV", &t_goodPV, &b_t_goodPV);
0237 fChain->SetBranchAddress("t_l1pt", &t_l1pt, &b_t_l1pt);
0238 fChain->SetBranchAddress("t_l1eta", &t_l1eta, &b_t_l1eta);
0239 fChain->SetBranchAddress("t_l1phi", &t_l1phi, &b_t_l1phi);
0240 fChain->SetBranchAddress("t_l3pt", &t_l3pt, &b_t_l3pt);
0241 fChain->SetBranchAddress("t_l3eta", &t_l3eta, &b_t_l3eta);
0242 fChain->SetBranchAddress("t_l3phi", &t_l3phi, &b_t_l3phi);
0243 fChain->SetBranchAddress("t_p", &t_p, &b_t_p);
0244 fChain->SetBranchAddress("t_pt", &t_pt, &b_t_pt);
0245 fChain->SetBranchAddress("t_phi", &t_phi, &b_t_phi);
0246 fChain->SetBranchAddress("t_mindR1", &t_mindR1, &b_t_mindR1);
0247 fChain->SetBranchAddress("t_mindR2", &t_mindR2, &b_t_mindR2);
0248 fChain->SetBranchAddress("t_eMipDR", &t_eMipDR, &b_t_eMipDR);
0249 fChain->SetBranchAddress("t_eHcal", &t_eHcal, &b_t_eHcal);
0250 fChain->SetBranchAddress("t_eHcal10", &t_eHcal10, &b_t_eHcal10);
0251 fChain->SetBranchAddress("t_eHcal30", &t_eHcal30, &b_t_eHcal30);
0252 fChain->SetBranchAddress("t_hmaxNearP", &t_hmaxNearP, &b_t_hmaxNearP);
0253 fChain->SetBranchAddress("t_rhoh", &t_rhoh, &b_t_rhoh);
0254 fChain->SetBranchAddress("t_selectTk", &t_selectTk, &b_t_selectTk);
0255 fChain->SetBranchAddress("t_qltyFlag", &t_qltyFlag, &b_t_qltyFlag);
0256 fChain->SetBranchAddress("t_qltyMissFlag", &t_qltyMissFlag, &b_t_qltyMissFlag);
0257 fChain->SetBranchAddress("t_qltyPVFlag", &t_qltyPVFlag, &b_t_qltyPVFlag);
0258 fChain->SetBranchAddress("t_gentrackP", &t_gentrackP, &b_t_gentrackP);
0259 fChain->SetBranchAddress("t_DetIds", &t_DetIds, &b_t_DetIds);
0260 fChain->SetBranchAddress("t_HitEnergies", &t_HitEnergies, &b_t_HitEnergies);
0261 fChain->SetBranchAddress("t_trgbits", &t_trgbits, &b_t_trgbits);
0262 fChain->SetBranchAddress("t_DetIds1", &t_DetIds1, &b_t_DetIds1);
0263 fChain->SetBranchAddress("t_DetIds3", &t_DetIds3, &b_t_DetIds3);
0264 fChain->SetBranchAddress("t_HitEnergies1", &t_HitEnergies1, &b_t_HitEnergies1);
0265 fChain->SetBranchAddress("t_HitEnergies3", &t_HitEnergies3, &b_t_HitEnergies3);
0266 Notify();
0267
0268 if (std::string(dupFile) != "") {
0269 ifstream infile(dupFile);
0270 if (!infile.is_open()) {
0271 std::cout << "Cannot open " << dupFile << std::endl;
0272 } else {
0273 while (1) {
0274 Long64_t jentry;
0275 infile >> jentry;
0276 if (!infile.good())
0277 break;
0278 entries_.push_back(jentry);
0279 }
0280 infile.close();
0281 std::cout << "Reads a list of " << entries_.size() << " events from " << dupFile << std::endl;
0282 }
0283 }
0284 }
0285
0286 Bool_t EHcalVsRho::Notify() {
0287
0288
0289
0290
0291
0292
0293 return kTRUE;
0294 }
0295
0296 void EHcalVsRho::Show(Long64_t entry) {
0297
0298
0299 if (!fChain)
0300 return;
0301 fChain->Show(entry);
0302 }
0303
0304 Int_t EHcalVsRho::Cut(Long64_t) {
0305
0306
0307
0308 return 1;
0309 }
0310
0311 void EHcalVsRho::LoopFill(int maxEta, const char *outFile, const char *logFile) {
0312 if (fChain == 0)
0313 return;
0314 TFile *f1 = new TFile(outFile, "RECREATE");
0315 char name[100], Title[100], graph[100], proji[100];
0316
0317 std::vector<TH2D *> VIsoRho;
0318 std::vector<TProfile *> Hcal_corr;
0319 for (int ieta = 0; ieta < maxEta; ieta++) {
0320 sprintf(name, "IsoRho2d%d", ieta + 1);
0321 sprintf(Title, "Iso vs Rho %d", ieta + 1);
0322 VIsoRho.push_back(new TH2D(name, Title, 30, 0, 30, 25000, 0, 250));
0323 sprintf(name, "IsoRhoProfile%d", ieta + 1);
0324 Hcal_corr.push_back(new TProfile(name, Title, 30, 0, 30));
0325 }
0326
0327 Long64_t nentries = fChain->GetEntriesFast();
0328 std::cout << "Total # of entries: " << nentries << std::endl;
0329 Long64_t nbytes = 0, nb = 0;
0330 Long64_t kount(0), duplicate(0), good(0);
0331 for (Long64_t jentry = 0; jentry < nentries; jentry++) {
0332 Long64_t ientry = LoadTree(jentry);
0333 if (ientry < 0)
0334 break;
0335 nb = fChain->GetEntry(jentry);
0336 nbytes += nb;
0337
0338 ++kount;
0339 if (kount % 100000 == 0)
0340 std::cout << "Processing Entry " << kount << std::endl;
0341 bool select = (std::find(entries_.begin(), entries_.end(), jentry) == entries_.end());
0342 if (!select) {
0343 ++duplicate;
0344 continue;
0345 }
0346
0347 int absIeta = abs(t_ieta);
0348 if ((absIeta <= maxEta) && (t_p >= 40) && (t_p <= 60)) {
0349 VIsoRho[absIeta - 1]->Fill(t_rhoh, t_eHcal);
0350 Hcal_corr[absIeta - 1]->Fill(t_rhoh, t_eHcal);
0351 ++good;
0352 }
0353 }
0354 std::cout << "Uses " << good << " events out of " << kount << " excluding " << duplicate << " duplicate events"
0355 << std::endl;
0356
0357 gStyle->SetCanvasBorderMode(0);
0358 gStyle->SetCanvasColor(kWhite);
0359 gStyle->SetPadColor(kWhite);
0360 gStyle->SetFillColor(kWhite);
0361 gStyle->SetOptTitle(0);
0362 gStyle->SetOptFit(1);
0363 std::ofstream myfile;
0364 myfile.open(logFile);
0365 for (int ieta = 0; ieta < maxEta; ieta++) {
0366 VIsoRho[ieta]->Write();
0367 Hcal_corr[ieta]->Write();
0368 TH2D *his_i = dynamic_cast<TH2D *>(VIsoRho[ieta]->Clone());
0369 his_i->GetEntries();
0370 int dim = his_i->GetXaxis()->GetNbins();
0371 double *xcut, *binc, *errXL, *errXH, *errYL, *errYH;
0372 double *errX, *errY;
0373 double errX1, errX2, xmax(0);
0374
0375 xcut = new double[dim];
0376 binc = new double[dim];
0377 errX = new double[dim];
0378 errY = new double[dim];
0379 errXL = new double[dim];
0380 errXH = new double[dim];
0381 errYL = new double[dim];
0382 errYH = new double[dim];
0383
0384 for (int j = 0; j < dim; j++) {
0385 sprintf(proji, "proj%d-%d", ieta + 1, j);
0386 TH1D *h_proj = dynamic_cast<TH1D *>(his_i->ProjectionY(proji, j, j + 1, " "));
0387 binc[j] = his_i->GetXaxis()->GetBinCenter(j + 1);
0388 xcut[j] = EffCalc(h_proj, 0.90, errX1, errX2);
0389
0390 errXL[j] = 0.0;
0391 errXH[j] = 0.0;
0392 errYL[j] = errX1;
0393 errYH[j] = errX2;
0394
0395 errX[j] = 0.0;
0396 errY[j] = 0.0;
0397 h_proj->Write();
0398 if (xcut[j] > xmax)
0399 xmax = xcut[j];
0400 }
0401
0402 TGraphAsymmErrors *Isovsrho = new TGraphAsymmErrors(dim, binc, xcut, errXL, errXH, errYL, errYH);
0403 sprintf(graph, "IsovsRho%d", ieta + 1);
0404 sprintf(name, "EvsRho%d", ieta + 1);
0405
0406 TF1 *fnc = new TF1("fnc", "[1]*x + [0]", 4, 13);
0407 TFitResultPtr fitI = Isovsrho->Fit("fnc", "+QSR");
0408 double ic = fnc->GetParameter(1);
0409 double err = fitI->FitResult::Error(1);
0410 myfile << ieta + 1 << " " << ic << " " << err << std::endl;
0411 std::cout << "Fit " << ieta + 1 << " " << fnc->GetParameter(0) << " " << fitI->FitResult::Error(0) << " " << ic
0412 << " " << err << "\n";
0413 gStyle->SetOptFit(1);
0414 TCanvas *pad = new TCanvas(graph, name, 0, 10, 1200, 400);
0415 pad->SetRightMargin(0.10);
0416 pad->SetTopMargin(0.10);
0417 Isovsrho->SetMarkerStyle(24);
0418 Isovsrho->SetMarkerSize(0.4);
0419 Isovsrho->GetXaxis()->SetRangeUser(0, 15);
0420 Isovsrho->GetXaxis()->SetTitle("#rho");
0421 Isovsrho->GetXaxis()->SetLabelSize(0.04);
0422 Isovsrho->GetXaxis()->SetTitleSize(0.06);
0423 Isovsrho->GetXaxis()->SetTitleOffset(0.8);
0424 Isovsrho->GetYaxis()->SetRangeUser(0, 1.25 * xmax);
0425 Isovsrho->GetYaxis()->SetTitle("Energy (GeV)");
0426 Isovsrho->GetYaxis()->SetLabelSize(0.04);
0427 Isovsrho->GetYaxis()->SetTitleSize(0.06);
0428 Isovsrho->GetYaxis()->SetTitleOffset(0.6);
0429 Isovsrho->Draw("AP");
0430 pad->Update();
0431 TPaveStats *st1 = (TPaveStats *)Isovsrho->GetListOfFunctions()->FindObject("stats");
0432 if (st1 != nullptr) {
0433 st1->SetY1NDC(0.78);
0434 st1->SetY2NDC(0.90);
0435 st1->SetX1NDC(0.65);
0436 st1->SetX2NDC(0.90);
0437 }
0438 pad->Write();
0439 }
0440
0441 myfile.close();
0442 f1->Close();
0443 }
0444
0445 double EHcalVsRho::EffCalc(TH1D *h, double perc, double &errXL, double &errXH) {
0446 double eff, eff_err = 0.0, xCut = 0.0;
0447 int tot = h->GetEntries();
0448 int integ = 0;
0449 errXL = 0.0;
0450 errXH = 0.0;
0451 for (int i = 0; i < (h->GetXaxis()->GetNbins() + 1); i++) {
0452 xCut = h->GetXaxis()->GetBinLowEdge(i);
0453 integ += h->GetBinContent(i);
0454
0455 if (integ != 0 && tot != 0) {
0456 eff = (integ * 1.0 / tot);
0457 eff_err = sqrt(eff * (1 - eff) / tot);
0458 } else {
0459 eff = 0.0;
0460 }
0461 if (eff > perc)
0462 break;
0463 }
0464 if (eff == 0.0)
0465 xCut = 0.0;
0466 errXL = eff_err;
0467 errXH = eff_err;
0468 return xCut;
0469 }
0470
0471 void EHcalVsRho::LoopTest(int maxEta, const char *inFile, const char *outFile) {
0472 if (fChain == 0)
0473 return;
0474
0475 TFile *f1 = new TFile(outFile, "RECREATE");
0476 std::map<int, TH1D *> histo, histo_uncorr;
0477 char name[100], title[100];
0478 for (int ieta = -maxEta; ieta <= maxEta; ieta++) {
0479 sprintf(name, "MPV%d", ieta);
0480 sprintf(title, "Corrected Response (i#eta = %d)", ieta - 30);
0481 histo[ieta] = new TH1D(name, title, 100, 0, 2);
0482 sprintf(name, "MPVUn%d", ieta);
0483 sprintf(title, "Uncorrected Response (i#eta = %d)", ieta - 30);
0484 histo_uncorr[ieta] = new TH1D(name, title, 100, 0, 2);
0485 }
0486 std::cout << "Initialized histograms from " << -maxEta << ":" << maxEta << "\n";
0487
0488 double par[10];
0489 ifstream myReadFile;
0490 myReadFile.open(inFile);
0491 int npar = 0;
0492 if (myReadFile.is_open()) {
0493 while (!myReadFile.eof()) {
0494 myReadFile >> par[npar];
0495 ++npar;
0496 }
0497 }
0498 myReadFile.close();
0499 std::cout << "Reads " << npar << " parameters:";
0500 for (int k = 0; k < npar; ++k)
0501 std::cout << " [" << k << "] = " << par[k];
0502 std::cout << std::endl;
0503
0504 Long64_t nentries = fChain->GetEntriesFast();
0505 Long64_t nbytes = 0, nb = 0;
0506 Long64_t kount(0), duplicate(0), good(0);
0507 for (Long64_t jentry = 0; jentry < nentries; jentry++) {
0508 Long64_t ientry = LoadTree(jentry);
0509 if (ientry < 0)
0510 break;
0511 nb = fChain->GetEntry(jentry);
0512 nbytes += nb;
0513 ++kount;
0514 if (kount % 100000 == 0)
0515 std::cout << "Processing Entry " << kount << std::endl;
0516 bool select = (std::find(entries_.begin(), entries_.end(), jentry) == entries_.end());
0517 if (!select) {
0518 ++duplicate;
0519 continue;
0520 }
0521
0522 select = ((t_qltyFlag) && (t_selectTk) && (t_hmaxNearP < 10.0) && (t_eMipDR < 1.0) && (t_p > 40) && (t_p < 60.0));
0523 if (select) {
0524 double corr_eHcal = 0.0;
0525 int absIeta = abs(t_ieta);
0526 ++good;
0527 if (absIeta <= maxEta) {
0528 corr_eHcal = t_eHcal - t_rhoh * getEA(absIeta, par);
0529 double myEovP = corr_eHcal / (t_p - t_eMipDR);
0530 double myEovP_uncorr = t_eHcal / (t_p - t_eMipDR);
0531 histo[t_ieta]->Fill(myEovP);
0532 histo_uncorr[t_ieta]->Fill(myEovP_uncorr);
0533 }
0534 }
0535 }
0536
0537 for (std::map<int, TH1D *>::iterator itr = histo.begin(); itr != histo.end(); ++itr)
0538 itr->second->Write();
0539 for (std::map<int, TH1D *>::iterator itr = histo_uncorr.begin(); itr != histo_uncorr.end(); ++itr)
0540 itr->second->Write();
0541 f1->Close();
0542 std::cout << "Processes " << good << " out of " << kount << " events with " << duplicate << " duplicate entries"
0543 << std::endl;
0544 }
0545
0546 double EHcalVsRho::getEA(const int eta, const double *par) {
0547 double eA;
0548 if (eta < 20)
0549 eA = par[0];
0550 else
0551 eA = (((par[5] * eta + par[4]) * eta + par[3]) * eta + par[2]) * eta + par[1];
0552 return eA;
0553 }
0554
0555 void FitEvsRho(const char *inFile, const char *outFile, const char *rootFile) {
0556 const int ndim = 30;
0557 double EA[ndim] = {0.0};
0558 double errEA[ndim] = {0.0};
0559 double ietaEA[ndim] = {0.0};
0560 ifstream myReadFile;
0561 myReadFile.open(inFile);
0562
0563 int ii = 0;
0564 if (myReadFile.is_open()) {
0565 while (!myReadFile.eof()) {
0566 myReadFile >> ietaEA[ii] >> EA[ii] >> errEA[ii];
0567 if (EA[ii] < 0)
0568 EA[ii] = 0;
0569 ii++;
0570 }
0571 }
0572 myReadFile.close();
0573 std::cout << "Reads " << ii << " points from " << inFile << std::endl;
0574
0575 gStyle->SetCanvasBorderMode(0);
0576 gStyle->SetCanvasColor(kWhite);
0577 gStyle->SetPadColor(kWhite);
0578 gStyle->SetFillColor(kWhite);
0579 gStyle->SetOptTitle(0);
0580 gStyle->SetOptStat(0);
0581 gStyle->SetOptFit(0);
0582 TFile *f1 = new TFile(rootFile, "RECREATE");
0583 TGraphErrors *eA = new TGraphErrors(ii, ietaEA, EA, errEA, errEA);
0584 eA->SetMarkerStyle(20);
0585 eA->SetMarkerColor(4);
0586 eA->SetLineColor(2);
0587 eA->GetXaxis()->SetTitle("i#eta");
0588 eA->GetXaxis()->SetTitleOffset(0.6);
0589 eA->GetXaxis()->SetTitleSize(0.06);
0590 eA->GetYaxis()->SetTitle("Effective Area");
0591 eA->GetYaxis()->SetTitleOffset(0.6);
0592 eA->GetYaxis()->SetTitleSize(0.06);
0593
0594 Double_t par[6];
0595 const int nmid = 19;
0596 TF1 *g1 = new TF1("g1", "pol0", 1, nmid);
0597 TF1 *g2 = new TF1("g2", "pol4", nmid, ii);
0598
0599 eA->Fit(g1, "R");
0600 eA->Fit(g2, "R+");
0601 g1->GetParameters(&par[0]);
0602 g2->GetParameters(&par[1]);
0603
0604 TCanvas *c2 = new TCanvas("EA vs #eta", "EA vs ieta", 0, 10, 1200, 400);
0605 eA->Draw("AP");
0606 c2->Write();
0607 f1->Close();
0608
0609 ofstream params;
0610 params.open(outFile);
0611 for (int i = 0; i < 6; i++) {
0612 params << par[i] << std::endl;
0613 std::cout << "Parameter[" << i << "] = " << par[i] << std::endl;
0614 }
0615 params.close();
0616 }
0617
0618 void FitEovPwithRho(int maxEta, const char *inFile, const char *outFile) {
0619 TFile *file = new TFile(inFile);
0620 std::map<int, TH1D *> histo, histo_uncorr;
0621 char name[100];
0622 for (int ieta = -maxEta; ieta <= maxEta; ieta++) {
0623 sprintf(name, "MPV%d", ieta);
0624 TH1D *h0 = (TH1D *)file->FindObjectAny(name);
0625 histo[ieta] = (h0 != 0) ? (TH1D *)(h0->Clone()) : 0;
0626 sprintf(name, "MPVUn%d", ieta);
0627 TH1D *h1 = (TH1D *)file->FindObjectAny(name);
0628 histo_uncorr[ieta] = (h1 != 0) ? (TH1D *)(h1->Clone()) : 0;
0629 }
0630
0631
0632 new TFile(outFile, "RECREATE");
0633 double xlim = maxEta + 0.5;
0634 TH1D *EovPvsieta = new TH1D("Corrected", "Corrected", 2 * maxEta + 1, -xlim, xlim);
0635 TH1D *EovPvsieta_uncorr = new TH1D("Uncorrect", "Uncorrect", 2 * maxEta + 1, -xlim, xlim);
0636
0637 TF1 *fnc = new TF1("fnc", "gaus");
0638 unsigned int k1(0), k2(0);
0639 for (int ieta = -maxEta; ieta <= maxEta; ieta++) {
0640 if (ieta == 0)
0641 continue;
0642 if (histo[ieta] != 0) {
0643 double mean = histo[ieta]->GetMean();
0644 double rms = histo[ieta]->GetRMS();
0645 TFitResultPtr FitG = histo[ieta]->Fit("fnc", "QRWLS", "", mean - rms, mean + rms);
0646 double a = fnc->GetParameter(1);
0647 double err = FitG->FitResult::Error(1);
0648 histo[ieta]->Write();
0649 ++k1;
0650 int ibin = ieta + maxEta + 1;
0651 EovPvsieta->SetBinContent(ibin, a);
0652 EovPvsieta->SetBinError(ibin, err);
0653 std::cout << "Correct[" << k1 << "] " << ieta << " a " << a << " +- " << err << std::endl;
0654 }
0655
0656 if (histo_uncorr[ieta] != 0) {
0657 double mean = histo_uncorr[ieta]->GetMean();
0658 double rms = histo_uncorr[ieta]->GetRMS();
0659 TFitResultPtr FitG = histo_uncorr[ieta]->Fit("fnc", "QRWLS", "", mean - rms, mean + rms);
0660 double a = fnc->GetParameter(1);
0661 double err = FitG->FitResult::Error(1);
0662 histo_uncorr[ieta]->Write();
0663 ++k2;
0664 int ibin = ieta + maxEta + 1;
0665 EovPvsieta_uncorr->SetBinContent(ibin, a);
0666 EovPvsieta_uncorr->SetBinError(ibin, err);
0667 std::cout << "Correct[" << k2 << "] " << ieta << " a " << a << " +- " << err << std::endl;
0668 }
0669 }
0670
0671 gStyle->SetCanvasBorderMode(0);
0672 gStyle->SetCanvasColor(kWhite);
0673 gStyle->SetPadColor(kWhite);
0674 gStyle->SetFillColor(kWhite);
0675 gStyle->SetOptTitle(0);
0676 gStyle->SetOptStat(10);
0677 gStyle->SetOptFit(1);
0678 TCanvas *c3 = new TCanvas("E/P vs ieta", "E/P vs ieta", 0, 10, 1200, 400);
0679 EovPvsieta->GetXaxis()->SetTitle("i#eta");
0680 EovPvsieta->GetYaxis()->SetTitle("MPV[E_{Hcal}/(p_{Track}-E_{Ecal})]");
0681 EovPvsieta->SetMarkerStyle(20);
0682 EovPvsieta->SetMarkerColor(2);
0683 EovPvsieta->SetMarkerSize(1.0);
0684 EovPvsieta->Fit("pol0", "+QRWLS", "", -maxEta, maxEta);
0685
0686 EovPvsieta_uncorr->SetMarkerStyle(24);
0687 EovPvsieta_uncorr->SetMarkerColor(4);
0688 EovPvsieta_uncorr->SetMarkerSize(1.0);
0689
0690 EovPvsieta->GetYaxis()->SetRangeUser(0.5, 2.0);
0691 EovPvsieta->Draw();
0692 c3->Update();
0693 TPaveStats *st1 = (TPaveStats *)EovPvsieta->GetListOfFunctions()->FindObject("stats");
0694 if (st1 != nullptr) {
0695 st1->SetY1NDC(0.81);
0696 st1->SetY2NDC(0.90);
0697 st1->SetX1NDC(0.65);
0698 st1->SetX2NDC(0.90);
0699 }
0700 EovPvsieta_uncorr->Draw("sames");
0701 c3->Update();
0702 st1 = (TPaveStats *)EovPvsieta_uncorr->GetListOfFunctions()->FindObject("stats");
0703 std::cout << st1 << std::endl;
0704 if (st1 != nullptr) {
0705 st1->SetY1NDC(0.78);
0706 st1->SetY2NDC(0.81);
0707 st1->SetX1NDC(0.65);
0708 st1->SetX2NDC(0.90);
0709 }
0710 c3->Modified();
0711 c3->Update();
0712 EovPvsieta->Write();
0713 EovPvsieta_uncorr->Write();
0714 }
0715
0716 void PlotEvsRho(const char *inFile, int eta = 0, int type = 0, bool save = false) {
0717 gStyle->SetCanvasBorderMode(0);
0718 gStyle->SetCanvasColor(kWhite);
0719 gStyle->SetPadColor(kWhite);
0720 gStyle->SetFillColor(kWhite);
0721 gStyle->SetOptTitle(0);
0722 gStyle->SetOptStat(1110);
0723 gStyle->SetOptFit(10);
0724
0725 TFile *file = new TFile(inFile);
0726 int etamin = (eta == 0) ? ((type == 0) ? 1 : 25) : eta;
0727 int etamax = (eta == 0) ? 25 : eta;
0728 for (int it = etamin; it <= etamax; ++it) {
0729 char name[50];
0730 sprintf(name, "IsovsRho%d", it);
0731 TCanvas *pad;
0732 if (type == 0) {
0733 pad = (TCanvas *)(file->FindObjectAny(name));
0734 pad->Draw();
0735 } else {
0736 sprintf(name, "MPV%d", it);
0737 pad = new TCanvas(name, name, 0, 10, 800, 500);
0738 pad->SetRightMargin(0.10);
0739 pad->SetTopMargin(0.10);
0740 TH1D *h1 = (TH1D *)(file->FindObjectAny(name));
0741 sprintf(name, "MPVUn%d", it);
0742 TH1D *h2 = (TH1D *)(file->FindObjectAny(name));
0743 double ymx1 = h1->GetMaximum();
0744 double ymx2 = h2->GetMaximum();
0745 double ymax = (ymx1 > ymx2) ? ymx1 : ymx2;
0746 h1->GetXaxis()->SetRangeUser(0.5, 2.0);
0747 h2->GetXaxis()->SetRangeUser(0.5, 2.0);
0748 h1->GetYaxis()->SetRangeUser(0, 1.25 * ymax);
0749 h2->GetYaxis()->SetRangeUser(0, 1.25 * ymax);
0750 h1->GetXaxis()->SetTitleSize(0.048);
0751 h1->GetXaxis()->SetTitleOffset(0.8);
0752 h1->GetXaxis()->SetTitle("E_{Hcal}/(p-E_{Ecal})");
0753 h1->GetYaxis()->SetTitleSize(0.048);
0754 h1->GetYaxis()->SetTitleOffset(0.8);
0755 h1->GetYaxis()->SetTitle("Tracks");
0756 h1->SetLineColor(2);
0757 h1->Draw();
0758 pad->Modified();
0759 pad->Update();
0760 TPaveStats *st1 = (TPaveStats *)h1->GetListOfFunctions()->FindObject("stats");
0761 if (st1 != nullptr) {
0762 st1->SetLineColor(2);
0763 st1->SetTextColor(2);
0764 st1->SetY1NDC(0.75);
0765 st1->SetY2NDC(0.90);
0766 st1->SetX1NDC(0.65);
0767 st1->SetX2NDC(0.90);
0768 }
0769 h2->SetLineColor(4);
0770 h2->Draw("sames");
0771 pad->Modified();
0772 pad->Update();
0773 TPaveStats *st2 = (TPaveStats *)h2->GetListOfFunctions()->FindObject("stats");
0774 if (st2 != nullptr) {
0775 st2->SetLineColor(4);
0776 st2->SetTextColor(4);
0777 st2->SetY1NDC(0.60);
0778 st2->SetY2NDC(0.75);
0779 st2->SetX1NDC(0.65);
0780 st2->SetX2NDC(0.90);
0781 }
0782 pad->Modified();
0783 pad->Update();
0784 TF1 *f1 = (TF1 *)h1->GetListOfFunctions()->FindObject("fnc");
0785 if (f1 != nullptr)
0786 f1->SetLineColor(2);
0787 TF1 *f2 = (TF1 *)h2->GetListOfFunctions()->FindObject("fnc");
0788 if (f2 != nullptr)
0789 f2->SetLineColor(4);
0790 pad->Modified();
0791 pad->Update();
0792 }
0793 if (save) {
0794 sprintf(name, "%s.pdf", pad->GetName());
0795 pad->Print(name);
0796 }
0797 }
0798 }