]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Fix in copy constructor, added draw functionality (Chiara)
authordainese <dainese@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 28 Apr 2009 21:28:33 +0000 (21:28 +0000)
committerdainese <dainese@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 28 Apr 2009 21:28:33 +0000 (21:28 +0000)
PWG3/vertexingHF/AliHFMassFitter.cxx
PWG3/vertexingHF/AliHFMassFitter.h

index 46d387bdb5749921d795369111b66c4ea8af02cd..dd225af23be5824bb94a66275f2a63a37f5db36c 100644 (file)
 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),
@@ -56,6 +59,8 @@ AliHFMassFitter::AliHFMassFitter (TH1F *histoToFit, Double_t minvalue, Double_t
  fminMass(0),
  fmaxMass(0),
  fNbin(1),
+ fParsSize(1),
+ fFitPars(0),
  fWithBkg(0),
  ftypeOfFit4Bkg(0),
  ftypeOfFit4Sgn(0),
@@ -78,9 +83,11 @@ AliHFMassFitter::AliHFMassFitter (TH1F *histoToFit, Double_t minvalue, Double_t
   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(),
@@ -88,6 +95,8 @@ AliHFMassFitter::AliHFMassFitter(const AliHFMassFitter &mfit):
   fminMass(mfit.fminMass),
   fmaxMass(mfit.fmaxMass),
   fNbin(mfit.fNbin),
+  fParsSize(mfit.fParsSize),
+  fFitPars(0),
   fWithBkg(mfit.fWithBkg),
   ftypeOfFit4Bkg(mfit.ftypeOfFit4Bkg),
   ftypeOfFit4Sgn(mfit.ftypeOfFit4Sgn),
@@ -99,7 +108,20 @@ AliHFMassFitter::AliHFMassFitter(const AliHFMassFitter &mfit):
 
 {
   //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;
 }
 
 //_________________________________________________________________________
@@ -113,6 +135,7 @@ AliHFMassFitter& AliHFMassFitter::operator=(const AliHFMassFitter &mfit){
   fminMass= mfit.fminMass;
   fmaxMass= mfit.fmaxMass;
   fNbin= mfit.fNbin;
+  fParsSize= mfit.fParsSize;
   fWithBkg= mfit.fWithBkg;
   ftypeOfFit4Bkg= mfit.ftypeOfFit4Bkg;
   ftypeOfFit4Sgn= mfit.ftypeOfFit4Sgn;
@@ -121,10 +144,53 @@ AliHFMassFitter& AliHFMassFitter::operator=(const AliHFMassFitter &mfit){
   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];
+
+}
 
 //___________________________________________________________________________
 
@@ -517,17 +583,17 @@ void AliHFMassFitter::MassFitter(Bool_t draw){
     }
     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];
   }
 }
 
@@ -712,7 +778,7 @@ void AliHFMassFitter::Signal(Double_t nOfSigma,Double_t &signal,Double_t &errsig
   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;
@@ -753,7 +819,7 @@ void AliHFMassFitter::Background(Double_t nOfSigma,Double_t &background,Double_t
   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;
index 3668f57a1962f1e9698761c9e36a3817ef86b039..322c602bcd07685ae98ce999136d2758a44877d9 100644 (file)
@@ -26,28 +26,28 @@ class AliHFMassFitter : public TNamed {
  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;} 
@@ -70,11 +70,14 @@ class AliHFMassFitter : public TNamed {
 
  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
@@ -84,7 +87,7 @@ class AliHFMassFitter : public TNamed {
   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