ROOT logo
#include <Riostream.h>
#include <TStyle.h>
#include <TFile.h>
#include <TList.h>
#include <TDirectoryFile.h>
#include <TClonesArray.h>
#include <TH1F.h>
#include <TCanvas.h>

#include <AliHFMassFitter.h>

#include <fstream>
#include <cmath>

//root[0] .x fitD0InvMass.C+
//root[1] fitD0(...)

//input: nsigma is the number of sigma in which significance, signal and background are calculated

//fit of histograms in the directory PWG3_D2H_D0InvMass of AnalysisResults.root . Must specify the list name where the histo are stored. Produce a root file with the fitted histos and a text file with signal, background and significance

void fitD0(Int_t rebin=0,TString listname="coutputmassD0mycuts",Int_t nsigma=3, TString pathin="./",TString pathout="./",Int_t btype=2){

  TString file="AnalysisResults.root"; //"D0InvMass.root";

  file.Prepend(pathin);
  cout<<"Opening "<<file<<endl;
  TFile *fin=new TFile(file.Data());
  if(!fin->IsOpen()){
    cout<<"File "<<file.Data()<<" not found"<<endl;
    return;
  }

  gStyle->SetOptFit(0111);
  gStyle->SetOptStat("nemrou");

  const Int_t npt=5;
  TString dirname="PWG3_D2H_D0InvMass";
  TDirectoryFile *dir=(TDirectoryFile*)fin->GetDirectory(dirname);

  TList *lista = (TList*) dir->Get(listname.Data());
  if(!lista) {
    cout<<listname<<" doesn't exist"<<endl;
    return;
  }

  TString fileout="table.dat";
  fileout.Prepend(pathout);
  ofstream out(fileout.Data());

  AliHFMassFitter *fitter=new AliHFMassFitter();

  cout<<"mean = "<<fitter->GetMean()<<"\tsigma= "<<fitter->GetSigma()<<endl;
  Bool_t init=kTRUE;

  out<<"Bakground type = "<<btype<<";\trebin = "<<rebin<<endl;
  Int_t i=0;
  for(Int_t ipt=0;ipt<npt;ipt++){ //npt

    out<<"************************************************************\n";
    out<<"* ptbin * entriesMass * entriesSgn * entriesBkg * entriesRfl *\n";

    //ALL w cuts
    TString nameall="histMass_";
    nameall+=(ipt+1);
    TH1F *hMass=(TH1F*)lista->FindObject(nameall);
    if(!hMass){
      cout<<nameall<<" not found"<<endl;
      return;
    }

    out<<"* "<< ipt+1 <<"  *  "<<hMass->GetEntries()<<"  *  ";
    //SIGNAL from MC
    TString namesgn="histSgn_";
    namesgn+=(ipt+1);
    TH1F *hSgn=(TH1F*)lista->FindObject(namesgn);
    if(!hSgn){
      cout<<namesgn<<" not found"<<endl;
      return;
    }
    
    out<<hSgn->GetEntries()<<"  *  ";
    //BACKGROUND from MC
    TString namebkg="histBkg_";
    namebkg+=(ipt+1);
    TH1F *hBkg=(TH1F*)lista->FindObject(namebkg);
    if(!hBkg){
      cout<<namebkg<<" not found"<<endl;
      return;
    }

    out<<hBkg->GetEntries()<<"  *  ";
    //REFLECTED SIGNAL from MC
    TString namerfl="histRfl_";
    namerfl+=(ipt+1);
    TH1F *hRfl=(TH1F*)lista->FindObject(namerfl);
    if(!hRfl){
      cout<<namerfl<<" not found"<<endl;
      return;
    }

    out<<hRfl->GetEntries()<<"  *\n";
    out<<"*************************************************\n";
    if(rebin!=0){
      hSgn->Rebin(rebin);
      hBkg->Rebin(rebin);
      hRfl->Rebin(rebin);
    }
    Double_t min, max;
    Int_t    nbin;
    Double_t sgn,errsgn,errsgn2=0,bkg,errbkg,errbkg2=0,sgnf,errsgnf,sgnfMC;
    Double_t meanfrfit,sigmafrfit, meanMC=hSgn->GetMean(),sigmaMC=hSgn->GetRMS();
    Double_t width=0;
    nbin=hMass->GetNbinsX();
    min=hMass->GetBinLowEdge(1);
    max=min+nbin*hMass->GetBinWidth(nbin);

    //FIT:

    TString namentu="ntupt3bin";
    if(init) fitter->InitNtuParam((char*)namentu.Data());
    // - all
    fitter->SetHisto(hMass);
    fitter->SetRangeFit(min, max);
    //fitter->SetRangeFit(1.83,1.89);
    fitter->SetType(btype,0);//(b,s)
    if(rebin!=0) fitter->RebinMass(rebin);
    Bool_t fitOK=fitter->MassFitter(kFALSE); //kFALSE = do not draw
    if(!fitOK) {
      out<<"Fit return kFALSE, skip "<<hMass->GetName()<<endl;
      fitter->Reset(); //delete histogram set
      continue;
    }
    width=fitter->GetHistoClone()->GetBinWidth(3);
    cout<<"\nChi^2 = "<<fitter->GetChiSquare()<<"\t Reduced Chi^2 = "<<fitter->GetReducedChiSquare()<<endl;
    meanfrfit=fitter->GetMean();
    sigmafrfit=fitter->GetSigma();
    out<<"mean = "<<meanfrfit<<" (MC "<<meanMC<<")"<<"\tsigma= "<<sigmafrfit<<" (MC "<<sigmaMC<<")"<<endl;
    //cout<<"old nbin = "<<hMass->GetNbinsX()<<"\tnew nbin = "<<fitter->GetHistoClone()->GetNbinsX()<<endl;
    if(meanfrfit<0 || sigmafrfit<0 || meanfrfit<min || meanfrfit>max) {
      cout<<"Fit failed, check"<<endl;
      out<<hMass->GetName();
      out<<": \nSgn not available"<<endl;
      out<<"Bkg  not available"<<endl;
      out<<"Sgnf not available"<<endl;
      out<<"*************************************************\n";
    }
    else{
      //cout<<"Writing..."<<endl;
      fitter->WriteHisto(pathout);
      hMass= fitter->GetHistoClone();
      //TH1F *hc=fitter->GetHistoClone();
      //TF1 *fbtest=hc->GetFunction("funcbkgRecalc"); //new version of ALiHFMassFitter
     
      fitter->FillNtuParam();
     
      Double_t limsx,limdx;
      limsx=meanfrfit-nsigma*sigmafrfit;
      limdx=meanfrfit+nsigma*sigmafrfit;
      // limsx=meanMC-nsigma*sigmaMC;
      //limdx=meanMC+nsigma*sigmaMC;


      //determine limit of nsigma in bins
      Int_t binsx,bindx;
      binsx=hMass->FindBin(limsx);
      if (limsx > hMass->GetBinCenter(binsx)) binsx++;
      bindx=hMass->FindBin(limdx);
      if (limdx < hMass->GetBinCenter(bindx)) bindx--;

      //reconvert bin in x
      Double_t sxr,dxr;
      sxr=hMass->GetBinLowEdge(binsx);
      dxr=hMass->GetBinLowEdge(bindx+1);

      fitter->Signal(sxr,dxr,sgn,errsgn);
      fitter->Background(sxr,dxr,bkg,errbkg);
      fitter->Significance(sxr,dxr,sgnf,errsgnf);
      

      Float_t inttot,intsgn,intsgnerr;

      Int_t np=-99;
      switch (btype){
      case 0: //expo
	np=2;
	break;
      case 1: //linear
	np=2;
	break;
      case 2: //pol2
	np=3;
	break;
      case 3: //no bkg
	np=1;
	break;
      }

      
      TF1 *fmass=hMass->GetFunction("funcmass");
      if (fmass){
	
	inttot=fmass->GetParameter(0);
	intsgn=fmass->GetParameter(np);
	intsgnerr=fmass->GetParError(np);
	//cout<<"i = "<<i<<"inttot = "<<inttot<<"\tintsgn = "<<intsgn<<"\tintsgnErr = "<<intsgnerr<<"\twidth = "<<width<<endl;
	Double_t errbkg2rel=errbkg/bkg*TMath::Sqrt((inttot-intsgn)/width/bkg);//intsgnerr/(inttot-intsgn)*TMath::Sqrt((inttot-intsgn)/width/bkg);
	Double_t errsgn2rel=errsgn/sgn*TMath::Sqrt(intsgn/width/sgn);
	errbkg2=errbkg2rel*bkg;
	errsgn2=errsgn2rel*sgn;
      }

           
      cout<<"bin sx = "<<binsx<<"\t xsx = "<<sxr<<endl;
      cout<<"bin dx = "<<bindx<<"\t xdx = "<<dxr<<endl;

      out<<hMass->GetName();
      Double_t sgnMC,bkgMC,rflMC;
      sgnMC=hSgn->Integral(binsx,bindx);
      bkgMC=hBkg->Integral(binsx,bindx);
      rflMC=hRfl->Integral(binsx,bindx);
      sgnfMC=sgnMC/TMath::Sqrt(sgnMC+bkgMC+rflMC);
      out<<": \nSgn  "<<sgn<<"+/-"<<errsgn<<" ("<<errsgn2<<")\tCompare with: "<<sgnMC<<endl;
      out<<"Bkg  "<<bkg<<"+/-"<<errbkg<<" ("<<errbkg2<<")\tCompare with: "<<bkgMC<<" + "<<rflMC<<" = "<<bkgMC+rflMC<<endl;
      out<<"Sgnf "<<sgnf<<"+/-"<<errsgnf<<"\tCompare with: "<<sgnfMC<<endl;
      if (sgn != 0 && sgnfMC != 0) out<<"sigmaS/S = "<<errsgn/sgn<<"\tCompare with 1/signif: "<<1./sgnfMC<<endl;
      else {
	out<<"sigmaS/S = "<<errsgn<<"/"<<sgn<<"\tCompare with 1/signif: 1./"<<sgnfMC<<endl;
      }
      out<<"nsigma considered for comparison = \ndx: "<<(dxr-meanfrfit)/sigmafrfit<<"\nsx: "<<(meanfrfit-sxr)/sigmafrfit<<endl;
      out<<"Mean = "<<meanfrfit<<"\tSigma = "<<sigmafrfit<<endl;
      out<<"*************************************************\n";
      i++;
    }
    
    sgn=0; bkg=0; sgnf=0;
    errsgn=0; errbkg=0; errsgnf=0;
    if (ipt == npt-1) fitter->WriteNtuple(pathout);

    out<<endl;
    fitter->Reset(); //delete histogram set

    init=kFALSE;

  }

  out.close();
}
 fitD0InvMass.C:1
 fitD0InvMass.C:2
 fitD0InvMass.C:3
 fitD0InvMass.C:4
 fitD0InvMass.C:5
 fitD0InvMass.C:6
 fitD0InvMass.C:7
 fitD0InvMass.C:8
 fitD0InvMass.C:9
 fitD0InvMass.C:10
 fitD0InvMass.C:11
 fitD0InvMass.C:12
 fitD0InvMass.C:13
 fitD0InvMass.C:14
 fitD0InvMass.C:15
 fitD0InvMass.C:16
 fitD0InvMass.C:17
 fitD0InvMass.C:18
 fitD0InvMass.C:19
 fitD0InvMass.C:20
 fitD0InvMass.C:21
 fitD0InvMass.C:22
 fitD0InvMass.C:23
 fitD0InvMass.C:24
 fitD0InvMass.C:25
 fitD0InvMass.C:26
 fitD0InvMass.C:27
 fitD0InvMass.C:28
 fitD0InvMass.C:29
 fitD0InvMass.C:30
 fitD0InvMass.C:31
 fitD0InvMass.C:32
 fitD0InvMass.C:33
 fitD0InvMass.C:34
 fitD0InvMass.C:35
 fitD0InvMass.C:36
 fitD0InvMass.C:37
 fitD0InvMass.C:38
 fitD0InvMass.C:39
 fitD0InvMass.C:40
 fitD0InvMass.C:41
 fitD0InvMass.C:42
 fitD0InvMass.C:43
 fitD0InvMass.C:44
 fitD0InvMass.C:45
 fitD0InvMass.C:46
 fitD0InvMass.C:47
 fitD0InvMass.C:48
 fitD0InvMass.C:49
 fitD0InvMass.C:50
 fitD0InvMass.C:51
 fitD0InvMass.C:52
 fitD0InvMass.C:53
 fitD0InvMass.C:54
 fitD0InvMass.C:55
 fitD0InvMass.C:56
 fitD0InvMass.C:57
 fitD0InvMass.C:58
 fitD0InvMass.C:59
 fitD0InvMass.C:60
 fitD0InvMass.C:61
 fitD0InvMass.C:62
 fitD0InvMass.C:63
 fitD0InvMass.C:64
 fitD0InvMass.C:65
 fitD0InvMass.C:66
 fitD0InvMass.C:67
 fitD0InvMass.C:68
 fitD0InvMass.C:69
 fitD0InvMass.C:70
 fitD0InvMass.C:71
 fitD0InvMass.C:72
 fitD0InvMass.C:73
 fitD0InvMass.C:74
 fitD0InvMass.C:75
 fitD0InvMass.C:76
 fitD0InvMass.C:77
 fitD0InvMass.C:78
 fitD0InvMass.C:79
 fitD0InvMass.C:80
 fitD0InvMass.C:81
 fitD0InvMass.C:82
 fitD0InvMass.C:83
 fitD0InvMass.C:84
 fitD0InvMass.C:85
 fitD0InvMass.C:86
 fitD0InvMass.C:87
 fitD0InvMass.C:88
 fitD0InvMass.C:89
 fitD0InvMass.C:90
 fitD0InvMass.C:91
 fitD0InvMass.C:92
 fitD0InvMass.C:93
 fitD0InvMass.C:94
 fitD0InvMass.C:95
 fitD0InvMass.C:96
 fitD0InvMass.C:97
 fitD0InvMass.C:98
 fitD0InvMass.C:99
 fitD0InvMass.C:100
 fitD0InvMass.C:101
 fitD0InvMass.C:102
 fitD0InvMass.C:103
 fitD0InvMass.C:104
 fitD0InvMass.C:105
 fitD0InvMass.C:106
 fitD0InvMass.C:107
 fitD0InvMass.C:108
 fitD0InvMass.C:109
 fitD0InvMass.C:110
 fitD0InvMass.C:111
 fitD0InvMass.C:112
 fitD0InvMass.C:113
 fitD0InvMass.C:114
 fitD0InvMass.C:115
 fitD0InvMass.C:116
 fitD0InvMass.C:117
 fitD0InvMass.C:118
 fitD0InvMass.C:119
 fitD0InvMass.C:120
 fitD0InvMass.C:121
 fitD0InvMass.C:122
 fitD0InvMass.C:123
 fitD0InvMass.C:124
 fitD0InvMass.C:125
 fitD0InvMass.C:126
 fitD0InvMass.C:127
 fitD0InvMass.C:128
 fitD0InvMass.C:129
 fitD0InvMass.C:130
 fitD0InvMass.C:131
 fitD0InvMass.C:132
 fitD0InvMass.C:133
 fitD0InvMass.C:134
 fitD0InvMass.C:135
 fitD0InvMass.C:136
 fitD0InvMass.C:137
 fitD0InvMass.C:138
 fitD0InvMass.C:139
 fitD0InvMass.C:140
 fitD0InvMass.C:141
 fitD0InvMass.C:142
 fitD0InvMass.C:143
 fitD0InvMass.C:144
 fitD0InvMass.C:145
 fitD0InvMass.C:146
 fitD0InvMass.C:147
 fitD0InvMass.C:148
 fitD0InvMass.C:149
 fitD0InvMass.C:150
 fitD0InvMass.C:151
 fitD0InvMass.C:152
 fitD0InvMass.C:153
 fitD0InvMass.C:154
 fitD0InvMass.C:155
 fitD0InvMass.C:156
 fitD0InvMass.C:157
 fitD0InvMass.C:158
 fitD0InvMass.C:159
 fitD0InvMass.C:160
 fitD0InvMass.C:161
 fitD0InvMass.C:162
 fitD0InvMass.C:163
 fitD0InvMass.C:164
 fitD0InvMass.C:165
 fitD0InvMass.C:166
 fitD0InvMass.C:167
 fitD0InvMass.C:168
 fitD0InvMass.C:169
 fitD0InvMass.C:170
 fitD0InvMass.C:171
 fitD0InvMass.C:172
 fitD0InvMass.C:173
 fitD0InvMass.C:174
 fitD0InvMass.C:175
 fitD0InvMass.C:176
 fitD0InvMass.C:177
 fitD0InvMass.C:178
 fitD0InvMass.C:179
 fitD0InvMass.C:180
 fitD0InvMass.C:181
 fitD0InvMass.C:182
 fitD0InvMass.C:183
 fitD0InvMass.C:184
 fitD0InvMass.C:185
 fitD0InvMass.C:186
 fitD0InvMass.C:187
 fitD0InvMass.C:188
 fitD0InvMass.C:189
 fitD0InvMass.C:190
 fitD0InvMass.C:191
 fitD0InvMass.C:192
 fitD0InvMass.C:193
 fitD0InvMass.C:194
 fitD0InvMass.C:195
 fitD0InvMass.C:196
 fitD0InvMass.C:197
 fitD0InvMass.C:198
 fitD0InvMass.C:199
 fitD0InvMass.C:200
 fitD0InvMass.C:201
 fitD0InvMass.C:202
 fitD0InvMass.C:203
 fitD0InvMass.C:204
 fitD0InvMass.C:205
 fitD0InvMass.C:206
 fitD0InvMass.C:207
 fitD0InvMass.C:208
 fitD0InvMass.C:209
 fitD0InvMass.C:210
 fitD0InvMass.C:211
 fitD0InvMass.C:212
 fitD0InvMass.C:213
 fitD0InvMass.C:214
 fitD0InvMass.C:215
 fitD0InvMass.C:216
 fitD0InvMass.C:217
 fitD0InvMass.C:218
 fitD0InvMass.C:219
 fitD0InvMass.C:220
 fitD0InvMass.C:221
 fitD0InvMass.C:222
 fitD0InvMass.C:223
 fitD0InvMass.C:224
 fitD0InvMass.C:225
 fitD0InvMass.C:226
 fitD0InvMass.C:227
 fitD0InvMass.C:228
 fitD0InvMass.C:229
 fitD0InvMass.C:230
 fitD0InvMass.C:231
 fitD0InvMass.C:232
 fitD0InvMass.C:233
 fitD0InvMass.C:234
 fitD0InvMass.C:235
 fitD0InvMass.C:236
 fitD0InvMass.C:237
 fitD0InvMass.C:238
 fitD0InvMass.C:239
 fitD0InvMass.C:240
 fitD0InvMass.C:241
 fitD0InvMass.C:242
 fitD0InvMass.C:243
 fitD0InvMass.C:244
 fitD0InvMass.C:245
 fitD0InvMass.C:246
 fitD0InvMass.C:247
 fitD0InvMass.C:248
 fitD0InvMass.C:249