Index: trunk/MagicSoft/Mars/Changelog
===================================================================
--- trunk/MagicSoft/Mars/Changelog	(revision 2327)
+++ trunk/MagicSoft/Mars/Changelog	(revision 2328)
@@ -1,5 +1,24 @@
                                                  -*-*- END OF LINE -*-*-
 
+ 2003/09/10: Thomas Bretz
+ 
+   * mdata/MDataChain.[h,cc]:
+     - added log2, acosh, asinh, atanh, ceil, isnan and finite
+     - changed math.h callings to TMath:: namespace to be more
+       consistent
+       
+   * mhist/MHMatrix.[h,cc]:
+     - added RemoveInvalidRows member function to get rid of rows
+       containing invalid numbers (nan, inf)
+
+   * mraw/MRawEvtHeader.cc:
+     - fixed variable types calculating the time (ns, s, m and h)
+       to get rid of some compiler warnings, casting the values 
+       for-, back- and forward only wasts computing time.
+
+
+
  2003/09/08: Abelardo Moralejo
+
    * mhist/MHOnSubtraction.cc: 
      - added some casts in the arguments of function calls, to get rid 
@@ -8,4 +27,5 @@
        TH1D constructor of fSignificanceHist (number of bins and bin 
        limits).
+
    * mraw/MRawEvtHeader.cc:
      - Added casts to arguments of fTime->SetTime(h, m, s, ns) to get 
@@ -16,5 +36,8 @@
        with gcc2.96, abs() was not recognized.
 
+
+
  2003/09/07: Abelardo Moralejo
+
    * manalysis/MCerPhotCalc.cc:
      - removed normalization of array fWeight introduced on 30/06. For
@@ -44,4 +67,5 @@
        slice was wrong by 0.5 units... once more: please Thomas B, 
        be careful with these kind of changes.
+
 
 
Index: trunk/MagicSoft/Mars/mdata/MDataChain.cc
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataChain.cc	(revision 2327)
+++ trunk/MagicSoft/Mars/mdata/MDataChain.cc	(revision 2328)
@@ -58,4 +58,5 @@
 //   log(x)    natural logarithm of x
 //   pow10(x)  10^x
+//   log2(x)   logarithm of x to base two
 //   log10(x)  logarithm of x to base ten
 //   cos(x)    cosine of x
@@ -65,4 +66,7 @@
 //   sinh(x)   hyperbolic sine of x
 //   tanh(x)   hyperbolic tangent of x
+//   acosh(x)  arc hyperbolic cosine of x
+//   asinh(x)  arc hyperbolic sine of x
+//   atanh(x)  arc hyperbolic tangent of x
 //   acos(x)   arc cosine (inverse cosine) of x
 //   asin(x)   arc sine (inverse sine) of x
@@ -72,4 +76,5 @@
 //   abs(x)    absolute value of x, |x|
 //   floor(x)  round down to the nearest integer (floor(9.9)=9)
+//   ceil(x)   round up   to the nearest integer (floor(9.1)=10)
 //   r2d(x)    transform radians to degrees
 //   d2r(x)    transform degrees to radians
@@ -81,5 +86,12 @@
 //   randg(x)  returns gRandom->Gaus(0, x)
 //   randl(x)  returns gRandom->Landau(0, x)
-//
+//   isnan(x)  return 1 if x is NaN (Not a Number) otherwise 0
+//   finite(x) return 1 if the number is a valid double (not NaN, inf)
+//
+// NaN (Not a Number) means normally a number which is to small to be
+// stored in a floating point variable (eg. 0<x<1e-56 or similar) or
+// a number which function is not defined (like asin(1.5))
+//
+// inf is the symbol for an infinite number.
 //
 // Constants are implemented in ParseDataMember, namely:
@@ -110,5 +122,4 @@
 #include "MDataChain.h"
 
-#include <math.h>         // fabs on Alpha
 #include <ctype.h>        // isalnum, ...
 #include <stdlib.h>       // strtod, ...
@@ -236,33 +247,39 @@
     txt.ToLower();
 
-    if (txt=="abs")   return kEAbs;
-    if (txt=="fabs")  return kEAbs;
-    if (txt=="log")   return kELog;
-    if (txt=="log10") return kELog10;
-    if (txt=="sin")   return kESin;
-    if (txt=="cos")   return kECos;
-    if (txt=="tan")   return kETan;
-    if (txt=="sinh")  return kESinH;
-    if (txt=="cosh")  return kECosH;
-    if (txt=="tanh")  return kETanH;
-    if (txt=="asin")  return kEASin;
-    if (txt=="acos")  return kEACos;
-    if (txt=="atan")  return kEATan;
-    if (txt=="sqrt")  return kESqrt;
-    if (txt=="sqr")   return kESqr;
-    if (txt=="exp")   return kEExp;
-    if (txt=="pow10") return kEPow10;
-    if (txt=="sgn")   return kESgn;
-    if (txt=="floor") return kEFloor;
-    if (txt=="r2d")   return kERad2Deg;
-    if (txt=="d2r")   return kEDeg2Rad;
-    if (txt=="rand")  return kERandom;
-    if (txt=="randp") return kERandomP;
-    if (txt=="rande") return kERandomE;
-    if (txt=="randi") return kERandomI;
-    if (txt=="randg") return kERandomG;
-    if (txt=="randl") return kERandomL;
-    if (txt[0]=='-')  return kENegative;
-    if (txt[0]=='+')  return kEPositive;
+    if (txt=="abs")    return kEAbs;
+    if (txt=="fabs")   return kEAbs;
+    if (txt=="log")    return kELog;
+    if (txt=="log2")   return kELog2;
+    if (txt=="log10")  return kELog10;
+    if (txt=="sin")    return kESin;
+    if (txt=="cos")    return kECos;
+    if (txt=="tan")    return kETan;
+    if (txt=="sinh")   return kESinH;
+    if (txt=="cosh")   return kECosH;
+    if (txt=="tanh")   return kETanH;
+    if (txt=="asin")   return kEASin;
+    if (txt=="acos")   return kEACos;
+    if (txt=="atan")   return kEATan;
+    if (txt=="asinh")  return kEASinH;
+    if (txt=="acosh")  return kEACosH;
+    if (txt=="atanh")  return kEATanH;
+    if (txt=="sqrt")   return kESqrt;
+    if (txt=="sqr")    return kESqr;
+    if (txt=="exp")    return kEExp;
+    if (txt=="pow10")  return kEPow10;
+    if (txt=="sgn")    return kESgn;
+    if (txt=="floor")  return kEFloor;
+    if (txt=="r2d")    return kERad2Deg;
+    if (txt=="d2r")    return kEDeg2Rad;
+    if (txt=="rand")   return kERandom;
+    if (txt=="randp")  return kERandomP;
+    if (txt=="rande")  return kERandomE;
+    if (txt=="randi")  return kERandomI;
+    if (txt=="randg")  return kERandomG;
+    if (txt=="randl")  return kERandomL;
+    if (txt=="isnan")  return kEIsNaN;
+    if (txt=="finite") return kEFinite;
+    if (txt[0]=='-')   return kENegative;
+    if (txt[0]=='+')   return kEPositive;
 
     return kENoop;
@@ -523,24 +540,29 @@
     switch (fOperatorType)
     {
-    case kEAbs:      return fabs(val);
-    case kELog:      return log(val);
-    case kELog10:    return log10(val);
-    case kESin:      return sin(val);
-    case kECos:      return cos(val);
-    case kETan:      return tan(val);
-    case kESinH:     return sinh(val);
-    case kECosH:     return cosh(val);
-    case kETanH:     return tanh(val);
-    case kEASin:     return asin(val);
-    case kEACos:     return acos(val);
-    case kEATan:     return atan(val);
-    case kESqrt:     return sqrt(val);
+    case kEAbs:      return TMath::Abs(val);
+    case kELog:      return TMath::Log(val);
+    case kELog2:     return TMath::Log2(val);
+    case kELog10:    return TMath::Log10(val);
+    case kESin:      return TMath::Sin(val);
+    case kECos:      return TMath::Cos(val);
+    case kETan:      return TMath::Tan(val);
+    case kESinH:     return TMath::SinH(val);
+    case kECosH:     return TMath::CosH(val);
+    case kETanH:     return TMath::TanH(val);
+    case kEASin:     return TMath::ASin(val);
+    case kEACos:     return TMath::ACos(val);
+    case kEATan:     return TMath::ATan(val);
+    case kEASinH:    return TMath::ASinH(val);
+    case kEACosH:    return TMath::ACosH(val);
+    case kEATanH:    return TMath::ATanH(val);
+    case kESqrt:     return TMath::Sqrt(val);
     case kESqr:      return val*val;
-    case kEExp:      return exp(val);
-    case kEPow10:    return pow(10, val);
+    case kEExp:      return TMath::Exp(val);
+    case kEPow10:    return TMath::Power(10, val);
     case kESgn:      return val<0 ? -1 : 1;
     case kENegative: return -val;
     case kEPositive: return val;
-    case kEFloor:    return floor(val);
+    case kEFloor:    return TMath::Floor(val);
+    case kECeil:     return TMath::Ceil(val);
     case kERad2Deg:  return val*180/TMath::Pi();
     case kEDeg2Rad:  return val*TMath::Pi()/180;
@@ -551,4 +573,6 @@
     case kERandomG:  return gRandom ? gRandom->Gaus(0, val)   : 0;
     case kERandomL:  return gRandom ? gRandom->Landau(0, val) : 0;
+    case kEIsNaN:    return TMath::IsNaN(val);
+    case kEFinite:   return TMath::Finite(val);
     case kENoop:     return val;
     }
@@ -615,32 +639,39 @@
     switch (fOperatorType)
     {
-    case kEAbs:      str += "abs"  ; break;
-    case kELog:      str += "log"  ; break;
-    case kELog10:    str += "log10"; break;
-    case kESin:      str += "sin"  ; break;
-    case kECos:      str += "cos"  ; break;
-    case kETan:      str += "tan"  ; break;
-    case kESinH:     str += "sinh" ; break;
-    case kECosH:     str += "cosh" ; break;
-    case kETanH:     str += "tanh" ; break;
-    case kEASin:     str += "asin" ; break;
-    case kEACos:     str += "acos" ; break;
-    case kEATan:     str += "atan" ; break;
-    case kESqrt:     str += "sqrt" ; break;
-    case kESqr:      str += "sqr"  ; break;
-    case kEExp:      str += "exp"  ; break;
-    case kEPow10:    str += "pow10"; break;
-    case kESgn:      str += "sgn"  ; break;
-    case kENegative: str += "-"    ; break;
-    case kEPositive: str += "+"    ; break;
-    case kEFloor:    str += "floor"; break;
-    case kERad2Deg:  str += "r2d"  ; break;
-    case kEDeg2Rad:  str += "d2r"  ; break;
-    case kERandom:   str += "rand" ; break;
-    case kERandomP:  str += "randp"; break;
-    case kERandomE:  str += "rande"; break;
-    case kERandomI:  str += "randi"; break;
-    case kERandomG:  str += "randg"; break;
-    case kERandomL:  str += "randl"; break;
+    case kEAbs:      str += "abs"   ; break;
+    case kELog:      str += "log"   ; break;
+    case kELog2:     str += "log2"  ; break;
+    case kELog10:    str += "log10" ; break;
+    case kESin:      str += "sin"   ; break;
+    case kECos:      str += "cos"   ; break;
+    case kETan:      str += "tan"   ; break;
+    case kESinH:     str += "sinh"  ; break;
+    case kECosH:     str += "cosh"  ; break;
+    case kETanH:     str += "tanh"  ; break;
+    case kEASin:     str += "asin"  ; break;
+    case kEACos:     str += "acos"  ; break;
+    case kEATan:     str += "atan"  ; break;
+    case kEASinH:    str += "asinh" ; break;
+    case kEACosH:    str += "acosh" ; break;
+    case kEATanH:    str += "atanh" ; break;
+    case kESqrt:     str += "sqrt"  ; break;
+    case kESqr:      str += "sqr"   ; break;
+    case kEExp:      str += "exp"   ; break;
+    case kEPow10:    str += "pow10" ; break;
+    case kESgn:      str += "sgn"   ; break;
+    case kENegative: str += "-"     ; break;
+    case kEPositive: str += "+"     ; break;
+    case kEFloor:    str += "floor" ; break;
+    case kECeil:     str += "ceil"  ; break;
+    case kERad2Deg:  str += "r2d"   ; break;
+    case kEDeg2Rad:  str += "d2r"   ; break;
+    case kERandom:   str += "rand"  ; break;
+    case kERandomP:  str += "randp" ; break;
+    case kERandomE:  str += "rande" ; break;
+    case kERandomI:  str += "randi" ; break;
+    case kERandomG:  str += "randg" ; break;
+    case kERandomL:  str += "randl" ; break;
+    case kEIsNaN:    str += "isnan" ; break;
+    case kEFinite:   str += "finite"; break;
     case kENoop:
         break;
Index: trunk/MagicSoft/Mars/mdata/MDataChain.h
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataChain.h	(revision 2327)
+++ trunk/MagicSoft/Mars/mdata/MDataChain.h	(revision 2328)
@@ -19,34 +19,20 @@
     MData *fMember; // Filter
 
+    // PLEASE, always add new enums to the end of the enumeration,
+    // otherwise you would break loading old data chains...
     typedef enum {
         kENoop,
-        kELog10,
-        kELog,
+        kELog, kELog2, kELog10,
         kEAbs,
-        kESin,
-        kECos,
-        kETan,
-        kESinH,
-        kECosH,
-        kETanH,
-        kEASin,
-        kEACos,
-        kEATan,
-        kESqrt,
-        kESqr,
-        kEPow10,
-        kEExp,
+        kESin, kECos, kETan, kESinH, kECosH, kETanH,
+        kEASin, kEACos, kEATan, kEASinH, kEACosH, kEATanH,
+        kESqrt, kESqr, kEPow10, kEExp,
         kESgn,
         kEPositive,
         kENegative,
-        kEFloor,
-        kERad2Deg,
-        kEDeg2Rad,
-        kERandom,
-        kERandomP,
-        kERandomE,
-        kERandomI,
-        kERandomG,
-        kERandomL
+        kEFloor, kECeil,
+        kERad2Deg, kEDeg2Rad, kERandom,
+        kERandomP, kERandomE, kERandomI, kERandomG, kERandomL,
+        kEIsNaN, kEFinite
     } OperatorType_t;
 
Index: trunk/MagicSoft/Mars/mhist/MHMatrix.cc
===================================================================
--- trunk/MagicSoft/Mars/mhist/MHMatrix.cc	(revision 2327)
+++ trunk/MagicSoft/Mars/mhist/MHMatrix.cc	(revision 2328)
@@ -1120,4 +1120,9 @@
 }
 
+// --------------------------------------------------------------------------
+//
+// Reduces the number of rows to the given number num by cutting out the
+// last rows.
+//
 void MHMatrix::ReduceRows(UInt_t num)
 {
@@ -1135,2 +1140,37 @@
         TMatrixRow(fM, irow) = tmp = TMatrixRow(m, irow);
 }
+
+// --------------------------------------------------------------------------
+//
+// Remove rows which contains numbers not fullfilling TMath::Finite
+//
+Bool_t MHMatrix::RemoveInvalidRows()
+{
+    TMatrix m(fM);
+
+    const Int_t ncol=fM.GetNcols();
+    TVector vold(ncol);
+    int irow=0;
+
+    for (int i=0; i<m.GetNrows(); i++)
+    {
+        const TMatrixRow &row = TMatrixRow(m, i);
+
+        // finite (-> math.h) checks for NaN as well as inf
+        int jcol;
+        for (jcol=0; jcol<ncol; jcol++)
+            if (!TMath::Finite(vold(jcol)))
+                break;
+
+        if (jcol==ncol)
+            TMatrixRow(fM, irow++) = vold = row;
+        else
+            *fLog << warn << "Warning - MHMatrix::RemoveInvalidRows: row #" << i<< " removed." << endl;
+    }
+
+    // Do not use ResizeTo (in older root versions this doesn't save the contents
+    ReduceRows(irow);
+
+    return kTRUE;
+}
+
Index: trunk/MagicSoft/Mars/mhist/MHMatrix.h
===================================================================
--- trunk/MagicSoft/Mars/mhist/MHMatrix.h	(revision 2327)
+++ trunk/MagicSoft/Mars/mhist/MHMatrix.h	(revision 2328)
@@ -103,4 +103,5 @@
 
     void ReduceNumberOfRows(UInt_t numrows, const TString opt);
+    Bool_t RemoveInvalidRows();
 
     Int_t Read(const char *name);
Index: trunk/MagicSoft/Mars/mraw/MRawEvtHeader.cc
===================================================================
--- trunk/MagicSoft/Mars/mraw/MRawEvtHeader.cc	(revision 2327)
+++ trunk/MagicSoft/Mars/mraw/MRawEvtHeader.cc	(revision 2328)
@@ -247,10 +247,10 @@
     const Double_t mhz = 9.375;                          // [1e6 ticks/s]
     const Double_t t   = (Double_t)fAbsTime[0]/mhz*1e-3; // [ns]
-    const Double_t ns  = (UShort_t)fmod(t, 1e9);
-    const Double_t s   = (Byte_t)fmod(t/1e9, 60);
-    const Double_t m   = (Byte_t)fmod(t/60e9, 60);
-    const Double_t h   = (Byte_t)(t/3600e9);
-
-    fTime->SetTime((Byte_t)h, (Byte_t)m, (Byte_t)s, (UShort_t)ns);
+    const UShort_t ns  = (UShort_t)fmod(t, 1e9);
+    const Byte_t s     = (Byte_t)fmod(t/1e9, 60);
+    const Byte_t m     = (Byte_t)fmod(t/60e9, 60);
+    const Byte_t h     = (Byte_t)(t/3600e9);
+
+    fTime->SetTime(h, m, s, ns);
     fTime->SetTime(fAbsTime[0], fAbsTime[1]);
 
