File indexing completed on 2023-03-17 10:44:19
0001
0002 #include <vector>
0003
0004 #include "TROOT.h"
0005 #include "TFile.h"
0006 #include "TDirectory.h"
0007 #include "TChain.h"
0008 #include "TObject.h"
0009 #include "TCanvas.h"
0010 #include "TMath.h"
0011 #include "TLegend.h"
0012 #include "TGraph.h"
0013 #include "TH1.h"
0014 #include "TH2.h"
0015 #include "TH3.h"
0016 #include "TTree.h"
0017 #include "TF1.h"
0018 #include "TPaveText.h"
0019 #include "TPaveStats.h"
0020 #include "tdrstyle.C"
0021
0022 int Color [] = {2,4,1,8,6,7,3,9,5};
0023 int Marker[] = {21,22,23,20,29,3,2};
0024 int Style [] = {1,2,5,7,9,10};
0025
0026 char buffer[2048];
0027
0028
0029 char* FileName;
0030
0031 void Core(char* SavePath);
0032
0033
0034 TObject* GetObjectFromPath(TDirectory* File, const char* Path);
0035 void SaveCanvas(TCanvas* c, const char* path, const char* name, bool OnlyPPNG=false);
0036 void DrawStatBox(TObject** Histos, std::vector<char*> legend, bool Mean , double X=0.15, double Y=0.93, double W=0.15, double H=0.03);
0037 void DrawLegend (TObject** Histos, std::vector<char*> legend, char* Title, char* Style, double X=0.79, double Y=0.93, double W=0.20, double H=0.05);
0038 void DrawSuperposedHistos(TH1D** Histos, std::vector<char*> legend, char* Style, char* Xlegend, char* Ylegend, double xmin, double xmax, double ymin, double ymax);
0039 void DrawTH2D (TH2D** Histos, std::vector<char*> legend, char* Style, char* Xlegend, char* Ylegend, double xmin, double xmax, double ymin, double ymax);
0040
0041 void makePlot()
0042 {
0043 setTDRStyle();
0044 gStyle->SetPadLeftMargin (0.18);
0045 gStyle->SetPadTopMargin (0.05);
0046 gStyle->SetPadBottomMargin(0.10);
0047 gStyle->SetPadRightMargin (0.18);
0048 gStyle->SetTitleSize(0.04, "XYZ");
0049 gStyle->SetTitleXOffset(1.1);
0050 gStyle->SetTitleYOffset(1.35);
0051 gStyle->SetPalette(1);
0052 gStyle->SetCanvasColor(0);
0053 gStyle->SetBarOffset(0);
0054
0055 TCanvas* c1;
0056 TObject** Histos = new TObject*[10];
0057 std::vector<char*> legend;
0058
0059 FileName = "ProbaMap.root";
0060 system("mkdir -p pictures");
0061 Core("pictures/");
0062 }
0063
0064
0065 void Core(char* SavePath)
0066 {
0067 TFile* f1 = new TFile(FileName);
0068 TH3F* Charge_Vs_Path3D = (TH3F*)GetObjectFromPath(f1,"Charge_Vs_Path");
0069 for(int x=0;x<15;x++){
0070 char xProjName[255];
0071 if(x==0){
0072 sprintf(xProjName,"%s","inc");
0073 Charge_Vs_Path3D->GetXaxis()->SetRange(0,15);
0074 }else{
0075 sprintf(xProjName,"%02i",x);
0076 Charge_Vs_Path3D->GetXaxis()->SetRange(x,x);
0077 }
0078 printf("---------------\n%s------------\n",xProjName);
0079 string xProjNameStr(xProjName);
0080
0081
0082 TH2D* Charge_Vs_Path2D = (TH2D*)Charge_Vs_Path3D->Project3D("zy");
0083 double binMinA = Charge_Vs_Path2D->GetXaxis()->GetBinLowEdge(4);
0084 double binMaxA = Charge_Vs_Path2D->GetXaxis()->GetBinUpEdge(6);
0085
0086 TH1D* Charge_Vs_PathA = (TH1D*)Charge_Vs_Path2D->ProjectionY("projA",4,6);
0087 Charge_Vs_PathA->Rebin(2);
0088 char ALegend[1024];sprintf(ALegend,"[%5.2f,%5.2f]",binMinA,binMaxA);
0089
0090
0091 double binMinB = Charge_Vs_Path2D->GetXaxis()->GetBinLowEdge(7);
0092 double binMaxB = Charge_Vs_Path2D->GetXaxis()->GetBinUpEdge(9);
0093 TH1D* Charge_Vs_PathB = (TH1D*)Charge_Vs_Path2D->ProjectionY("projB",7,9);
0094 Charge_Vs_PathB->Rebin(2);
0095 char BLegend[1024];sprintf(BLegend,"[%5.2f,%5.2f]",binMinB,binMaxB);
0096
0097 double binMinC = Charge_Vs_Path2D->GetXaxis()->GetBinLowEdge(10);
0098 double binMaxC = Charge_Vs_Path2D->GetXaxis()->GetBinUpEdge(12);
0099 TH1D* Charge_Vs_PathC = (TH1D*)Charge_Vs_Path2D->ProjectionY("projC",10,12);
0100 Charge_Vs_PathC->Rebin(2);
0101 char CLegend[1024];sprintf(CLegend,"[%5.2f,%5.2f]",binMinC,binMaxC);
0102
0103 double binMinD = Charge_Vs_Path2D->GetXaxis()->GetBinLowEdge(13);
0104 double binMaxD = Charge_Vs_Path2D->GetXaxis()->GetBinUpEdge(15);
0105 TH1D* Charge_Vs_PathD = (TH1D*)Charge_Vs_Path2D->ProjectionY("projD",13,15);
0106 Charge_Vs_PathD->Rebin(2);
0107 char DLegend[1024];sprintf(DLegend,"[%5.2f,%5.2f]",binMinD,binMaxD);
0108
0109 printf("%f to %f\n",binMinA,binMaxA);
0110 printf("%f to %f\n",binMinB,binMaxB);
0111 printf("%f to %f\n",binMinC,binMaxC);
0112 printf("%f to %f\n",binMinD,binMaxD);
0113
0114
0115 TCanvas* c0;
0116 TObject** Histos = new TObject*[10];
0117 std::vector<char*> legend;
0118
0119 c0 = new TCanvas("c0", "c0", 600,600);
0120 Charge_Vs_Path2D->SetTitle("");
0121 Charge_Vs_Path2D->SetStats(kFALSE);
0122 Charge_Vs_Path2D->GetXaxis()->SetTitle("pathlength (mm)");
0123 Charge_Vs_Path2D->GetYaxis()->SetTitle("#Delta E/#Delta x (ADC/mm)");
0124 Charge_Vs_Path2D->GetYaxis()->SetTitleOffset(1.80);
0125 Charge_Vs_Path2D->Draw("COLZ");
0126
0127 c0->SetLogz(true);
0128 SaveCanvas(c0,SavePath,(xProjNameStr+"_TH2").c_str());
0129 delete c0;
0130
0131
0132
0133 TH2D* Prob_ChargePath = new TH2D ("Prob_ChargePath" , "Prob_ChargePath" , Charge_Vs_Path2D->GetXaxis()->GetNbins(), Charge_Vs_Path2D->GetXaxis()->GetXmin(), Charge_Vs_Path2D->GetXaxis()->GetXmax(), Charge_Vs_Path2D->GetYaxis()->GetNbins(), Charge_Vs_Path2D->GetYaxis()->GetXmin(), Charge_Vs_Path2D->GetYaxis()->GetXmax());
0134 for(int j=0;j<=Prob_ChargePath->GetXaxis()->GetNbins()+1;j++){
0135 double Ni = 0;
0136 for(int k=0;k<=Prob_ChargePath->GetYaxis()->GetNbins()+1;k++){ Ni+=Charge_Vs_Path2D->GetBinContent(j,k);}
0137
0138 for(int k=0;k<=Prob_ChargePath->GetYaxis()->GetNbins()+1;k++){
0139 double tmp = 1E-10;
0140 for(int l=0;l<=k;l++){ tmp+=Charge_Vs_Path2D->GetBinContent(j,l);}
0141
0142 if(Ni>0){
0143 Prob_ChargePath->SetBinContent (j, k, tmp/Ni);
0144 }else{
0145 Prob_ChargePath->SetBinContent (j, k, 0);
0146 }
0147 }
0148 }
0149
0150 c0 = new TCanvas("c0", "c0", 600,600);
0151 Prob_ChargePath->SetTitle("Probability MIP(#DeltaE/#DeltaX) < Obs (#DeltaE/#DeltaX)");
0152 Prob_ChargePath->SetStats(kFALSE);
0153 Prob_ChargePath->GetXaxis()->SetTitle("pathlength (mm)");
0154 Prob_ChargePath->GetYaxis()->SetTitle("Observed #DeltaE/#DeltaX (ADC/mm)");
0155 Prob_ChargePath->GetYaxis()->SetTitleOffset(1.80);
0156 Prob_ChargePath->GetXaxis()->SetRangeUser(0.28,1.2);
0157
0158 Prob_ChargePath->Draw("COLZ");
0159
0160
0161 SaveCanvas(c0,SavePath,(xProjNameStr+"_TH2Proba").c_str());
0162 delete c0;
0163
0164 c0 = new TCanvas("c1","c1,",600,600); legend.clear();
0165 Histos[0] = Charge_Vs_PathA; legend.push_back(ALegend);
0166 Histos[1] = Charge_Vs_PathB; legend.push_back(BLegend);
0167 Histos[2] = Charge_Vs_PathC; legend.push_back(CLegend);
0168 Histos[3] = Charge_Vs_PathD; legend.push_back(DLegend);
0169 if(((TH1*)Histos[0])->Integral()>=1)((TH1*)Histos[0])->Scale(1/((TH1*)Histos[0])->Integral());
0170 if(((TH1*)Histos[1])->Integral()>=1)((TH1*)Histos[1])->Scale(1/((TH1*)Histos[1])->Integral());
0171 if(((TH1*)Histos[2])->Integral()>=1)((TH1*)Histos[2])->Scale(1/((TH1*)Histos[2])->Integral());
0172 if(((TH1*)Histos[3])->Integral()>=1)((TH1*)Histos[3])->Scale(1/((TH1*)Histos[3])->Integral());
0173
0174 DrawSuperposedHistos((TH1D**)Histos, legend, "", "Normalized Cluster Charge (ADC/mm)", "u.a.", 0,600, 0,0);
0175 DrawLegend(Histos,legend,"PathLength (mm):","L");
0176 c0->SetGridx(true);
0177 Charge_Vs_PathA->GetXaxis()->SetNdivisions(520);
0178 SaveCanvas(c0,SavePath,(xProjNameStr+"_TH1Linear").c_str());
0179 delete c0;
0180
0181
0182 c0 = new TCanvas("c1","c1,",600,600); legend.clear();
0183 Histos[0] = Charge_Vs_PathA; legend.push_back(ALegend);
0184 Histos[1] = Charge_Vs_PathB; legend.push_back(BLegend);
0185 Histos[2] = Charge_Vs_PathC; legend.push_back(CLegend);
0186 Histos[3] = Charge_Vs_PathD; legend.push_back(DLegend);
0187 if(((TH1*)Histos[0])->Integral()>=1)((TH1*)Histos[0])->Scale(1/((TH1*)Histos[0])->Integral());
0188 if(((TH1*)Histos[1])->Integral()>=1)((TH1*)Histos[1])->Scale(1/((TH1*)Histos[1])->Integral());
0189 if(((TH1*)Histos[2])->Integral()>=1)((TH1*)Histos[2])->Scale(1/((TH1*)Histos[2])->Integral());
0190 if(((TH1*)Histos[3])->Integral()>=1)((TH1*)Histos[3])->Scale(1/((TH1*)Histos[3])->Integral());
0191 DrawSuperposedHistos((TH1D**)Histos, legend, "", "Normalized Cluster Charge (ADC/mm)", "u.a.", 0,3000, 0,0);
0192
0193 c0->SetLogy(true);
0194 SaveCanvas(c0,SavePath,(xProjNameStr+"_TH1").c_str());
0195 delete c0;
0196
0197
0198
0199
0200 delete Charge_Vs_Path2D;
0201 delete Charge_Vs_PathA;
0202 delete Charge_Vs_PathB;
0203 delete Charge_Vs_PathC;
0204 delete Charge_Vs_PathD;
0205 delete Prob_ChargePath;
0206
0207 }
0208 }
0209
0210
0211
0212
0213 TObject* GetObjectFromPath(TDirectory* File, const char* Path)
0214 {
0215 string str(Path);
0216 size_t pos = str.find("/");
0217
0218 if(pos < 256){
0219 string firstPart = str.substr(0,pos);
0220 string endPart = str.substr(pos+1,str.length());
0221 TDirectory* TMP = (TDirectory*)File->Get(firstPart.c_str());
0222 if(TMP!=NULL)return GetObjectFromPath(TMP,endPart.c_str());
0223
0224 printf("BUG\n");
0225 return NULL;
0226 }else{
0227 return File->Get(Path);
0228 }
0229
0230 }
0231
0232
0233
0234 void SaveCanvas(TCanvas* c, const char* path, const char* name, bool OnlyPPNG){
0235 char buff[1024];
0236 sprintf(buff,"%s/%s.png",path,name); c->SaveAs(buff); if(OnlyPPNG)return;
0237 sprintf(buff,"%s/%s.eps",path,name); c->SaveAs(buff);
0238 sprintf(buff,"%s/%s.C" ,path,name); c->SaveAs(buff);
0239 }
0240
0241
0242
0243 void DrawLegend(TObject** Histos, std::vector<char*> legend, char* Title, char* Style, double X, double Y, double W, double H)
0244 {
0245 int N = legend.size();
0246
0247 if(strcmp(legend[0],"")!=0){
0248 TLegend* leg;
0249 leg = new TLegend(X,Y,X-W,Y - N*H);
0250 leg->SetFillColor(0);
0251 leg->SetBorderSize(0);
0252
0253 if(strcmp(Title,"")!=0)leg->SetHeader(Title);
0254
0255 if(strcmp(Style,"DataMC")==0){
0256 for(int i=0;i<N;i++){
0257 TH2D* temp = (TH2D*)Histos[i];
0258 temp->SetMarkerSize(1.3);
0259 if(i==0){
0260 leg->AddEntry(temp, legend[i] ,"P");
0261 }else{
0262 leg->AddEntry(temp, legend[i] ,"L");
0263 }
0264 }
0265 }else{
0266 for(int i=0;i<N;i++){
0267 TH2D* temp = (TH2D*)Histos[i];
0268 temp->SetMarkerSize(1.3);
0269 leg->AddEntry(temp, legend[i] ,Style);
0270 }
0271 }
0272 leg->Draw();
0273 }
0274 }
0275
0276
0277 void DrawStatBox(TObject** Histos, std::vector<char*> legend, bool Mean, double X, double Y, double W, double H)
0278 {
0279 int N = legend.size();
0280 char buffer[255];
0281
0282 if(Mean)H*=3;
0283 for(int i=0;i<N;i++){
0284 TPaveText* stat = new TPaveText(X,Y-(i*H), X+W, Y-(i+1)*H, "NDC");
0285 TH1* Histo = (TH1*)Histos[i];
0286 sprintf(buffer,"Entries : %i\n",(int)Histo->GetEntries());
0287 stat->AddText(buffer);
0288
0289 if(Mean){
0290 sprintf(buffer,"Mean : %6.2f\n",Histo->GetMean());
0291 stat->AddText(buffer);
0292
0293 sprintf(buffer,"RMS : %6.2f\n",Histo->GetRMS());
0294 stat->AddText(buffer);
0295 }
0296
0297 stat->SetFillColor(0);
0298 stat->SetLineColor(Color[i]);
0299 stat->SetTextColor(Color[i]);
0300 stat->SetBorderSize(0);
0301 stat->SetMargin(0.05);
0302 stat->SetTextAlign(12);
0303 stat->Draw();
0304 }
0305 }
0306
0307
0308
0309 void DrawTH2D(TH2D** Histos, std::vector<char*> legend, char* Style, char* Xlegend, char* Ylegend, double xmin, double xmax, double ymin, double ymax)
0310 {
0311 int N = legend.size();
0312
0313 for(int i=0;i<N;i++){
0314 if(!Histos[i])continue;
0315 Histos[i]->SetTitle("");
0316 Histos[i]->SetStats(kFALSE);
0317 Histos[i]->GetXaxis()->SetTitle(Xlegend);
0318 Histos[i]->GetYaxis()->SetTitle(Ylegend);
0319 Histos[i]->GetYaxis()->SetTitleOffset(1.60);
0320 if(xmin!=xmax)Histos[i]->SetAxisRange(xmin,xmax,"X");
0321 if(ymin!=ymax)Histos[i]->SetAxisRange(ymin,ymax,"Y");
0322 Histos[i]->SetMarkerStyle(Marker[i]);
0323 Histos[i]->SetMarkerColor(Color[i]);
0324 Histos[i]->SetMarkerSize(0.3);
0325 }
0326
0327 char Buffer[256];
0328 Histos[0]->Draw(Style);
0329 for(int i=1;i<N;i++){
0330 sprintf(Buffer,"%s same",Style);
0331 Histos[i]->Draw(Buffer);
0332 }
0333 }
0334
0335 void DrawSuperposedHistos(TH1D** Histos, std::vector<char*> legend, char* Style, char* Xlegend, char* Ylegend, double xmin, double xmax, double ymin, double ymax)
0336 {
0337 int N = legend.size();
0338
0339 double HistoMax = -1;
0340 int HistoHeighest = -1;
0341
0342 for(int i=0;i<N;i++){
0343 if(!Histos[i])continue;
0344 Histos[i]->SetTitle("");
0345 Histos[i]->SetStats(kFALSE);
0346 Histos[i]->GetXaxis()->SetTitle(Xlegend);
0347 Histos[i]->GetYaxis()->SetTitle(Ylegend);
0348 Histos[i]->GetXaxis()->SetTitleOffset(1.20);
0349 Histos[i]->GetYaxis()->SetTitleOffset(1.70);
0350 if(xmin!=xmax)Histos[i]->SetAxisRange(xmin,xmax,"X");
0351 if(ymin!=ymax)Histos[i]->SetAxisRange(ymin,ymax,"Y");
0352 Histos[i]->SetFillColor(0);
0353 Histos[i]->SetMarkerStyle(Marker[i]);
0354 Histos[i]->SetMarkerColor(Color[i]);
0355 Histos[i]->SetMarkerSize(0.5);
0356 Histos[i]->SetLineColor(Color[i]);
0357 Histos[i]->SetLineWidth(2);
0358 if(strcmp(Style,"DataMC")==0 && i==0){
0359 Histos[i]->SetFillColor(0);
0360 Histos[i]->SetMarkerStyle(20);
0361 Histos[i]->SetMarkerColor(1);
0362 Histos[i]->SetMarkerSize(1);
0363 Histos[i]->SetLineColor(1);
0364 Histos[i]->SetLineWidth(2);
0365 }
0366
0367 if(Histos[i]->GetMaximum() >= HistoMax){
0368 HistoMax = Histos[i]->GetMaximum();
0369 HistoHeighest = i;
0370 }
0371
0372 }
0373
0374 char Buffer[256];
0375 if(strcmp(Style,"DataMC")==0){
0376 if(HistoHeighest==0){
0377 Histos[HistoHeighest]->Draw("E1");
0378 }else{
0379 Histos[HistoHeighest]->Draw("HIST");
0380 }
0381 for(int i=0;i<N;i++){
0382 if(i==0){
0383 Histos[i]->Draw("same E1");
0384 }else{
0385 Histos[i]->Draw("same");
0386 }
0387 }
0388 }else{
0389 Histos[HistoHeighest]->Draw(Style);
0390 for(int i=0;i<N;i++){
0391 if(strcmp(Style,"")!=0){
0392 sprintf(Buffer,"same %s",Style);
0393 }else{
0394 sprintf(Buffer,"same");
0395 }
0396 Histos[i]->Draw(Buffer);
0397 }
0398 }
0399 }