#if !defined(__CINT__) || defined(__MAKECINT__)
#include <TFile.h>
#include <TF1.h>
#include <TH1F.h>
#include <TCanvas.h>
#include <TLatex.h>
#include <TROOT.h>
#include <TStyle.h>
#include <TFractionFitter.h>
#endif
enum species {kPion, kKaon, kProton};
enum chargesign {kPositive,kNegative};
Float_t PerformFit(TH1F* fHistDCA, TObjArray *mc,TString partname,Float_t xyMax);
void FitDCADistributions(TString period="LHC10d",
TString MCname="LHC10f6a",
Int_t iSpecies=2,
Int_t cSign=1
)
{
gROOT->SetStyle("Plain");
gStyle->SetFillColor(0);
gStyle->SetOptStat(0000);
//binning
const Int_t nptbins = 22;
Double_t ptbins[nptbins+1]={0.08,0.10,0.12,0.14,0.16,0.18,0.20,0.25,0.30,0.35,0.40,0.45,0.50,0.55,0.60,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1.0};
//Final correction
TH1F *hPrimAllDATA=new TH1F("hPrimAllDATA","hPrimAllDATA",nptbins,ptbins);
TH1F *hPrimAllMC=new TH1F("hPrimAllMC","hPrimAllMC",nptbins,ptbins);
TH1F *hPrimAllDATAMC=new TH1F("hPrimAllDATAMC","hPrimAllDATAMC",nptbins,ptbins);
TString fnameMC=Form("%s/AnalysisResults.root",MCname.Data());
TString lnameMC="clistITSsaMult-1to-1";
TString lnameCutMC="DCACutMult-1to-1";
TString fnameDATA=Form("%s/AnalysisResults.root",period.Data());
TString lnameDATA="clistITSsaMult-1to-1";
TString lnameCutDATA="DCACutMult-1to-1";
const Int_t firstbin=1;
Int_t rebin=10;
Bool_t optSmooth=kTRUE;
TString pCharge="Pos";
TString pcharge="pos";
if(cSign==kNegative){
pCharge="Neg";
pcharge="neg";
}
TString species[3]={"Pi","K","P"};
TString speciesRoot[6]={"#pi^{+}","#pi^{-}","K^{+}","K^{-}","p","#bar{p}"};
Int_t idPart=iSpecies*2+cSign;
TString partname=Form("%s%s",pCharge.Data(),species[iSpecies].Data());
printf("%s\n",partname.Data());
// MC histograms
TFile *fMC=new TFile(fnameMC,"READ");
TH1F *fHistDCAMC[nptbins];
TH1F *fHistDCAPrim[nptbins];
TH1F *fHistDCAsec[nptbins];
TH1F *fHistDCAsecSt[nptbins];
TDirectory *dirFileMC=(TDirectory*)fMC->Get("PWG2SpectraITSsa");
TList *liMC = (TList*)dirFileMC->Get(lnameMC.Data());
for(Int_t m=0;m<nptbins;m++){
fHistDCAMC[m] = (TH1F*)liMC->FindObject(Form("fHistDCA%s%i",partname.Data(),m));
fHistDCAPrim[m] = (TH1F*)liMC->FindObject(Form("fHistMCPrimDCA%s%i",partname.Data(),m));
fHistDCAsec[m] = (TH1F*)liMC->FindObject(Form("fHistMCSecMatDCA%s%i",partname.Data(),m));
fHistDCAsecSt[m] = (TH1F*)liMC->FindObject(Form("fHistMCSecStDCA%s%i",partname.Data(),m));
fHistDCAMC[m]->Rebin(rebin);
fHistDCAPrim[m]->Rebin(rebin);
fHistDCAsec[m]->Rebin(rebin);
fHistDCAsecSt[m]->Rebin(rebin);
}
TList *liCutMC = (TList*)dirFileMC->Get(lnameCutMC.Data());
Bool_t setDCA=kFALSE;
Float_t DCAcut=7.;
Double_t xyPMC[3]; //parameters of DCA cut
xyPMC[0]=36.; //MC LHC10d1
xyPMC[1]=43.9;
xyPMC[2]=1.3;
TF1* fDCAxyCutMC=0x0;
TF1* fDCAzCutMC=0x0;
Float_t nSigmaDCAxyMC=0.;
Float_t nSigmaDCAzMC=0.;
if(liCutMC){
fDCAxyCutMC=(TF1*)liCutMC->FindObject("fDCAxyCutFunc");
fDCAzCutMC=(TF1*)liCutMC->FindObject("fDCAzCutFunc");
nSigmaDCAxyMC=fDCAxyCutMC->GetParameter(3);
nSigmaDCAzMC=fDCAzCutMC->GetParameter(3);
printf("DCA cut parameters from TF1: %f %f %f --- DCA cut = %f\n",fDCAxyCutMC->GetParameter(0),fDCAxyCutMC->GetParameter(1),fDCAxyCutMC->GetParameter(2),nSigmaDCAxyMC);
setDCA=kTRUE;
}
if(!setDCA){
printf("DCA cut values for MC not found in the output file, use dafault values. DCAcut=%f with default resolution\n",DCAcut);
fDCAxyCutMC = new TF1("fDCAxyCutFunc","[3]*([0]+[1]/TMath::Power(TMath::Abs(x),[2]))",0.05,10.);
for(Int_t ipar=0; ipar<3; ipar++) fDCAxyCutMC->SetParameter(ipar,xyPMC[ipar]);
fDCAxyCutMC->SetParameter(3,DCAcut);
nSigmaDCAxyMC=DCAcut;
}
//DATA histograms
TFile *fDATA=new TFile(fnameDATA,"READ");
TDirectory *dirFileDATA=(TDirectory*)fDATA->Get("PWG2SpectraITSsa");
TList *liDATA = (TList*)dirFileDATA->Get(lnameDATA.Data());
TH1F *fHistDCADATA[nptbins];
for(Int_t m=0;m<nptbins;m++){
fHistDCADATA[m] = (TH1F*)liDATA->FindObject(Form("fHistDCA%s%i",partname.Data(),m));
fHistDCADATA[m]->Rebin(rebin);
}
TList *liCutDATA = (TList*)dirFileDATA->Get(lnameCutDATA.Data());
setDCA=kFALSE;
Float_t nSigmaDCAxyDATA=0.;
Float_t nSigmaDCAzDATA=0.;
Double_t xyP[3]; // parameters of DCA cut
xyP[0]=32.7; //DATA 7 TeV pass2
xyP[1]=44.8;
xyP[2]=1.3;
TF1* fDCAxyCutDATA=0x0;
TF1* fDCAzCutDATA=0x0;
if(liCutDATA){
fDCAxyCutDATA=(TF1*)liCutDATA->FindObject("fDCAxyCutFunc");
fDCAzCutDATA=(TF1*)liCutDATA->FindObject("fDCAzCutFunc");
nSigmaDCAxyDATA=fDCAxyCutDATA->GetParameter(3);
nSigmaDCAzDATA=fDCAzCutDATA->GetParameter(3);
printf("DCA cut parameters from TF1: %f %f %f --- DCA cut = %f\n",fDCAxyCutDATA->GetParameter(0),fDCAxyCutDATA->GetParameter(1),fDCAxyCutDATA->GetParameter(2),nSigmaDCAxyDATA);
setDCA=kTRUE;
}
if(!setDCA){
printf("DCA cut values for DATA not found in the output file, use dafault values. DCAcut=%f with default resolution\n",DCAcut);
fDCAxyCutDATA = new TF1("fDCAxyCutFunc","[3]*([0]+[1]/TMath::Power(TMath::Abs(x),[2]))",0.05,10.);
for(Int_t ipar=0; ipar<3; ipar++) fDCAxyCutDATA->SetParameter(ipar,xyP[ipar]);
fDCAxyCutDATA->SetParameter(3,DCAcut);
nSigmaDCAxyDATA=DCAcut;
}
if(TMath::Abs(nSigmaDCAxyDATA-nSigmaDCAxyMC)<0.01) DCAcut=nSigmaDCAxyDATA;
else{
printf("ERROR: DCAxy cuts do not match between data and MC\n");
return;
}
if(TMath::Abs(nSigmaDCAzDATA-nSigmaDCAzMC)>0.01){
printf("ERROR: DCAz cuts do not match between data (%f) and MC (%f) \n",nSigmaDCAzDATA,nSigmaDCAzMC);
return;
}
TCanvas *cfitDATA=new TCanvas("cfitDATA","cfitDATA");
cfitDATA->Divide(6,4);
TCanvas *cfitMC=new TCanvas("cfitMC","cfitMC");
cfitMC->Divide(6,4);
for(Int_t ibin=firstbin;ibin<nptbins;ibin++){
Double_t xyMax =fDCAxyCutDATA->Eval(TMath::Abs((ptbins[ibin+1]+ptbins[ibin])/2))/10000.;
Double_t xyMaxMC =fDCAxyCutMC->Eval(TMath::Abs((ptbins[ibin+1]+ptbins[ibin])/2))/10000.;
TObjArray *mcTemplates = 0x0;
if(partname=="PosP"){
mcTemplates = new TObjArray(3); // MC histograms are put in this array
mcTemplates->Add(fHistDCAPrim[ibin]);
mcTemplates->Add(fHistDCAsecSt[ibin]);
mcTemplates->Add(fHistDCAsec[ibin]);
}else{
mcTemplates = new TObjArray(2); // MC histograms are put in this array
mcTemplates->Add(fHistDCAPrim[ibin]);
mcTemplates->Add(fHistDCAsecSt[ibin]);
}
// if(fHistDCADATA[ibin]->Integral()==0) continue;
////////////////// Fit on DATA
cfitDATA->cd(ibin);
gPad->SetLogy();
Double_t primAllDATA=PerformFit(fHistDCADATA[ibin],mcTemplates,partname,xyMax);
////////////////// Fit on MC
cfitMC->cd(ibin);
gPad->SetLogy();
Double_t primAllMC=PerformFit(fHistDCAMC[ibin],mcTemplates,partname,xyMaxMC);
if(hPrimAllMC!=0 && hPrimAllDATA!=0){
hPrimAllDATA->Fill((ptbins[ibin]+ptbins[ibin+1])/2,primAllDATA);
hPrimAllMC->Fill((ptbins[ibin]+ptbins[ibin+1])/2,primAllMC);
hPrimAllDATAMC->Fill((ptbins[ibin]+ptbins[ibin+1])/2,primAllDATA/primAllMC);
}
}
//Adding MC truth
TH1F* hAll=(TH1F*)liMC->FindObject(Form("hHist%sNSigmaMean%d",pCharge.Data(),iSpecies));
TH1F* hPrim=(TH1F*)liMC->FindObject(Form("hHist%sNSigmaPrimMean%d",pCharge.Data(),iSpecies));
TH1F* hPrimRecMC=(TH1F*)liMC->FindObject(Form("fHistPrimMC%sReco%d",pcharge.Data(),iSpecies));
TH1F* hSecMatRecMC=(TH1F*)liMC->FindObject(Form("fHistSecMatMC%sReco%d",pcharge.Data(),iSpecies));
TH1F* hSecStrRecMC=(TH1F*)liMC->FindObject(Form("fHistSecStrMC%sReco%d",pcharge.Data(),iSpecies));
hSecStrRecMC->Add(hSecMatRecMC);
hSecStrRecMC->Add(hPrimRecMC);
hPrim->SetLineColor(8);
hPrim->SetLineWidth(2);
hPrim->SetTitle("Prim/All from MC Truth");
hPrim->Divide(hAll);
hPrimRecMC->SetLineColor(11);
hPrimRecMC->SetLineWidth(2);
hPrimRecMC->SetTitle("Prim/All from MC Truth Reco");
hPrimRecMC->Divide(hSecStrRecMC);
hPrimAllDATAMC->GetXaxis()->SetRangeUser(0.09,0.79);
hPrimAllMC->GetXaxis()->SetRangeUser(0.09,0.79);
hPrimAllDATA->GetXaxis()->SetRangeUser(0.09,0.79);
if(optSmooth) hPrimAllDATAMC->Smooth(1,"R");
hPrimAllDATA->SetTitle("Prim/all data");
hPrimAllDATA->SetLineColor(2);
hPrimAllDATA->SetLineWidth(2);
hPrimAllMC->SetTitle("Prim/all mc");
hPrimAllMC->SetLineColor(4);
hPrimAllMC->SetLineWidth(2);
hPrimAllDATAMC->SetTitle("Prim/all data/mc");
hPrimAllDATAMC->SetLineColor(1);
hPrimAllDATAMC->SetLineWidth(2);
TCanvas *cPrimAll=new TCanvas("cPrimAll","cPrimAll");
hPrimAllDATA->SetMinimum(0.7);
hPrimAllDATA->SetMaximum(1.1);
hPrimAllDATA->Draw("l");
hPrimAllMC->Draw("lsame");
hPrimAllDATAMC->Draw("lsame");
hPrim->Draw("lsame");
hPrimRecMC->Draw("lsame");
gPad->BuildLegend();
TLatex* tsp=new TLatex(0.4,0.75,speciesRoot[idPart].Data());
tsp->SetTextFont(43);
tsp->SetTextSize(28);
tsp->SetNDC();
tsp->Draw();
cPrimAll->Update();
TString fout;
fout=Form("DCACorr%s_%s_%.0fDCA_%s_TFraction.root",period.Data(),MCname.Data(),DCAcut,partname.Data());
TFile *out=new TFile(fout.Data(),"recreate");
hPrimAllDATA->Write();
hPrimAllMC->Write();
hPrimAllDATAMC->Write();
out->Close();
delete out;
}
Float_t PerformFit(TH1F* fHistDCA, TObjArray *mc,TString partname,Float_t xyMax){
Double_t prim=0,secSt=0,sec=0;
TFractionFitter* fit = new TFractionFitter(fHistDCA, mc); // initialise
fit->Constrain(0,0.0,1.0); // constrain fraction 1 to be between 0 and 1
fit->Constrain(1,0.0,1.0); // constrain fraction 1 to be between 0 and 1
if(partname=="PosP")fit->Constrain(2,0.0,1.0); // constrain fraction 1 to be between 0 and 1
//fit->SetRangeX(200,1000); // use only the first 15 bins in the fit
Int_t status = fit->Fit(); // perform the fit
cout << "fit status: " << status << endl;
if (status == 0) { // check on fit status
TH1F* result = (TH1F*) fit->GetPlot();
TH1F* PrimMCPred=(TH1F*)fit->GetMCPrediction(0);
TH1F* secStMCPred=(TH1F*)fit->GetMCPrediction(1);
TH1F* secMCPred=0x0;
if(partname=="PosP"){
secMCPred=(TH1F*)fit->GetMCPrediction(2);
secMCPred->SetLineColor(4);
}
//Drawing section
PrimMCPred->SetLineColor(2);
secStMCPred->SetLineColor(6);
fHistDCA->SetTitle("DCA distr - data");
fHistDCA->DrawCopy("Ep");
result->SetTitle("Fit result");
result->DrawCopy("same");
Double_t value,error;
fit->GetResult(0,value,error);
PrimMCPred->Scale(fHistDCA->GetSumOfWeights()*value/PrimMCPred->GetSumOfWeights());
PrimMCPred->SetTitle("Primaries");
PrimMCPred->DrawCopy("same");
fit->GetResult(1,value,error);
secStMCPred->Scale(fHistDCA->GetSumOfWeights()*value/secStMCPred->GetSumOfWeights());
secStMCPred->SetTitle("Sec from strangeness");
secStMCPred->DrawCopy("same");
if(partname=="PosP" && secMCPred){
fit->GetResult(2,value,error);
secMCPred->Scale(fHistDCA->GetSumOfWeights()*value/secMCPred->GetSumOfWeights());
secMCPred->SetTitle("Sec from material");
secMCPred->DrawCopy("same");
}
prim=PrimMCPred->Integral(PrimMCPred->FindBin(-xyMax),PrimMCPred->FindBin(xyMax));
secSt=secStMCPred->Integral(secStMCPred->FindBin(-xyMax),secStMCPred->FindBin(xyMax));
if(partname=="PosP")sec=secMCPred->Integral(secMCPred->FindBin(-xyMax),secMCPred->FindBin(xyMax));
}
else{
prim=1;
secSt=1;
if(partname=="PosP")sec=1;
}
Printf("Yields: primary=%f material=%f strange=%f\n",prim,sec,secSt);
return prim/(prim+secSt+sec);
}