// ********************************************************************* // To execute this macro under ROOT after your simulation ended, // 1 - launch ROOT (usually type 'root' at your machine's prompt) // 2 - type '.X plot.C' at the ROOT session prompt // // Author: Sebastien Incerti, CNRS, France // Date: 25 Feb. 2015 // The Geant4-DNA collaboration // ********************************************************************* { gROOT->Reset(); gStyle->SetPalette(1); gROOT->SetStyle("Plain"); gStyle->SetOptStat(00000); //*************************************** //*************************************** // MAKE YOUR SELECTION OF B, min and max // for log histograms //*************************************** //*************************************** Int_t B=1000; // bins per decade Int_t min=-2; // minimum x-axis value as 10^min Int_t max=2; // maximum x-axis value as 10^max // FILE *fp = fopen("yz.root","r"); if( fp ) { // exists cout << "*** Notice: the output file yz.root exists ***"<< endl; fclose(fp); } else { cout << "*** Notice: the output file yz.root does not exist ***"<< endl; cout << "*** it will be created from merged ROOT files ***"<< endl; system ("rm -rf yz.root"); system ("hadd yz.root yz_*.root");} // c1 = new TCanvas ("c1","",60,60,800,600); c1.Divide(3,2); /* // for testing only FILE * fp = fopen("yz.txt","r"); Float_t radius,y,z; Int_t ncols = 0; Int_t nlines = 0; TNtuple *ntuple = new TNtuple("ntuple","micro","radius:y:z"); while (1) { ncols = fscanf(fp,"%f %f %f",&radius,&y,&z); if (ncols < 0) break; ntuple->Fill(radius,y,z); nlines++; } fclose(fp); */ TFile f("yz.root"); TNtuple* ntuple; ntuple = (TNtuple*)f->Get("yz"); // --->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->---> //plot f(y) c1.cd(1); ntuple->Draw("y>>hfy","",""); hfy->Scale (1./(hfy->GetEntries()*hfy->GetBinWidth(1))); // DIVIDE BY BIN WIDTH !!! hfy->SetTitle("f(y) (um/keV)"); hfy->GetXaxis()->SetTitle("y (keV/um)"); hfy->SetFillColor(1); hfy->Draw(""); //check normalization Double_t norm=0; for (Int_t j=0;jGetNbinsX(); j++) norm=norm+hfy->GetBinContent(j)*hfy->GetBinWidth(1); // MULTIPLY BY BIN WIDTH !!! cout << endl; cout << "**** I - Results from lin-lin histograms ****" << endl; cout << endl; cout << "---> sum of f(y)dy =" << norm << endl; //plot y*f(y) c1.cd(2); TH1F *hyfy = (TH1F*)hfy->Clone("hyfy"); for (Int_t i=0;iGetNbinsX(); i++) hyfy->SetBinContent(i,hyfy->GetBinCenter(i)*hyfy->GetBinContent(i)); hyfy->SetLineColor(2); hyfy->SetFillColor(2); hyfy->SetTitle("y*f(y)"); hyfy->GetXaxis()->SetTitle("y (keV/um)"); hyfy->Draw(""); // --->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->---> //calculate yF Double_t yF=0; for (Int_t j=0;jGetNbinsX(); j++) yF=yF+hyfy->GetBinContent(j)*hyfy->GetBinWidth(1); // MULTIPLY BY BIN WIDTH !!! cout << "---> yF=" << yF << " keV/um" << endl; //plot y*f(y)/yF = d(y) (cf. Burigo et al., NIMB 320 (2014) 89-99) c1.cd(4); TH1F *hdy = (TH1F*)hyfy->Clone("hdy"); hdy->Scale (1./yF); hdy->SetLineColor(4); hdy->SetFillColor(4); hdy->SetTitle("d(y) (um/keV)"); hdy->GetXaxis()->SetTitle("y (keV/um)"); hdy->Draw(""); //check normalization Double_t normD=0; for (Int_t j=0;jGetNbinsX(); j++) normD=normD+hdy->GetBinContent(j)*hdy->GetBinWidth(1); // MULTIPLY BY BIN WIDTH !!! cout << "---> sum of d(y)dy =" << normD << endl; //plot y*d(y) c1.cd(5); TH1F *hydy = (TH1F*)hdy->Clone("hydy"); for (Int_t k=0;kGetNbinsX(); k++) hydy->SetBinContent(k,hydy->GetBinCenter(k)*hdy->GetBinContent(k)); hydy->SetLineColor(3); hydy->SetFillColor(3); hydy->SetTitle("y*d(y)"); hydy->GetXaxis()->SetTitle("y (keV/um)"); hydy->Draw(""); //calculate yD Double_t yD=0; for (Int_t l=0;lGetNbinsX(); l++) yD=yD+hydy->GetBinContent(l)*hydy->GetBinWidth(1); // MULTIPLY BY BIN WIDTH !!! cout << "---> yD=" << yD << " keV/um" << endl; // --->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->---> // --->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->---> // --->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->---> //log plot of y*f(y) //goto end; c1.cd(3); cout << endl; cout << "**** II - Results from log-lin histograms ****" << endl; cout << endl; cout << " You have selected "<< B << " bins per decade, from 10^" << min << " (a.u.) to 10^"<< max << " (a.u.) "<< endl; cout << endl; Int_t bins=B*(max-min); TH1F *hlogyfy = new TH1F("1","1",bins,min,max); TAxis *axis = hlogyfy->GetXaxis(); TH1F *hlogy2fy = new TH1F("2","2",bins,min,max); TAxis *axis2 = hlogy2fy->GetXaxis(); TH1F *hlogydy = new TH1F("3","3",bins,min,max); TAxis *axis3 = hlogydy->GetXaxis(); TH1F *hlogy3fy = new TH1F("4","4",bins,min,max); TAxis *axis4 = hlogy3fy->GetXaxis(); Axis_t from = axis->GetXmin(); Axis_t to = axis->GetXmax(); Axis_t width = (to - from) / bins; //cout << "*** width=" << width << endl; //cout << "*** bins=" << bins << endl; Axis_t *new_bins = new Axis_t[bins + 1]; for (int i = 0; i <= bins; i++) { new_bins[i] = TMath::Power(10, from + i * width); } axis->Set(bins, new_bins); axis2->Set(bins, new_bins); axis3->Set(bins, new_bins); axis4->Set(bins, new_bins); delete new_bins; // /* //for testing only FILE * fp2 = fopen("yz.txt","r"); while (1) { ncols = fscanf(fp2,"%f %f %f",&radius,&y,&z); if (ncols < 0) break; hlogyfy->Fill(y); hlogy2fy->Fill(y); hlogydy->Fill(y); hlogy3fy->Fill(y); hlogzfz->Fill(z); hlogz2fz->Fill(z); hlogzdz->Fill(z); hlogz3fz->Fill(z); nlines++; } fclose(fp2); */ // Double_t radius,y,z; ntuple->SetBranchAddress("radius",&radius); ntuple->SetBranchAddress("y",&y); ntuple->SetBranchAddress("z",&z); Int_t nentries = (Int_t)ntuple->GetEntries(); for (Int_t i=0; iGetEntry(i); hlogyfy->Fill(y); hlogy2fy->Fill(y); hlogydy->Fill(y); hlogy3fy->Fill(y); } // hlogyfy->Scale(1./( hlogyfy->GetEntries() )); hlogy2fy->Scale(1./( hlogy2fy->GetEntries() )); hlogydy->Scale(1./( hlogydy->GetEntries() )); hlogy3fy->Scale(1./( hlogy3fy->GetEntries() )); //plot y*f(y) gPad->SetLogx(); for (Int_t i=0;iGetNbinsX(); i++) { hlogyfy->SetBinContent(i, //(log(10)/B)* hlogyfy->GetBinCenter(i) *hlogyfy->GetBinContent(i) /(TMath::Power(10, from + (i+1) * width)-TMath::Power(10, from + i * width)) ); } hlogyfy->SetLineColor(2); hlogyfy->SetFillColor(2); hlogyfy->SetTitle("y*f(y)"); hlogyfy->GetXaxis()->SetTitle("y (keV/um)"); hlogyfy->Draw(""); //check normalization Double_t normLogfy=0; for (Int_t j=0;jGetNbinsX(); j++) normLogfy=normLogfy+(log(10)/B)*hlogyfy->GetBinContent(j); cout << "---> sum of Log f(y)dy =" << normLogfy << endl; //calculate yF //requires plot of log y2fy and integration of this plot for (Int_t i=0;iGetNbinsX(); i++) { hlogy2fy->SetBinContent(i, //(log(10)/B)* hlogy2fy->GetBinCenter(i) *hlogy2fy->GetBinCenter(i) *hlogy2fy->GetBinContent(i) /(TMath::Power(10, from + (i+1) * width)-TMath::Power(10, from + i * width)) ); } Double_t logyF=0; for (Int_t j=0;jGetNbinsX(); j++) logyF=logyF+(log(10)/B)*hlogy2fy->GetBinContent(j); cout << "---> yF =" << logyF << " keV/um" << endl; // --->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->---> //plot y*d(y) c1.cd(6); for (Int_t i=0;iGetNbinsX(); i++) { hlogydy->SetBinContent(i, //(log(10)/B)* hlogydy->GetBinCenter(i) *hlogydy->GetBinCenter(i) *hlogydy->GetBinContent(i) /(TMath::Power(10, from + (i+1) * width)-TMath::Power(10, from + i * width)) /logyF ); } hlogydy->SetLineColor(3); hlogydy->SetFillColor(3); hlogydy->SetTitle("y*d(y)"); hlogydy->GetXaxis()->SetTitle("y (keV/um)"); gPad->SetLogx(); hlogydy->Draw(""); //check normalization Double_t normLogdy=0; for (Int_t j=0;jGetNbinsX(); j++) normLogdy=normLogdy+(log(10)/B)*hlogydy->GetBinContent(j); cout << "---> sum of Log d(y)dy =" << normLogdy << endl; //calculate yD //requires plot of log y3fy and integration of this plot for (Int_t i=0;iGetNbinsX(); i++) { hlogy3fy->SetBinContent(i, //(log(10)/B)* hlogy3fy->GetBinCenter(i) *hlogy3fy->GetBinCenter(i) *hlogy3fy->GetBinCenter(i) *hlogy3fy->GetBinContent(i) /(TMath::Power(10, from + (i+1) * width)-TMath::Power(10, from + i * width)) /logyF ); } Double_t logyD=0; for (Int_t j=0;jGetNbinsX(); j++) logyD=logyD+(log(10)/B)*hlogy3fy->GetBinContent(j); cout << "---> yD =" << logyD << " keV/um" << endl; // --->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->---> // end: cout << endl; }