ClassImp(AliHFMassFitter)
//constructors
-AliHFMassFitter::AliHFMassFitter() : TNamed(),
+AliHFMassFitter::AliHFMassFitter() :
+ TNamed(),
fhistoInvMass(0),
fminMass(0),
fmaxMass(0),
fNbin(1),
+ fParsSize(1),
+ fFitPars(0),
fWithBkg(0),
ftypeOfFit4Bkg(0),
ftypeOfFit4Sgn(0),
fminMass(0),
fmaxMass(0),
fNbin(1),
+ fParsSize(1),
+ fFitPars(0),
fWithBkg(0),
ftypeOfFit4Bkg(0),
ftypeOfFit4Sgn(0),
else fWithBkg=kTRUE;
if (!fWithBkg) cout<<"Fit Histogram of Signal only"<<endl;
else cout<<"Type of fit For Background = "<<ftypeOfFit4Bkg<<endl;
+
+ ComputeParSize();
+ fFitPars=new Float_t[fParsSize];
}
-//_________________________________________________________________________
AliHFMassFitter::AliHFMassFitter(const AliHFMassFitter &mfit):
TNamed(),
fminMass(mfit.fminMass),
fmaxMass(mfit.fmaxMass),
fNbin(mfit.fNbin),
+ fParsSize(mfit.fParsSize),
+ fFitPars(0),
fWithBkg(mfit.fWithBkg),
ftypeOfFit4Bkg(mfit.ftypeOfFit4Bkg),
ftypeOfFit4Sgn(mfit.ftypeOfFit4Sgn),
{
//copy constructor
- for(Int_t i=0;i<30;i++) fFitPars[i]=mfit.fFitPars[i];
+
+ if(mfit.fParsSize > 0){
+ fFitPars=new Float_t[fParsSize];
+ memcpy(fFitPars,mfit.fFitPars,mfit.fParsSize*sizeof(Float_t));
+ }
+ //for(Int_t i=0;i<fParsSize;i++) fFitPars[i]=mfit.fFitPars[i];
+}
+
+//_________________________________________________________________________
+
+AliHFMassFitter::~AliHFMassFitter() {
+ if(fhistoInvMass) delete fhistoInvMass;
+ if(fntuParam) delete fntuParam;
+ if(fFitPars) delete[] fFitPars;
}
//_________________________________________________________________________
fminMass= mfit.fminMass;
fmaxMass= mfit.fmaxMass;
fNbin= mfit.fNbin;
+ fParsSize= mfit.fParsSize;
fWithBkg= mfit.fWithBkg;
ftypeOfFit4Bkg= mfit.ftypeOfFit4Bkg;
ftypeOfFit4Sgn= mfit.ftypeOfFit4Sgn;
fMass= mfit.fMass;
fSigmaSgn= mfit.fSigmaSgn;
fSideBands= mfit.fSideBands;
- for(Int_t i=0;i<30;i++) fFitPars[i]=mfit.fFitPars[i];
+ if(mfit.fParsSize > 0){
+ if(fFitPars) delete[] fFitPars;
+ fFitPars=new Float_t[fParsSize];
+ memcpy(fFitPars,mfit.fFitPars,mfit.fParsSize*sizeof(Float_t));
+ }
+// fFitPars=new Float_t[fParsSize];
+// for(Int_t i=0;i<fParsSize;i++) fFitPars[i]=mfit.fFitPars[i];
return *this;
}
+//__________________________________________________________________________
+
+void AliHFMassFitter::ComputeParSize() {
+ switch (ftypeOfFit4Bkg) {//npar backround func
+ case 0:
+ fParsSize = 2*3;
+ break;
+ case 1:
+ fParsSize = 2*3;
+ break;
+ case 2:
+ fParsSize = 3*3;
+ break;
+ case 3:
+ fParsSize = 1*2;
+ break;
+ default:
+ cout<<"Error computing fParsSize: check ftypeOfFit4Bkg"<<endl;
+ break;
+ }
+
+ fParsSize += 3; //npar refl
+ fParsSize += 3; //npar signal gaus
+
+ fParsSize*=2; //add errors
+ cout<<"Parameters array size "<<fParsSize<<endl;
+}
+
+//___________________________________________________________________________
+
+ void AliHFMassFitter::SetType(Int_t fittypeb, Int_t fittypes) {
+ ftypeOfFit4Bkg = fittypeb;
+ ftypeOfFit4Sgn = fittypes;
+ ComputeParSize();
+ fFitPars = new Float_t[fParsSize];
+
+}
//___________________________________________________________________________
}
cout<<"funcmass "<<funcmass<<endl;
funcmass->Draw("sames");
-
+ cout<<"Drawn"<<endl;
}
}
//_________________________________________________________________________
-void AliHFMassFitter::GetFitPars(Float_t *params) const {
+void AliHFMassFitter::GetFitPars(Float_t *vector) const {
// Return fit parameters
- for(Int_t i=0;i<30;i++){
- params[i]=fFitPars[i];
+ for(Int_t i=0;i<fParsSize;i++){
+ vector[i]=fFitPars[i];
}
}
else funcbkg=fhistoInvMass->GetFunction("funcbkg1");
Double_t min=mean-nOfSigma*sigma;
Double_t max=mean+nOfSigma*sigma;
- signal=funcmass->Integral(min,max)-funcbkg->Integral(min,max);
+ signal=(funcmass->Integral(min,max)-funcbkg->Integral(min,max))/(Double_t)fhistoInvMass->GetBinWidth(2);
errsignal=intSerr/intS*signal; // assume relative error is the same as for total integral
return;
else funcbkg=fhistoInvMass->GetFunction("funcbkg1");
Double_t min=mean-nOfSigma*sigma;
Double_t max=mean+nOfSigma*sigma;
- background=funcbkg->Integral(min,max);
+ background=funcbkg->Integral(min,max)/(Double_t)fhistoInvMass->GetBinWidth(2);
errbackground=intBerr/intB*background;
return;
public:
AliHFMassFitter();
AliHFMassFitter(TH1F* histoToFit, Double_t minvalue, Double_t maxvalue, Int_t rebin=1,Int_t fittypeb=0,Int_t fittypes=0);
- virtual ~AliHFMassFitter(){if(fhistoInvMass) delete fhistoInvMass; if(fntuParam) delete fntuParam;}
+ virtual ~AliHFMassFitter();
AliHFMassFitter(const AliHFMassFitter &mfit);
AliHFMassFitter& operator=(const AliHFMassFitter &mfit);
//setters
void SetHisto(TH1F *histoToFit) {fhistoInvMass=histoToFit;}
- void SetRangeFit(Double_t minvalue, Double_t maxvalue){fminMass=minvalue; fmaxMass=maxvalue;};
- void SetMinRangeFit(Double_t minvalue){fminMass=minvalue;};
- void SetMaxRangeFit(Double_t maxvalue){fmaxMass=maxvalue;};
- void SetBinN(Int_t newbinN){fNbin=newbinN;};
- void SetType(Int_t fittypeb, Int_t fittypes) {ftypeOfFit4Bkg = fittypeb; ftypeOfFit4Sgn = fittypes; };
+ void SetRangeFit(Double_t minvalue, Double_t maxvalue){fminMass=minvalue; fmaxMass=maxvalue;}
+ void SetMinRangeFit(Double_t minvalue){fminMass=minvalue;}
+ void SetMaxRangeFit(Double_t maxvalue){fmaxMass=maxvalue;}
+ void SetBinN(Int_t newbinN){fNbin=newbinN;}
+ void SetType(Int_t fittypeb, Int_t fittypes);
void SetReflectionSigmaFactor(Int_t constant) {ffactor=constant;}
void SetInitialGaussianMean(Double_t mean) {fMass=mean;}
void SetInitialGaussianSigma(Double_t sigma) {fSigmaSgn=sigma;}
void SetSideBands(Bool_t onlysidebands=kTRUE) {fSideBands=onlysidebands;}
//getters
- TH1F* GetHisto() const {return fhistoInvMass;};
- Double_t GetMinRangeFit()const {return fminMass;};
- Double_t GetMaxRangeFit()const {return fmaxMass;};
- Int_t GetBinN() const {return fNbin;};
+ TH1F* GetHisto() const {return fhistoInvMass;}
+ Double_t GetMinRangeFit()const {return fminMass;}
+ Double_t GetMaxRangeFit()const {return fmaxMass;}
+ Int_t GetBinN() const {return fNbin;}
void GetFitPars(Float_t*) const;
void GetTypeOfFit(Bool_t background, Int_t typeb) const {background = fWithBkg; typeb = ftypeOfFit4Bkg;}
Int_t GetReflectionSigmaFactor() const {return ffactor;}
private:
+ void ComputeParSize();
+
TH1F *fhistoInvMass; // histogram to fit
Double_t fminMass; // lower mass limit
Double_t fmaxMass; // upper mass limit
Int_t fNbin; // number of bins
- Float_t fFitPars[30]; // array of fit parameters
+ Int_t fParsSize; // size of fFitPars array
+ Float_t *fFitPars; //[fParsSize] array of fit parameters
Bool_t fWithBkg; // signal+background (kTRUE) or signal only (kFALSE)
Int_t ftypeOfFit4Bkg; // 0 = exponential; 1 = linear; 2 = pol2
Int_t ftypeOfFit4Sgn; // 0 = gaus; 1 = gaus+gaus broadened
Double_t fSigmaSgn; // signal gaussian sigma
Bool_t fSideBands; // kTRUE = only side bands considered
- ClassDef(AliHFMassFitter,0); // class for invariant mass fit
+ ClassDef(AliHFMassFitter,1); // class for invariant mass fit
};
#endif