166 lines
4.5 KiB
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.00001, 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");
|
|
}
|