Index: trunk/MagicSoft/Mars/Changelog
===================================================================
--- trunk/MagicSoft/Mars/Changelog	(revision 2113)
+++ trunk/MagicSoft/Mars/Changelog	(revision 2114)
@@ -1,7 +1,35 @@
                                                  -*-*- END OF LINE -*-*-
+ 2003/05/13: Thomas Bretz
+
+   * mdata/MDataArray.[h,cc]:
+     - addeed GetData and >>-operator to fill a TVector from the array
+     
+   * manalysis/MMultiDimDistCalc.cc:
+     - use new >>-operator from MDataArray
+     
+   * mranforest/MRanForest.[h,cc]:
+     - TVector& in CalcHadronness declared const
+     - added a const qualifier to 'Float_t sum'
+     - removed Reset() from a TIter declaration (done by the TIter 
+       constructor)
+     
+   * mranforest/MRanForestCalc.cc:
+     - fill TVector with new >>-operator of MDataArray
+     
+   * mranforest/MRanTree.[h,cc]:
+     - removed obsolete returns at the end of some functions
+     - TVector& in TreeHad declared const
+     - changed if to ?:-operator in TreeHad
+     - TreeHad() calls TreeHad(const TVector &) now (code is not
+       implemented twice)
+
+
+
  2003/05/12: Abelardo Moralejo
 
    * mhistmc/MHMcEnergyMigration.cc
      - Draw(): fixed axis label in one plot.
+
+
 
  2003/05/12: Thomas Bretz
Index: trunk/MagicSoft/Mars/manalysis/MMultiDimDistCalc.cc
===================================================================
--- trunk/MagicSoft/Mars/manalysis/MMultiDimDistCalc.cc	(revision 2113)
+++ trunk/MagicSoft/Mars/manalysis/MMultiDimDistCalc.cc	(revision 2114)
@@ -172,18 +172,7 @@
 Bool_t MMultiDimDistCalc::Process()
 {
-    const Double_t ncols = fMGammas->GetM().GetNcols();
-
-    TVector event(ncols);
-
-    for (int i=0; i<fData->GetNumEntries(); i++)
-        event(i) = (*fData)(i);
-
-    /*
-    Int_t n=0;
-    TIter Next(fData);
-    MData *data = NULL;
-    while ((data=(MData*)Next()))
-        event(n++) = data->GetValue();
-        */
+    // first copy the data from the data array to a vector event
+    TVector event;
+    *fData >> event;
 
     Double_t numg = fNum;
Index: trunk/MagicSoft/Mars/mdata/MDataArray.cc
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataArray.cc	(revision 2113)
+++ trunk/MagicSoft/Mars/mdata/MDataArray.cc	(revision 2114)
@@ -35,4 +35,6 @@
 #include <fstream.h>
 
+#include <TVector.h>
+
 #include "MLog.h"
 #include "MLogManip.h"
@@ -89,7 +91,7 @@
 // Return the data value of the i-th entry
 //
-Double_t MDataArray::operator()(Int_t i)
-{
-    return ((MData*)fList[i])->GetValue();
+Double_t MDataArray::operator()(Int_t i) const
+{
+    return (*this)[i].GetValue();
 }
 
@@ -189,2 +191,13 @@
     return str;
 }
+
+void MDataArray::GetData(TVector &v) const
+{
+    Double_t ncols = GetNumEntries();
+
+    v.ResizeTo(ncols);
+
+    // same as: for (int i=0; i<ncols; i++) <should be faster>
+    while (ncols--)
+        v(ncols) = (*this)(ncols);
+}
Index: trunk/MagicSoft/Mars/mdata/MDataArray.h
===================================================================
--- trunk/MagicSoft/Mars/mdata/MDataArray.h	(revision 2113)
+++ trunk/MagicSoft/Mars/mdata/MDataArray.h	(revision 2114)
@@ -14,4 +14,6 @@
 #include <TObjArray.h>
 #endif
+
+class TVector;
 
 class MData;
@@ -31,5 +33,12 @@
 
     MData &operator[](Int_t i) const;
-    Double_t operator()(Int_t i);
+    Double_t operator()(Int_t i) const;
+
+    void GetData(TVector &v) const;
+
+    void operator>>(TVector &v) const
+    {
+        GetData(v);
+    }
 
     TString GetRule(int i) const;
Index: trunk/MagicSoft/Mars/mranforest/MRanForest.cc
===================================================================
--- trunk/MagicSoft/Mars/mranforest/MRanForest.cc	(revision 2113)
+++ trunk/MagicSoft/Mars/mranforest/MRanForest.cc	(revision 2114)
@@ -85,7 +85,5 @@
 void MRanForest::SetPriors(Float_t prior_had, Float_t prior_gam)
 {
-    Float_t sum;
-
-    sum=prior_gam+prior_had;
+    const Float_t sum=prior_gam+prior_had;
 
     prior_gam/=sum;
@@ -98,13 +96,12 @@
 }
 
-Double_t MRanForest::CalcHadroness(TVector &event)
+Double_t MRanForest::CalcHadroness(const TVector &event)
 {
     Double_t hadroness=0;
     Int_t ntree=0;
+
+    TIter forest(fForest);
+
     MRanTree *tree;
-
-    TIter forest(fForest);
-    forest.Reset();
-
     while ((tree=(MRanTree*)forest.Next()))
     {
Index: trunk/MagicSoft/Mars/mranforest/MRanForest.h
===================================================================
--- trunk/MagicSoft/Mars/mranforest/MRanForest.h	(revision 2113)
+++ trunk/MagicSoft/Mars/mranforest/MRanForest.h	(revision 2114)
@@ -96,5 +96,5 @@
  
     // use forest to calculate hadronness of event
-    Double_t CalcHadroness(TVector &event);
+    Double_t CalcHadroness(const TVector &event);
 
     Bool_t AsciiWrite(ostream &out) const;
Index: trunk/MagicSoft/Mars/mranforest/MRanForestCalc.cc
===================================================================
--- trunk/MagicSoft/Mars/mranforest/MRanForestCalc.cc	(revision 2113)
+++ trunk/MagicSoft/Mars/mranforest/MRanForestCalc.cc	(revision 2114)
@@ -137,9 +137,7 @@
 Bool_t MRanForestCalc::Process()
 {
-    const Double_t ncols = fData->GetNumEntries();
-    TVector event(ncols);
-
-    for (int i=0; i<fData->GetNumEntries(); i++)
-        event(i) = (*fData)(i);
+    // first copy the data from the data array to a vector event
+    TVector event;
+    *fData >> event;
 
     Double_t hadroness=fRanForest->CalcHadroness(event);
Index: trunk/MagicSoft/Mars/mranforest/MRanTree.cc
===================================================================
--- trunk/MagicSoft/Mars/mranforest/MRanTree.cc	(revision 2113)
+++ trunk/MagicSoft/Mars/mranforest/MRanTree.cc	(revision 2114)
@@ -178,5 +178,5 @@
     // (Gini-index as criterium crit)
 
-    critmax=-1.0e20;
+    critmax=-1.0e20;  // FIXME: Replace by a constant from limits.h
 
     // random split selection, number of trials = fNumTry
@@ -301,6 +301,4 @@
     for(Int_t n=ndstart;n<=ndend;n++)
         ncase[n]=datasort[msplit*numdata+n];
-
-    return;
 }
 
@@ -459,6 +457,4 @@
             fBestSplit[kn]/=(classpop[0*nrnodes+kn]+classpop[1*nrnodes+kn]);
         }
-
-    return;
 }
 
@@ -468,36 +464,6 @@
 }
 
-Double_t MRanTree::TreeHad(TVector &event)
-{
-    Int_t kt=0;
-    // to optimize on storage space node status and node class
-    // are coded into fBestVar:
-    // status of node kt = TMath::Sign(1,fBestVar[kt])
-    // hadronness assigned to node kt = fBestSplit[kt]
-
-    for (Int_t k=0;k<fNumNodes;k++)
-    {
-        if (fBestVar[kt]<0)
-            break;
-
-        Int_t m=fBestVar[kt];
-
-        if (event(m)<=fBestSplit[kt])
-            kt=fTreeMap1[kt];
-        else
-            kt=fTreeMap2[kt];
-    }
-
-    return fBestSplit[kt];
-}
-
-Double_t MRanTree::TreeHad()
-{
-    const Double_t ncols = fData->GetNumEntries();
-    TVector event(ncols);
-
-    for (int i=0; i<fData->GetNumEntries(); i++)
-        event(i) = (*fData)(i);
-
+Double_t MRanTree::TreeHad(const TVector &event)
+{
     Int_t kt=0;
     // to optimize on storage space node status and node class
@@ -513,14 +479,18 @@
             break;
 
-        Int_t m=fBestVar[kt];
-
-        if (event(m)<=fBestSplit[kt])
-            kt=fTreeMap1[kt];
-        else
-            kt=fTreeMap2[kt];
-
+        const Int_t m=fBestVar[kt];
+
+        kt = event(m)<=fBestSplit[kt] ? fTreeMap1[kt] : fTreeMap2[kt];
     }
 
     return fBestSplit[kt];
+}
+
+Double_t MRanTree::TreeHad()
+{
+    TVector event;
+    *fData >> event;
+
+    return TreeHad(event);
 }
 
Index: trunk/MagicSoft/Mars/mranforest/MRanTree.h
===================================================================
--- trunk/MagicSoft/Mars/mranforest/MRanTree.h	(revision 2113)
+++ trunk/MagicSoft/Mars/mranforest/MRanTree.h	(revision 2114)
@@ -81,5 +81,5 @@
                    TArrayF &wl,Int_t ninbag);
 
-    Double_t TreeHad(TVector &event);
+    Double_t TreeHad(const TVector &event);
     Double_t TreeHad();
 
