+++ /dev/null
-TCanvas *cCompareSimple,*cCompareCum;
-TCanvas *cSubtraction,*cCompareSubtractSimple,*cCompareSubtractCum;
-const Int_t timeWait=500;
-
-void AnalyzeCharmFractionHists(Int_t ptbin,Int_t rebin){
-
- //
- // Macro for analyzing the impact parameter distribution of the D0 candidates.
- //
- // andrea.rossi@ts.infn.it
- //
- //==========================================================================
-
-
- DrawHistos("d0D0_PureBack.root","d0D0NoMCSel_SideBand.root","hd0D0",ptbin,rebin);
- SubtractHist("d0D0_Signal.root","d0D0NoMCSel.root","d0D0NoMCSel_SideBand.root","hd0D0",ptbin,rebin);
- return;
-
-}
-
-TH1F* CumulativeHist(const TH1F *h1,TString nameHist=0x0){
- //ASSUME SAME BINNING
- TString histname="hCumulative";
- if(!nameHist.IsNull())histname.Append(nameHist.Data());
- Int_t nbins;
- Double_t minX,maxX,binwidth,cumul=0.,errcumul=0.;
- nbins=h1->GetNbinsX();
- minX=h1->GetBinCenter(1);
- maxX=h1->GetBinCenter(nbins);
- binwidth=h1->GetBinWidth(1);
-
- TH1F *h1copy=new TH1F();
- *h1copy=*h1;
- //h1copy->Sumw2();
-
- TH1F *hCumul=new TH1F(histname.Data(),histname.Data(),nbins,minX-binwidth/2.,maxX+binwidth/2.);
-
-
- for(Int_t j=1;j<=nbins;j++){
- cumul+=h1copy->GetBinContent(j);
- hCumul->SetBinContent(j,cumul);
- }
- hCumul->Sumw2();
- hCumul->Scale(1./h1copy->Integral(1,nbins));
-
- delete h1copy;
- return hCumul;
-}
-
-
-///////////////////// HISTOGRAMS COMPARISON //////////////////////////////////
-//
-// Compare the desired histograms. The default case is the comparison
-// between the d0 distribution for background (from MC) D0 candidates with the
-// d0 distribution for "side bands" d0 candidates
-//
-///////////////////////////////////////////////////////////////////////////////////
-
-void DrawHistos(Int_t pt,Int_t rebin=1){
- TString hist="hd0D0";
- DrawHistos("","",hist,pt,rebin);
- return;
-}
-void DrawHistos(TString file1,TString file2,TString hist,Int_t pt,Int_t rebin=1){
-
- if(pt>=0){
- hist.Append("pt");
- hist+=pt;
- }
- TString nameH=hist;
- Double_t integr1,integr2;
- if(file1.IsNull())file1="d0D0_PureBack.root";
- if(file2.IsNull())file2="d0D0NoMCSel_SideBand.root";
- TFile *fSide=TFile::Open(file2.Data());
- TFile *fmer=TFile::Open(file1.Data());
- TH1F *h1=(TH1F*)fmer->Get(hist.Data());
- nameH.Append("_Gaus");
- h1->SetName(nameH.Data());
- nameH=hist;
- TH1F *h2=(TH1F*)fSide->Get(hist.Data());
- nameH.Append("_SideBands");
- h2->SetName(nameH.Data());
-
- Bool_t satisfied=kFALSE;
-
- while(!satisfied){
- h1->Rebin(rebin);
- h2->Rebin(rebin);
- TH1F *hCumul1=CumulativeHist(h1,"_Gaus");
- hCumul1->SetDrawOption("E4");
- TH1F *hCumul2=CumulativeHist(h2,"_SideBands");
- hCumul2->SetDrawOption("E4");
-
-
- TH1F *hDivCumul=new TH1F();
- *hDivCumul=*hCumul2;
- // hDivCumul->Sumw2();
- hDivCumul->Divide(hCumul1,hCumul2);
- hDivCumul->SetName("RatioCumulGausSdBands");
- hDivCumul->SetTitle("Ratio Cumulative Gaus Over SideBands");
-
- TH1F *hGausComp=new TH1F();
- *hGausComp=*h1;
- nameH=h1->GetName();
- nameH.Append("Compare");
- hGausComp->SetName(nameH.Data());
- hGausComp->SetLineColor(kRed);
- hGausComp->Sumw2();
- integr1=hGausComp->Integral();
-
- TH1F *hSideComp=new TH1F();
- *hSideComp=*h2;
- nameH=h2->GetName();
- nameH.Append("Compare");
- hSideComp->SetName(nameH.Data());
- hSideComp->SetLineColor(kBlue);
- hSideComp->Sumw2();
- integr2=hSideComp->Integral();
- if(integr2>integr1)hSideComp->Scale(integr1/integr2);
- else hGausComp->Scale(integr2/integr1);
-
- TH1F *hDivision=new TH1F();
- *hDivision=*h1;
- hDivision->SetName("RatioGausSdBands");
- hDivision->SetTitle("Ratio Gaus Over Sd Bands");
- hDivision->Sumw2();
- hDivision->Divide(hGausComp,hSideComp);
-
-
- cCompareSimple=new TCanvas("cCompareSimple","Comparison of Under Gaus and Under Side Band background",700,700);
- cCompareSimple->Divide(1,2);
- cCompareSimple->cd(1);
- hSideComp->Draw();
- hGausComp->Draw("Sames");
- cCompareSimple->Update();
- TPaveStats *p=hGausComp->FindObject("stats");
- p->SetTextColor(kRed);
- p=(TPaveStats*)hSideComp->FindObject("stats");
- p->SetTextColor(kBlue);
- cCompareSimple->cd(2);
- hDivision->Draw();
- cCompareSimple->Update();
-
- cCompareCum=new TCanvas("cCompareCum","Comparison of cumulative function",700,700);
-
- cCompareCum->Divide(1,2);
-
- cCompareCum->cd(1);
-
- hCumul1->SetLineColor(kRed);
- hCumul2->SetLineColor(kBlue);
- hCumul1->SetFillColor(kRed);
- hCumul2->SetFillColor(kBlue);
- hCumul1->Draw();
- hCumul2->Draw("Sames");
- cCompareCum->cd(2);
- hDivCumul->Draw();
- cCompareCum->Update();
- p=(TPaveStats*)hCumul1->FindObject("stats");
- p->SetTextColor(kRed);
- p=(TPaveStats*)hCumul2->FindObject("stats");
- p->SetTextColor(kBlue);
- cCompareCum->Update();
- // cCompareCum->cd(2);
- //hCumul2->Draw();
- // cCompareCum->Update();
-
- for(Int_t timewait=0;timewait<timeWait;timewait++){
- cCompareCum->Update();
- cCompareSimple->Update();
- }
- cout<<"Are you satisfied?"<<endl;
- cin>>satisfied;
-
- if(!satisfied){
-
-
- delete hCumul1;
- delete hCumul2;
- delete hDivCumul;
- delete cCompareCum;
- delete hSideComp;
- delete hGausComp;
- delete cCompareSimple;
- delete hDivision;
-
- cout<<"Rebin"<<endl;
- cin>>rebin;
- if(rebin<0)return;
- }
- }
-
- return;
-
-}
-
-/////////////////////////////////////// BACKGROUND SUBTRACTION EXAMPLE ///////////////////
-//
-//
-// Performs: Signal Imp.Par Distr - B* Normalized Background Imp.Par Distr.(from Side Bands)
-// and compare it with the MC Signal Imp. Par distribution.
-// The amount of Background B is taken as the true one from the difference between
-// the integrals of the "Observed Signal" and the MC Signal d0 distributions.
-//
-//////////////////////////////////////////////////////////////////////////////////////////////
-
-void SubtractHist(Int_t pt,Int_t rebin=1){
- SubtractHist("d0D0_Signal.root","d0D0NoMCSel.root","d0D0NoMCSel_SideBand.root","hd0D0",pt,rebin);
-
- return;
-}
-
-void SubtractHist(TString fileSignal,TString fileNoMC,TString fileNoMCSB,TString hist,Int_t pt,Int_t rebin){
-
- if(pt>=0){
- hist.Append("pt");
- hist+=pt;
- }
-
- TString nameH=hist;
- Double_t integr1,integr2;
- /* if(fileNoMC.IsNull())fileNoMC="d0D0merged.root";
- if(fileNoMCSB.IsNull())fileNoMCSB="d0D0SideBmerged.root";*/
- if(gSystem->AccessPathName(fileSignal.Data())){
- Printf("Wrong signal file! \n");
- return;
- }
- if(gSystem->AccessPathName(fileNoMC.Data())){
- Printf("Wrong d0distr under inv mass peak file! \n");
- return;
- }
- if(gSystem->AccessPathName(fileNoMCSB.Data())){
- Printf("Wrong d0distr Side band file! \n");
- return;
- }
-
- TFile *fSide=TFile::Open(fileNoMCSB.Data());
- TFile *fNoMCSignal=TFile::Open(fileNoMC.Data());
-
- TH1F *h1=(TH1F*)fNoMCSignal->Get(hist.Data());
- nameH.Append("_SelSignal");
- h1->SetName(nameH.Data());
- nameH=hist;
- h1->Sumw2();
-
-
- TH1F *h2=(TH1F*)fSide->Get(hist.Data());
- nameH.Append("_SideBands");
- h2->SetName(nameH.Data());
- h2->Sumw2();
-
-
- Double_t integrGaus,integrSB,integrSign;
- integrGaus=h1->Integral();
- integrSB=h2->Integral();
-
-
- TFile *fSignal=TFile::Open(fileSignal.Data());
- TH1F *hSign=(TH1F*)fSignal->Get(hist.Data());
- nameH=hist;
- nameH.Append("_MCSignal");
- hSign->SetName(nameH.Data());
- hSign->Sumw2();
-
- Double_t integrGaus,integrSB,integrSign;
- integrGaus=h1->Integral();
- integrSB=h2->Integral();
- integrSign=hSign->Integral();
-
-
- Bool_t satisfied=kFALSE;
-
- while(!satisfied){
-
- h1->Rebin(rebin);
- h2->Rebin(rebin);
- hSign->Rebin(rebin);
-
- TH1F *hGausSubtract=new TH1F();
- *hGausSubtract=*h1;
- nameH=hist;
- hist.Append("_Subtracted");
- hGausSubtract->SetName(hist.Data());
- //hGausSubtract->Sumw2();
- hGausSubtract->Add(h1,h2,1.,-1./integrSB*(integrGaus-integrSign));
- /* hGausSubtract->Draw();
- return;*/
- cSubtraction=new TCanvas("cSubtraction","cSubtraction",600,700);
- cSubtraction->cd();
- hGausSubtract->SetLineColor(kRed);
- hGausSubtract->Draw("E0");
- hSign->SetLineColor(kBlue);
- hSign->Draw("sames");
- cSubtraction->Update();
- TPaveStats *p=hGausSubtract->FindObject("stats");
- p->SetTextColor(kRed);
- cSubtraction->Update();
- p=(TPaveStats*)hSign->FindObject("stats");
- p->SetTextColor(kBlue);
- cSubtraction->Update();
- /*TString strText="Side Band integral: ";
- strText+=integrSB;
- TLatex *lat=new TLatex(500.,500.,strText.Data());// *text=p->AddText(strText.Data());
- lat->Draw();
- TPaveText *pvInfo = new TPaveText(72.74276,79.18782,92.84497,95.43147,"brNDC");
- pvInfo->SetName("pvInfo");
- pvInfo->SetBorderSize(2);
- pvInfo->SetFillColor(19);
- pvInfo->SetTextAlign(12);
- TText *text=p->AddText(strText.Data());
- pvInfo->Draw();
- hGausSubtract->GetListOfFunctions()->Add(pvInfo);
- // pvInfo->SetParent(hGausSubtract->GetListOfFunctions());
-
- // strText="MCSignal integral: ";
- //strText+=integrSign;
- text=p->AddText(strText.Data());
- strText="Sel Signal integral: ";
- strText+=integrGaus;
- text=p->AddText(strText.Data());
- cSubtraction->Modified();*/
-
-
- TH1F *hCumulGausSubtract=CumulativeHist(hGausSubtract,"_BackSubtr");
- hCumulGausSubtract->SetDrawOption("E4");
- TH1F *hCumulSign=CumulativeHist(hSign,"_MCSignal");
- hCumulSign->SetDrawOption("E4");
-
-
- TH1F *hDivCumul=new TH1F();
- *hDivCumul=*hCumulSign;
- hDivCumul->Divide(hCumulGausSubtract,hCumulSign);
- hDivCumul->SetName("RatioCumulBackSubtr_MCSignal");
- hDivCumul->SetTitle("Ratio Cumulative BackSubtracted Over MCSignal");
-
- TH1F *hGausSubComp=new TH1F();
- *hGausSubComp=*hGausSubtract;
- nameH=hGausSubtract->GetName();
- nameH.Append("Compare");
- hGausSubComp->SetName(nameH.Data());
- hGausSubComp->SetLineColor(kRed);
- integr1=hGausSubComp->Integral();
-
- TH1F *hSignComp=new TH1F();
- *hSignComp=*hSign;
- nameH=hSign->GetName();
- nameH.Append("Compare");
- hSignComp->SetName(nameH.Data());
- hSignComp->SetLineColor(kBlue);
- integr2=hSignComp->Integral();
- if(integr2>integr1)hSignComp->Scale(integr1/integr2);
- else hGausSubComp->Scale(integr2/integr1);
-
- TH1F *hDivision=new TH1F();
- *hDivision=*hGausSubtract;
- hDivision->SetName("RatioBackSubtr_Signal");
- hDivision->SetTitle("Ratio BackSubtracted Over MCSignal");
- hDivision->Divide(hGausSubComp,hSignComp);
-
-
- cCompareSubtractSimple=new TCanvas("cCompareSubtractSimple","Comparison of BackSubtracted and MCSignal",700,700);
- cCompareSubtractSimple->Divide(1,2);
- cCompareSubtractSimple->cd(1);
- hSignComp->Draw();
- hGausSubComp->Draw("Sames");
- cCompareSubtractSimple->cd(2);
- hDivision->SetLineColor(1);
- hDivision->Draw();
- cCompareSubtractSimple->Update();
- p=(TPaveStats*)hGausSubComp->FindObject("stats");
- p->SetTextColor(kRed);
- p=(TPaveStats*)hSignComp->FindObject("stats");
- p->SetTextColor(kBlue);
- cCompareSubtractSimple->Update();
-
-
- cCompareSubtractCum=new TCanvas("cCompareSubtractCumulative","Comparison of cumulative functions",700,700);
-
- cCompareSubtractCum->Divide(1,2);
-
- cCompareSubtractCum->cd(1);
-
- hCumulGausSubtract->SetLineColor(kRed);
- hCumulSign->SetLineColor(kBlue);
- hCumulGausSubtract->SetFillColor(kRed);
- hCumulSign->SetFillColor(kBlue);
- hCumulGausSubtract->Draw();
- hCumulSign->Draw("Sames");
- cCompareSubtractCum->cd(2);
- hDivCumul->SetLineColor(1);
- hDivCumul->Draw();
-
- cCompareSubtractCum->Update();
- p=(TPaveStats*)hCumulGausSubtract->FindObject("stats");
- p->SetTextColor(kRed);
- p=(TPaveStats*)hCumulSign->FindObject("stats");
- p->SetTextColor(kBlue);
- cCompareSubtractCum->Update();
-
-
- for(Int_t timewait=0;timewait<timeWait;timewait++){
- cCompareSubtractCum->Update();
- cCompareSubtractSimple->Update();
- cSubtraction->Update();
- }
-
- cout<<"Are you satisfied?"<<endl;
- cin>>satisfied;
-
- if(!satisfied){
- cout<<"Rebin"<<endl;
- cin>>rebin;
- delete hCumulGausSubtract;
- delete hCumulSign;
- delete hDivCumul;
- delete cCompareSubtractCum;
- delete hSignComp;
- delete hGausSubComp;
- delete cCompareSubtractSimple;
- delete hDivision;
- }
- }
-
- printf("Side Band integral: %d \n",integrSB);
- printf("Selected Signal integral: %d \n",integrGaus);
- printf("MC Signal integral: %d \n",integrSign);
- printf(" -> Background = %d \n",integrGaus-integrSign);
-
- return;
-
-}
-
-//////////////////////////////// FIT DISTRIBUTION WITH GAUSSIAN + EXP TAILS ///////////////////
-//
-// Fit a istogram with a gaus(mean,sigma) + a*exp(mean2,lambda) function
-//
-/////////////////////////////////////////////////////////////////////////////////////////////////
-void DoFit(TString filename,TString histo,TString gausSide,Int_t ptbin,Int_t rebin=-1){
-
- TString histname=histo;
- TString fileout=histo;
-
- if(ptbin>=0){
- histname.Append("pt");
- histname+=ptbin;
- fileout.Append("pt");
- fileout+=ptbin;
- }
- else fileout.Append("ptAll");
-
- TFile *fIN=TFile::Open(filename.Data());
-
- TH1F *h=(TH1F*)fIN->Get(histname.Data());
-
- Int_t ok=0;
- Int_t binL=1,binR=h->GetNbinsX();
-
- while(ok!=1){
- if(rebin>0)h->Rebin(rebin);
-
- Double_t integr=h->Integral(binL,binR);
- Double_t binwidth=h->GetBinWidth(10);
- Double_t minX,maxX;
- Int_t nbin=h->GetNbinsX();
-
-
- TCanvas *c1=new TCanvas("c1","c1",700,600);
- c1->cd();
- // h->SetFillColor(kRed);
- h->Draw("");
- // c1->SetLogy();
- c1->Update();
-
- TF1 *f=CreateFunc(integr,binwidth);
- h->Fit(f->GetName(),"RI","",h->GetBinCenter(binL)-binwidth/2.,h->GetBinCenter(binR)+binwidth/2.);
- c1->Update();
-
- cout<<"Is it ok?"<<endl;
- cin>>ok;
- if(ok==1){
-
- fileout.Append("_");
- fileout.Append(gausSide.Data());
- fileout.Append("Fit.root");
-
- TFile *fOUT=new TFile(fileout.Data(),"RECREATE");
- fOUT->cd();
- c1->Write();
- h->Write();
- fOUT->Close();
- delete c1;
- delete f;
- }
- else if(ok==0){
- cout<<"rebin value= ";
- cin>>rebin;
- cout<<endl;
- cout<<"Change Interval?"<<endl;
- cin>>ok;
- if(ok){
- cout<<"Lower value= ";
- cin>>minX;
- cout<<endl;
- cout<<"Upper value= ";
- cin>>maxX;
- cout<<endl;
-
- binL=h->FindBin(minX);
- binR=h->FindBin(maxX);
- }
- ok=0;
- delete f;
- delete c1;
- }
- else {
- ok=1;
- delete f;
- delete c1;
- }
- }
-
- return;
-}
-
-
-TF1* CreateFunc(Double_t integral,Double_t binw){
- TF1 *func=new TF1("func","[5]*[6]*((1.-[2])*1./2./[1]*TMath::Exp(-TMath::Abs((x-[0])/[1]))+[2]/TMath::Sqrt(2*TMath::Pi())/[4]*TMath::Exp(-1*(x-[3])*(x-[3])/2./[4]/[4]))");
-
- func->FixParameter(5,integral);
- func->SetParName(5,"histInt");
- func->FixParameter(6,binw);
- func->SetParName(6,"binW");
- func->SetParLimits(0,-100,100.);
- func->SetParName(0,"expMean");
- func->SetParLimits(1,0.001,1000);
- func->SetParName(1,"expDecay");
- func->SetParLimits(2,0.00001,1.);
- func->SetParName(2,"fracGaus");
- func->SetParLimits(3,-100,100.);
- func->SetParName(3,"gausMean");
- func->SetParLimits(4,5.,200.);
- func->SetParName(4,"gausSigma");
-
- func->SetParameter(1,50.);
- func->SetParameter(4,50.);
-
- return func;
-
-}
-
-////////////////////////////////// CHI2 TEST: ////////////////////////
-// IN PROGRESS
-//
-///////////////////////////////////////////////////////////////////////////////
-Double_t GetChi2(const TH1F *h1,const TH1F *h2,TH1F *hchi2,Int_t &ndof){//ASSUME SAME BINNING
-
- Int_t int1=h1->Integral();
- Int_t int2=h2->Integral();
- Int_t nm,nM;
- TH1F **h=new TH1F*[2];
- TH1F *hchisq=new TH1F("hChi2","Chi2 histo",1000,0.,10.);
-
- if(int2>int1){
- nM=int2;
- nm=int1;
- h[0]=h2;
- h[1]=h1;
- }
- else {
- nM=int1;
- nm=int2;
- h[0]=h1;
- h[1]=h2;
- }
- ndof=0;
- Int_t nbin=h[0]->GetNbinsX();//ASSUME SAME BINNING
-
- Double_t chi2=0.,chi2Sum=0.;
- Double_t f1,fTrue;
- for(Int_t j=1;j<=nbin;j++){//THE BINNING IS NOT TAKEN INTO ACCOUNT
-
- if(h[1]->GetBinContent(j)==0||h[0]->GetBinContent(j)==0)continue;
- fTrue=h[0]->GetBinContent(j)/nM;
- chi2=(h[1]->GetBinContent(j)-fTrue*nm)*(h[1]->GetBinContent(j)-fTrue*nm)/h[1]->GetBinContent(j);
- hchisq->Fill(chi2);
- chi2Sum+=chi2;
- ndof++;
- }
-
- *hchi2=*hchisq;
- delete hchisq;
-
- return chi2Sum;
-
-
-}
-
-void TestChi2(){
-
-
- TH1F *h1=new TH1F("h1","h1",50,-10.,10.);
- TH1F *h2=new TH1F("h2","h2",50,-10.,10.);
-
- h1->FillRandom("gaus",50000);
- h2->FillRandom("gaus",80000);
- TH1F *hchi2=new TH1F();
- Int_t ndof;
- Double_t chi2=GetChi2(h1,h2,hchi2,ndof);
- hchi2->Draw();
- cout<<"The chi2 is "<<chi2;
-}
\ No newline at end of file