31 #include <Riostream.h>
39 #include <TVirtualPad.h>
41 #include <TVirtualFitter.h>
44 #include <TPaveText.h>
45 #include <TDatabasePDG.h>
73 fFixParSignExternalValue(0x0),
74 fFixParBackExternalValue(0x0),
75 fFixParReflExternalValue(0x0),
81 fpolbackdegreeTayHelp(-1),
86 cout<<
"Default constructor:"<<endl;
87 cout<<
"Remember to set the Histo, the Type, the FixPar"<<endl;
106 fFixParSignExternalValue(0x0),
107 fFixParBackExternalValue(0x0),
108 fFixParReflExternalValue(0x0),
113 fpolbackdegreeTay(4),
114 fpolbackdegreeTayHelp(-1),
130 if (!
fWithBkg) cout<<
"Fit Histogram of Signal only"<<endl;
147 fNparSignal(mfit.fNparSignal),
148 fNparBack(mfit.fNparBack),
149 fNparRefl(mfit.fNparRefl),
150 fhTemplRefl(mfit.fhTemplRefl),
154 fSmoothRefl(mfit.fSmoothRefl),
155 fReflInit(mfit.fReflInit),
159 fFixParSignExternalValue(0x0),
160 fFixParBackExternalValue(0x0),
161 fFixParReflExternalValue(0x0),
165 fRawYieldHelp(mfit.fRawYieldHelp),
166 fpolbackdegreeTay(mfit.fpolbackdegreeTay),
167 fpolbackdegreeTayHelp(mfit.fpolbackdegreeTayHelp),
168 fMassParticle(mfit.fMassParticle)
246 if(&mfit ==
this)
return *
this;
332 Printf(
"AliHFMassFitterVAR::SetBackHighPolDegree, remeber that this method has to be called after the constructor");
345 if(opt.EqualTo(
"templ")||opt.EqualTo(
"Templ")||opt.EqualTo(
"TEMPL")||opt.EqualTo(
"template")||opt.EqualTo(
"Template")||opt.EqualTo(
"TEMPLATE")){
350 if(opt.EqualTo(
"1gaus")||opt.EqualTo(
"singlegaus")){
351 if(minRange>=0&&maxRange>=0){
352 f=
new TF1(
"mygaus",
"gaus",TMath::Max(minRange,h->GetBinLowEdge(1)),TMath::Min(maxRange,h->GetXaxis()->GetBinUpEdge(h->GetNbinsX())));
354 else f=
new TF1(
"mygaus",
"gaus",h->GetBinLowEdge(1),h->GetXaxis()->GetBinUpEdge(h->GetNbinsX()));
355 f->SetParameter(0,h->GetMaximum());
357 f->SetParameter(1,1.865);
358 f->SetParameter(2,0.050);
363 if(
fhTemplRefl->GetBinContent(j)>=0.&&TMath::Abs(h->GetBinError(j)*h->GetBinError(j)-h->GetBinContent(j))>0.1*h->GetBinContent(j))isPoissErr=kFALSE;
375 if(opt.EqualTo(
"2gaus")||opt.EqualTo(
"doublegaus")){
376 if(minRange>=0&&maxRange>=0){
377 f=
new TF1(
"my2gaus",
"[0]*([3]/( TMath::Sqrt(2.*TMath::Pi())*[2])*TMath::Exp(-(x-[1])*(x-[1])/(2.*[2]*[2]))+(1.-[3])/( TMath::Sqrt(2.*TMath::Pi())*[5])*TMath::Exp(-(x-[4])*(x-[4])/(2.*[5]*[5])))",TMath::Max(minRange,h->GetBinLowEdge(1)),TMath::Min(maxRange,h->GetXaxis()->GetBinUpEdge(h->GetNbinsX())));
379 else f=
new TF1(
"my2gaus",
"[0]*([3]/( TMath::Sqrt(2.*TMath::Pi())*[2])*TMath::Exp(-(x-[1])*(x-[1])/(2.*[2]*[2]))+(1.-[3])/( TMath::Sqrt(2.*TMath::Pi())*[5])*TMath::Exp(-(x-[4])*(x-[4])/(2.*[5]*[5])))",h->GetBinLowEdge(1),h->GetXaxis()->GetBinUpEdge(h->GetNbinsX()));
381 f->SetParameter(0,h->GetMaximum());
383 f->SetParLimits(3,0.,1.);
384 f->SetParameter(3,0.5);
386 f->SetParameter(1,1.84);
387 f->SetParameter(2,0.050);
389 f->SetParameter(4,1.88);
390 f->SetParameter(5,0.050);
395 if(
fhTemplRefl->GetBinContent(j)>=0.&&TMath::Abs(h->GetBinError(j)*h->GetBinError(j)-h->GetBinContent(j))>0.1*h->GetBinContent(j))isPoissErr=kFALSE;
407 if(opt.EqualTo(
"pol3")||opt.EqualTo(
"POL3")){
408 if(minRange>=0&&maxRange>=0){
409 f=
new TF1(
"mypol3",
"pol3",TMath::Max(minRange,h->GetBinLowEdge(1)),TMath::Min(maxRange,h->GetXaxis()->GetBinUpEdge(h->GetNbinsX())));
411 else f=
new TF1(
"mypol3",
"pol3",h->GetBinLowEdge(1),h->GetXaxis()->GetBinUpEdge(h->GetNbinsX()));
412 f->SetParameter(0,h->GetMaximum());
416 for(
Int_t nf=0;nf<10;nf++){
423 if(
fhTemplRefl->GetBinContent(j)>=0.&&TMath::Abs(h->GetBinError(j)*h->GetBinError(j)-h->GetBinContent(j))>0.1*h->GetBinContent(j))isPoissErr=kFALSE;
435 if(opt.EqualTo(
"pol6")||opt.EqualTo(
"POL6")){
437 if(minRange>=0&&maxRange>=0){
438 f=
new TF1(
"mypol6",
"pol6",TMath::Max(minRange,h->GetBinLowEdge(1)),TMath::Min(maxRange,h->GetXaxis()->GetBinUpEdge(h->GetNbinsX())));
440 else f=
new TF1(
"mypol6",
"pol6",h->GetBinLowEdge(1),h->GetXaxis()->GetBinUpEdge(h->GetNbinsX()));
441 f->SetParameter(0,h->GetMaximum());
450 if(
fhTemplRefl->GetBinContent(j)>=0.&&TMath::Abs(h->GetBinError(j)*h->GetBinError(j)-h->GetBinContent(j))>0.1*h->GetBinContent(j))isPoissErr=kFALSE;
462 Printf(
"AlliHFMassFitterVAR::SetTemplateReflections: bad option");
521 return par[0]/TMath::Sqrt(2.*TMath::Pi())/par[2]*TMath::Exp(-(x[0]-par[1])*(x[0]-par[1])/2./par[2]/par[2]);
527 Printf(
"FitFunction4BkgAndRefl called but w/o reasons: this is just for drawing and requires parameters to be set from outside!!!");
559 back+=par[it]*TMath::Power(x[0]-
fMassParticle,it)/TMath::Factorial(it);
600 total = par[0+firstPar]*par[1+firstPar]/(TMath::Exp(par[1+firstPar]*
fmaxMass)-TMath::Exp(par[1+firstPar]*
fminMass))*TMath::Exp(par[1+firstPar]*x[0]);
607 total= par[0+firstPar]/(fmaxMass-
fminMass)+par[1+firstPar]*(x[0]-0.5*(fmaxMass+fminMass));
617 total = par[0+firstPar]/(fmaxMass-
fminMass)+par[1+firstPar]*(x[0]-0.5*(fmaxMass+fminMass))+par[2+firstPar]*(x[0]*x[0]-1/3.*(fmaxMass*fmaxMass*fmaxMass-fminMass*fminMass*fminMass)/(fmaxMass-
fminMass));
620 total=par[0+firstPar];
631 Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
633 total = par[0+firstPar]*(par[1+firstPar]+1.)/(TMath::Power(fmaxMass-mpi,par[1+firstPar]+1.)-TMath::Power(fminMass-mpi,par[1+firstPar]+1.))*TMath::Power(x[0]-mpi,par[1+firstPar]);
640 Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
642 total = par[1+firstPar]*TMath::Sqrt(x[0] - mpi)*TMath::Exp(-1.*par[2+firstPar]*(x[0]-mpi));
656 total=par[0+firstPar];
658 total+=par[it+firstPar]*TMath::Power(x[0]-
fMassParticle,it)/TMath::Factorial(it);
685 Double_t sidebandldouble,sidebandrdouble;
686 Bool_t leftok=kFALSE, rightok=kFALSE;
689 cout<<
"Left limit of range > mean or right limit of range < mean: change left/right limit or initial mean value"<<endl;
698 cout<<
"Changed number of sigma from 4 to "<<0.5*coeff<<
" for the estimation of the side bands"<<endl;
699 if (coeff<3) cout<<
"Side bands inside 3 sigma, may be better use ftypeOfFit4Bkg = 3 (only signal)"<<endl;
701 cout<<
"Side bands inside 2 sigma. Change mode: ftypeOfFit4Bkg = 3"<<endl;
713 cout<<
"Left side band ";
721 if(TMath::Abs(tmp-sidebandldouble) > 1e-6){
722 cout<<tmp<<
" is not allowed, changing it to the nearest value allowed: ";
725 cout<<sidebandldouble<<
" (bin "<<
fSideBandl<<
")"<<endl;
727 cout<<
"Right side band ";
734 if(TMath::Abs(tmp-sidebandrdouble) > 1e-6){
735 cout<<tmp<<
" is not allowed, changing it to the nearest value allowed: ";
738 cout<<sidebandrdouble<<
" (bin "<<
fSideBandr<<
")"<<endl;
740 cout<<
"Error! Range too little";
751 cout<<
"No histogram to fit! SetHisto(TH1F* h) before! "<<endl;
754 Bool_t leftok=kFALSE, rightok=kFALSE;
761 cout<<
"Out of histogram left bound! Setting to "<<minhisto<<endl;
765 cout<<
"Out of histogram right bound! Setting to"<<maxhisto<<endl;
775 if(TMath::Abs(tmp-
fminMass) > 1e-6){
776 cout<<
"Left bound "<<tmp<<
" is not allowed, changing it to the nearest value allowed: "<<
fminMass<<endl;
785 if(TMath::Abs(tmp-
fmaxMass) > 1e-6){
786 cout<<
"Right bound "<<tmp<<
" is not allowed, changing it to the nearest value allowed: "<<
fmaxMass<<endl;
790 return (leftok && rightok);
801 TVirtualFitter::SetDefaultFitter(
"Minuit");
804 Double_t slope1=-1,slope2=1,slope3=1;
809 Int_t checkinnsigma=4;
812 Double_t intUnderFunc=func->Integral(range[0],range[1]);
814 cout<<
"Pick zone: IntFunc = "<<intUnderFunc<<
"; IntHist = "<<intUnderHisto<<
"\tDiff = "<<intUnderHisto-intUnderFunc<<
"\tRelDiff = "<<(intUnderHisto-intUnderFunc)/intUnderFunc<<endl;
815 Double_t diffUnderPick=(intUnderHisto-intUnderFunc);
818 cout<<
"Band (l) zone: IntFunc = "<<intUnderFunc<<
"; IntHist = "<<intUnderHisto<<
"\tDiff = "<<intUnderHisto-intUnderFunc<<
"\tRelDiff = "<<(intUnderHisto-intUnderFunc)/intUnderFunc<<endl;
819 diffUnderBands=(intUnderHisto-intUnderFunc);
820 Double_t relDiff=diffUnderPick/diffUnderBands;
821 cout<<
"Relative difference = "<<relDiff<<endl;
822 if(TMath::Abs(relDiff) < 0.25) isBkgOnly=kTRUE;
824 cout<<
"Relative difference = "<<relDiff<<
": I suppose there is some signal, continue with total fit!"<<endl;
828 cout<<
"INFO!! The histogram contains only background"<<endl;
852 if(!ok)
return kFALSE;
857 cout<<
"------sideBandsInt - first approx = "<<sideBandsInt<<endl;
858 if (sideBandsInt<=0) {
859 cout<<
"! sideBandsInt <=0. There's a problem, cannot start the fit"<<endl;
866 cout<<
"Function name = "<<funcbkg->GetName()<<endl<<endl;
868 funcbkg->SetLineColor(2);
875 parBackInit[j]=func->GetParameter(j);
879 Print(
"First fit background function not present");
881 delete[] parBackInit;
886 parBackInit[0]=totInt;
892 funcbkg->SetParameter(j,parBackInit[j]);
897 funcbkg->FixParameter(j,parBackInit[j]);
912 intbkg1 = funcbkg->Integral(fminMass,fmaxMass);
920 else cout<<
"\t\t//"<<endl;
939 if(
ftypeOfFit4Sgn == 1) bkgInt=funcbkg->Integral(fminMass,fmaxMass);
940 else bkgInt=funcbkg->Integral(fminMass,fmaxMass);
945 sgnInt = totInt-bkgInt;
946 Printf(
"Estimates: bkgInt: %f, totInt: %f, diffUndBan:%f",bkgInt,totInt,diffUnderBands);
951 if(sgnInt<0)sgnInt=0.1*totInt;
953 cout<<
"Function name = "<<funcmass->GetName()<<endl<<endl;
954 funcmass->SetLineColor(4);
957 cout<<
"\nTOTAL FIT"<<endl;
962 Printf(
"Initial parameters: \n back: tot int: %f, slope1:%f, slope2:%f \n sign: sgnInt %f, mean %f, sigma %f",totInt,slope1,slope2,sgnInt,
fMass,
fSigmaSgn);
966 funcmass->SetParameter(j,parBackInit[j]);
971 funcmass->FixParameter(j,parBackInit[j]);
977 funcmass->SetParameter(j+fNparBack,parSignInit[j]);
982 funcmass->FixParameter(j+fNparBack,parSignInit[j]);
988 funcmass->SetParName(j+fNparBack+fNparSignal,
fReflParNames[j]);
989 funcmass->SetParameter(j+fNparBack+fNparSignal,parReflInit[j]);
990 funcmass->SetParLimits(j+fNparBack+fNparSignal,0.,1.);
992 funcmass->FixParameter(j+fNparBack+fNparSignal,
fparReflFixExt[j]);
995 funcmass->FixParameter(j+fNparBack+fNparSignal,parReflInit[j]);
1004 cout<<
"Minuit returned "<<status<<endl;
1006 delete[] parBackInit;
1010 Printf(
"MassFitter: Value of func at 1.800: %f",funcmass->Eval(1.8000));
1011 cout<<
"fit done"<<endl;
1013 fMass=funcmass->GetParameter(fNparBack+1);
1014 fMassErr=funcmass->GetParError(fNparBack+1);
1015 fSigmaSgn=funcmass->GetParameter(fNparBack+2);
1034 if(funcmass->GetParameter(fNparBack+2) <0 || funcmass->GetParameter(fNparBack+1) <0 || funcmass->GetParameter(fNparBack) <0 ) {
1035 cout<<
"IntS or mean or sigma negative. You may tray to SetInitialGaussianSigma(..) and SetInitialGaussianMean(..)"<<endl;
1037 delete[] parBackInit;
1046 delete[] parBackInit;
1065 for(
Int_t j=1;j<=hCp->GetNbinsX();j++){
1068 Double_t binCenter=hCp->GetBinCenter(j);
1070 hCp->SetBinContent(j,0);
1071 hCp->SetBinError(j,0);
1076 TF1 *funcbkg,*funcPrev=0x0;
1081 funcbkg->SetParameter(j,funcPrev->GetParameter(j));
1086 funcbkg->SetParameter(0,estimatecent);
1087 funcbkg->SetParameter(1,estimateslope);
1090 hCp->Fit(funcbkg,
"REMN",
"");
1091 funcPrev=(TF1*)funcbkg->Clone(
"ftemp");
1100 fback->SetParameter(j,funcPrev->GetParameter(j));
1101 fback->SetParError(j,funcPrev->GetParError(j));
1103 hCp->Fit(fback,
"REMN",
"");
1126 TString bkgname=
"funcbkgonly";
1132 funcbkg->SetLineColor(kBlue+3);
1138 funcbkg->SetParNames(
"BkgInt",
"Slope");
1139 funcbkg->SetParameters(integral,-2.);
1142 funcbkg->SetParNames(
"BkgInt",
"Slope");
1143 funcbkg->SetParameters(integral,-100.);
1146 funcbkg->SetParNames(
"BkgInt",
"Coef1",
"Coef2");
1147 funcbkg->SetParameters(integral,-10.,5);
1150 cout<<
"Warning! This choice does not make a lot of sense..."<<endl;
1152 funcbkg->SetParNames(
"Const");
1153 funcbkg->SetParameter(0,0.);
1154 funcbkg->FixParameter(0,0.);
1158 funcbkg->SetParNames(
"BkgInt",
"Coef1");
1159 funcbkg->SetParameters(integral,0.5);
1162 funcbkg->SetParNames(
"BkgInt",
"Coef1",
"Coef2");
1163 funcbkg->SetParameters(integral,-10.,5.);
1167 funcbkg->SetParName(ipb,Form(
"Coef%d",ipb));
1171 cout<<
"Wrong choise of ftypeOfFit4Bkg ("<<
ftypeOfFit4Bkg<<
")"<<endl;
1183 fhistoInvMass->GetFunction(funcbkg->GetName())->SetBit(1<<9,kTRUE);
1189 cout<<
"Minuit returned "<<status<<endl;
1205 if(!valuewitherror) {
1206 printf(
"AliHFMassFitterVAR::IntS: got a null pointer\n");
1224 Bool_t done1=kFALSE,done2=kFALSE;
1225 Printf(
" AddFunctionsToHisto ############# LISTING ALL FUNCTIONS #################");
1230 testname +=
"FullRange";
1231 TF1 *testfunc=(TF1*)
fhistoInvMass->FindObject(testname.Data());
1236 testname=
"funcbkgonly";
1244 cout<<
"AddFunctionsToHisto already used: exiting...."<<endl;
1252 TF1 *bonly=(TF1*)hlist->FindObject(testname.Data());
1254 cout<<testname.Data()<<
" not found looking for complete fit"<<endl;
1256 bonly->SetLineColor(kBlue+3);
1257 hlist->Add((TF1*)bonly->Clone());
1264 TF1 *b=(TF1*)hlist->FindObject(bkgname.Data());
1266 cout<<bkgname<<
" not found, cannot produce "<<bkgname<<
"FullRange and "<<bkgname<<
"Recalc"<<endl;
1270 bkgname +=
"FullRange";
1274 bfullrange->SetParName(i,b->GetParName(i));
1275 bfullrange->SetParameter(i,b->GetParameter(i));
1276 bfullrange->SetParError(i,b->GetParError(i));
1278 bfullrange->SetLineStyle(4);
1279 bfullrange->SetLineColor(14);
1282 bkgnamesave +=
"Recalc";
1291 cout<<
"funcmass doesn't exist "<<endl;
1301 blastpar->SetParameter(0,mass->GetParameter(0));
1302 blastpar->SetParError(0,mass->GetParError(0));
1305 blastpar->SetParameter(0,mass->GetParameter(0)-mass->GetParameter(fNparBack));
1306 blastpar->SetParError(0,mass->GetParError(fNparBack));
1309 blastpar->SetParameter(jb,mass->GetParameter(jb));
1310 blastpar->SetParError(jb,mass->GetParError(jb));
1314 blastpar->SetParameter(0,mass->GetParameter(0)-mass->GetParameter(fNparBack)-mass->GetParameter(fNparBack+
fNparSignal)*mass->GetParameter(fNparBack));
1315 blastpar->SetParError(0,mass->GetParError(fNparBack));
1317 blastpar->SetParameter(fNparBack,mass->GetParameter(fNparBack+
fNparSignal));
1319 blastpar->SetParameter(jr+fNparBack,mass->GetParameter(fNparBack+
fNparSignal+jr));
1320 blastpar->SetParError(jr+fNparBack,mass->GetParError(fNparBack+
fNparSignal+jr));
1324 blastpar->SetParameter(jr+fNparBack,mass->GetParameter(fNparBack+
fNparSignal+jr));
1325 blastpar->SetParError(jr+fNparBack,mass->GetParError(fNparBack+
fNparSignal+jr));
1328 blastpar->SetLineStyle(1);
1329 blastpar->SetLineColor(2);
1331 hlist->Add((TF1*)bfullrange->Clone());
1332 hlist->Add((TF1*)blastpar->Clone());
1347 gStyle->SetOptStat(0);
1348 gStyle->SetCanvasColor(0);
1349 gStyle->SetFrameFillColor(0);
1375 filename.Prepend(userIDstring);
1376 path.Append(filename);
1378 TFile* outputcv=
new TFile(path.Data(),
"update");
1380 TCanvas*
c=(TCanvas*)
GetPad(nsigma,writeFitInfo);
1381 c->SetName(Form(
"%s%s%s",c->GetName(),userIDstring.Data(),type.Data()));
1382 if(draw)c->DrawClone();
1401 gStyle->SetOptStat(0);
1402 gStyle->SetCanvasColor(0);
1403 gStyle->SetFrameFillColor(0);
1405 cout<<
"nsigma = "<<nsigma<<endl;
1406 cout<<
"Verbosity = "<<writeFitInfo<<endl;
1410 if(!hdraw->GetFunction(
"funcmass") && !hdraw->GetFunction(
"funcbkgFullRange") && !hdraw->GetFunction(
"funcbkgRecalc")&& !hdraw->GetFunction(
"funcbkgonly")){
1411 cout<<
"Probably fit failed and you didn't try to refit with background only, there's no function to be drawn"<<endl;
1415 if(hdraw->GetFunction(
"funcbkgonly")){
1416 cout<<
"Drawing background fit only"<<endl;
1417 hdraw->SetMinimum(0);
1420 hdraw->SetMarkerStyle(20);
1421 hdraw->DrawClone(
"PE");
1422 hdraw->GetFunction(
"funcbkgonly")->DrawClone(
"sames");
1424 if(writeFitInfo > 0){
1425 TPaveText *pinfo=
new TPaveText(0.6,0.86,1.,1.,
"NDC");
1426 pinfo->SetBorderSize(0);
1427 pinfo->SetFillStyle(0);
1428 TF1* f=hdraw->GetFunction(
"funcbkgonly");
1430 pinfo->SetTextColor(kBlue+3);
1431 TString str=Form(
"%s = %.3f #pm %.3f",f->GetParName(i),f->GetParameter(i),f->GetParError(i));
1432 pinfo->AddText(str);
1436 pinfo->SetTextColor(kBlue+3);
1437 TString str=Form(
"%s = %.3f #pm %.3f",f->GetParName(i),f->GetParameter(i),f->GetParError(i));
1438 pinfo->AddText(str);
1441 for (
Int_t i=fNparBack+fNparSignal;i<fNparBack+fNparSignal+
fNparRefl;i++){
1442 pinfo->SetTextColor(kBlue+3);
1443 TString str=Form(
"%s = %.3f #pm %.3f",f->GetParName(i),f->GetParameter(i),f->GetParError(i));
1444 pinfo->AddText(str);
1447 pinfo->AddText(Form(
"Reduced #chi^{2} = %.3f",f->GetChisquare()/f->GetNDF()));
1457 hdraw->SetMinimum(0);
1460 hdraw->SetMarkerStyle(20);
1461 hdraw->DrawClone(
"PE");
1464 if(hdraw->GetFunction(
"funcmass")) hdraw->GetFunction(
"funcmass")->DrawClone(
"same");
1466 if(writeFitInfo > 0){
1467 TPaveText *pinfob=
new TPaveText(0.6,0.86,1.,1.,
"NDC");
1468 TPaveText *pinfom=
new TPaveText(0.6,0.7,1.,.87,
"NDC");
1469 pinfob->SetBorderSize(0);
1470 pinfob->SetFillStyle(0);
1471 pinfom->SetBorderSize(0);
1472 pinfom->SetFillStyle(0);
1483 pinfom->SetTextColor(kBlue);
1484 TString str=Form(
"%s = %.3f #pm %.3f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1485 if(!(writeFitInfo==1 && i==
fNparBack)) pinfom->AddText(str);
1488 pinfom->SetTextColor(kBlue+3);
1489 TString str=Form(
"%s = %.3f #pm %.3f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1490 pinfom->AddText(str);
1494 pinfom->DrawClone();
1496 TPaveText *pinfo2=
new TPaveText(0.1,0.1,0.6,0.4,
"NDC");
1497 pinfo2->SetBorderSize(0);
1498 pinfo2->SetFillStyle(0);
1500 Double_t signif, signal, bkg, errsignif, errsignal, errbkg;
1502 Signal(nsigma,signal,errsignal);
1507 TString str=Form(
"Significance (%.0f#sigma) %.1f #pm %.1f ",nsigma,signif,errsignif);
1508 pinfo2->AddText(str);
1509 str=Form(
"S (%.0f#sigma) %.0f #pm %.0f ",nsigma,signal,errsignal);
1510 pinfo2->AddText(str);
1511 str=Form(
"B (%.0f#sigma) %.0f #pm %.0f",nsigma,bkg,errbkg);
1512 pinfo2->AddText(str);
1513 if(bkg>0) str=Form(
"S/B (%.0f#sigma) %.4f ",nsigma,signal/bkg);
1514 pinfo2->AddText(str);
1518 if(writeFitInfo==1){
1519 TF1 *fitBkgRec=hdraw->GetFunction(
"funcbkgRecalc");
1520 fitBkgRec->SetLineColor(14);
1521 fitBkgRec->SetLineStyle(2);
1529 fitCp->SetParameter(ibk,fitBkgRec->GetParameter(ibk));
1531 fitCp->SetLineColor(kMagenta);
1532 fitCp->SetLineStyle(7);
1533 fitCp->SetLineWidth(2);
1534 fitCp->DrawCopy(
"Lsame");
1540 if(writeFitInfo > 1){
1542 pinfob->SetTextColor(kRed);
1543 str=Form(
"%s = %f #pm %f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1544 pinfob->AddText(str);
1547 pinfob->DrawClone();
1562 cout<<
"Use MassFitter method before Signal"<<endl;
1569 Signal(min,max,signal,errsignal);
1582 cout<<
"AliHFMassFitterVAR::Signal() ERROR -> Mass distr function not found!"<<endl;
1586 Printf(
"The fit was done w/o reflection template");
1600 cout<<
"Use MassFitter method before Signal"<<endl;
1605 TString bkgname=
"funcbkgRecalc";
1606 TString bkg1name=
"funcbkg1Recalc";
1613 cout<<
"AliHFMassFitterVAR::Signal() ERROR -> Mass distr function not found!"<<endl;
1621 cout<<
"AliHFMassFitterVAR::Signal() ERROR -> Bkg function not found!"<<endl;
1630 intS=funcmass->GetParameter(np);
1631 intSerr=funcmass->GetParError(np);
1633 cout<<
"Sgn relative error evaluation from fit: "<<intSerr/intS<<endl;
1635 Background(min,max,background,errbackground);
1640 signal=mass - background;
1641 errsignal=(intSerr/intS)*signal;
1651 cout<<
"Use MassFitter method before Background"<<endl;
1657 Background(min,max,background,errbackground);
1668 cout<<
"Use MassFitter method before Background"<<endl;
1673 TString bkgname=
"funcbkgRecalc";
1674 TString bkg1name=
"funcbkg1Recalc";
1680 cout<<
"AliHFMassFitterVAR::Background() ERROR -> Bkg function not found!"<<endl;
1690 intB=funcbkg->GetParameter(0);
1691 intBerr=funcbkg->GetParError(0);
1692 cout<<
"Bkg relative error evaluation: from final parameters of the fit: "<<intBerr/intB<<endl;
1706 intBerr=TMath::Sqrt(sum2);
1707 cout<<
"Bkg relative error evaluation: from histo: "<<intBerr/intB<<endl;
1709 cout<<
"Last estimation of bkg error is used"<<endl;
1718 errbackground=intBerr/intB*background;
1743 Double_t signal,errsignal,background,errbackground;
1744 Signal(min, max,signal,errsignal);
1745 Background(min, max,background,errbackground);
1747 if (signal+background <= 0.){
1748 cout<<
"Cannot calculate significance because of div by 0!"<<endl;
1787 cout<<
"AliHFMassFitterVAR, Error in computing fParsSize: check ftypeOfFit4Bkg"<<endl;
1795 cout<<
"Parameters array size "<<
fParsSize<<endl;
1802 cout<<
"Info:ComputeNFinalPars... ";
1865 cout<<
"AliHFMassFitterVAR, Error in computing fNparBack: check ftypeOfFit4Bkg"<<endl;
1926 Printf(
"Total number of par: %d, Back:%d, Sign:%d, Refl: %d",
fNFinalPars,fNparBack,fNparSignal,fNparRefl);
1931 TPaveText *pinfom=
new TPaveText(0.6,0.7,1.,.87,
"NDC");
1932 pinfom->SetBorderSize(0);
1933 pinfom->SetFillStyle(0);
1938 pinfom->SetTextColor(kBlue);
1939 TString str=Form(
"%s = %.3f #pm %.3f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1940 if(!(mode==1 && i==
fNparBack)) pinfom->AddText(str);
1943 pinfom->SetTextColor(kBlue+3);
1944 TString str=Form(
"%s = %.3f #pm %.3f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1945 pinfom->AddText(str);
1949 pinfom->SetTextColor(kBlue+5);
1951 TString str=Form(
"%s = %.3f #pm %.3f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1952 pinfom->AddText(str);
1955 pinfom->AddText(Form(
"#chi^{2}/NDF=%.2f/%d",ff->GetChisquare(),ff->GetNDF()));
1962 TPaveText *pinfo2=
new TPaveText(0.1,0.1,0.6,0.4,
"NDC");
1963 pinfo2->SetBorderSize(0);
1964 pinfo2->SetFillStyle(0);
1966 Double_t signif, signal, bkg, errsignif, errsignal, errbkg;
1968 Signal(nsigma,signal,errsignal);
1973 TString str=Form(
"Significance (%.0f#sigma) %.1f #pm %.1f ",nsigma,signif,errsignif);
1974 pinfo2->AddText(str);
1975 str=Form(
"S (%.0f#sigma) %.0f #pm %.0f ",nsigma,signal,errsignal);
1976 pinfo2->AddText(str);
1977 str=Form(
"B (%.0f#sigma) %.0f #pm %.0f",nsigma,bkg,errbkg);
1978 pinfo2->AddText(str);
1979 if(bkg>0) str=Form(
"S/B (%.0f#sigma) %.4f ",nsigma,signal/bkg);
1980 pinfo2->AddText(str);
1992 Printf(
"AliHFMassFitter::GetOverBackgroundResidualsAndPulls, invariant mass histogram not avaialble!");
1998 Printf(
"AliHFMassFitter::GetOverBackgroundResidualsAndPulls, funcbkgRecalc not available!");
2007 for(
Int_t i=0;i<fback->GetNpar();i++){
2008 fbackCp->SetParameter(i,fback->GetParameter(i));
2016 Printf(
"AliHFMassFitter::GetOverBackgroundResidualsAndPulls, negative sigma: fit not performed or something went wrong, cannto draw gaussian term on top of residuals");
2021 TF1 *fgauss=
new TF1(
"signalTermForRes",
"[0]/TMath::Sqrt(2.*TMath::Pi())/[2]*TMath::Exp(-(x-[1])*(x-[1])/2./[2]/[2])",
fhistoInvMass->GetBinLowEdge(1),
fhistoInvMass->GetBinLowEdge(
fhistoInvMass->GetNbinsX()+1));
2023 fgauss->SetParameter(1,
fMass);
2025 fgauss->SetLineColor(kBlue);
2026 hResidualTrend->GetListOfFunctions()->Add(fgauss);
2036 Printf(
"AliHFMassFitter::GetAllRangeResidualsAndPulls, invariant mass histogram not avaialble!");
2042 Printf(
"AliHFMassFitter::GetAllRangeResidualsAndPulls, funcmass not available!");
2048 for(
Int_t i=0;i< f->GetNpar();i++){
2049 fmassCp->SetParameter(i,f->GetParameter(i));
TVirtualPad * GetPad(Double_t nsigma=3, Int_t writeFitInfo=1) const
void Significance(Double_t nOfSigma, Double_t &significance, Double_t &errsignificance) const
backgournd in (min, max) with error
TH1F * GetHistoClone() const
Double_t fReflInit
smoothing refl template
Float_t * fFitPars
number of parameters of the final function
void Background(Double_t nOfSigma, Double_t &background, Double_t &errbackground) const
signal in (min, max) with error
return jsonbuilder str().c_str()
Double_t FitFunction4BkgAndReflDraw(Double_t *x, Double_t *par)
TPaveText * GetYieldBox(Double_t nsigma=3.)
void Print(std::ostream &o, const char *name, Double_t dT, Double_t dVM, Double_t alldT, Double_t alldVM)
TPaveText * GetFitParametersBox(Double_t nsigma=3., Int_t mode=0)
TString * fSignParNames
template of reflection contribution
Double_t * fparReflFixExt
external values to fix back parameters
Int_t fSideBandr
left side band limit (bin number)
void PlotFitVAR(TVirtualPad *pd, Double_t nsigma=3, Int_t writeFitInfo=1)
Int_t fNparBack
number of signal parameters
Bool_t * fFixParReflExternalValue
fix signal parameter from ext value
Bool_t RefitWithBkgOnly(Bool_t draw=kTRUE)
void WriteCanvas(TString userIDstring="", TString path="./", Double_t nsigma=3, Int_t writeFitInfo=1, Bool_t draw=kFALSE) const
setters
Bool_t * fFixParBack
fix signal parameter from ext value
void DrawFit(Double_t nsigma=3) const
void Signal(Double_t nOfSigma, Double_t &signal, Double_t &errsignal) const
return total integral of the histogram
Double_t FitFunction4Sgn(Double_t *x, Double_t *par)
void DrawHere(TVirtualPad *pd, Double_t nsigma=3, Int_t writeFitInfo=1)
void SetBackHighPolDegree(Int_t deg)
Int_t fParsSize
number of bins
Int_t ftypeOfFit4Sgn
0 = exponential; 1 = linear; 2 = pol2
Int_t fNparRefl
number of bkg parameters
Bool_t * fFixParBackExternalValue
fix signal parameter from ext value
Double_t fmaxMass
lower mass limit
Double_t GetReflOverSignal(Double_t &err) const
significance in (min, max) with error
Int_t ftypeOfFit4Bkg
signal+background (kTRUE) or signal only (kFALSE)
Bool_t MassFitter(Bool_t draw=kTRUE)
Bool_t * fFixParRefl
fix signal parameter from ext value
TString * fReflParNames
back parameter names
Double_t fMassErr
signal gaussian mean value
Int_t fmaxBinMass
bin corresponding to fminMass
Double_t fminMass
histogram to fit
AliHFMassFitterVAR for the fit of invariant mass distribution of charmed mesons.
Int_t fNbin
bin corresponding to fmaxMass
Double_t fRawYieldErr
signal gaussian integral
Double_t fSigmaSgnErr
signal gaussian sigma
Double_t fMass
contains fit parameters
Int_t fcounter
right side band limit (bin number)
Double_t fRawYieldHelp
external values to fix refl parameters
Int_t fpolbackdegreeTay
internal variable used when fitting with reflections
Int_t fNFinalPars
size of fFitPars array
Double_t BackFitFuncPolHelper(Double_t *x, Double_t *par)
Double_t fRawYield
err signal gaussian sigma
void AddFunctionsToHisto()
TString * fBackParNames
signal parameter names
Double_t FitFunction4Bkg(Double_t *x, Double_t *par)
void IntS(Float_t *valuewitherror) const
TH1F * GetResidualsAndPulls(TH1 *h, TF1 *f, Double_t minrange=0, Double_t maxrange=-1, TH1 *hPulls=0x0, TH1 *hResidualTrend=0x0, TH1 *hPullsTrend=0x0)
Double_t fMassParticle
help variable
void RebinMass(Int_t bingroup=1)
static void ComputeSignificance(Double_t signal, Double_t errsignal, Double_t background, Double_t errbackground, Double_t &significance, Double_t &errsignificance)
Significance calculator.
virtual ~AliHFMassFitterVAR()
TH1F * SetTemplateReflections(const TH1 *h, TString option="templ", Double_t minRange=1.72, Double_t maxRange=2.05)
virtual void SetDefaultFixParam()
Double_t fSigmaSgn
err signal gaussian mean value
Double_t FitFunction4Refl(Double_t *x, Double_t *par)
TList * fContourGraph
L, LW or Chi2.
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
AliHFMassFitterVAR & operator=(const AliHFMassFitterVAR &mfit)
Double_t * fparBackFixExt
external values to fix signal parameters
Bool_t fSmoothRefl
refl parameter names
TH1F * GetOverBackgroundResidualsAndPulls(Double_t minrange=0, Double_t maxrange=-1, TH1 *hPulls=0x0, TH1 *hResidualTrend=0x0, TH1 *hPullsTrend=0x0)
Bool_t * fFixParSign
initial value of Refl/Signal
Int_t fminBinMass
upper mass limit
Int_t fpolbackdegreeTayHelp
degree of polynomial expansion for back fit (option 6 for back)
Bool_t * fFixParSignExternalValue
fix signal parameter from ext value
TH1F * GetAllRangeResidualsAndPulls(Double_t minrange=0, Double_t maxrange=-1, TH1 *hPulls=0x0, TH1 *hResidualTrend=0x0, TH1 *hPullsTrend=0x0)
Double_t FitFunction4MassDistr(Double_t *x, Double_t *par)
significance in (min, max) with error
Bool_t fSideBands
err on signal gaussian integral
TString fFitOption
Number of points used in the fit.
AliHFMassFitter for the fit of invariant mass distribution of charmed mesons.
TH1F * fhTemplRefl
number of reflection parameters
Double_t * fparSignFixExt
fix signal parameter from ext value
Bool_t PrepareHighPolFit(TF1 *fback)
AliHFMassFitter & operator=(const AliHFMassFitter &mfit)