From 5a8a84f8c48dbbc61df8c431c8f2f224677b7500 Mon Sep 17 00:00:00 2001 From: dainese Date: Sat, 17 Jul 2010 00:21:23 +0000 Subject: [PATCH] Update (Chiara) --- PWG3/vertexingHF/AliHFMassFitter.cxx | 248 +++++++++++++++++++++------ PWG3/vertexingHF/AliHFMassFitter.h | 5 +- 2 files changed, 199 insertions(+), 54 deletions(-) diff --git a/PWG3/vertexingHF/AliHFMassFitter.cxx b/PWG3/vertexingHF/AliHFMassFitter.cxx index ddc04818b3c..91b01baea42 100644 --- a/PWG3/vertexingHF/AliHFMassFitter.cxx +++ b/PWG3/vertexingHF/AliHFMassFitter.cxx @@ -332,7 +332,8 @@ Bool_t AliHFMassFitter::SetFixThisParam(Int_t thispar,Bool_t fixpar){ } fFixPar[thispar]=fixpar; - cout<<"Parameter "<Rebin(bingroup); - if(nbinshisto%bingroup != 0) CheckRangeFit(); fNbin = fhistoInvMass->GetNbinsX(); cout<<"New number of bins: "<GetBinLowEdge(1), maxhisto=fhistoInvMass->GetBinLowEdge(nbins)+width; //check if limits are inside histogram range + if( fminMass-minhisto < 0. ) { - cout<<"Out of histogram left bound!"< 0. ) { - cout<<"Out of histogram right bound!"<SetLineColor(kBlue+3); //dark blue + + Double_t integral=fhistoInvMass->Integral(fhistoInvMass->FindBin(fminMass),fhistoInvMass->FindBin(fmaxMass),"width"); + + switch (ftypeOfFit4Bkg) { + case 0: //gaus+expo + funcbkg->SetParNames("BkgInt","Slope"); + funcbkg->SetParameters(integral,-2.); + break; + case 1: + funcbkg->SetParNames("BkgInt","Slope"); + funcbkg->SetParameters(integral,-100.); + break; + case 2: + funcbkg->SetParNames("BkgInt","Coef1","Coef2"); + funcbkg->SetParameters(integral,-10.,5); + break; + case 3: + cout<<"Warning! This choice does not have a lot of sense..."<SetParNames("Const"); + funcbkg->SetParameter(0,0.); + funcbkg->FixParameter(0,0.); + } + break; + default: + cout<<"Wrong choise of ftypeOfFit4Bkg ("<Fit(bkgname.Data(),"R,L,E,+,0"); + if (status != 0){ + cout<<"Minuit returned "<GetFunction("funcmass"); @@ -1230,6 +1292,10 @@ Double_t AliHFMassFitter::GetChiSquare() const{ //_________________________________________________________________________ Double_t AliHFMassFitter::GetReducedChiSquare() const{ TF1 *funcmass=(TF1*)fhistoInvMass->GetFunction("funcmass"); + if(!funcmass) { + cout<<"funcmass not found"<GetChisquare()/funcmass->GetNDF(); } @@ -1285,11 +1351,24 @@ void AliHFMassFitter::AddFunctionsToHisto(){ np+=3; } + Bool_t done1=kFALSE,done2=kFALSE; + TString bkgnamesave=bkgname; TString testname=bkgname; testname += "FullRange"; TF1 *testfunc=(TF1*)fhistoInvMass->FindObject(testname.Data()); if(testfunc){ + done1=kTRUE; + testfunc=0x0; + } + testname="funcbkgonly"; + testfunc=(TF1*)fhistoInvMass->FindObject(testname.Data()); + if(testfunc){ + done2=kTRUE; + testfunc=0x0; + } + + if(done1 && done2){ cout<<"AddFunctionsToHisto already used: exiting...."<GetListOfFunctions(); hlist->ls(); - TF1 *b=(TF1*)hlist->FindObject(bkgname.Data()); - if(!b){ - cout<FindObject(testname.Data()); + if(!bonly){ + cout<SetLineColor(kBlue+3); + hlist->Add((TF1*)bonly->Clone()); + if(bonly) { + delete bonly; + bonly=NULL; + } + } - bkgname += "FullRange"; - TF1 *bfullrange=new TF1(bkgname.Data(),this,&AliHFMassFitter::FitFunction4Bkg,fminMass,fmaxMass,np,"AliHFMassFitter","FitFunction4Bkg"); - //cout<GetName()<SetParName(i,b->GetParName(i)); - bfullrange->SetParameter(i,b->GetParameter(i)); - bfullrange->SetParError(i,b->GetParError(i)); } - bfullrange->SetLineStyle(4); - bfullrange->SetLineColor(14); - bkgnamesave += "Recalc"; + if(!done1){ + TF1 *b=(TF1*)hlist->FindObject(bkgname.Data()); + if(!b){ + cout<GetName()<SetParName(i,b->GetParName(i)); + bfullrange->SetParameter(i,b->GetParameter(i)); + bfullrange->SetParError(i,b->GetParError(i)); + } + bfullrange->SetLineStyle(4); + bfullrange->SetLineColor(14); - TF1 *mass=fhistoInvMass->GetFunction("funcmass"); + bkgnamesave += "Recalc"; - if (!mass){ - cout<<"funcmass doesn't exist "<SetParameter(0,mass->GetParameter(0)-mass->GetParameter(np)); - blastpar->SetParError(0,mass->GetParError(np)); - if (np>=2) { - blastpar->SetParameter(1,mass->GetParameter(1)); - blastpar->SetParError(1,mass->GetParError(1)); - } - if (np==3) { - blastpar->SetParameter(2,mass->GetParameter(2)); - blastpar->SetParError(2,mass->GetParError(2)); - } + TF1 *mass=fhistoInvMass->GetFunction("funcmass"); - blastpar->SetLineStyle(1); - blastpar->SetLineColor(2); + if (!mass){ + cout<<"funcmass doesn't exist "<Add((TF1*)bfullrange->Clone()); - hlist->Add((TF1*)blastpar->Clone()); - hlist->ls(); + blastpar->SetParameter(0,mass->GetParameter(0)-mass->GetParameter(np)); + blastpar->SetParError(0,mass->GetParError(np)); + if (np>=2) { + blastpar->SetParameter(1,mass->GetParameter(1)); + blastpar->SetParError(1,mass->GetParError(1)); + } + if (np==3) { + blastpar->SetParameter(2,mass->GetParameter(2)); + blastpar->SetParError(2,mass->GetParError(2)); + } + + blastpar->SetLineStyle(1); + blastpar->SetLineColor(2); + + hlist->Add((TF1*)bfullrange->Clone()); + hlist->Add((TF1*)blastpar->Clone()); + hlist->ls(); - if(bfullrange) { - delete bfullrange; - bfullrange=NULL; - } - if(blastpar) { - delete blastpar; - blastpar=NULL; + if(bfullrange) { + delete bfullrange; + bfullrange=NULL; + } + if(blastpar) { + delete blastpar; + blastpar=NULL; + } } + + } //_________________________________________________________________________ @@ -1484,6 +1582,42 @@ void AliHFMassFitter::PlotFit(TVirtualPad* pd,Double_t nsigma,Int_t writeFitInfo cout<<"Verbosity = "<GetFunction("funcmass") && !hdraw->GetFunction("funcbkgFullRange") && !hdraw->GetFunction("funcbkgRecalc")&& !hdraw->GetFunction("funcbkgonly")){ + cout<<"Probably fit failed and you didn't try to refit with background only, there's no function to be drawn"<GetFunction("funcbkgonly")){ //Warning! if this function is present, no chance to draw the other! + cout<<"Drawing background fit only"<SetMinimum(0); + hdraw->GetXaxis()->SetRangeUser(fminMass,fmaxMass); + pd->cd(); + hdraw->SetMarkerStyle(20); + hdraw->DrawClone("PE"); + hdraw->GetFunction("funcbkgonly")->DrawClone("sames"); + + if(writeFitInfo > 0){ + TPaveText *pinfo=new TPaveText(0.6,0.86,1.,1.,"NDC"); + pinfo->SetBorderSize(0); + pinfo->SetFillStyle(0); + TF1* f=hdraw->GetFunction("funcbkgonly"); + for (Int_t i=0;iSetTextColor(kBlue+3); + TString str=Form("%s = %f #pm %f",f->GetParName(i),f->GetParameter(i),f->GetParError(i)); + pinfo->AddText(str); + } + + pinfo->AddText(Form("Reduced #chi^{2} = %.3f",f->GetChisquare()/f->GetNDF())); + pd->cd(); + pinfo->DrawClone(); + + + } + + return; + } + hdraw->SetMinimum(0); hdraw->GetXaxis()->SetRangeUser(fminMass,fmaxMass); pd->cd(); @@ -1537,7 +1671,7 @@ void AliHFMassFitter::PlotFit(TVirtualPad* pd,Double_t nsigma,Int_t writeFitInfo if(writeFitInfo > 1){ for (Int_t i=0;iSetTextColor(kRed); - str=Form("%s = %f #pm %f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i)); + TString str=Form("%s = %f #pm %f",ff->GetParName(i),ff->GetParameter(i),ff->GetParError(i)); pinfob->AddText(str); } pd->cd(); @@ -1893,7 +2027,11 @@ void AliHFMassFitter::Background(Double_t min, Double_t max, Double_t &backgroun void AliHFMassFitter::Significance(Double_t nOfSigma,Double_t &significance,Double_t &errsignificance) const { // Return significance in mean+- n sigma - + + Double_t min=fMass-nOfSigma*fSigmaSgn; + Double_t max=fMass+nOfSigma*fSigmaSgn; + Significance(min, max, significance, errsignificance); + /* Double_t signal,errsignal,background,errbackground; Signal(nOfSigma,signal,errsignal); Background(nOfSigma,background,errbackground); @@ -1901,7 +2039,7 @@ void AliHFMassFitter::Significance(Double_t nOfSigma,Double_t &significance,Doub significance = signal/TMath::Sqrt(signal+background); errsignificance = TMath::Sqrt(significance*significance/(signal+background)/(signal+background)*(1/4.*errsignal*errsignal+errbackground*errbackground)+significance*significance/signal/signal*errsignal*errsignal); - + */ return; } @@ -1914,6 +2052,12 @@ void AliHFMassFitter::Significance(Double_t min, Double_t max, Double_t &signifi Signal(min, max,signal,errsignal); Background(min, max,background,errbackground); + if (signal+background <= 0.){ + cout<<"Cannot calculate significance because of div by 0!"<