Index: /trunk/MagicSoft/Mars/Changelog
===================================================================
--- /trunk/MagicSoft/Mars/Changelog	(revision 1352)
+++ /trunk/MagicSoft/Mars/Changelog	(revision 1353)
@@ -1,7 +1,41 @@
                                                                   -*-*- END -*-*-
+ 2002/06/10: Thomas Bretz
+
+   * manalysis/MHillas.cc:
+     - changed atan2 to atan for fDelta
+
+   * mbase/MAGIC.h, mbase/BaseLinkDef.h:
+     - changed definitions for Particle Id to enum
+
+   * mbase/MGList.cc:
+     - IsA()->InheritsFrom() replaced with InheritsFrom()
+
+   * mbase/MWriteAsciiFile.cc:
+     - IsA()->InheritsFrom() replaced with InheritsFrom()
+     - removed some debug outputs
+
+   * mbase/MDataChain.[h,cc]:
+     - implemented sign '-'
+
+   * mhist/MH.h:
+     - changed default canvas size to 580x435
+
+   * mhist/MHHadroness.cc:
+     - added some more output to Print
+
+   * mhist/MHMatrix.h:
+     - changed some i,j to x,y
+     - removed fabs from distance calculation
+     - added sqrt to distance calculation
+
+   * mmc/MMcEvt.cxx:
+     - changed output of Print
+
+
+
  2002/06/06: Thomas Bretz
 
-   * manalysis/MHillas.cc:
-     - changed atan2 to atan
+   * manalysis/MHillasSrc.cc:
+     - changed atan2 to atan for fAlpha
 
 
Index: /trunk/MagicSoft/Mars/macros/plot.C
===================================================================
--- /trunk/MagicSoft/Mars/macros/plot.C	(revision 1353)
+++ /trunk/MagicSoft/Mars/macros/plot.C	(revision 1353)
@@ -0,0 +1,115 @@
+/* ======================================================================== *\
+!
+! *
+! * This file is part of MARS, the MAGIC Analysis and Reconstruction
+! * Software. It is distributed to you in the hope that it can be a useful
+! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
+! * It is distributed WITHOUT ANY WARRANTY.
+! *
+! * Permission to use, copy, modify and distribute this software and its
+! * documentation for any purpose is hereby granted without fee,
+! * provided that the above copyright notice appear in all copies and
+! * that both that copyright notice and this permission notice appear
+! * in supporting documentation. It is provided "as is" without express
+! * or implied warranty.
+! *
+!
+!
+!   Author(s): Thomas Bretz, 5/2002 <mailto:tbretz@astro.uni-wuerzburg.de>
+!   Author(s): Rudy Bock, 5/2002 <mailto:rkb@mppmu.mpg.de>
+!
+!   Copyright: MAGIC Software Development, 2000-2002
+!
+!
+\* ======================================================================== */
+
+void plot()
+{
+    //
+    // This is a demonstration program which calculates the Hillas
+    // parameter out of a Magic root file.
+
+    //
+    // Create a empty Parameter List and an empty Task List
+    // The tasklist is identified in the eventloop by its name
+    //
+    MParList  plist;
+
+    MTaskList tlist;
+    plist.AddToList(&tlist);
+
+    //
+    // Now setup the tasks and tasklist:
+    // ---------------------------------
+    //
+    // The first argument is the tree you want to read.
+    //   Events:     Cosmic ray events
+    //   PedEvents:  Pedestal Events
+    //   CalEvents:  Calibration Events
+    //
+    MReadMarsFile  read("Events", "star.root");
+    read.DisableAutoScheme();
+    tlist.AddToList(&read);
+
+    MFParticleId fgamma("MMcEvt", '=', kGAMMA);
+    tlist.AddToList(&fgamma);
+
+    MFParticleId fhadrons("MMcEvt", '!', kGAMMA);
+    tlist.AddToList(&fhadrons);
+
+    // -------------------------------------------------------
+    //
+    // set the name of the variable to plot and the binning
+    //
+    TString var("MHillas.fSize");
+
+    MBinning bins("BinningMH3X");
+    bins.SetEdgesLog(50, 100, 20000);
+    //
+    // -------------------------------------------------
+
+    MH3 h3g(var);
+    MH3 h3h(var);
+
+    plist.AddToList(&h3g);
+    plist.AddToList(&h3h);
+
+    plist.AddToList(&bins);
+
+    MFillH fillg(&h3g);
+    fillg.SetFilter(&fgamma);
+    tlist.AddToList(&fillg);
+
+    MFillH fillh(&h3h);
+    fillh.SetFilter(&fhadrons);
+    tlist.AddToList(&fillh);
+
+    //
+    // Create and setup the eventloop
+    //
+    MEvtLoop evtloop;
+    evtloop.SetParList(&plist);
+
+    //
+    // Execute your analysis
+    //
+    if (!evtloop.Eventloop())
+        return;
+
+    tlist.PrintStatistics();
+
+    MH::MakeDefCanvas("Plot");
+    h3h.GetHist().SetLineColor(kRed);
+    h3h.GetHist().SetFillStyle(4000);
+    h3g.GetHist().DrawCopy();
+    h3h.GetHist().DrawCopy("same");
+
+    TH1D h;
+    MH::SetBinning(&h, &bins);
+    h.Divide(&h3g.GetHist(), &h3h.GetHist());
+    h.SetLineColor(kGreen);
+    h.SetFillStyle(4000);
+    h.DrawCopy("same");
+
+    gPad->SetLogx();
+}
Index: /trunk/MagicSoft/Mars/manalysis/MHillas.cc
===================================================================
--- /trunk/MagicSoft/Mars/manalysis/MHillas.cc	(revision 1352)
+++ /trunk/MagicSoft/Mars/manalysis/MHillas.cc	(revision 1353)
@@ -281,7 +281,7 @@
     // -------------------------------------------------------------------
     //
-    const float d = corryy - corrxx;
-
-    fDelta = atan2(d + sqrt(d*d + corrxy*corrxy*4), corrxy*2);
+    const float d = (corryy - corrxx)/(corrxy*2);
+
+    fDelta = atan(d + sqrt(d*d + 1));
 
     fCosDelta = cos(fDelta);   // need these in derived classes
Index: /trunk/MagicSoft/Mars/mbase/BaseLinkDef.h
===================================================================
--- /trunk/MagicSoft/Mars/mbase/BaseLinkDef.h	(revision 1352)
+++ /trunk/MagicSoft/Mars/mbase/BaseLinkDef.h	(revision 1353)
@@ -5,10 +5,7 @@
 #pragma link off all functions;
 
+#pragma link C++ enum ParticleId_t;
+
 #pragma link C++ global kCONTINUE;
-#pragma link C++ global kGAMMA;
-#pragma link C++ global kPROTON;
-#pragma link C++ global kHELIUM;
-#pragma link C++ global kOXIGEN;
-#pragma link C++ global kIRON;
 #pragma link C++ global kPI;
 #pragma link C++ global kRad2Deg;
Index: /trunk/MagicSoft/Mars/mbase/MAGIC.h
===================================================================
--- /trunk/MagicSoft/Mars/mbase/MAGIC.h	(revision 1352)
+++ /trunk/MagicSoft/Mars/mbase/MAGIC.h	(revision 1353)
@@ -22,9 +22,12 @@
 //     ParticleId for Monte Carlo simulation
 //
-const Int_t kGAMMA  =    1;
-const Int_t kPROTON =   14;
-const Int_t kHELIUM =  402;
-const Int_t kOXIGEN = 1608;
-const Int_t kIRON   = 5626;
+typedef enum
+{
+    kGAMMA  =    1,
+    kPROTON =   14,
+    kHELIUM =  402,
+    kOXYGEN = 1608,
+    kIRON   = 5626
+} ParticleId_t;
 
 const Double_t kPI      = 3.1415926535897932384626433832795028841971693993751;
Index: /trunk/MagicSoft/Mars/mbase/MGList.cc
===================================================================
--- /trunk/MagicSoft/Mars/mbase/MGList.cc	(revision 1352)
+++ /trunk/MagicSoft/Mars/mbase/MGList.cc	(revision 1353)
@@ -99,5 +99,5 @@
     //
 #if ROOT_VERSION_CODE < ROOT_VERSION(3,02,07)
-    if (!obj->IsA()->InheritsFrom(TGWidget::Class()))
+    if (!obj->InheritsFrom(TGWidget::Class()))
         return NULL;
 #endif
Index: /trunk/MagicSoft/Mars/mbase/MWriteAsciiFile.cc
===================================================================
--- /trunk/MagicSoft/Mars/mbase/MWriteAsciiFile.cc	(revision 1352)
+++ /trunk/MagicSoft/Mars/mbase/MWriteAsciiFile.cc	(revision 1353)
@@ -50,5 +50,4 @@
 #include <fstream.h>
 
-#include <TClass.h>      // IsA
 #include <TMethodCall.h> // TMethodCall, AsciiWrite
 
@@ -247,5 +246,5 @@
         // MData is the highest class in the inheritance tree
         //
-        if (obj->IsA()->InheritsFrom(MData::Class()))
+        if (obj->InheritsFrom(MData::Class()))
         {
             if (!((MData*)obj)->PreProcess(plist))
@@ -257,5 +256,5 @@
         // MParContainer is the next class in the inheritance tree
         //
-        if (obj->IsA()->InheritsFrom(MParContainer::Class()))
+        if (obj->InheritsFrom(MParContainer::Class()))
             continue;
 
@@ -287,21 +286,13 @@
     Int_t num = fList.GetEntries();
 
-    *fLog << all << "CHECK&WRITE " << num << endl;
-
     TIter Next(&fList);
     while ((obj=(MParContainer*)Next()))
     {
-        *fLog << all << endl << obj->IsA()->GetName() << ": 0..." << flush;
-
         if (!obj->IsReadyToSave())
             continue;
 
-        *fLog << all << "1..." << flush;
-
         if (!obj->AsciiWrite(*fOut))
             continue;
 
-        *fLog << all << "2..." << flush;
-
         written = kTRUE;
 
Index: /trunk/MagicSoft/Mars/mdata/MDataChain.cc
===================================================================
--- /trunk/MagicSoft/Mars/mdata/MDataChain.cc	(revision 1352)
+++ /trunk/MagicSoft/Mars/mdata/MDataChain.cc	(revision 1353)
@@ -163,5 +163,5 @@
     int l = txt.Length();
     for (int i = 0; i<l; i++)
-        if (!isalnum(txt[i]) && txt[i]!='.')
+        if (!isalnum(txt[i]) && txt[i]!='.' && txt[i]!='-')
             return i;
 
@@ -208,4 +208,6 @@
     if (txt=="exp")   return kEExp;
     if (txt=="pow10") return kEPow10;
+    if (txt=="sgn")   return kESgn;
+    if (txt[0]=='-')  return kENegative;
 
     return kENoop;
@@ -276,5 +278,5 @@
             {
                 //
-                // Check for the type of the conditional
+                // Check for the type of the symbol
                 //
                 char is = txt[0];
@@ -283,6 +285,6 @@
                 //
                 // If no filter is available or the available filter
-                // is of a different conditional we have to create a new
-                // filter list with the new conditional
+                // is of a different symbols we have to create a new
+                // data list with the new symbol
                 //
                 if (/*!member0->InheritsFrom(MDataMember::Class()) ||*/ type!=is)
@@ -301,8 +303,14 @@
             }
 
-            *fLog << err << dbginf << "Syntax Error: First argument of condition missing." << endl;
-            if (member0)
-                delete member0;
-            return NULL;
+            if (txt[0]!='-' && txt[0]!='+')
+            {
+                *fLog << err << dbginf << "Syntax Error: First argument of symbol '";
+                *fLog << txt[0] << "' missing." << endl;
+                if (member0)
+                    delete member0;
+                return NULL;
+            }
+
+            // FALLTHROU
 
         case '0':
@@ -316,4 +324,5 @@
         case '8':
         case '9':
+            if (txt[0]!='-' || isdigit(txt[1]) || txt[1]=='.')
             {
                 char *end;
@@ -330,6 +339,8 @@
 
                 newmember = new MDataValue(num);
-            }
-            break;
+                break;
+            }
+
+            // FALLTHROUH
 
         default:
@@ -365,5 +376,5 @@
 
             Int_t first = GetBracket(txt);
-            TString sub = txt(1, first-1);
+            TString sub = op==kENegative ? text.Remove(0,1) + txt : txt(1, first-1);
             txt.Remove(0, first+1);
 
@@ -407,20 +418,22 @@
     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 kEExp:   return exp(val);
-    case kEPow10: return pow(10, val);
-    case kENoop:  return val;
+    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 kEExp:      return exp(val);
+    case kEPow10:    return pow(10, val);
+    case kESgn:      return val<0 ? -1 : 1;
+    case kENegative: return -val;
+    case kENoop:     return val;
     }
 
@@ -436,19 +449,21 @@
     switch (fOperatorType)
     {
-    case kEAbs:   *fLog << "abs"   << flush; break;
-    case kELog:   *fLog << "log"   << flush; break;
-    case kELog10: *fLog << "log10" << flush; break;
-    case kESin:   *fLog << "sin"   << flush; break;
-    case kECos:   *fLog << "cos"   << flush; break;
-    case kETan:   *fLog << "tan"   << flush; break;
-    case kESinH:  *fLog << "sinh"  << flush; break;
-    case kECosH:  *fLog << "cosh"  << flush; break;
-    case kETanH:  *fLog << "tanh"  << flush; break;
-    case kEASin:  *fLog << "asin"  << flush; break;
-    case kEACos:  *fLog << "acos"  << flush; break;
-    case kEATan:  *fLog << "atan"  << flush; break;
-    case kESqrt:  *fLog << "sqrt"  << flush; break;
-    case kEExp:   *fLog << "exp"   << flush; break;
-    case kEPow10: *fLog << "pow10" << flush; break;
+    case kEAbs:      *fLog << "abs"   << flush; break;
+    case kELog:      *fLog << "log"   << flush; break;
+    case kELog10:    *fLog << "log10" << flush; break;
+    case kESin:      *fLog << "sin"   << flush; break;
+    case kECos:      *fLog << "cos"   << flush; break;
+    case kETan:      *fLog << "tan"   << flush; break;
+    case kESinH:     *fLog << "sinh"  << flush; break;
+    case kECosH:     *fLog << "cosh"  << flush; break;
+    case kETanH:     *fLog << "tanh"  << flush; break;
+    case kEASin:     *fLog << "asin"  << flush; break;
+    case kEACos:     *fLog << "acos"  << flush; break;
+    case kEATan:     *fLog << "atan"  << flush; break;
+    case kESqrt:     *fLog << "sqrt"  << flush; break;
+    case kEExp:      *fLog << "exp"   << flush; break;
+    case kEPow10:    *fLog << "pow10" << flush; break;
+    case kESgn:      *fLog << "sgn"   << flush; break;
+    case kENegative: *fLog << "-" << flush; break;
     case kENoop:
         break;
Index: /trunk/MagicSoft/Mars/mdata/MDataChain.h
===================================================================
--- /trunk/MagicSoft/Mars/mdata/MDataChain.h	(revision 1352)
+++ /trunk/MagicSoft/Mars/mdata/MDataChain.h	(revision 1353)
@@ -35,5 +35,7 @@
         kESqrt,
         kEPow10,
-        kEExp
+        kEExp,
+        kESgn,
+        kENegative
     } OperatorType_t;
 
Index: /trunk/MagicSoft/Mars/mhist/MH.h
===================================================================
--- /trunk/MagicSoft/Mars/mhist/MH.h	(revision 1352)
+++ /trunk/MagicSoft/Mars/mhist/MH.h	(revision 1353)
@@ -26,7 +26,7 @@
 
     static TCanvas *MakeDefCanvas(TString name="", const char *title="",
-                                  const UInt_t w=700, const UInt_t h=500);
+                                  const UInt_t w=580, const UInt_t h=435);
     static TCanvas *MakeDefCanvas(const TObject *obj,
-                                  const UInt_t w=700, const UInt_t h=500);
+                                  const UInt_t w=580, const UInt_t h=435);
 
     static void SetBinning(TH1 *h, const MBinning *binsx);
Index: /trunk/MagicSoft/Mars/mhist/MHHadroness.cc
===================================================================
--- /trunk/MagicSoft/Mars/mhist/MHHadroness.cc	(revision 1352)
+++ /trunk/MagicSoft/Mars/mhist/MHHadroness.cc	(revision 1353)
@@ -197,6 +197,4 @@
 Bool_t MHHadroness::Finalize()
 {
-    *fLog << inf << "Finished filling hadroness histograms." << endl;
-
     Int_t n = fGhness->GetNbinsX();
 
@@ -268,4 +266,7 @@
     *fLog << "Hadroness histograms:" << endl;
     *fLog << "---------------------" << endl;
+    *fLog << "Acc Gammas at  1% Hadron-acc: " << Form("%3.0f", GetGammaAcceptance(0.01)*100) << "%" << endl;
+    *fLog << "Acc Gammas at  2% Hadron-acc: " << Form("%3.0f", GetGammaAcceptance(0.02)*100) << "%" << endl;
+    *fLog << "Acc Gammas at  5% Hadron-acc: " << Form("%3.0f", GetGammaAcceptance(0.05)*100) << "%" << endl;
     *fLog << "Acc Gammas at 10% Hadron-acc: " << Form("%3.0f", GetGammaAcceptance(0.1)*100) << "%" << endl;
     *fLog << "Acc Gammas at 20% Hadron-acc: " << Form("%3.0f", GetGammaAcceptance(0.2)*100) << "%" << endl;
@@ -274,9 +275,12 @@
     *fLog << "Acc Gammas at 50% Hadron-acc: " << Form("%3.0f", GetGammaAcceptance(0.5)*100) << "%" << endl;
     const Int_t h = fMinDist->GetMaximumBin();
-    *fLog << "Minimum Distance to (0, 1): " << Form("%.2f", 1-fMinDist->GetMaximum()) << " at H=" << fMinDist->GetBinCenter(h) << endl;
-    *fLog << " Acc Gammas = " << Form("%3.0f", fIntGhness->GetBinContent(h)*100) << "%, ";
+    *fLog << "Minimum Distance to (0, 1): " << Form("%.2f", 1-fMinDist->GetMaximum()) << " @ H=" << fMinDist->GetBinCenter(h) << endl;
+    *fLog << "  Acc Gammas = " << Form("%3.0f", fIntGhness->GetBinContent(h)*100) << "%, ";
     *fLog << "Acc Hadrons = " << Form("%3.0f", fIntPhness->GetBinContent(h)*100) << "%" << endl;
-    *fLog << "Maximum Q-Factor: " << GetQfac()->GetMaximum() << endl;
-
+    const Int_t q = GetQfac()->GetMaximumBin();
+    *fLog << "Maximum Q-Factor: " << GetQfac()->GetMaximum() << " @ H=";
+    *fLog << GetQfac()->GetBinCenter(q) << endl;;
+    *fLog << "  Acc Gammas = " << Form("%3.0f", fIntGhness->GetBinContent(q)*100) << "%, ";
+    *fLog << "Acc Hadrons = " << Form("%3.0f", fIntPhness->GetBinContent(q)*100) << "%" << endl;
     *fLog << endl;
 }
Index: /trunk/MagicSoft/Mars/mhist/MHMatrix.h
===================================================================
--- /trunk/MagicSoft/Mars/mhist/MHMatrix.h	(revision 1352)
+++ /trunk/MagicSoft/Mars/mhist/MHMatrix.h	(revision 1353)
@@ -39,4 +39,6 @@
     const TList *GetRules() const { return fRules; }
 
+    void SetEnergy(MHMatrix *m) { fEnergy = m; }
+
     //void Draw(Option_t *opt=NULL);
     //TObject *DrawClone(Option_t *opt=NULL) const;
Index: /trunk/MagicSoft/include-Classes/MMcFormat/MMcEvt.cxx
===================================================================
--- /trunk/MagicSoft/include-Classes/MMcFormat/MMcEvt.cxx	(revision 1352)
+++ /trunk/MagicSoft/include-Classes/MMcFormat/MMcEvt.cxx	(revision 1353)
@@ -170,14 +170,57 @@
 */
 
-void MMcEvt::Print(Option_t *Option) const {
-  //
-  //  print out the data member on screen
-  //
-  cout << endl;
-  cout << "Monte Carlo output:" << endl;
-  cout << " Particle Id:    " << fPartId; 
-  cout << " Energy:         " << fEnergy << "GeV";
-  cout << " Impactpar.:     " << fImpact/100 << "m";
-  cout << " Photoelectrons: " << fPhotElfromShower; 
-  cout << endl; 
-}
+// --------------------------------------------------------------------------
+//
+// Print the contents of the container.
+//
+//  if you specify an option only the requested data members are printed:
+//  allowed options are:
+//   id, energy, impact
+//
+void MMcEvt::Print(Option_t *opt) const
+{
+    //
+    //  print out the data member on screen
+    //
+    TString str(opt);
+    if (str.IsNull())
+    {
+        cout << endl;
+        cout << "Monte Carlo output:" << endl;
+        cout << " Particle Id:    ";
+        switch(fPartId)
+        {
+        case kGAMMA:
+            cout << "Gamma" << endl;
+            break;
+        case kPROTON:
+            cout << "Proton" << endl;
+            break;
+        case kHELIUM:
+            cout << "Helium" << endl;
+            break;
+        }
+        cout << " Energy:         " << fEnergy << "GeV" << endl;
+        cout << " Impactpar.:     " << fImpact/100 << "m" << endl;
+        cout << " Photoelectrons: " << fPhotElfromShower << endl;
+        cout << endl;
+        return;
+    }
+    if (str.Contains("id", TString::kIgnoreCase))
+        switch(fPartId)
+        {
+        case kGAMMA:
+            cout << "Particle: Gamma" << endl;
+            break;
+        case kPROTON:
+            cout << "Particle: Proton" << endl;
+            break;
+        case kHELIUM:
+            cout << "Particle: Helium" << endl;
+            break;
+        }
+    if (str.Contains("energy", TString::kIgnoreCase))
+        cout << "Energy: " << fEnergy << "GeV" << endl;
+    if (str.Contains("impact", TString::kIgnoreCase))
+        cout << "Impact: " << fImpact << "cm" << endl;
+}
