]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONCalibParamNF.cxx
Fixing memory leak
[u/mrichter/AliRoot.git] / MUON / AliMUONCalibParamNF.cxx
index c5f3f7d2aac6c953f1c8a243487d554cd82f039f..72f332d1ba7223a7c1f72bdca982a9f74112ba14 100644 (file)
 #include "TMath.h"
 #include "TString.h"
 
-///
+#include <limits.h>
+
+//-----------------------------------------------------------------------------
 /// \class AliMUONCalibParamNF
 ///
 /// Handle the case of N floating point parameters per channel.
 ///
 /// \author Laurent Aphecetche
+//-----------------------------------------------------------------------------
 
 /// \cond CLASSIMP
 ClassImp(AliMUONCalibParamNF)
@@ -134,11 +137,20 @@ AliMUONCalibParamNF::Index(Int_t i, Int_t j) const
 
   if ( i >= 0 && i < Size() && j >= 0 && j < Dimension() )
   {
-    return i + Size()*j;
+    return IndexFast(i,j);
   }
   return -1;
 }
 
+//_____________________________________________________________________________
+Int_t
+AliMUONCalibParamNF::IndexFast(Int_t i, Int_t j) const
+{
+  /// Compute the 1D index of the internal storage from the pair (i,j)
+  
+  return i + Size()*j;
+}
+
 //_____________________________________________________________________________
 void
 AliMUONCalibParamNF::Print(Option_t* opt) const
@@ -207,6 +219,15 @@ AliMUONCalibParamNF::SetValueAsFloat(Int_t i, Int_t j, Float_t value)
   }
 }
 
+//_____________________________________________________________________________
+void
+AliMUONCalibParamNF::SetValueAsFloatFast(Int_t i, Int_t j, Float_t value)
+{
+  /// Set one value as a float, w/o checking that the indices are correct.
+  
+  fValues[IndexFast(i,j)] = value;
+}
+
 //_____________________________________________________________________________
 void
 AliMUONCalibParamNF::SetValueAsInt(Int_t i, Int_t j, Int_t value)
@@ -216,6 +237,15 @@ AliMUONCalibParamNF::SetValueAsInt(Int_t i, Int_t j, Int_t value)
   SetValueAsFloat(i,j,static_cast<Float_t>(value));
 }
 
+//_____________________________________________________________________________
+void
+AliMUONCalibParamNF::SetValueAsIntFast(Int_t i, Int_t j, Int_t value)
+{
+  /// Set one value as an int.
+  
+  SetValueAsFloatFast(i,j,static_cast<Float_t>(value));
+}
+
 //_____________________________________________________________________________
 Float_t
 AliMUONCalibParamNF::ValueAsFloat(Int_t i, Int_t j) const
@@ -236,6 +266,15 @@ AliMUONCalibParamNF::ValueAsFloat(Int_t i, Int_t j) const
   }
 }
 
+//_____________________________________________________________________________
+Float_t
+AliMUONCalibParamNF::ValueAsFloatFast(Int_t i, Int_t j) const
+{
+  /// Return the value as a float (which it is), after checking indices.
+  
+  return fValues[IndexFast(i,j)];
+}
+
 //_____________________________________________________________________________
 Int_t
 AliMUONCalibParamNF::ValueAsInt(Int_t i, Int_t j) const
@@ -243,5 +282,22 @@ AliMUONCalibParamNF::ValueAsInt(Int_t i, Int_t j) const
 /// Return the value as an int, by rounding the internal float value.
 
   Float_t v = ValueAsFloat(i,j);
+  
+  if ( v >= Float_t(INT_MAX) ) {
+    AliErrorStream() 
+      << "Cannot convert value " << v << " to Int_t." << endl;
+    return 0;
+  }  
+  
+  return TMath::Nint(v);
+}
+
+//_____________________________________________________________________________
+Int_t
+AliMUONCalibParamNF::ValueAsIntFast(Int_t i, Int_t j) const
+{
+  /// Return the value as an int, by rounding the internal float value.
+  
+  Float_t v = ValueAsFloatFast(i,j);
   return TMath::Nint(v);
 }