]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Analysis macro (Andrea R)
authordainese <dainese@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 22 Jun 2009 15:33:33 +0000 (15:33 +0000)
committerdainese <dainese@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 22 Jun 2009 15:33:33 +0000 (15:33 +0000)
PWG3/vertexingHF/macros/AnalyzeCharmFractionHists.C [new file with mode: 0644]

diff --git a/PWG3/vertexingHF/macros/AnalyzeCharmFractionHists.C b/PWG3/vertexingHF/macros/AnalyzeCharmFractionHists.C
new file mode 100644 (file)
index 0000000..749fee7
--- /dev/null
@@ -0,0 +1,611 @@
+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