FRIB_e21062/compareTH2D.C

166 lines
4.5 KiB
C

#include "armory/AnalysisLibrary.h"
double xMin1, xMax1;
TGraph fitGraph1;
Double_t fitFunc1(Double_t *x, Double_t *par) {
double pos = par[1]*x[0] + par[0];
return (xMax1 > pos && pos > xMin1 ? par[2] * fitGraph1.Eval(pos): 0);
}
TF1 * FitHist1(TH1F * hist1, TH1F * hist2, double a0, double a1, double scale){
if( hist1->GetNbinsX() != hist2->GetNbinsX() ) return NULL;
xMin1 = hist1->GetXaxis()->GetXmin();
xMax1 = hist2->GetXaxis()->GetXmax();
int nBin = hist1->GetNbinsX();
fitGraph1.Clear();
for( int i = 0; i < nBin; i++){
fitGraph1.AddPoint(hist1->GetBinCenter(i), hist1->GetBinContent(i));
}
double par[3] = {a0, a1, scale};
TF1 * fit1 = new TF1("fit1", fitFunc1, xMin1, xMax1, 3);
fit1->SetParameters(par);
fit1->SetParLimits(0, -20, 15);
fit1->SetParLimits(1, 0.6, 1.3);
//fit1->SetParLimits(2, 0.5*scale, 1.4*scale);
fit1->SetLineWidth(2);
fit1->SetLineColor(4);
fit1->SetNpx(1000);
hist2->Fit("fit1", "Rq");
return fit1;
}
double xMin2, xMax2;
TGraph fitGraph2;
Double_t fitFunc2(Double_t *x, Double_t *par) {
double pos = par[3]*x[0]*x[0] + par[1]*x[0] + par[0];
//return (xMax2 > pos && pos > xMin2 ? par[2] * fitGraph2->Eval(pos) * exp(pos/1000./par[3]): 0);
return (xMax2 > pos && pos > xMin2 ? par[2] * fitGraph2.Eval(pos) : 0);
//if( x[0] < 3900 ){
// return (xMax2 > pos && pos > xMin2 ? par[2] * fitGraph2.Eval(pos): 0);
//}else{
// return (xMax2 > pos && pos > xMin2 ? par[3] * fitGraph2.Eval(pos): 0);
//}
}
TF1 * FitHist2(TH1F * hist1, TH1F * hist2, double a0, double a1, double scale, double scale2){
if( hist1->GetNbinsX() != hist2->GetNbinsX() ) return NULL;
xMin2 = hist1->GetXaxis()->GetXmin();
xMax2 = hist2->GetXaxis()->GetXmax();
int nBin = hist1->GetNbinsX();
fitGraph2.Clear();
for( int i = 0; i < nBin; i++){
fitGraph2.AddPoint(hist1->GetBinCenter(i), hist1->GetBinContent(i));
}
double par[4] = {a0, a1, scale, scale2};
TF1 * fit2 = new TF1("fit2", fitFunc2, xMin2, xMax2, 4);
fit2->SetParameters(par);
fit2->SetParLimits(0, 0, 15);
fit2->SetParLimits(1, 0.6, 1.2);
fit2->SetParLimits(3, -0.00002, 0.00001);
//fit2->FixParameter(3, 0);
fit2->SetLineWidth(2);
fit2->SetLineColor(4);
fit2->SetNpx(1000);
hist2->Fit("fit2", "Rq");
return fit2;
}
void compareTH2D(int run1, int run2){
TFile * f1 = new TFile(Form("PID_%d.root", run1));
TH1F * hTOF1 = (TH1F*) f1->Get("hTOF");
TH1F * hdE1 = (TH1F*) f1->Get("hdE");
TH2F * hPID1 = (TH2F*) f1->Get("hPID0");
TFile * f2 = new TFile(Form("PID_%d.root", run2));
TH1F * hTOF2 = (TH1F*) f2->Get("hTOF");
TH1F * hdE2 = (TH1F*) f2->Get("hdE");
TH2F * hPID2 = (TH2F*) f2->Get("hPID0");
TCanvas * cc = (TCanvas *) gROOT->FindObjectAny("cc");
if( cc == NULL )cc = new TCanvas("cc", Form("cc %d, %d", run1, run2), 3000, 1000);
cc->Clear();
cc->Divide(3,1);
//================= TOF
cc->cd(1);
double yMax1 = hTOF1->GetMaximum();
double yMax2 = hTOF2->GetMaximum();
hTOF2->SetLineColor(2);
double scaleGuess = yMax2/yMax1;
if( yMax1 > yMax2 ) {
hTOF1->Draw("");
hTOF2->Draw("same");
}else{
hTOF2->Draw("");
hTOF1->Draw("same");
}
TF1 * fitTOF = FitHist1(hTOF1, hTOF2, -6, 1.0, scaleGuess);
fitTOF->Draw("same");
//TPad * chaha = (TPad*) (cc->cd(1))->Clone();
//cc->cd();
//chaha->Draw();
const Double_t* paraE_TOF = fitTOF->GetParErrors();
const Double_t* paraA_TOF = fitTOF->GetParameters();
printf("=================== TOF \n");
printf("a0 : %7.4f +- %7.4f \n", paraA_TOF[0], paraE_TOF[0]);
printf("a1 : %7.4f +- %7.4f \n", paraA_TOF[1], paraE_TOF[1]);
printf(" B : %7.4f +- %7.4f \n", paraA_TOF[2], paraE_TOF[2]);
//============== dE
cc->cd(2); cc->cd(2)->SetLogy();
hdE1->Draw("");
hdE2->SetLineColor(2);
hdE2->Draw("same");
TF1 * fitdE = FitHist2(hdE1, hdE2, -1, 1, 1, 0.0000001);
fitdE->Draw("same");
const Double_t* paraE_dE = fitdE->GetParErrors();
const Double_t* paraA_dE = fitdE->GetParameters();
printf("=================== dE \n");
printf("a0 : %7.4f +- %7.4f \n", paraA_dE[0], paraE_dE[0]);
printf("a1 : %7.4f +- %7.4f \n", paraA_dE[1], paraE_dE[1]);
printf(" B : %7.4f +- %7.4f \n", paraA_dE[2], paraE_dE[2]);
printf("B2 : %7.4f +- %7.4f \n", paraA_dE[3], paraE_dE[3]);
printf("################################\n");
printf("%3d %9.6f %9.6f %9.6f %9.6f %14.10f\n", run2, paraA_TOF[0], paraA_TOF[1], paraA_dE[0], paraA_dE[1], paraA_dE[3]);
printf("\n\n\n");
cc->cd(3);
hPID1->Draw("colz");
hPID2->Draw("same");
}