File indexing completed on 2024-04-06 12:29:59
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 #include <TCanvas.h>
0027 #include <TChain.h>
0028 #include <TFile.h>
0029 #include <TFitResult.h>
0030 #include <TFitResultPtr.h>
0031 #include <TH1D.h>
0032 #include <TH2D.h>
0033 #include <TLegend.h>
0034 #include <TPaveStats.h>
0035 #include <TPaveText.h>
0036 #include <TProfile.h>
0037 #include <TROOT.h>
0038 #include <TStyle.h>
0039 #include <vector>
0040 #include <string>
0041 #include <iomanip>
0042 #include <iostream>
0043 #include <fstream>
0044
0045 void makeHitStudyPlots(std::string file1 = "Forward.root",
0046 std::string tag1 = "New",
0047 std::string file2 = "Standard.root",
0048 std::string tag2 = "Old",
0049 std::string file3 = "",
0050 std::string tag3 = "",
0051 std::string gtitle = "",
0052 int todomin = 0,
0053 int todomax = 5,
0054 bool ratio = true,
0055 bool save = false,
0056 std::string dirnm = "zdcSimHitStudy") {
0057 const int plots = 6;
0058 std::string names[plots] = {"ETot", "ETotT", "Edep", "Hits", "Indx", "Time"};
0059 int logy[plots] = {1, 1, 1, 0, 1, 1};
0060 int rebin[plots] = {10, 10, 10, 2, 1, 10};
0061 int xmax[plots] = {5, 5, 3, 5, 2, 2};
0062 int colors[5] = {1, 2, 4, 6, 46};
0063 int marker[5] = {20, 21, 22, 23, 24};
0064 int styles[5] = {1, 2, 3, 4, 5};
0065 bool debug(false);
0066
0067 gStyle->SetCanvasBorderMode(0);
0068 gStyle->SetCanvasColor(kWhite);
0069 gStyle->SetPadColor(kWhite);
0070 gStyle->SetFillColor(kWhite);
0071 if (ratio) {
0072 gStyle->SetOptStat(10);
0073 gStyle->SetOptFit(1);
0074 } else {
0075 gStyle->SetOptStat(1110);
0076 }
0077 TFile* file[3];
0078 int nfile(0);
0079 std::string tag(""), tags[3];
0080 if (file1 != "") {
0081 file[nfile] = new TFile(file1.c_str());
0082 if (file[nfile]) {
0083 tags[nfile] = tag1;
0084 ++nfile;
0085 tag += tag1;
0086 }
0087 }
0088 if (file2 != "") {
0089 file[nfile] = new TFile(file2.c_str());
0090 if (file[nfile]) {
0091 tags[nfile] = tag2;
0092 ++nfile;
0093 tag += tag2;
0094 }
0095 }
0096 if (file3 != "") {
0097 file[nfile] = new TFile(file3.c_str());
0098 if (file[nfile]) {
0099 tags[nfile] = tag3;
0100 ++nfile;
0101 tag += tag3;
0102 }
0103 }
0104 if ((todomin < 0) || (todomin >= plots))
0105 todomin = 0;
0106 if (todomax < todomin) {
0107 todomax = todomin;
0108 } else if (todomax >= plots) {
0109 todomax = plots - 1;
0110 }
0111 std::cout << "Use " << nfile << " files from " << file1 << "," << file2 << " and " << file3 << " and look for "
0112 << todomin << ":" << todomax << std::endl;
0113 for (int todo = todomin; todo <= todomax; ++todo) {
0114 double y1(0.90), dy(0.12);
0115 double y2 = y1 - dy * nfile - 0.01;
0116 double y3 = y1 - 0.04 * (nfile - 1);
0117 TLegend* leg = (ratio) ? (new TLegend(0.10, y3, 0.65, y1)) : (new TLegend(0.65, y2 - nfile * 0.04, 0.90, y2));
0118 leg->SetBorderSize(1);
0119 leg->SetFillColor(10);
0120 TH1D* hist0[nfile];
0121 for (int i1 = 0; i1 < nfile; ++i1) {
0122 TDirectory* dir = static_cast<TDirectory*>(file[i1]->FindObjectAny(dirnm.c_str()));
0123 hist0[i1] = static_cast<TH1D*>(dir->FindObjectAny(names[todo].c_str()));
0124 if (debug)
0125 std::cout << "Reads histogram " << hist0[i1]->GetName() << " for " << hist0[i1]->GetTitle() << " from "
0126 << file[i1] << std::endl;
0127 }
0128 std::string title = hist0[0]->GetTitle();
0129 if (debug)
0130 std::cout << "Histogram title " << title << std::endl;
0131 int istart = (ratio) ? 1 : 0;
0132 char name[100], namec[100];
0133 std::vector<TH1D*> hist1;
0134 for (int i1 = istart; i1 < nfile; ++i1) {
0135 if (ratio) {
0136 int nbin = hist0[0]->GetNbinsX();
0137 int nbinR = nbin / rebin[todo];
0138 double xlow = hist0[0]->GetXaxis()->GetBinLowEdge(1);
0139 double xhigh = hist0[0]->GetXaxis()->GetBinLowEdge(nbin) + hist0[0]->GetXaxis()->GetBinWidth(nbin);
0140 sprintf(name, "%s%sVs%sRatio", names[todo].c_str(), tags[0].c_str(), tags[i1].c_str());
0141 TH1D* histr = new TH1D(name, hist0[0]->GetTitle(), nbinR, xlow, xhigh);
0142 histr->SetTitle(gtitle.c_str());
0143 histr->GetXaxis()->SetTitle(title.c_str());
0144 histr->GetYaxis()->SetTitle(name);
0145 histr->GetXaxis()->SetLabelOffset(0.005);
0146 histr->GetXaxis()->SetTitleOffset(1.00);
0147 histr->GetYaxis()->SetLabelOffset(0.005);
0148 histr->GetYaxis()->SetTitleOffset(1.20);
0149 histr->GetYaxis()->SetRangeUser(0.0, xmax[todo]);
0150 histr->SetLineColor(colors[i1 - 1]);
0151 histr->SetLineStyle(styles[i1 - 1]);
0152 histr->SetMarkerStyle(marker[i1 - 1]);
0153 histr->SetMarkerColor(colors[i1 - 1]);
0154 double sumNum(0), sumDen(0), maxDev(0), xlow1(-1), xhigh1(xlow);
0155 for (int j = 0; j < nbinR; ++j) {
0156 double tnum(0), tden(0), rnum(0), rden(0);
0157 for (int i = 0; i < rebin[todo]; ++i) {
0158 int ib = j * rebin[todo] + i + 1;
0159 tnum += hist0[0]->GetBinContent(ib);
0160 tden += hist0[1]->GetBinContent(ib);
0161 rnum += ((hist0[0]->GetBinError(ib)) * (hist0[0]->GetBinError(ib)));
0162 rden += ((hist0[1]->GetBinError(ib)) * (hist0[1]->GetBinError(ib)));
0163 }
0164 if (tden > 0 && tnum > 0) {
0165 if (xlow1 < 0)
0166 xlow1 = hist0[0]->GetXaxis()->GetBinLowEdge(j * rebin[todo] + 1);
0167 xhigh1 = hist0[0]->GetXaxis()->GetBinLowEdge((j + 1) * rebin[todo]) +
0168 hist0[0]->GetXaxis()->GetBinWidth((j + 1) * rebin[todo]);
0169 double rat = tnum / tden;
0170 double err = rat * sqrt((rnum / (tnum * tnum)) + (rden / (tden * tden)));
0171 if (debug)
0172 std::cout << "Bin " << j << " Ratio " << rat << " +- " << err << std::endl;
0173 histr->SetBinContent(j + 1, rat);
0174 histr->SetBinError(j + 1, err);
0175 double temp1 = (rat > 1.0) ? 1.0 / rat : rat;
0176 double temp2 = (rat > 1.0) ? err / (rat * rat) : err;
0177 sumNum += (fabs(1 - temp1) / (temp2 * temp2));
0178 sumDen += (1.0 / (temp2 * temp2));
0179 if (fabs(1 - temp1) > maxDev)
0180 maxDev = fabs(1 - temp1);
0181 }
0182 }
0183 histr->Fit("pol0", "+QRWLS", "", xlow1, xhigh1);
0184 sumNum = (sumDen > 0) ? (sumNum / sumDen) : 0;
0185 sumDen = (sumDen > 0) ? 1.0 / sqrt(sumDen) : 0;
0186 sprintf(name, "%sVs%sRatio", tags[0].c_str(), tags[i1].c_str());
0187 if (sumNum == 0)
0188 sumDen = 0;
0189 sprintf(name, "%s vs %s (%6.3f +- %6.3f)", tags[0].c_str(), tags[i1].c_str(), sumNum, sumDen);
0190 hist1.push_back(histr);
0191 leg->AddEntry(histr, name, "lp");
0192 } else {
0193 hist1.push_back(hist0[i1]);
0194 hist1.back()->SetTitle(gtitle.c_str());
0195 hist1.back()->GetXaxis()->SetTitle(title.c_str());
0196 hist1.back()->GetYaxis()->SetTitle("Events");
0197 hist1.back()->GetXaxis()->SetLabelOffset(0.005);
0198 hist1.back()->GetXaxis()->SetTitleOffset(1.00);
0199 hist1.back()->GetYaxis()->SetLabelOffset(0.005);
0200 hist1.back()->GetYaxis()->SetTitleOffset(1.40);
0201 hist1.back()->SetLineColor(colors[i1]);
0202 hist1.back()->SetLineStyle(styles[i1]);
0203 leg->AddEntry(hist1.back(), tags[i1].c_str(), "lp");
0204 }
0205 }
0206 sprintf(namec, "c_%s", hist1[0]->GetName());
0207 if (debug)
0208 std::cout << namec << " Canvas made for " << hist1[0]->GetName() << " with " << hist1.size() << " plots"
0209 << std::endl;
0210 TCanvas* pad = new TCanvas(namec, namec, 500, 500);
0211 pad->SetRightMargin(0.10);
0212 pad->SetTopMargin(0.10);
0213 if ((!ratio) && (logy[todo] > 0))
0214 pad->SetLogy(1);
0215 else
0216 pad->SetLogy(0);
0217 for (unsigned int i1 = 0; i1 < hist1.size(); ++i1) {
0218 if ((!ratio) && (rebin[todo] > 1))
0219 hist1[i1]->Rebin(rebin[todo]);
0220 if (i1 == 0) {
0221 hist1[i1]->Draw();
0222 } else {
0223 hist1[i1]->Draw("sames");
0224 }
0225 if (debug)
0226 std::cout << "Drawing histograms for " << hist1[i1]->GetName() << ":" << i1 << " in canvas " << pad->GetName()
0227 << std::endl;
0228 pad->Update();
0229 double dy0 = (ratio) ? 0.75 * dy : dy;
0230 TPaveStats* st = ((TPaveStats*)hist1[i1]->GetListOfFunctions()->FindObject("stats"));
0231 if (st != NULL) {
0232 st->SetFillColor(kWhite);
0233 st->SetLineColor(colors[i1]);
0234 st->SetTextColor(colors[i1]);
0235 st->SetY1NDC(y1 - dy0);
0236 st->SetY2NDC(y1);
0237 st->SetX1NDC(0.65);
0238 st->SetX2NDC(0.90);
0239 y1 -= dy0;
0240 }
0241 pad->Modified();
0242 pad->Update();
0243 leg->Draw("same");
0244 pad->Update();
0245 if (save) {
0246 sprintf(name, "%s.pdf", pad->GetName());
0247 pad->Print(name);
0248 }
0249 }
0250 }
0251 }