]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STAT/AliTMinuitToolkit.cxx
1st draft for pass0
[u/mrichter/AliRoot.git] / STAT / AliTMinuitToolkit.cxx
index bc2d2c73791bca97b2db8856c7ac0b2f1aa78642..7cbf0f2ff42bd99608079938786343601b076dd8 100644 (file)
@@ -1,19 +1,34 @@
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
 
-#include "AliTMinuitToolkit.h"
-#include <TNamed.h>
-#include <TVirtualFitter.h>
-#include <TH1F.h>
-#include <TH2F.h>
+/* $Id$ */
+
+#include <TCanvas.h>
 #include <TF1.h>
 #include <TFormula.h>
-#include <TVector.h>
-#include <TMatrix.h>
+#include <TH1F.h>
+#include <TH2F.h>
 #include <TMath.h>
-#include <TString.h>
-#include <TROOT.h>
-#include <TCanvas.h>
+#include <TMatrix.h>
 #include <TRandom.h>
+#include <TString.h>
+#include <TVector.h>
+#include <TVectorD.h>
+#include <TVirtualFitter.h>
 
+#include "AliTMinuitToolkit.h"
 
 //--------------------------------------------------------------------------------------
 //
@@ -24,6 +39,9 @@
 //   (TH2F::Fit() only allows to fit a hyperplane).
 // - Or n points can be specified directly via a n x 2 matrix.
 // - An option for robust fitting with non-linear functions is implemented.
+//
+// A small example illustrating the usage of AliTMinuitToolkit is given in the function 
+// "AliTMinuitToolkit::Test()".
 // 
 // 
 // 1. Setting the formula:
@@ -109,7 +127,7 @@ AliTMinuitToolkit::AliTMinuitToolkit() :
    TNamed(),
    fFormula(0),
    fWeightFunction(0),
-   fFitAlgorithm(0),
+   fFitAlgorithm(""),
    fPoints(0),
    fWeights(0),
    fParam(0),
@@ -135,7 +153,7 @@ AliTMinuitToolkit::AliTMinuitToolkit(const AliTMinuitToolkit&) :
    TNamed(),
    fFormula(0),
    fWeightFunction(0),
-   fFitAlgorithm(0),
+   fFitAlgorithm(""),
    fPoints(0),
    fWeights(0),
    fParam(0),
@@ -173,7 +191,7 @@ AliTMinuitToolkit::~AliTMinuitToolkit(){
   delete fChi2;
 }
 
-void AliTMinuitToolkit::FitHistogram(TH1F * his) {
+void AliTMinuitToolkit::FitHistogram(TH1F *const his) {
  //
  // Fit a one dimensional histogram
  //
@@ -191,7 +209,7 @@ void AliTMinuitToolkit::FitHistogram(TH1F * his) {
 }
 
 
-void AliTMinuitToolkit::FitHistogram(TH2F * his) {
+void AliTMinuitToolkit::FitHistogram(TH2F *const his) {
  //
  // Fit a curve to a two dimensional histogram
  //
@@ -216,7 +234,7 @@ void AliTMinuitToolkit::FitHistogram(TH2F * his) {
 }
 
 
-void AliTMinuitToolkit::SetWeightFunction(Char_t * name, Float_t param1, Float_t param2) {
+void AliTMinuitToolkit::SetWeightFunction(const Char_t *name, Float_t param1, Float_t param2) {
  //
  // Set the weight function which must be defined on the interval [0,1].
  //
@@ -307,7 +325,7 @@ void AliTMinuitToolkit::Fit() {
   }
   
   // migrad fit algorithm as default
-  if (fFitAlgorithm == 0) {
+  if (fFitAlgorithm == "") {
    fFitAlgorithm = "migrad";
   }
   
@@ -367,8 +385,8 @@ void AliTMinuitToolkit::Fit() {
    if (fMaxCalls != 500 || fPrecision != 1) minuit->ExecuteCommand(fFitAlgorithm, argList, 2);
    fUseRobust = true;
    
-   delete sortList; 
-   delete indexList;    
+   delete [] sortList; 
+   delete [] indexList;    
   }
   
   // fill parameter vector
@@ -395,15 +413,8 @@ void AliTMinuitToolkit::Test() {
  // This test function shows the basic working principles of this class 
  // and illustrates how a robust fit can improve the results
  //
- TFormula *FormExp = new TFormula("formExp", "[0]*TMath::Exp(-[1]*x)");
- SetFitFunction(FormExp);
- SetFitAlgorithm("migrad");
- // Set initial values
- TVectorD *vec1 = new TVectorD(2);
- (*vec1)(0) = 1800;
- (*vec1)(1) = 1;
- SetInitialParam(vec1);
- //provide some example histogram
+ // 1. provide some example histogram
  TH1F * hist = new TH1F("test", "with (red) and without (black) robust option", 20,0,4);
  TRandom * rand = new TRandom();
  for (Int_t i = 0; i < 10000; i++) {
@@ -418,25 +429,32 @@ void AliTMinuitToolkit::Test() {
  canv->cd(1);
  hist->Draw();
  
- // 1. fit it with the exponential decay - no robust
- FitHistogram(hist);
+ // 2. example fit without robust option
+ AliTMinuitToolkit * tool = new AliTMinuitToolkit();
+ TFormula *aFormExp = new TFormula("formExp", "[0]*TMath::Exp(-[1]*x)");
+ tool->SetFitFunction(aFormExp);
+ TVectorD *vec1 = new TVectorD(2); // Set initial values
+ (*vec1)(0) = 1800;
+ (*vec1)(1) = 1;
+ tool->SetInitialParam(vec1);
+ tool->FitHistogram(hist);
  // draw fit function
  TF1 *func = new TF1("test", "[0]*TMath::Exp(-[1]*x)", 0, 6);
- func->SetParameter(0, (*GetParameters())(0));
- func->SetParameter(1, (*GetParameters())(1));
+ func->SetParameters((*tool->GetParameters())(0), (*tool->GetParameters())(1));
  func->Draw("same");
  
- // 2 . robust fit 
+ // 3 . robust fit 
  TVectorD *vec2 = new TVectorD(2);
  (*vec2)(0) = 1800;
  (*vec2)(1) = 1;
- SetInitialParam(vec2);
- EnableRobust(true, 10);
- SetWeightFunction("box", 0.75);
- FitHistogram(hist);
tool->SetInitialParam(vec2);
tool->EnableRobust(true, 10);
tool->SetWeightFunction("box", 0.75);
tool->FitHistogram(hist);
  TF1 *func2 = new TF1("test2", "[0]*TMath::Exp(-[1]*x)", 0, 6);
- func2->SetParameter(0, (*GetParameters())(0));
- func2->SetParameter(1, (*GetParameters())(1));
+ func2->SetParameter(0, (*tool->GetParameters())(0));
+ func2->SetParameter(1, (*tool->GetParameters())(1));
  func2->SetLineColor(kRed);
  func2->Draw("same");