]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STAT/TStatToolkit.cxx
Always delete TObjArrays created by TString::Tokenize (Ruben)
[u/mrichter/AliRoot.git] / STAT / TStatToolkit.cxx
index 1fb67062b0e109a2cd3e0134c30d5338e144055c..2ea78cb4f54adedecfa36562f192b18bae04047e 100644 (file)
@@ -32,6 +32,7 @@
 #include "TLinearFitter.h"
 #include "TGraph2D.h"
 #include "TGraph.h"
+#include "TGraphErrors.h"
 
 //
 // includes neccessary for test functions
@@ -97,7 +98,7 @@ void TStatToolkit::EvaluateUni(Int_t nvectors, Double_t *data, Double_t &mean
   }
   
   Double_t norm = 1./Double_t(hh);
-  Double_t norm2 = 1./Double_t(hh-1);
+  Double_t norm2 = (hh-1)>0 ? 1./Double_t(hh-1):1;
   for (Int_t i=hh; i<nvectors; i++){
     Double_t cmean  = sumx*norm;
     Double_t csigma = (sumx2 - hh*cmean*cmean)*norm2;
@@ -755,6 +756,7 @@ TString* TStatToolkit::FitPlane(TTree *tree, const char* drawCommand, const char
      TObjArray* valTokens = strVal.Tokenize(":");
      drawStr = valTokens->At(0)->GetName();
      ferr       = valTokens->At(1)->GetName();     
+     delete valTokens;
    }
 
       
@@ -770,11 +772,16 @@ TString* TStatToolkit::FitPlane(TTree *tree, const char* drawCommand, const char
    fitter->ClearPoints();
    
    Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(), "goff",  stop-start, start);
-   if (entries == -1) return new TString("An ERROR has occured during fitting!");
-   Double_t **values = new Double_t*[dim+1] ; 
+   if (entries == -1) {
+     delete formulaTokens;
+     return new TString("An ERROR has occured during fitting!");
+   }
+   Double_t **values = new Double_t*[dim+1] ;
+   for (Int_t i=0; i<dim+1; i++) values[i]=NULL; 
    //
    entries = tree->Draw(ferr.Data(), cutStr.Data(), "goff",  stop-start, start);
    if (entries == -1) {
+     delete formulaTokens;
      delete []values;
      return new TString("An ERROR has occured during fitting!");
    }
@@ -851,6 +858,7 @@ TString* TStatToolkit::FitPlaneConstrain(TTree *tree, const char* drawCommand, c
      TObjArray* valTokens = strVal.Tokenize(":");
      drawStr = valTokens->At(0)->GetName();
      ferr       = valTokens->At(1)->GetName();     
+     delete valTokens;
    }
 
       
@@ -866,11 +874,16 @@ TString* TStatToolkit::FitPlaneConstrain(TTree *tree, const char* drawCommand, c
    fitter->ClearPoints();
    
    Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(), "goff",  stop-start, start);
-   if (entries == -1) return new TString("An ERROR has occured during fitting!");
+   if (entries == -1) {
+     delete formulaTokens;
+     return new TString("An ERROR has occured during fitting!");
+   }
    Double_t **values = new Double_t*[dim+1] ; 
+   for (Int_t i=0; i<dim+1; i++) values[i]=NULL; 
    //
    entries = tree->Draw(ferr.Data(), cutStr.Data(), "goff",  stop-start, start);
    if (entries == -1) {
+     delete formulaTokens;
      delete [] values;
      return new TString("An ERROR has occured during fitting!");
    }
@@ -885,6 +898,7 @@ TString* TStatToolkit::FitPlaneConstrain(TTree *tree, const char* drawCommand, c
       if (entries != centries) {
        delete []errors;
        delete []values;
+       delete formulaTokens;
        return new TString("An ERROR has occured during fitting!");
       }
       values[i] = new Double_t[entries];
@@ -953,7 +967,8 @@ TString* TStatToolkit::FitPlaneFixed(TTree *tree, const char* drawCommand, const
    if (strVal.Contains(":")){
      TObjArray* valTokens = strVal.Tokenize(":");
      drawStr = valTokens->At(0)->GetName();
-     ferr       = valTokens->At(1)->GetName();     
+     ferr       = valTokens->At(1)->GetName();
+     delete valTokens;
    }
 
       
@@ -970,12 +985,17 @@ TString* TStatToolkit::FitPlaneFixed(TTree *tree, const char* drawCommand, const
    fitter->ClearPoints();
    
    Int_t entries = tree->Draw(drawStr.Data(), cutStr.Data(), "goff",  stop-start, start);
-   if (entries == -1) return new TString("An ERROR has occured during fitting!");
+   if (entries == -1) {
+     delete formulaTokens;
+     return new TString("An ERROR has occured during fitting!");
+   }
    Double_t **values = new Double_t*[dim+1] ; 
+   for (Int_t i=0; i<dim+1; i++) values[i]=NULL; 
    //
    entries = tree->Draw(ferr.Data(), cutStr.Data(), "goff",  stop-start, start);
    if (entries == -1) {
      delete []values;
+     delete formulaTokens;
      return new TString("An ERROR has occured during fitting!");
    }
    Double_t *errors = new Double_t[entries];
@@ -989,6 +1009,7 @@ TString* TStatToolkit::FitPlaneFixed(TTree *tree, const char* drawCommand, const
       if (entries != centries) {
        delete []errors;
        delete []values;
+       delete formulaTokens;
        return new TString("An ERROR has occured during fitting!");
       }
       values[i] = new Double_t[entries];
@@ -1051,6 +1072,8 @@ Int_t TStatToolkit::GetFitIndex(const TString fString, const TString subString){
     }
     if (isOK) index=i;
   }
+  delete arrFit;
+  delete arrSub;
   return index;
 }
 
@@ -1076,6 +1099,8 @@ TString  TStatToolkit::FilterFit(const TString &input, const TString filter, TVe
     }
   }
   result+="-0.)";
+  delete array0;
+  delete array1;
   return result;
 }
 
@@ -1163,6 +1188,8 @@ void   TStatToolkit::Constrain1D(const TString &input, const TString filter, TVe
   for (Int_t i=0; i<=array0->GetEntries(); i++){
     param(i)=paramM(i,0);
   }
+  delete array0;
+  delete array1;
 }
 
 TString  TStatToolkit::MakeFitString(const TString &input, const TVectorD &param, const TMatrixD & covar, Bool_t verbose){
@@ -1179,19 +1206,29 @@ TString  TStatToolkit::MakeFitString(const TString &input, const TVectorD &param
     if (verbose) printf("%f\t%f\t%s\n", param[i+1], TMath::Sqrt(covar(i+1,i+1)),str.Data());    
   }
   result+="-0.)";
+  delete array0;
   return result;
 }
 
 
-TGraph * TStatToolkit::MakeGraphSparse(TTree * tree, const char * expr, const char * cut){
+TGraph * TStatToolkit::MakeGraphSparse(TTree * tree, const char * expr, const char * cut, Int_t mstyle, Int_t mcolor, Float_t msize){
   //
   // Make a sparse draw of the variables
-  //
+  // Writen by Weilin.Yu
   const Int_t entries =  tree->Draw(expr,cut,"goff");
+  if (entries<=0) {
+    TStatToolkit t;
+    t.Error("TStatToolkit::MakeGraphSparse",Form("Empty or Not valid expression (%s) or cut *%s)", expr,cut));
+    return 0;
+  }
   //  TGraph * graph = (TGraph*)gPad->GetPrimitive("Graph"); // 2D
-  TGraph * graph = new TGraph (entries, tree->GetV2(),tree->GetV1());
+  TGraph * graph = 0;
+  if (tree->GetV3()) graph = new TGraphErrors (entries, tree->GetV2(),tree->GetV1(),0,tree->GetV3());
+  graph =  new TGraphErrors (entries, tree->GetV2(),tree->GetV1(),0,0);
+  graph->SetMarkerStyle(mstyle); 
+  graph->SetMarkerColor(mcolor);
   //
-  Int_t *index = new Int_t[entries];
+  Int_t *index = new Int_t[entries*4];
   TMath::Sort(entries,graph->GetX(),index,kFALSE);
   
   Double_t *tempArray = new Double_t[entries];
@@ -1219,7 +1256,10 @@ TGraph * TStatToolkit::MakeGraphSparse(TTree * tree, const char * expr, const ch
     newBins[i] = i;
   }
   
-  TGraph *graphNew = new TGraph(entries,tempArray,graph->GetY());
+  TGraph *graphNew = 0;
+  if (tree->GetV3()) graphNew = new TGraphErrors(entries,tempArray,graph->GetY(),0,tree->GetV3());
+  else
+    graphNew = new TGraphErrors(entries,tempArray,graph->GetY(),0,0);
   graphNew->GetXaxis()->Set(newNbins,newBins);
   
   Char_t xName[50];
@@ -1228,7 +1268,9 @@ TGraph * TStatToolkit::MakeGraphSparse(TTree * tree, const char * expr, const ch
     graphNew->GetXaxis()->SetBinLabel(i+1,xName);
   }
   graphNew->GetHistogram()->SetTitle("");
-  
+  graphNew->SetMarkerStyle(mstyle); 
+  graphNew->SetMarkerColor(mcolor);
+  if (msize>0) graphNew->SetMarkerSize(msize);
   delete [] tempArray;
   delete [] index;
   delete [] newBins;