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)
241 if(&mfit ==
this)
return *
this;
327 Printf(
"AliHFMassFitterVAR::SetBackHighPolDegree, remeber that this method has to be called after the constructor");
340 if(opt.EqualTo(
"templ")||opt.EqualTo(
"Templ")||opt.EqualTo(
"TEMPL")||opt.EqualTo(
"template")||opt.EqualTo(
"Template")||opt.EqualTo(
"TEMPLATE")){
345 if(opt.EqualTo(
"1gaus")||opt.EqualTo(
"singlegaus")){
346 if(minRange>=0&&maxRange>=0){
347 f=
new TF1(
"mygaus",
"gaus",TMath::Max(minRange,h->GetBinLowEdge(1)),TMath::Min(maxRange,h->GetXaxis()->GetBinUpEdge(h->GetNbinsX())));
349 else f=
new TF1(
"mygaus",
"gaus",h->GetBinLowEdge(1),h->GetXaxis()->GetBinUpEdge(h->GetNbinsX()));
350 f->SetParameter(0,h->GetMaximum());
352 f->SetParameter(1,1.865);
353 f->SetParameter(2,0.050);
358 if(
fhTemplRefl->GetBinContent(j)>=0.&&TMath::Abs(h->GetBinError(j)*h->GetBinError(j)-h->GetBinContent(j))>0.1*h->GetBinContent(j))isPoissErr=kFALSE;
370 if(opt.EqualTo(
"2gaus")||opt.EqualTo(
"doublegaus")){
371 if(minRange>=0&&maxRange>=0){
372 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())));
374 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()));
376 f->SetParameter(0,h->GetMaximum());
378 f->SetParLimits(3,0.,1.);
379 f->SetParameter(3,0.5);
381 f->SetParameter(1,1.84);
382 f->SetParameter(2,0.050);
384 f->SetParameter(4,1.88);
385 f->SetParameter(5,0.050);
390 if(
fhTemplRefl->GetBinContent(j)>=0.&&TMath::Abs(h->GetBinError(j)*h->GetBinError(j)-h->GetBinContent(j))>0.1*h->GetBinContent(j))isPoissErr=kFALSE;
402 if(opt.EqualTo(
"pol3")||opt.EqualTo(
"POL3")){
403 if(minRange>=0&&maxRange>=0){
404 f=
new TF1(
"mypol3",
"pol3",TMath::Max(minRange,h->GetBinLowEdge(1)),TMath::Min(maxRange,h->GetXaxis()->GetBinUpEdge(h->GetNbinsX())));
406 else f=
new TF1(
"mypol3",
"pol3",h->GetBinLowEdge(1),h->GetXaxis()->GetBinUpEdge(h->GetNbinsX()));
407 f->SetParameter(0,h->GetMaximum());
411 for(
Int_t nf=0;nf<10;nf++){
418 if(
fhTemplRefl->GetBinContent(j)>=0.&&TMath::Abs(h->GetBinError(j)*h->GetBinError(j)-h->GetBinContent(j))>0.1*h->GetBinContent(j))isPoissErr=kFALSE;
430 if(opt.EqualTo(
"pol6")||opt.EqualTo(
"POL6")){
432 if(minRange>=0&&maxRange>=0){
433 f=
new TF1(
"mypol6",
"pol6",TMath::Max(minRange,h->GetBinLowEdge(1)),TMath::Min(maxRange,h->GetXaxis()->GetBinUpEdge(h->GetNbinsX())));
435 else f=
new TF1(
"mypol6",
"pol6",h->GetBinLowEdge(1),h->GetXaxis()->GetBinUpEdge(h->GetNbinsX()));
436 f->SetParameter(0,h->GetMaximum());
445 if(
fhTemplRefl->GetBinContent(j)>=0.&&TMath::Abs(h->GetBinError(j)*h->GetBinError(j)-h->GetBinContent(j))>0.1*h->GetBinContent(j))isPoissErr=kFALSE;
457 Printf(
"AlliHFMassFitterVAR::SetTemplateReflections: bad option");
516 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]);
522 Printf(
"FitFunction4BkgAndRefl called but w/o reasons: this is just for drawing and requires parameters to be set from outside!!!");
554 back+=par[it]*TMath::Power(x[0]-
fMassParticle,it)/TMath::Factorial(it);
595 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]);
602 total= par[0+firstPar]/(fmaxMass-
fminMass)+par[1+firstPar]*(x[0]-0.5*(fmaxMass+fminMass));
612 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));
615 total=par[0+firstPar];
626 Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
628 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]);
635 Double_t mpi = TDatabasePDG::Instance()->GetParticle(211)->Mass();
637 total = par[1+firstPar]*TMath::Sqrt(x[0] - mpi)*TMath::Exp(-1.*par[2+firstPar]*(x[0]-mpi));
651 total=par[0+firstPar];
653 total+=par[it+firstPar]*TMath::Power(x[0]-
fMassParticle,it)/TMath::Factorial(it);
680 Double_t sidebandldouble,sidebandrdouble;
681 Bool_t leftok=kFALSE, rightok=kFALSE;
684 cout<<
"Left limit of range > mean or right limit of range < mean: change left/right limit or initial mean value"<<endl;
693 cout<<
"Changed number of sigma from 4 to "<<0.5*coeff<<
" for the estimation of the side bands"<<endl;
694 if (coeff<3) cout<<
"Side bands inside 3 sigma, may be better use ftypeOfFit4Bkg = 3 (only signal)"<<endl;
696 cout<<
"Side bands inside 2 sigma. Change mode: ftypeOfFit4Bkg = 3"<<endl;
708 cout<<
"Left side band ";
716 if(TMath::Abs(tmp-sidebandldouble) > 1e-6){
717 cout<<tmp<<
" is not allowed, changing it to the nearest value allowed: ";
720 cout<<sidebandldouble<<
" (bin "<<
fSideBandl<<
")"<<endl;
722 cout<<
"Right side band ";
729 if(TMath::Abs(tmp-sidebandrdouble) > 1e-6){
730 cout<<tmp<<
" is not allowed, changing it to the nearest value allowed: ";
733 cout<<sidebandrdouble<<
" (bin "<<
fSideBandr<<
")"<<endl;
735 cout<<
"Error! Range too little";
746 cout<<
"No histogram to fit! SetHisto(TH1F* h) before! "<<endl;
749 Bool_t leftok=kFALSE, rightok=kFALSE;
756 cout<<
"Out of histogram left bound! Setting to "<<minhisto<<endl;
760 cout<<
"Out of histogram right bound! Setting to"<<maxhisto<<endl;
770 if(TMath::Abs(tmp-
fminMass) > 1e-6){
771 cout<<
"Left bound "<<tmp<<
" is not allowed, changing it to the nearest value allowed: "<<
fminMass<<endl;
780 if(TMath::Abs(tmp-
fmaxMass) > 1e-6){
781 cout<<
"Right bound "<<tmp<<
" is not allowed, changing it to the nearest value allowed: "<<
fmaxMass<<endl;
785 return (leftok && rightok);
796 TVirtualFitter::SetDefaultFitter(
"Minuit");
799 Double_t slope1=-1,slope2=1,slope3=1;
804 Int_t checkinnsigma=4;
807 Double_t intUnderFunc=func->Integral(range[0],range[1]);
809 cout<<
"Pick zone: IntFunc = "<<intUnderFunc<<
"; IntHist = "<<intUnderHisto<<
"\tDiff = "<<intUnderHisto-intUnderFunc<<
"\tRelDiff = "<<(intUnderHisto-intUnderFunc)/intUnderFunc<<endl;
810 Double_t diffUnderPick=(intUnderHisto-intUnderFunc);
813 cout<<
"Band (l) zone: IntFunc = "<<intUnderFunc<<
"; IntHist = "<<intUnderHisto<<
"\tDiff = "<<intUnderHisto-intUnderFunc<<
"\tRelDiff = "<<(intUnderHisto-intUnderFunc)/intUnderFunc<<endl;
814 diffUnderBands=(intUnderHisto-intUnderFunc);
815 Double_t relDiff=diffUnderPick/diffUnderBands;
816 cout<<
"Relative difference = "<<relDiff<<endl;
817 if(TMath::Abs(relDiff) < 0.25) isBkgOnly=kTRUE;
819 cout<<
"Relative difference = "<<relDiff<<
": I suppose there is some signal, continue with total fit!"<<endl;
823 cout<<
"INFO!! The histogram contains only background"<<endl;
847 if(!ok)
return kFALSE;
852 cout<<
"------sideBandsInt - first approx = "<<sideBandsInt<<endl;
853 if (sideBandsInt<=0) {
854 cout<<
"! sideBandsInt <=0. There's a problem, cannot start the fit"<<endl;
861 cout<<
"Function name = "<<funcbkg->GetName()<<endl<<endl;
863 funcbkg->SetLineColor(2);
870 parBackInit[j]=func->GetParameter(j);
874 Print(
"First fit background function not present");
876 delete[] parBackInit;
881 parBackInit[0]=totInt;
887 funcbkg->SetParameter(j,parBackInit[j]);
892 funcbkg->FixParameter(j,parBackInit[j]);
907 intbkg1 = funcbkg->Integral(fminMass,fmaxMass);
915 else cout<<
"\t\t//"<<endl;
934 if(
ftypeOfFit4Sgn == 1) bkgInt=funcbkg->Integral(fminMass,fmaxMass);
935 else bkgInt=funcbkg->Integral(fminMass,fmaxMass);
940 sgnInt = totInt-bkgInt;
941 Printf(
"Estimates: bkgInt: %f, totInt: %f, diffUndBan:%f",bkgInt,totInt,diffUnderBands);
946 if(sgnInt<0)sgnInt=0.1*totInt;
948 cout<<
"Function name = "<<funcmass->GetName()<<endl<<endl;
949 funcmass->SetLineColor(4);
952 cout<<
"\nTOTAL FIT"<<endl;
957 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);
961 funcmass->SetParameter(j,parBackInit[j]);
966 funcmass->FixParameter(j,parBackInit[j]);
972 funcmass->SetParameter(j+fNparBack,parSignInit[j]);
977 funcmass->FixParameter(j+fNparBack,parSignInit[j]);
983 funcmass->SetParName(j+fNparBack+fNparSignal,
fReflParNames[j]);
984 funcmass->SetParameter(j+fNparBack+fNparSignal,parReflInit[j]);
985 funcmass->SetParLimits(j+fNparBack+fNparSignal,0.,1.);
987 funcmass->FixParameter(j+fNparBack+fNparSignal,
fparReflFixExt[j]);
990 funcmass->FixParameter(j+fNparBack+fNparSignal,parReflInit[j]);
999 cout<<
"Minuit returned "<<status<<endl;
1001 delete[] parBackInit;
1005 Printf(
"MassFitter: Value of func at 1.800: %f",funcmass->Eval(1.8000));
1006 cout<<
"fit done"<<endl;
1008 fMass=funcmass->GetParameter(fNparBack+1);
1009 fMassErr=funcmass->GetParError(fNparBack+1);
1010 fSigmaSgn=funcmass->GetParameter(fNparBack+2);
1029 if(funcmass->GetParameter(fNparBack+2) <0 || funcmass->GetParameter(fNparBack+1) <0 || funcmass->GetParameter(fNparBack) <0 ) {
1030 cout<<
"IntS or mean or sigma negative. You may tray to SetInitialGaussianSigma(..) and SetInitialGaussianMean(..)"<<endl;
1032 delete[] parBackInit;
1041 delete[] parBackInit;
1060 for(
Int_t j=1;j<=hCp->GetNbinsX();j++){
1063 Double_t binCenter=hCp->GetBinCenter(j);
1065 hCp->SetBinContent(j,0);
1066 hCp->SetBinError(j,0);
1071 TF1 *funcbkg,*funcPrev=0x0;
1076 funcbkg->SetParameter(j,funcPrev->GetParameter(j));
1081 funcbkg->SetParameter(0,estimatecent);
1082 funcbkg->SetParameter(1,estimateslope);
1085 hCp->Fit(funcbkg,
"REMN",
"");
1086 funcPrev=(TF1*)funcbkg->Clone(
"ftemp");
1095 fback->SetParameter(j,funcPrev->GetParameter(j));
1096 fback->SetParError(j,funcPrev->GetParError(j));
1098 hCp->Fit(fback,
"REMN",
"");
1121 TString bkgname=
"funcbkgonly";
1127 funcbkg->SetLineColor(kBlue+3);
1133 funcbkg->SetParNames(
"BkgInt",
"Slope");
1134 funcbkg->SetParameters(integral,-2.);
1137 funcbkg->SetParNames(
"BkgInt",
"Slope");
1138 funcbkg->SetParameters(integral,-100.);
1141 funcbkg->SetParNames(
"BkgInt",
"Coef1",
"Coef2");
1142 funcbkg->SetParameters(integral,-10.,5);
1145 cout<<
"Warning! This choice does not make a lot of sense..."<<endl;
1147 funcbkg->SetParNames(
"Const");
1148 funcbkg->SetParameter(0,0.);
1149 funcbkg->FixParameter(0,0.);
1153 funcbkg->SetParNames(
"BkgInt",
"Coef1");
1154 funcbkg->SetParameters(integral,0.5);
1157 funcbkg->SetParNames(
"BkgInt",
"Coef1",
"Coef2");
1158 funcbkg->SetParameters(integral,-10.,5.);
1162 funcbkg->SetParName(ipb,Form(
"Coef%d",ipb));
1166 cout<<
"Wrong choise of ftypeOfFit4Bkg ("<<
ftypeOfFit4Bkg<<
")"<<endl;
1178 fhistoInvMass->GetFunction(funcbkg->GetName())->SetBit(1<<9,kTRUE);
1184 cout<<
"Minuit returned "<<status<<endl;
1200 if(!valuewitherror) {
1201 printf(
"AliHFMassFitterVAR::IntS: got a null pointer\n");
1219 Bool_t done1=kFALSE,done2=kFALSE;
1220 Printf(
" AddFunctionsToHisto ############# LISTING ALL FUNCTIONS #################");
1225 testname +=
"FullRange";
1226 TF1 *testfunc=(TF1*)
fhistoInvMass->FindObject(testname.Data());
1231 testname=
"funcbkgonly";
1239 cout<<
"AddFunctionsToHisto already used: exiting...."<<endl;
1247 TF1 *bonly=(TF1*)hlist->FindObject(testname.Data());
1249 cout<<testname.Data()<<
" not found looking for complete fit"<<endl;
1251 bonly->SetLineColor(kBlue+3);
1252 hlist->Add((TF1*)bonly->Clone());
1259 TF1 *b=(TF1*)hlist->FindObject(bkgname.Data());
1261 cout<<bkgname<<
" not found, cannot produce "<<bkgname<<
"FullRange and "<<bkgname<<
"Recalc"<<endl;
1265 bkgname +=
"FullRange";
1269 bfullrange->SetParName(i,b->GetParName(i));
1270 bfullrange->SetParameter(i,b->GetParameter(i));
1271 bfullrange->SetParError(i,b->GetParError(i));
1273 bfullrange->SetLineStyle(4);
1274 bfullrange->SetLineColor(14);
1277 bkgnamesave +=
"Recalc";
1286 cout<<
"funcmass doesn't exist "<<endl;
1296 blastpar->SetParameter(0,mass->GetParameter(0));
1297 blastpar->SetParError(0,mass->GetParError(0));
1300 blastpar->SetParameter(0,mass->GetParameter(0)-mass->GetParameter(fNparBack));
1301 blastpar->SetParError(0,mass->GetParError(fNparBack));
1304 blastpar->SetParameter(jb,mass->GetParameter(jb));
1305 blastpar->SetParError(jb,mass->GetParError(jb));
1309 blastpar->SetParameter(0,mass->GetParameter(0)-mass->GetParameter(fNparBack)-mass->GetParameter(fNparBack+
fNparSignal)*mass->GetParameter(fNparBack));
1310 blastpar->SetParError(0,mass->GetParError(fNparBack));
1312 blastpar->SetParameter(fNparBack,mass->GetParameter(fNparBack+
fNparSignal));
1314 blastpar->SetParameter(jr+fNparBack,mass->GetParameter(fNparBack+
fNparSignal+jr));
1315 blastpar->SetParError(jr+fNparBack,mass->GetParError(fNparBack+
fNparSignal+jr));
1319 blastpar->SetParameter(jr+fNparBack,mass->GetParameter(fNparBack+
fNparSignal+jr));
1320 blastpar->SetParError(jr+fNparBack,mass->GetParError(fNparBack+
fNparSignal+jr));
1323 blastpar->SetLineStyle(1);
1324 blastpar->SetLineColor(2);
1326 hlist->Add((TF1*)bfullrange->Clone());
1327 hlist->Add((TF1*)blastpar->Clone());
1342 gStyle->SetOptStat(0);
1343 gStyle->SetCanvasColor(0);
1344 gStyle->SetFrameFillColor(0);
1370 filename.Prepend(userIDstring);
1371 path.Append(filename);
1373 TCanvas*
c =
static_cast<TCanvas*
>(
GetPad(nsigma,writeFitInfo));
1374 c->SetName(Form(
"%s%s%s",c->GetName(),userIDstring.Data(),type.Data()));
1375 if (draw) c->DrawClone();
1377 TFile outputcv(path.Data(),
"update");
1396 gStyle->SetOptStat(0);
1397 gStyle->SetCanvasColor(0);
1398 gStyle->SetFrameFillColor(0);
1400 cout<<
"nsigma = "<<nsigma<<endl;
1401 cout<<
"Verbosity = "<<writeFitInfo<<endl;
1405 if(!hdraw->GetFunction(
"funcmass") && !hdraw->GetFunction(
"funcbkgFullRange") && !hdraw->GetFunction(
"funcbkgRecalc")&& !hdraw->GetFunction(
"funcbkgonly")){
1406 cout<<
"Probably fit failed and you didn't try to refit with background only, there's no function to be drawn"<<endl;
1410 if(hdraw->GetFunction(
"funcbkgonly")){
1411 cout<<
"Drawing background fit only"<<endl;
1412 hdraw->SetMinimum(0);
1415 hdraw->SetMarkerStyle(20);
1416 hdraw->DrawClone(
"PE");
1417 hdraw->GetFunction(
"funcbkgonly")->DrawClone(
"sames");
1419 if(writeFitInfo > 0){
1420 TPaveText *pinfo=
new TPaveText(0.6,0.86,1.,1.,
"NDC");
1421 pinfo->SetBorderSize(0);
1422 pinfo->SetFillStyle(0);
1423 TF1* f=hdraw->GetFunction(
"funcbkgonly");
1425 pinfo->SetTextColor(kBlue+3);
1426 TString str=Form(
"%s = %.3f #pm %.3f",f->GetParName(i),f->GetParameter(i),f->GetParError(i));
1427 pinfo->AddText(str);
1431 pinfo->SetTextColor(kBlue+3);
1432 TString str=Form(
"%s = %.3f #pm %.3f",f->GetParName(i),f->GetParameter(i),f->GetParError(i));
1433 pinfo->AddText(str);
1436 for (
Int_t i=fNparBack+fNparSignal;i<fNparBack+fNparSignal+
fNparRefl;i++){
1437 pinfo->SetTextColor(kBlue+3);
1438 TString str=Form(
"%s = %.3f #pm %.3f",f->GetParName(i),f->GetParameter(i),f->GetParError(i));
1439 pinfo->AddText(str);
1442 pinfo->AddText(Form(
"Reduced #chi^{2} = %.3f",f->GetChisquare()/f->GetNDF()));
1452 hdraw->SetMinimum(0);
1455 hdraw->SetMarkerStyle(20);
1456 hdraw->DrawClone(
"PE");
1459 if(hdraw->GetFunction(
"funcmass")) hdraw->GetFunction(
"funcmass")->DrawClone(
"same");
1461 if(writeFitInfo > 0){
1462 TPaveText *pinfob=
new TPaveText(0.6,0.86,1.,1.,
"NDC");
1463 TPaveText *pinfom=
new TPaveText(0.6,0.7,1.,.87,
"NDC");
1464 pinfob->SetBorderSize(0);
1465 pinfob->SetFillStyle(0);
1466 pinfom->SetBorderSize(0);
1467 pinfom->SetFillStyle(0);
1478 pinfom->SetTextColor(kBlue);
1479 TString str=Form(
"%s = %.3f #pm %.3f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1480 if(!(writeFitInfo==1 && i==
fNparBack)) pinfom->AddText(str);
1483 pinfom->SetTextColor(kBlue+3);
1484 TString str=Form(
"%s = %.3f #pm %.3f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1485 pinfom->AddText(str);
1489 pinfom->DrawClone();
1491 TPaveText *pinfo2=
new TPaveText(0.1,0.1,0.6,0.4,
"NDC");
1492 pinfo2->SetBorderSize(0);
1493 pinfo2->SetFillStyle(0);
1495 Double_t signif, signal, bkg, errsignif, errsignal, errbkg;
1497 Signal(nsigma,signal,errsignal);
1502 TString str=Form(
"Significance (%.0f#sigma) %.1f #pm %.1f ",nsigma,signif,errsignif);
1503 pinfo2->AddText(str);
1504 str=Form(
"S (%.0f#sigma) %.0f #pm %.0f ",nsigma,signal,errsignal);
1505 pinfo2->AddText(str);
1506 str=Form(
"B (%.0f#sigma) %.0f #pm %.0f",nsigma,bkg,errbkg);
1507 pinfo2->AddText(str);
1508 if(bkg>0) str=Form(
"S/B (%.0f#sigma) %.4f ",nsigma,signal/bkg);
1509 pinfo2->AddText(str);
1513 if(writeFitInfo==1){
1514 TF1 *fitBkgRec=hdraw->GetFunction(
"funcbkgRecalc");
1515 fitBkgRec->SetLineColor(14);
1516 fitBkgRec->SetLineStyle(2);
1524 fitCp->SetParameter(ibk,fitBkgRec->GetParameter(ibk));
1526 fitCp->SetLineColor(kMagenta);
1527 fitCp->SetLineStyle(7);
1528 fitCp->SetLineWidth(2);
1529 fitCp->DrawCopy(
"Lsame");
1535 if(writeFitInfo > 1){
1537 pinfob->SetTextColor(kRed);
1538 str=Form(
"%s = %f #pm %f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1539 pinfob->AddText(str);
1542 pinfob->DrawClone();
1557 cout<<
"Use MassFitter method before Signal"<<endl;
1564 Signal(min,max,signal,errsignal);
1577 cout<<
"AliHFMassFitterVAR::Signal() ERROR -> Mass distr function not found!"<<endl;
1581 Printf(
"The fit was done w/o reflection template");
1595 cout<<
"Use MassFitter method before Signal"<<endl;
1600 TString bkgname=
"funcbkgRecalc";
1601 TString bkg1name=
"funcbkg1Recalc";
1608 cout<<
"AliHFMassFitterVAR::Signal() ERROR -> Mass distr function not found!"<<endl;
1616 cout<<
"AliHFMassFitterVAR::Signal() ERROR -> Bkg function not found!"<<endl;
1625 intS=funcmass->GetParameter(np);
1626 intSerr=funcmass->GetParError(np);
1628 cout<<
"Sgn relative error evaluation from fit: "<<intSerr/intS<<endl;
1630 Background(min,max,background,errbackground);
1635 signal=mass - background;
1636 errsignal=(intSerr/intS)*signal;
1646 cout<<
"Use MassFitter method before Background"<<endl;
1652 Background(min,max,background,errbackground);
1663 cout<<
"Use MassFitter method before Background"<<endl;
1668 TString bkgname=
"funcbkgRecalc";
1669 TString bkg1name=
"funcbkg1Recalc";
1675 cout<<
"AliHFMassFitterVAR::Background() ERROR -> Bkg function not found!"<<endl;
1685 intB=funcbkg->GetParameter(0);
1686 intBerr=funcbkg->GetParError(0);
1687 cout<<
"Bkg relative error evaluation: from final parameters of the fit: "<<intBerr/intB<<endl;
1701 intBerr=TMath::Sqrt(sum2);
1702 cout<<
"Bkg relative error evaluation: from histo: "<<intBerr/intB<<endl;
1704 cout<<
"Last estimation of bkg error is used"<<endl;
1713 errbackground=intBerr/intB*background;
1738 Double_t signal,errsignal,background,errbackground;
1739 Signal(min, max,signal,errsignal);
1740 Background(min, max,background,errbackground);
1742 if (signal+background <= 0.){
1743 cout<<
"Cannot calculate significance because of div by 0!"<<endl;
1782 cout<<
"AliHFMassFitterVAR, Error in computing fParsSize: check ftypeOfFit4Bkg"<<endl;
1790 cout<<
"Parameters array size "<<
fParsSize<<endl;
1797 cout<<
"Info:ComputeNFinalPars... ";
1860 cout<<
"AliHFMassFitterVAR, Error in computing fNparBack: check ftypeOfFit4Bkg"<<endl;
1921 Printf(
"Total number of par: %d, Back:%d, Sign:%d, Refl: %d",
fNFinalPars,fNparBack,fNparSignal,fNparRefl);
1926 TPaveText *pinfom=
new TPaveText(0.6,0.7,1.,.87,
"NDC");
1927 pinfom->SetBorderSize(0);
1928 pinfom->SetFillStyle(0);
1933 pinfom->SetTextColor(kBlue);
1934 TString str=Form(
"%s = %.3f #pm %.3f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1935 if(!(mode==1 && i==
fNparBack)) pinfom->AddText(str);
1938 pinfom->SetTextColor(kBlue+3);
1939 TString str=Form(
"%s = %.3f #pm %.3f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1940 pinfom->AddText(str);
1944 pinfom->SetTextColor(kBlue+5);
1946 TString str=Form(
"%s = %.3f #pm %.3f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i));
1947 pinfom->AddText(str);
1950 pinfom->AddText(Form(
"#chi^{2}/NDF=%.2f/%d",ff->GetChisquare(),ff->GetNDF()));
1957 TPaveText *pinfo2=
new TPaveText(0.1,0.1,0.6,0.4,
"NDC");
1958 pinfo2->SetBorderSize(0);
1959 pinfo2->SetFillStyle(0);
1961 Double_t signif, signal, bkg, errsignif, errsignal, errbkg;
1963 Signal(nsigma,signal,errsignal);
1968 TString str=Form(
"Significance (%.0f#sigma) %.1f #pm %.1f ",nsigma,signif,errsignif);
1969 pinfo2->AddText(str);
1970 str=Form(
"S (%.0f#sigma) %.0f #pm %.0f ",nsigma,signal,errsignal);
1971 pinfo2->AddText(str);
1972 str=Form(
"B (%.0f#sigma) %.0f #pm %.0f",nsigma,bkg,errbkg);
1973 pinfo2->AddText(str);
1974 if(bkg>0) str=Form(
"S/B (%.0f#sigma) %.4f ",nsigma,signal/bkg);
1975 pinfo2->AddText(str);
1987 Printf(
"AliHFMassFitter::GetOverBackgroundResidualsAndPulls, invariant mass histogram not avaialble!");
1993 Printf(
"AliHFMassFitter::GetOverBackgroundResidualsAndPulls, funcbkgRecalc not available!");
2002 for(
Int_t i=0;i<fback->GetNpar();i++){
2003 fbackCp->SetParameter(i,fback->GetParameter(i));
2011 Printf(
"AliHFMassFitter::GetOverBackgroundResidualsAndPulls, negative sigma: fit not performed or something went wrong, cannto draw gaussian term on top of residuals");
2016 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));
2018 fgauss->SetParameter(1,
fMass);
2020 fgauss->SetLineColor(kBlue);
2021 hResidualTrend->GetListOfFunctions()->Add(fgauss);
2031 Printf(
"AliHFMassFitter::GetAllRangeResidualsAndPulls, invariant mass histogram not avaialble!");
2037 Printf(
"AliHFMassFitter::GetAllRangeResidualsAndPulls, funcmass not available!");
2043 for(
Int_t i=0;i< f->GetNpar();i++){
2044 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
TH1F * SetTemplateReflections(const TH1F *h, TString option="templ", Double_t minRange=1.72, Double_t maxRange=2.05)
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()
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)