9 #include <TClonesArray.h>
12 #include <TGraphErrors.h>
14 #include <TMultiGraph.h>
16 #include <TObjectTable.h>
17 #include <TDatabasePDG.h>
19 #include <TPaveText.h>
45 Bool_t Data(TH1F* h,
Double_t* rangefit,
Bool_t writefit,
Double_t& sgn,
Double_t& errsgn,
Double_t& bkg,
Double_t& errbkg,
Double_t& sgnf,
Double_t& errsgnf,
Double_t& sigmafit,
Int_t& status);
68 outcheck.open(
"output.dat",ios::out);
69 outdetail.open(
"discarddetails.dat",ios::out);
71 gStyle->SetFrameBorderMode(0);
72 gStyle->SetCanvasColor(0);
73 gStyle->SetFrameFillColor(0);
74 gStyle->SetTitleFillColor(0);
75 gStyle->SetStatColor(0);
78 TString filename=
"AnalysisResults.root",dirname=
"PWG3_D2H_Significance",listname=
"coutputSig",mdvlistname=
"coutputmv";
80 TString hnamemass=
"hMass_",hnamesgn=
"hSig_",hnamebkg=
"hBkg_";
95 listname+=
"Dstar0100";
96 mdvlistname+=
"Dstar0100";
115 cout<<
decCh<<
" is not allowed as decay channel "<<endl;
118 mass=TDatabasePDG::Instance()->GetParticle(
pdg)->Mass();
119 if (
decCh==2)
mass=(TDatabasePDG::Instance()->GetParticle(
pdg)->Mass() - TDatabasePDG::Instance()->GetParticle(421)->Mass());
122 listname.Append(part);
123 mdvlistname.Append(part);
126 listname.Append(centr);
127 mdvlistname.Append(centr);
129 cout<<
"Mass = "<<
mass<<endl;
131 Int_t countFitFail=0,countSgnfFail=0,countNoHist=0,countBkgOnly=0;
133 outcheck<<
"ptbin\tmdvGlobAddr\thistIndex\tSignif\tS\tB"<<endl;
134 outdetail<<
"ptbin\tmdvGlobAddr\thistIndex\trelErrS\t\tmean_F-mass (mass = "<<
mass<<
")"<<endl;
135 TFile *fin=
new TFile(filename.Data());
137 cout<<
"File "<<filename.Data()<<
" not found"<<endl;
141 TDirectoryFile *dir=(TDirectoryFile*)fin->GetDirectory(dirname);
143 cout<<
"Directory "<<dirname<<
" not found"<<endl;
149 cout<<listname<<
" doesn't exist"<<endl;
153 TList* listamdv= (
TList*)dir->Get(mdvlistname);
155 cout<<mdvlistname<<
" doesn't exist"<<endl;
159 TH1F* hstat=(TH1F*)histlist->FindObject(
"fHistNEvents");
160 TCanvas *cst=
new TCanvas(
"hstat",
"Summary of statistics");
164 hstat->Draw(
"htext0");
165 cst->SaveAs(
"hstat.png");
167 cout<<
"Warning! fHistNEvents not found in "<<listname.Data()<<endl;
171 TH1F* htestIsMC=(TH1F*)histlist->FindObject(
"hSig_0");
172 if(htestIsMC) isMC=kTRUE;
175 Int_t nhist=(histlist->GetEntries()-1);
180 for(
Int_t i=0;i<nhist;i++){
184 TFile* fout=
new TFile(Form(
"outputSignifMaxim.root"),
"recreate");
187 TH1F* hstatus=
new TH1F(
"hstatus",
"Flag status",6,-0.5,5.5);
188 hstatus->GetXaxis()->SetBinLabel(1,
"fit fail");
189 hstatus->GetXaxis()->SetBinLabel(2,
"fit ok and good results");
190 hstatus->GetXaxis()->SetBinLabel(3,
"quality requirements not satisfied");
191 hstatus->GetXaxis()->SetBinLabel(4,
"only bkg fit ok");
192 hstatus->GetXaxis()->SetBinLabel(5,
"negative signif");
193 hstatus->GetXaxis()->SetBinLabel(6,Form(
"< %d entries",minentries));
197 for(
Int_t i=0;i<nhist;i++){
198 TString name=Form(
"%s%d",hnamemass.Data(),i);
199 TH1F* h=(TH1F*)histlist->FindObject(name.Data());
202 cout<<name<<
" not found"<<endl;
206 if(h->GetEntries()>minentries){
208 if (h->Integral() > minentries){
209 cout<<i<<
") Integral = "<<h->Integral()<<endl;
217 cout<<
"There are "<<count<<
" histogram with more than "<<minentries<<
" entries"<<endl;
219 cout<<
"No histogram to draw..."<<endl;
230 TString name=mdvS->GetName(),nameErr=
"err",setname=
"";
232 setname=Form(
"S%s",name.Data());
233 mdvS->SetName(setname.Data());
237 setname=Form(
"%sS%s",nameErr.Data(),name.Data());
238 mdvSerr->SetName(setname.Data());
241 setname=Form(
"B%s",name.Data());
245 setname=Form(
"%sB%s",nameErr.Data(),name.Data());
246 mdvBerr->SetName(setname.Data());
249 setname=Form(
"Sgf%s",name.Data());
253 setname=Form(
"%sSgf%s",nameErr.Data(),name.Data());
254 mdvSgnferr->SetName(setname.Data());
256 hSigma[i]=
new TH1F(Form(
"hSigmapt%d",i),Form(
"Sigma distribution pt bin %d (%.1f < pt < %.1f)",i,mdvSgnf->GetPtLimit(0),mdvSgnf->GetPtLimit(1)), 200,0.,0.05);
261 cout<<
"nhistforptbin = "<<nhistforptbin<<endl;
265 for(
Int_t ih=0;ih<nhistforptbin;ih++){
266 printf(
"Analyzing indexes[%d] = %d \n",ih+i*nhistforptbin,indexes[ih+i*nhistforptbin]);
268 if(isData && indexes[ih+i*nhistforptbin] == -1) {
273 mdvB->SetElement(ih,0);
278 outcheck<<i<<
"\t\t "<<ih<<
"\t\t"<<indexes[ih+i*nhistforptbin];
282 Double_t signif=0, signal=0, background=0, errSignif=0, errSignal=0, errBackground=0,sigmafit=0;
285 name=Form(
"%s%d",hnamemass.Data(),indexes[ih+i*nhistforptbin]);
286 h=(TH1F*)histlist->FindObject(name.Data());
289 if (h->GetEntries() >= minentries)
290 BinCounting(h,rangefit,writefit,signal,errSignal,background,errBackground,signif,errSignif,status);
292 Data(h,rangefit,writefit,signal,errSignal,background,errBackground,signif,errSignif,sigmafit,status);
294 name=Form(
"%s%d",hnamesgn.Data(),ih+i*nhistforptbin);
295 h=(TH1F*)histlist->FindObject(name.Data());
297 cout<<name.Data()<<
" not found"<<endl;
300 name=Form(
"%s%d",hnamebkg.Data(),ih+i*nhistforptbin);
301 g=(TH1F*)histlist->FindObject(name.Data());
303 cout<<name.Data()<<
" not found"<<endl;
307 MC(h,g,signal,errSignal,background,errBackground,signif,errSignif,sigmafit,status);
311 hstatus->Fill(status);
314 mdvSgnf->SetElement(ih,signif);
318 mdvB->SetElement(ih,background);
320 hSigma[i]->Fill(sigmafit);
322 mdvSgnf->SetElement(ih,0);
326 mdvB->SetElement(ih,0);
329 mdvB->SetElement(ih,background);
349 TCanvas *cinfo=
new TCanvas(
"cinfo",
"Status");
352 hstatus->Draw(
"htext0");
356 outcheck<<
"\nSummary:\n - Total number of histograms: "<<nhist<<
"\n - "<<count<<
" histograms with more than "<<minentries<<
" entries; \n - Too few entries in histo "<<countNoHist<<
" times;\n - Fit failed "<<countFitFail<<
" times \n - no sense Signal/Background/Significance "<<countSgnfFail<<
" times\n - only background "<<countBkgOnly<<
" times"<<endl;
371 Bool_t Data(TH1F* h,
Double_t* rangefit,
Bool_t writefit,
Double_t& sgn,
Double_t& errsgn,
Double_t& bkg,
Double_t& errbkg,
Double_t& sgnf,
Double_t& errsgnf,
Double_t& sigmafit,
Int_t& status){
372 Int_t nbin=h->GetNbinsX();
374 Double_t max=h->GetBinLowEdge(nbin-5)+h->GetBinWidth(nbin-5);
376 if(
decCh != 2) min = h->GetBinLowEdge(1);
377 else min = TDatabasePDG::Instance()->GetParticle(211)->Mass();
378 max=h->GetBinLowEdge(nbin+1);
398 cout<<
"FIT NOT OK!"<<endl;
401 outcheck<<
"\t 0\t xxx"<<
"\t failed"<<endl;
414 if(ok==kTRUE && ( (sigmafit <
sigmaCut) ) && sgn > 0 && bkg > 0){
421 outcheck<<
"\t\t "<<sgnf<<
" +- "<<errsgnf<<
"\t"<<sgn<<
" +- "<<errsgn<<
"\t"<<bkg<<
" +- "<<errbkg<<endl;
427 outdetail<<
"\t\t "<<errsgn/sgn<<
"\t\t "<<(meanfit-
mass)/errmeanfit<<endl;
434 fitter.
Background(nsigmarange[0],nsigmarange[1],bkg,errbkg);
436 outcheck<<
"\t\t 0\t "<<bkg <<
"\t bkgonly"<<endl;
439 outdetail<<
"\t\t \t\tnot able to refit with bkg obly"<<endl;
448 cout<<
"Setting to 0 (fitter results meaningless)"<<endl;
449 outcheck<<
"\t S || B || sgnf negative";
465 sigmaused=hs->GetRMS();
469 cout<<
"from "<<nsigmarange[0]<<
" to "<<nsigmarange[1]<<endl;
471 Int_t binnsigmarange[2]={hs->FindBin(nsigmarange[0]),hs->FindBin(nsigmarange[1])};
472 cout<<
"bins "<<binnsigmarange[0]<<
" e "<<binnsigmarange[1]<<endl;
474 sgn=hs->Integral(binnsigmarange[0],binnsigmarange[1]);
475 errsgn=TMath::Sqrt(sgn);
476 bkg=hb->Integral(binnsigmarange[0],binnsigmarange[1]);
477 errbkg=TMath::Sqrt(bkg);
478 if(sgn+bkg>0.) sgnf=sgn/TMath::Sqrt(sgn+bkg);
483 errsgnf=TMath::Sqrt(sgnf*sgnf/(sgn+bkg)/(sgn+bkg)*(1/4.*errsgn*errsgn+errbkg*errbkg)+sgnf*sgnf/sgn/sgn*errsgn*errsgn);
494 if(
reject && x[0]>par[2] && x[0]<par[3] ){
498 return par[0] + TMath::Exp(par[1]*x[0]) ;
507 if(
reject && x[0]>par[2] && x[0]<par[3] ){
512 Double_t xminusmpi = x[0]-TDatabasePDG::Instance()->GetParticle(211)->Mass();
513 return par[0]*TMath::Power(TMath::Abs(xminusmpi),par[1]) ;
521 if(
reject && x[0]>par[2] && x[0]<par[3] ){
525 Double_t xminusmpi = x[0]-TDatabasePDG::Instance()->GetParticle(211)->Mass();
526 return par[0]*TMath::Sqrt(xminusmpi)*TMath::Exp(-1.*par[1]*xminusmpi);
539 Int_t nbin=h->GetNbinsX();
540 if(
decCh != 2) min = h->GetBinLowEdge(1);
541 else min = TDatabasePDG::Instance()->GetParticle(211)->Mass();
542 max=h->GetBinLowEdge(nbin+1);
560 TFitResultPtr r = h->Fit(fBkgFit,
"RS+");
564 cout<<
"FIT NOT OK!"<<endl;
565 cout<<
"\t 0\t xxx"<<
"\t failed"<<endl;
577 fBkgFct->SetLineStyle(2);
578 for(
Int_t i=0; i<4; i++) fBkgFct->SetParameter(i,fBkgFit->GetParameter(i));
579 h->GetListOfFunctions()->Add(fBkgFct);
580 TH1F * hBkgFct = (TH1F*)fBkgFct->GetHistogram();
586 Double_t counts=0., bkgcounts=0., errcounts=0., errbkgcounts=0.;
587 for (
Int_t ibin = binStartCount; ibin<=binEndCount; ibin++) {
588 counts += h->GetBinContent( ibin );
589 errcounts += counts ;
590 Double_t center = h->GetBinCenter(ibin);
591 bkgcounts += hBkgFct->GetBinContent( hBkgFct->FindBin(center) );
593 errbkgcounts += bkgcounts ;
597 errbkg = TMath::Sqrt( errbkgcounts );
599 if(sgn<0) status = 2;
600 errsgn = TMath::Sqrt( counts + errbkg*errbkg );
601 sgnf = sgn / TMath::Sqrt( sgn + bkg );
602 errsgnf = TMath::Sqrt( sgnf*sgnf/(sgn+bkg)/(sgn+bkg)*(1/4.*errsgn*errsgn+errbkg*errbkg) + sgnf*sgnf/sgn/sgn*errsgn*errsgn );
603 cout <<
" Signal "<<sgn<<
" +- "<<errsgn<<
", bkg "<<bkg<<
" +- "<<errbkg<<
", significance "<<sgnf<<
" +- "<<errsgnf<<endl;
609 TFile* outputcv =
new TFile(filename.Data(),
"recreate");
611 TCanvas*
c =
new TCanvas();
613 c->SetName(Form(
"%s",h->GetName()));
617 TPaveText *pavetext=
new TPaveText(0.4,0.7,0.85,0.9,
"NDC");
618 pavetext->SetBorderSize(0);
619 pavetext->SetFillStyle(0);
620 pavetext->AddText(Form(
"Signal = %4.2e #pm %4.2e",sgn,errsgn));
621 pavetext->AddText(Form(
"Bkg = %4.2e #pm %4.2e",bkg,errbkg));
622 pavetext->AddText(Form(
"Signif = %3.2f #pm %3.2f",sgnf,errsgnf));
625 pavetext->DrawClone();
660 gStyle->SetCanvasColor(0);
661 gStyle->SetFrameFillColor(0);
662 gStyle->SetTitleFillColor(0);
663 gStyle->SetOptStat(0);
665 gStyle->SetFrameBorderMode(0);
667 TFile* fin=
new TFile(
"outputSignifMaxim.root");
669 cout<<
"outputSignifMaxim.root not found"<<endl;
674 cout<<
"Error! cannot show "<<n+1<<
" dimentions"<<endl;
681 name=
"SgfmultiDimVectorPtBin";
682 title=
"Significance";
686 name=
"SmultiDimVectorPtBin";
691 name=
"BmultiDimVectorPtBin";
696 name=
"SmultiDimVectorPtBin";
697 namebis=
"BmultiDimVectorPtBin";
698 title=
"Signal over Background ";
707 if(plotErrors && which!=3 && n==2){
709 title.Append(
" Error") ;
710 shorttitle.Append(
"Err");
716 TString mdvname=Form(
"%s%d",name.Data(),ip);
720 cout<<
"Number of pt bins "<<ip<<endl;
725 cout<<
"Projecting "<<title.Data()<<
" with respect to the maximization variable(s) [chose]"<<endl;
728 TString mdvname=Form(
"%s0",name.Data()), mdverrname=
"";
732 cout<<mdvname.Data()<<
" not found"<<endl;
736 Int_t nvarsopt=mdv->GetNVariables();
739 Int_t fixedvars[nvarsopt];
744 fstream writefixedvars;
747 writefixedvars.open(
"fixedvars.dat",ios::in);
749 while(writefixedvars){
750 writefixedvars>>allfixedvars[longi];
756 writefixedvars.open(
"fixedvars.dat",ios::out);
759 Bool_t freevars[nvarsopt];
762 for(
Int_t k=0;k<nvarsopt;k++){
763 cout<<k<<
" "<<mdv->GetAxisTitle(k)<<endl;
766 cout<<
"Choose "<<n<<
" variable(s)"<<endl;
767 for(
Int_t j=0;j<n;j++){
768 cout<<
"var"<<j<<
": ";
770 freevars[variable[j]]=kFALSE;
772 if(n==1) variable[1]=999;
774 TCanvas* cvpj=
new TCanvas(Form(
"proj%d",variable[0]),Form(
"%s wrt %s",title.Data(),(mdv->GetAxisTitle(variable[0])).
Data()));
776 TMultiGraph* mg=
new TMultiGraph(Form(
"proj%d",variable[0]),Form(
"%s wrt %s;%s;%s",title.Data(),(mdv->GetAxisTitle(variable[0])).
Data(),(mdv->GetAxisTitle(variable[0])).
Data(),title.Data()));
777 TLegend *leg=
new TLegend(0.7,0.2,0.9,0.6,
"Pt Bin");
778 leg->SetBorderSize(0);
779 leg->SetFillStyle(0);
786 writerange.open(
"rangehistos.dat",ios::in);
789 writerange>>axisrange[longi];
795 writerange.open(
"rangehistos.dat",ios::out);
799 cout<<
"\nPtBin = "<<i<<endl;
803 TString nameS,nameB,nameerrS,nameerrB;
804 nameS.Form(
"SmultiDimVectorPtBin%d",i);
805 nameerrS.Form(
"errSmultiDimVectorPtBin%d",i);
806 nameB.Form(
"BmultiDimVectorPtBin%d",i);
807 nameerrB.Form(
"errBmultiDimVectorPtBin%d",i);
813 if(!(mdvS && mdvB && mdvSerr && mdvBerr)){
814 cout<<
"one of the multidimvector is not present"<<endl;
832 for(
Int_t ic=0;ic<ncuts;ic++){
833 cutvalues[ic]=((
AliMultiDimVector*)fin->Get(nameS.Data()))->GetCutValue(ic,maxInd[ic]);
837 fixedvars[ic]=allfixedvars[i+ic];
841 fixedvars[ic]=maxInd[ic];
843 writefixedvars<<fixedvars[ic]<<
"\t";
847 if(!readfromfile) writefixedvars<<endl;
849 printf(
"Maximum of significance for Ptbin %d found in bin:\n",i);
850 for(
Int_t ic=0;ic<ncuts;ic++)printf(
" %d ",maxInd[ic]);
851 printf(
"\ncorresponding to cut:\n");
852 for(
Int_t ic=0;ic<ncuts;ic++)printf(
" %f ",cutvalues[ic]);
854 printf(
"\nSignificance = %f +- %f\n",sigMax0,mvess->
GetElement(maxInd,0));
860 if(!mdv)cout<<mdv->GetName()<<
" null"<<endl;
863 if(!mdverr)cout<<mdverr->GetName()<<
" null"<<endl;
867 mdvname=Form(
"%s%d",name.Data(),i);
869 if(!mdv)cout<<mdvname.Data()<<
" not found"<<endl;
872 mdverrname=Form(
"err%s%d",name.Data(),i);
874 if(!mdverr)cout<<mdverrname.Data()<<
" not found"<<endl;
876 printf(
"Global Address %d (%d)\n",(
Int_t)mdv->GetGlobalAddressFromIndices(maxInd,0),(
Int_t)mdv->GetNTotCells()*i+(
Int_t)mdv->GetGlobalAddressFromIndices(maxInd,0));
877 TString ptbinrange=Form(
"%.1f < p_{t} < %.1f GeV/c",mdv->GetPtLimit(0),mdv->GetPtLimit(1));
882 gStyle->SetPalette(1);
884 Int_t nstep[2]={mdv->GetNCutSteps(variable[0]),mdv->GetNCutSteps(variable[1])};
886 TH2F* hproj=
new TH2F(Form(
"hproj%d",i),Form(
"%s wrt %s vs %s (Ptbin%d %.1f<pt<%.1f);%s;%s",title.Data(),(mdv->GetAxisTitle(variable[0])).
Data(),mdv->GetAxisTitle(variable[1]).Data(),i,mdv->GetPtLimit(0),mdv->GetPtLimit(1),(mdv->GetAxisTitle(variable[0])).
Data(),mdv->GetAxisTitle(variable[1]).Data()),nstep[0],mdv->GetMinLimit(variable[0]),mdv->GetMaxLimit(variable[0]),nstep[1],mdv->GetMinLimit(variable[1]),mdv->GetMaxLimit(variable[1]));
888 hproj=mdv->Project(variable[0],variable[1],fixedvars,0);
889 hproj->SetTitle(Form(
"%s wrt %s vs %s (Ptbin%d %.1f<pt<%.1f);%s;%s",title.Data(),(mdv->GetAxisTitle(variable[0])).
Data(),mdv->GetAxisTitle(variable[1]).Data(),i,mdv->GetPtLimit(0),mdv->GetPtLimit(1),(mdv->GetAxisTitle(variable[0])).
Data(),mdv->GetAxisTitle(variable[1]).Data()));
891 for(
Int_t ist1=0;ist1<nstep[0];ist1++){
893 Int_t fillbin1=ist1+1;
894 if(mdv->GetCutValue(variable[0],0)>mdv->GetCutValue(variable[0],mdv->GetNCutSteps(variable[0])-1))fillbin1=nstep[0]-ist1;
895 for(
Int_t ist2=0;ist2<nstep[1];ist2++){
897 Int_t fillbin2=ist2+1;
898 if(mdv->GetCutValue(variable[1],0)>mdv->GetCutValue(variable[1],mdv->GetNCutSteps(variable[1])-1))fillbin2=nstep[1]-ist2;
899 Int_t* varmaxim=mdv->FindLocalMaximum(maxval,variable,steps,n,0);
900 hproj->SetBinContent(fillbin1,fillbin2,maxval);
906 hproj->SetMinimum(axisrange[2*i]);
907 hproj->SetMaximum(axisrange[2*i+1]);
909 writerange<<hproj->GetMinimum()<<
"\t"<<hproj->GetMinimum()<<endl;
911 TCanvas* cvpj=
new TCanvas(Form(
"proj%d%dpt%d",variable[0],variable[1],i),Form(
"%s wrt %s vs %s (Ptbin%d)",title.Data(),(mdv->GetAxisTitle(variable[0])).
Data(),mdv->GetAxisTitle(variable[1]).Data(),i));
913 hproj->DrawClone(
"COLZtext");
914 cvpj->SaveAs(Form(
"%s%s.png",shorttitle.Data(),cvpj->GetName()));
932 x[k]=mdv->GetCutValue(variable[0],k);
933 errx[k]=mdv->GetCutStep(variable[0])/2.;
934 Int_t onevariable[1]={variable[0]};
935 Int_t onestep[1]={k};
939 Int_t* varmaxim=mdv->FindLocalMaximum(maxval,onevariable,onestep,n,0);
941 gladd=mdv->GetGlobalAddressFromIndices(varmaxim,0);
947 cout<<mdv->GetAxisTitle(variable[0])<<
" step "<<k<<
" = "<<x[k]<<
":"<<
" y = "<<y[k]<<endl;
950 cout<<
"----------------------------------------------------------"<<endl;
952 gr->SetMarkerStyle(20+i);
953 gr->SetMarkerColor(i+1);
954 gr->SetLineColor(i+1);
956 gr->SetMarkerColor(i+2);
957 gr->SetLineColor(i+2);
961 gr->SetName(Form(
"g1%d",i));
963 leg->AddEntry(gr,ptbinrange.Data(),
"p");
971 cvpj->SaveAs(Form(
"%s%s.png",shorttitle.Data(),cvpj->GetName()));
981 if(fittype==
"Pol2Fit") ntot=6;
982 Int_t ihfirst=0,ihlast=1;
983 for(
Int_t ih=ihfirst;ih<ihlast;ih++){
984 fin=
new TFile(Form(
"h%d%s.root",ih,fittype.Data()));
986 TCanvas *cv=(TCanvas*)fin->Get(Form(
"cv1%s%d",fittype.Data(),ih));
987 TF1* func=(TF1*)cv->FindObject(
"funcmass");
1002 cout<<
"Calculating the index of the histogram corresponding to the following cut steps:"<<endl;
1007 cout<<
"Info: total number of cells per multidim: "<<vct->
GetNTotCells()<<endl;
1009 cout<<
"The histogram you want is:\t";
1018 cout<<
"Calculating the index of the histogram corresponding to the following cut values:"<<endl;
1023 cout<<
"Info: total number of cells per multidim: "<<vct->
GetNTotCells()<<endl;
1026 cout<<
"The histogram you want is:\t"<<glindex+vct->
GetNTotCells()*ptbin<<endl;
1045 for (
Int_t i=0;i<nvar4opt;i++) {
1046 if(valsgiven[i]==kTRUE) {
1047 allvals[i]=values[nvargiven];
1056 cout<<nhistinrange<<
" index will be returned"<<endl;
1057 Int_t *rangeofhistos=
new Int_t[nhistinrange];
1059 if(nhistinrange==1){
1061 cout<<
"output"<<rangeofhistos[0]<<endl;
1063 Int_t index[nvar4opt-nvargiven];
1065 for (
Int_t i=0;i<nvar4opt;i++){
1066 if(valsgiven[i]==kFALSE) {
1073 for(
Int_t i=0;i<nvar4opt-nvargiven;i++){
1074 cout<<
"Info: incrementing "<<vct->
GetAxisTitle(index[i])<<endl;
1081 return rangeofhistos;
1090 ULong64_t globadd=nhist-ptbin*totCells;
1104 gStyle->SetFrameBorderMode(0);
1105 gStyle->SetCanvasColor(0);
1106 gStyle->SetFrameFillColor(0);
1107 gStyle->SetOptStat(0);
1111 TString dirname=
"PWG3_D2H_Significance",listname=
"coutputSig",mdvlistname=
"coutputmv";
1114 TFile *fin=
new TFile(Form(
"%s%s",path.Data(),filename.Data()));
1116 cout<<path.Data()<<filename.Data()<<
" not found"<<endl;
1119 TDirectoryFile *dir=(TDirectoryFile*)fin->GetDirectory(dirname);
1121 cout<<
"Directory "<<dirname<<
" not found"<<endl;
1127 mdvlistname+=
"Dplus";
1136 listname+=
"Dstar0100";
1137 mdvlistname+=
"Dstar0100";
1156 cout<<
decCh<<
" is not allowed as decay channel "<<endl;
1162 TList* listamdv= (
TList*)dir->Get(mdvlistname);
1164 cout<<mdvlistname<<
" doesn't exist"<<endl;
1173 for(
Int_t i=0;i<nhists;i++){
1175 fin2=
new TFile(Form(
"%sh%dExpMassFit.root",path.Data(),indexes[i]));
1177 cout<<
"File "<<indexes[i]<<
" not found!"<<endl;
1180 TCanvas *cv=(TCanvas*)fin2->Get(Form(
"c1h%dExp",indexes[i]));
1182 cout<<
"Canvas c1h"<<indexes[i]<<
"Exp not found among";
1187 cv->SaveAs(Form(
"h%dExpMassFit.png",indexes[i]));
1197 printf(
"The bins to be merget must be consecutive. Check! [b1 = %d, b2= %d]\n",b1,b2);
1201 TFile *fin=
new TFile(Form(
"%sAnalysisResults.root",pathin.Data()));
1203 cout<<
"Input file not found"<<endl;
1207 TString dirname=
"PWG3_D2H_Significance",listname=
"coutputSig",mdvlistname=
"coutputmv";
1212 mdvlistname+=
"Dplus";
1219 listname+=
"Dstar0100";
1220 mdvlistname+=
"Dstar0100";
1235 cout<<
decCh<<
" is not allowed as decay channel "<<endl;
1240 listname.Append(part);
1241 mdvlistname.Append(part);
1244 TDirectoryFile *dir=(TDirectoryFile*)fin->GetDirectory(dirname);
1246 cout<<
"Directory "<<dirname<<
" not found"<<endl;
1252 cout<<listname<<
" doesn't exist"<<endl;
1256 TList* listamdv= (
TList*)dir->Get(mdvlistname);
1258 cout<<mdvlistname<<
" doesn't exist"<<endl;
1261 if (!
gSystem->AccessPathName(Form(
"merged%d%d",b1,b2)))
gSystem->Exec(Form(
"mkdir merged%d%d",b1,b2));
1262 gSystem->Exec(Form(
"cd merged%d%d",b1,b2));
1264 TFile* fout=
new TFile(
"mergeAnalysisResults.root",
"recreate");
1266 fout->mkdir(dirname);
1268 listmdvout->SetName(listamdv->GetName());
1269 listmdvout->SetOwner();
1272 histlistout->SetName(histlist->GetName());
1273 histlistout->SetOwner();
1281 cout<<
"Error! Number of histos in pt bin "<<b1<<
" = "<<ntotHperbin<<
" != Number of histos in pt bin "<<b2<<
" = "<<mdvin2->
GetNTotCells()<<endl;
1286 cout<<
"Error! Mismatch in number of variables"<<endl;
1291 Float_t loosercuts[nvar1], tightercuts[nvar1];
1293 Int_t ncells[nvar1];
1295 for (
Int_t ivar=0;ivar<nvar1;ivar++){
1297 if(loosercuts[ivar] - mdvin2->
GetCutValue(ivar,0) < 1e-8) printf(
"Warning! The loose cut %s is different between the 2: %f and %f\n",mdvin1->
GetAxisTitle(ivar).Data(),loosercuts[ivar],mdvin2->
GetCutValue(ivar,0));
1301 cout<<axistitles[ivar]<<
"\t";
1306 cout<<
"Info: writing mdv"<<endl;
1307 listmdvout->Add(mdvout);
1310 TH1F* htestIsMC=(TH1F*)histlist->FindObject(
"hSgn_0");
1311 if(htestIsMC) isMC=kTRUE;
1313 Int_t nhist=(histlist->GetEntries()-1);
1317 Int_t firsth1=b1*ntotHperbin,firsth2=b2*ntotHperbin;
1318 Int_t lasth1=firsth1+ntotHperbin-1,lasth2=firsth2+ntotHperbin-1;
1319 cout<<
"Histograms from "<<firsth1<<
" to "<<lasth1<<
" and "<<firsth2<<
" to "<<lasth2<<endl;
1327 vcttmp->SetName(Form(
"multiDimVectorPtBin%d",b2+cnt));
1330 listmdvout->Add(vcttmp);
1334 histlistout->Add((TH1F*)histlist->FindObject(
"fHistNEvents"));
1338 for(
Int_t ih1=firsth1;ih1<lasth1;ih1++){
1339 TH1F* h1=(TH1F*)histlist->FindObject(Form(
"hMass_%d",ih1));
1341 cout<<
"hMass_"<<ih1<<
" not found!"<<endl;
1344 TH1F* h2=(TH1F*)histlist->FindObject(Form(
"hMass_%d",ih2));
1346 cout<<
"hMass_"<<ih2<<
" not found!"<<endl;
1351 histlistout->Add(h1);
1359 if(!(j>=firsth1 && j<lasth2)){
1360 TH1F* htmp=(TH1F*)histlist->FindObject(Form(
"hMass_%d",j));
1363 htmp->SetName(Form(
"hMass_%d",lasth1+cnt));
1366 histlistout->Add(htmp);
1371 ((TDirectoryFile*)fout->Get(dirname))->cd();
1372 listmdvout->Write(mdvlistname.Data(),TObject::kSingleKey);
1373 histlistout->Write(listname.Data(),TObject::kSingleKey);
1379 gStyle->SetFrameBorderMode(0);
1380 gStyle->SetCanvasColor(0);
1381 gStyle->SetFrameFillColor(0);
1382 gStyle->SetOptStat(0);
1387 TFile* fin=
new TFile(filename.Data());
1389 cout<<filename.Data()<<
" not found, exit"<<endl;
1393 TKey* key=((TKey*)((
TList*)fin->GetListOfKeys())->At(fin->GetNkeys()-1));
1394 TCanvas*
canvas=((TCanvas*)fin->Get(key->GetName()));
1396 cout<<
"Canvas not found"<<endl;
1401 TH1F* hfit=(TH1F*)canvas->FindObject(
"fhistoInvMass");
1404 cout<<
"Histogram not found"<<endl;
1408 TF1* funcBkgRecalc=(TF1*)hfit->FindObject(
"funcbkgRecalc");
1410 cout<<
"Background fit function (final) not found"<<endl;
1414 TF1* funcBkgFullRange=(TF1*)hfit->FindObject(
"funcbkgFullRange");
1415 if(!funcBkgFullRange){
1416 cout<<
"Background fit function (side bands) not found"<<endl;
1421 Double_t min=hfit->GetBinLowEdge(1), width=hfit->GetBinWidth(1);
1422 TH1F* hsubRecalc=(TH1F*)hfit->Clone(
"hsub");
1423 hsubRecalc->SetMarkerColor(kRed);
1424 hsubRecalc->SetLineColor(kRed);
1425 hsubRecalc->GetListOfFunctions()->Delete();
1426 TH1F* hsubFullRange=(TH1F*)hfit->Clone(
"hsub");
1427 hsubFullRange->SetMarkerColor(kGray+2);
1428 hsubFullRange->SetLineColor(kGray+2);
1429 hsubFullRange->GetListOfFunctions()->Delete();
1432 Double_t x1=min+i*width, x2=min+(i+1)*width;
1433 Double_t ycont=hfit->GetBinContent(i+1);
1434 Double_t y1=funcBkgRecalc->Integral(x1,x2) / width;
1435 hsubRecalc->SetBinContent(i+1,ycont-y1);
1436 Double_t y2=funcBkgFullRange->Integral(x1,x2) / width;
1437 hsubFullRange->SetBinContent(i+1,ycont-y2);
1440 TCanvas*
c=
new TCanvas(
"c",
"subtraction");
1442 hsubRecalc->DrawClone();
1443 hsubFullRange->DrawClone(
"sames");
1446 if(hsubRecalc->GetBinContent(i+1)<0) hsubRecalc->SetBinContent(i+1,0);
1447 if(hsubFullRange->GetBinContent(i+1)<0) hsubFullRange->SetBinContent(i+1,0);
1450 TCanvas *cvnewfits=
new TCanvas(
"cvnewfits",
"new Fits",1200,600);
1451 cvnewfits->Divide(2,1);
1455 fitter1.
DrawHere(cvnewfits->cd(1));
1459 fitter2.
DrawHere(cvnewfits->cd(2));
1461 canvas->SaveAs(Form(
"h%d%sMassFit.png",nhisto,fitType.Data()));
1462 c->SaveAs(Form(
"h%d%sSubtr.png",nhisto,fitType.Data()));
1463 cvnewfits->SaveAs(Form(
"h%d%sFitNew.png",nhisto,fitType.Data()));
Float_t GetMaxSignificance(Int_t *cutIndices, Int_t ptbin) const
void DrawHere(TVirtualPad *pd, Double_t nsigma=3, Int_t writeFitInfo=1) const
write the canvas in a root file
Double_t PowerExpoBkgWoPeak(Double_t *x, Double_t *par)
Int_t GetNFinalPars() const
Int_t * GetRangeHistFromValues(AliMultiDimVector *vct, Int_t ptbin, Bool_t *valsgiven, Float_t *values, Int_t &nhistinrange)
Double_t PowerBkgWoPeak(Double_t *x, Double_t *par)
void SetInitialGaussianMean(Double_t mean)
AliMultiDimVector * CalculatePurity() const
Int_t GetNHistFromValues(AliMultiDimVector *vct, Int_t ptbin, Float_t *values)
AliMultiDimVector * GetSignificanceError() const
Bool_t charmCutsOptimization(Bool_t isData=kTRUE, TString part="both", TString centr="no", Bool_t writefit=kTRUE, Int_t minentries=50, Double_t *rangefit=0x0, Bool_t useBinCounting=kTRUE)
Int_t GetNVariables() const
AliMultiDimVector * CalculatePurityError() const
Int_t GetNHistFromIndices(AliMultiDimVector *vct, Int_t ptbin, Int_t *indices)
void Merge2Bins(Int_t b1, Int_t b2, TString pathin="./", Int_t decCh=2, TString part="both")
void SetElement(ULong64_t globadd, Float_t val)
virtual Bool_t RefitWithBkgOnly(Bool_t draw=kTRUE)
ULong64_t GetGlobalAddressFromValues(const Float_t *values, Int_t ptbin) const
Float_t GetPtLimit(Int_t i) const
virtual void Signal(Double_t nOfSigma, Double_t &signal, Double_t &errsignal) const
return total integral of the histogram
Bool_t GetCutValuesFromGlobalAddress(ULong64_t globadd, Float_t *cuts, Int_t &ptbin) const
AliMultiDimVector * CalculateSOverBError() const
void showMultiDimVector(Int_t n=2, Int_t which=0, Bool_t plotErrors=kFALSE, Bool_t readfromfile=kFALSE, Bool_t fixedrange=kFALSE, Bool_t fixedplane=kFALSE)
Float_t GetCutValue(Int_t iVar, Int_t iCell) const
virtual void Background(Double_t nOfSigma, Double_t &background, Double_t &errbackground) const
signal in (min, max) with error
Double_t ExpoBkgWoPeak(Double_t *x, Double_t *par)
ULong64_t GetGlobalAddressFromIndices(const Int_t *ind, Int_t ptbin) const
AliMultiDimVector * CalculateSOverB() const
void DrawPossibilities(Int_t ptbin, Bool_t *valsgiven, Float_t *values, TString path="./", Int_t decCh=2)
void SetInitialGaussianSigma(Double_t sigma)
change the default value of the mean
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
void DrawSigmas(TH2F *h2cuts)
Bool_t BinCounting(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Int_t &status)
virtual Bool_t MassFitter(Bool_t draw=kTRUE)
ULong64_t GetNTotCells() const
Int_t GetNCutSteps(Int_t iVar) const
TString GetAxisTitle(Int_t iVar) const
Float_t * GetCutValuesFromNHist(AliMultiDimVector *vct, Int_t ptbin, Int_t nhist)
Double_t GetSigma() const
void Significance(Double_t nOfSigma, Double_t &significance, Double_t &errsignificance) const
backgournd in (min, max) with error
AliHFMassFitter for the fit of invariant mass distribution of charmed mesons.
Float_t GetElement(ULong64_t globadd) const
void SubtractBkg(Int_t nhisto)
Bool_t MC(TH1F *hs, TH1F *hb, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmaused, Int_t &status)
virtual void WriteCanvas(TString userIDstring="", TString path="./", Double_t nsigma=3, Int_t writeFitInfo=1, Bool_t draw=kFALSE) const
write the TNtuple