Index: trunk/MagicSoft/Mars/mhbase/HBaseLinkDef.h
===================================================================
--- trunk/MagicSoft/Mars/mhbase/HBaseLinkDef.h	(revision 2736)
+++ trunk/MagicSoft/Mars/mhbase/HBaseLinkDef.h	(revision 2737)
@@ -8,4 +8,5 @@
 
 #pragma link C++ class MH+;
+#pragma link C++ class MH3+;
 #pragma link C++ class MHArray+;
 
Index: trunk/MagicSoft/Mars/mhbase/MH3.cc
===================================================================
--- trunk/MagicSoft/Mars/mhbase/MH3.cc	(revision 2737)
+++ trunk/MagicSoft/Mars/mhbase/MH3.cc	(revision 2737)
@@ -0,0 +1,722 @@
+/* ======================================================================== *\
+!
+! *
+! * 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  2002 <mailto:tbretz@astro.uni-wuerzburg.de>
+!
+!   Copyright: MAGIC Software Development, 2000-2002
+!
+!
+\* ======================================================================== */
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// MH3
+//
+// With this histogram you can fill a histogram with up to three
+// variables from Mars parameter containers in an eventloop.
+//
+// In the constructor you can give up to three variables which should be
+// filled in the histogram. Dependend on the number of given variables
+// (data members) a TH1F, TH2F or TH3F is created.
+// Specify the data mamber like the following:
+//   "MHillas.fLength"
+// Where MHillas is the name of the parameter container in the parameter
+// list and fLength is the name of the data member which should be filled
+// in the histogram. Assuming that your MHillas container has a different
+// name (MyHillas) the name to give would be:
+//   "MyHillas.fLength"
+//
+// The axis binning is retrieved from the parameter list, too. Create a
+// MBinning with the name "Binning" plus the name of your MH3 container
+// plus the axis name ("X", "Y" or "Z") and add it to the parameter list.
+//
+// If you want to use a different unit for histogramming use SetScaleX,
+// SetScaleY and SetScaleZ.
+//
+// For example:
+//   MH3 myhist("MHillas.fLength");
+//   myhist.SetName("MyHist");
+//   myhist.SetScaleX(geomcam.GetConvMm2Deg()); //convert length to degree
+//   MBinning bins("BinningMyHistX");
+//   bins.SetEdges(10, 0, 150);
+//   plist.AddToList(&myhist);
+//   plist.AddToList(&bins);
+//
+/////////////////////////////////////////////////////////////////////////////
+#include "MH3.h"
+
+#include <ctype.h>   // tolower
+#include <fstream>
+
+#include <TPad.h>
+#include <TStyle.h>
+#include <TCanvas.h>
+
+#include <TH2.h>
+#include <TH3.h>
+#include <TProfile.h>
+#include <TProfile2D.h>
+
+#include "MLog.h"
+#include "MLogManip.h"
+
+#include "MParList.h"
+#include "MBinning.h"
+#include "MDataChain.h"
+
+ClassImp(MH3);
+
+using namespace std;
+
+static const TString gsDefName  = "MH3";
+static const TString gsDefTitle = "Container for a %dD Mars Histogram";
+
+// --------------------------------------------------------------------------
+//
+// Default constructor.
+//
+MH3::MH3(const unsigned int dim)
+    : fDimension(dim>3?3:dim), fHist(NULL)
+{  
+    switch (fDimension)
+    {
+    case 1:
+        fHist = new TH1F;
+        fHist->SetYTitle("Counts");
+        break;
+    case 2:
+        fHist = new TH2F;
+        fHist->SetZTitle("Counts");
+        break;
+    case 3:
+        fHist = new TH3F;
+        break;
+    }
+
+    fData[0] = NULL;
+    fData[1] = NULL;
+    fData[2] = NULL;
+
+    fName  = gsDefName;
+    fTitle = Form(gsDefTitle.Data(), 1);
+
+    if (fHist)
+    {
+        fHist->SetDirectory(NULL);
+        fHist->UseCurrentStyle();
+    }
+
+    fScale[0] = 1;
+    fScale[1] = 1;
+    fScale[2] = 1;
+}
+
+// --------------------------------------------------------------------------
+//
+// Creates an TH1F. memberx is filled into the X-bins. For a more detailed
+// description see the class description above.
+//
+MH3::MH3(const char *memberx)
+    : fDimension(1)
+{
+    fHist = new TH1F;
+
+    fData[0] = new MDataChain(memberx);
+    fData[1] = NULL;
+    fData[2] = NULL;
+
+    fName  = gsDefName;
+    fTitle = Form(gsDefTitle.Data(), 1);
+
+    fHist->UseCurrentStyle();
+    fHist->SetDirectory(NULL);
+    fHist->SetYTitle("Counts");
+
+    fScale[0] = 1;
+    fScale[1] = 1;
+    fScale[2] = 1;
+}
+
+// --------------------------------------------------------------------------
+//
+// Creates an TH2F. memberx is filled into the X-bins. membery is filled
+// into the Y-bins. For a more detailed description see the class
+// description above.
+//
+MH3::MH3(const char *memberx, const char *membery)
+    : fDimension(2)
+{
+    fHist = new TH2F;
+
+    fData[0] = new MDataChain(memberx);
+    fData[1] = new MDataChain(membery);
+    fData[2] = NULL;
+
+    fName  = gsDefName;
+    fTitle = Form(gsDefTitle.Data(), 2);
+
+    fHist->UseCurrentStyle();
+    fHist->SetDirectory(NULL);
+    fHist->SetZTitle("Counts");
+
+    fScale[0] = 1;
+    fScale[1] = 1;
+    fScale[2] = 1;
+}
+
+// --------------------------------------------------------------------------
+//
+// Creates an TH3F. memberx is filled into the X-bins. membery is filled
+// into the Y-bins. membery is filled into the Z-bins. For a more detailed
+// description see the class description above.
+//
+MH3::MH3(const char *memberx, const char *membery, const char *memberz)
+    : fDimension(3)
+{
+    fHist = new TH3F;
+
+    fData[0] = new MDataChain(memberx);
+    fData[1] = new MDataChain(membery);
+    fData[2] = new MDataChain(memberz);
+
+    fName  = gsDefName;
+    fTitle = Form(gsDefTitle.Data(), 3);
+
+    fHist->UseCurrentStyle();
+    fHist->SetDirectory(NULL);
+
+    fScale[0] = 1;
+    fScale[1] = 1;
+    fScale[2] = 1;
+}
+
+// --------------------------------------------------------------------------
+//
+// Deletes the histogram
+//
+MH3::~MH3()
+{
+    delete fHist;
+
+    for (int i=0; i<3; i++)
+        if (fData[i])
+            delete fData[i];
+}
+
+// --------------------------------------------------------------------------
+//
+// Return the data members used by the data chain to be used in
+// MTask::AddBranchToList
+//
+TString MH3::GetDataMember() const
+{
+    TString str=fData[0]->GetDataMember();
+    if (fData[1])
+    {
+        str += ";";
+        str += fData[1]->GetDataMember();
+    }
+    if (fData[2])
+    {
+        str += ";";
+        str += fData[2]->GetDataMember();
+    }
+    return str;
+}
+
+// --------------------------------------------------------------------------
+//
+// Setup the Binning for the histograms automatically if the correct
+// instances of MBinning are found in the parameter list
+// For a more detailed description see class description above.
+//
+Bool_t MH3::SetupFill(const MParList *plist)
+{
+    // reset histogram (necessary if the same eventloop is run more than once) 
+    fHist->Reset();
+
+    TString bname("Binning");
+    bname += fName;
+
+    MBinning *binsx = NULL;
+    MBinning *binsy = NULL;
+    MBinning *binsz = NULL;
+
+    switch (fDimension)
+    {
+    case 3:
+        binsz = (MBinning*)plist->FindObject(bname+"Z", "MBinning");
+        if (!binsz)
+        {
+            *fLog << err << dbginf << "MBinning '" << bname << "X' not found... aborting." << endl;
+            return kFALSE;
+        }
+        if (binsz->IsLogarithmic())
+            fHist->SetBit(kIsLogz);
+        if (fData[2]) fHist->SetZTitle(fData[2]->GetTitle());
+        if (fData[2] && !fData[2]->PreProcess(plist))
+            return kFALSE;
+    case 2:
+        binsy = (MBinning*)plist->FindObject(bname+"Y", "MBinning");
+        if (!binsy)
+        {
+            *fLog << err << dbginf << "MBinning '" << bname << "Y' not found... aborting." << endl;
+            return kFALSE;
+        }
+        if (binsy->IsLogarithmic())
+            fHist->SetBit(kIsLogy);
+        if (fData[1]) fHist->SetYTitle(fData[1]->GetTitle());
+        if (fData[1] && !fData[1]->PreProcess(plist))
+            return kFALSE;
+    case 1:
+        binsx = (MBinning*)plist->FindObject(bname+"X", "MBinning");
+        if (!binsx)
+        {
+            if (fDimension==1)
+                binsx = (MBinning*)plist->FindObject(bname, "MBinning");
+
+            if (!binsx)
+            {
+                *fLog << err << dbginf << "Neither MBinning '" << bname << "X' nor '" << bname << "' found... aborting." << endl;
+                return kFALSE;
+            }
+
+        }
+        if (binsx->IsLogarithmic())
+            fHist->SetBit(kIsLogx);
+
+      if (fData[0]!=NULL)  fHist->SetXTitle(fData[0]->GetTitle());
+        if (fData[0] && !fData[0]->PreProcess(plist))
+            return kFALSE;
+    }
+
+    fHist->SetName(fName);
+
+    TString title("Histogram for ");
+    title += fName;
+
+    switch (fDimension)
+    {
+    case 1:
+        fHist->SetTitle(title+" (1D)");
+        SetBinning(fHist, binsx);
+        return kTRUE;
+    case 2:
+        fHist->SetTitle(title+" (2D)");
+        SetBinning((TH2*)fHist, binsx, binsy);
+        return kTRUE;
+    case 3:
+        fHist->SetTitle(title+" (3D)");
+        SetBinning((TH3*)fHist, binsx, binsy, binsz);
+        return kTRUE;
+    }
+    cout << "Still alive...?" << endl;
+    return kTRUE;
+}
+
+// --------------------------------------------------------------------------
+//
+// Set the name of the histogram ant the MH3 container
+//
+void MH3::SetName(const char *name)
+{
+    fHist->SetName(name);
+    MParContainer::SetName(name);
+}
+
+// --------------------------------------------------------------------------
+//
+// Set the title of the histogram ant the MH3 container
+//
+void MH3::SetTitle(const char *title)
+{
+    fHist->SetTitle(title);
+    MParContainer::SetTitle(title);
+}
+
+// --------------------------------------------------------------------------
+//
+// Fills the one, two or three data members into our histogram
+//
+Bool_t MH3::Fill(const MParContainer *par, const Stat_t w)
+{
+    Double_t x=0;
+    Double_t y=0;
+    Double_t z=0;
+
+    switch (fDimension)
+    {
+    case 3:
+        z = fData[2]->GetValue()*fScale[2];
+    case 2:
+        y = fData[1]->GetValue()*fScale[1];
+    case 1:
+        x = fData[0]->GetValue()*fScale[0];
+    }
+
+    switch (fDimension)
+    {
+    case 3:
+        ((TH3*)fHist)->Fill(x, y, z, w);
+        return kTRUE;
+    case 2:
+        ((TH2*)fHist)->Fill(x, y, w);
+        return kTRUE;
+    case 1:
+        fHist->Fill(x, w);
+        return kTRUE;
+    }
+
+    return kFALSE;
+}
+/*
+// --------------------------------------------------------------------------
+//
+// Set the palette you wanna use:
+//  - you could set the root "Pretty Palette Violet->Red" by
+//    gStyle->SetPalette(1, 0), but in some cases this may look
+//    confusing
+//  - The maximum colors root allowes us to set by ourself
+//    is 50 (idx: 51-100). This colors are set to a grayscaled
+//    palette
+//  - the number of contours must be two less than the number
+//    of palette entries
+//
+void MHStarMap::PrepareDrawing() const
+{
+    const Int_t numg = 32; // number of gray scaled colors
+    const Int_t numw = 32; // number of white
+
+    Int_t palette[numg+numw];
+
+    //
+    // The first half of the colors are white.
+    // This is some kind of optical background supression
+    //
+    gROOT->GetColor(51)->SetRGB(1, 1, 1);
+
+    Int_t i;
+    for (i=0; i<numw; i++)
+        palette[i] = 51;
+
+    //
+    // now the (gray) scaled part is coming
+    //
+    for (;i<numw+numg; i++)
+    {
+        const Float_t gray = 1.0-(float)(i-numw)/(numg-1.0);
+
+        gROOT->GetColor(52+i)->SetRGB(gray, gray, gray);
+        palette[i] = 52+i;
+    }
+
+    //
+    // Set the palette and the number of contour levels
+    //
+    gStyle->SetPalette(numg+numw, palette);
+    fStarMap->SetContour(numg+numw-2);
+}
+*/
+// --------------------------------------------------------------------------
+//
+// Setup a inversed deep blue sea palette for the fCenter histogram.
+//
+void MH3::SetColors() const
+{
+    // FIXME: This must be redone each time the canvas is repainted....
+    gStyle->SetPalette(51, NULL);
+    Int_t c[50];
+    for (int i=0; i<50; i++)
+        c[49-i] = gStyle->GetColorPalette(i);
+    gStyle->SetPalette(50, c);
+}
+
+// --------------------------------------------------------------------------
+//
+// Draw clone of histogram. So that the object can be deleted
+//
+// Possible options are:
+//   PROFX: Draw a x-profile into the histogram (for 2D histograms only)
+//   PROFY: Draw a y-profile into the histogram (for 2D histograms only)
+//   ONLY:  Draw the profile histogram only (for 2D histograms only)
+//
+// If the kIsLog?-Bit is set the axis is displayed lkogarithmically.
+// eg this is set when applying a logarithmic MBinning
+//
+// and the histogram is still visible in the canvas.
+// The cloned object are deleted together with the canvas if the canvas is
+// destroyed. If you want to handle destroying the canvas you can get a
+// pointer to it from this function
+//
+/*
+TObject *MH3::DrawClone(Option_t *opt) const
+{
+    TString str(opt);
+
+    TVirtualPad *c = gPad;
+    if (!str.Contains("nonew", TString::kIgnoreCase))
+    {
+        c = MH::MakeDefCanvas(fHist);
+
+        //
+        // This is necessary to get the expected bahviour of DrawClone
+        //
+        gROOT->SetSelectedPad(NULL);
+    }
+
+    if (str.Contains("COL", TString::kIgnoreCase))
+        SetColors();
+
+    Bool_t only = str.Contains("ONLY", TString::kIgnoreCase) && fDimension==2;
+    if (!only)
+        fHist->DrawCopy(opt);
+
+    if (str.Contains("PROFX", TString::kIgnoreCase) && fDimension==2)
+    {
+        TProfile *p = ((TH2*)fHist)->ProfileX("_pfx", -1, 9999, "s");
+        p->SetLineColor(kBlue);
+        p->Draw(only?"":"same");
+        p->SetBit(kCanDelete);
+        p->SetDirectory(NULL);
+    }
+    if (str.Contains("PROFY", TString::kIgnoreCase) && fDimension==2)
+    {
+        TProfile *p = ((TH2*)fHist)->ProfileY("_pfy", -1, 9999, "s");
+        p->SetLineColor(kBlue);
+        p->Draw(only?"":"same");
+        p->SetBit(kCanDelete);
+        p->SetDirectory(NULL);
+    }
+
+    if (fHist->TestBit(kIsLogx)) c->SetLogx();
+    if (fHist->TestBit(kIsLogy)) c->SetLogy();
+    if (fHist->TestBit(kIsLogz)) c->SetLogz();
+
+    c->Modified();
+    c->Update();
+
+    return c;
+}
+*/
+
+// --------------------------------------------------------------------------
+//
+// Creates a new canvas and draws the histogram into it.
+//
+// Possible options are:
+//   PROFX: Draw a x-profile into the histogram (for 2D histograms only)
+//   PROFY: Draw a y-profile into the histogram (for 2D histograms only)
+//   ONLY:  Draw the profile histogram only (for 2D histograms only)
+//
+// If the kIsLog?-Bit is set the axis is displayed lkogarithmically.
+// eg this is set when applying a logarithmic MBinning
+//
+// Be careful: The histogram belongs to this object and won't get deleted
+// together with the canvas.
+//
+void MH3::Draw(Option_t *opt)
+{
+    TVirtualPad *pad = gPad ? gPad : MakeDefCanvas(fHist);
+    pad->SetBorderMode(0);
+
+    AppendPad("");
+
+    TString str(opt);
+
+    // FIXME: Do it in Paint()
+    if (str.Contains("COL", TString::kIgnoreCase))
+        SetColors();
+
+    fHist->SetFillStyle(4000);
+
+    Bool_t only = str.Contains("ONLY", TString::kIgnoreCase) && fDimension==2;
+    if (!only)
+        fHist->Draw(opt);
+
+    if (str.Contains("PROFX", TString::kIgnoreCase) && fDimension==2)
+    {
+        TProfile *p = ((TH2*)fHist)->ProfileX("_pfx", -1, 9999, "s");
+        p->SetLineColor(kBlue);
+        p->Draw(only?"":"same");
+        p->SetBit(kCanDelete);
+        p->SetDirectory(NULL);
+    }
+    if (str.Contains("PROFY", TString::kIgnoreCase) && fDimension==2)
+    {
+        TProfile *p = ((TH2*)fHist)->ProfileY("_pfy", -1, 9999, "s");
+        p->SetLineColor(kBlue);
+        p->Draw(only?"":"same");
+        p->SetBit(kCanDelete);
+        p->SetDirectory(NULL);
+    }
+
+    if (fHist->TestBit(kIsLogx)) pad->SetLogx();
+    if (fHist->TestBit(kIsLogy)) pad->SetLogy();
+    if (fHist->TestBit(kIsLogz)) pad->SetLogz();
+
+    pad->Modified();
+    pad->Update();
+}
+
+// --------------------------------------------------------------------------
+//
+// Implementation of SavePrimitive. Used to write the call to a constructor
+// to a macro. In the original root implementation it is used to write
+// gui elements to a macro-file.
+//
+void MH3::StreamPrimitive(ofstream &out) const
+{
+    TString name = GetUniqueName();
+
+    out << "   MH3 " << name << "(\"";
+    out << fData[0]->GetRule() << "\"";
+    if (fDimension>1)
+        out << ", \"" << fData[1]->GetRule() << "\"";
+    if (fDimension>2)
+        out << ", \"" << fData[2]->GetRule() << "\"";
+
+    out << ");" << endl;
+
+    if (fName!=gsDefName)
+        out << "   " << name << ".SetName(\"" << fName << "\");" << endl;
+
+    if (fTitle!=Form(gsDefTitle.Data(), fDimension))
+        out << "   " << name << ".SetTitle(\"" << fTitle << "\");" << endl;
+
+    switch (fDimension)
+    {
+    case 3:
+        if (fScale[2]!=1)
+            out << "   " << name << ".SetScaleZ(" << fScale[2] << ");" << endl;
+    case 2:
+        if (fScale[1]!=1)
+            out << "   " << name << ".SetScaleY(" << fScale[1] << ");" << endl;
+    case 1:
+        if (fScale[0]!=1)
+            out << "   " << name << ".SetScaleX(" << fScale[0] << ");" << endl;
+    }
+}
+
+// --------------------------------------------------------------------------
+//
+// Used to rebuild a MH3 object of the same type (data members,
+// dimension, ...)
+//
+MParContainer *MH3::New() const
+{
+    MH3 *h = NULL;
+
+    if (fData[0] == NULL)
+        h=new MH3(fDimension);
+    else
+        switch (fDimension)
+        {
+        case 1:
+            h=new MH3(fData[0]->GetRule());
+            break;
+        case 2:
+            h=new MH3(fData[0]->GetRule(), fData[1]->GetRule());
+            break;
+        case 3:
+            h=new MH3(fData[0]->GetRule(), fData[1]->GetRule(), fData[2]->GetRule());
+            break;
+        }
+    switch (fDimension)
+    {
+    case 3:
+        h->SetScaleZ(fScale[2]);
+    case 2:
+        h->SetScaleY(fScale[1]);
+    case 1:
+        h->SetScaleX(fScale[0]);
+    }
+    return h;
+}
+
+TString MH3::GetRule(const Char_t axis) const
+{
+    switch (tolower(axis))
+    {
+    case 'x':
+        return fData[0] ? fData[0]->GetRule() : TString("");
+    case 'y':
+        return fData[1] ? fData[1]->GetRule() : TString("");
+    case 'z':
+        return fData[2] ? fData[2]->GetRule() : TString("");
+    default:
+        return "<n/a>";
+    }
+}
+
+// --------------------------------------------------------------------------
+//
+// Returns the total number of bins in a histogram (excluding under- and
+// overflow bins)
+//
+Int_t MH3::GetNbins() const
+{
+    Int_t num = 1;
+
+    switch (fDimension)
+    {
+    case 3:
+        num *= fHist->GetNbinsZ()+2;
+    case 2:
+        num *= fHist->GetNbinsY()+2;
+    case 1:
+        num *= fHist->GetNbinsX()+2;
+    }
+
+    return num;
+}
+
+// --------------------------------------------------------------------------
+//
+// Returns the total number of bins in a histogram (excluding under- and
+// overflow bins) Return -1 if bin is underflow or overflow
+//
+Int_t MH3::FindFixBin(Double_t x, Double_t y, Double_t z) const
+{
+    const TAxis &axex = *fHist->GetXaxis();
+    const TAxis &axey = *fHist->GetYaxis();
+    const TAxis &axez = *fHist->GetZaxis();
+
+    Int_t binz = 0;
+    Int_t biny = 0;
+    Int_t binx = 0;
+
+    switch (fDimension)
+    {
+    case 3:
+        binz = axez.FindFixBin(z);
+        if (binz>axez.GetLast() || binz<axez.GetFirst())
+            return -1;
+    case 2:
+        biny = axey.FindFixBin(y);
+        if (biny>axey.GetLast() || biny<axey.GetFirst())
+            return -1;
+    case 1:
+        binx = axex.FindFixBin(x);
+        if (binx<axex.GetFirst() || binx>axex.GetLast())
+            return -1;
+    }
+
+    const Int_t nx = fHist->GetNbinsX()+2;
+    const Int_t ny = fHist->GetNbinsY()+2;
+
+    return binx + nx*(biny +ny*binz);
+}
Index: trunk/MagicSoft/Mars/mhbase/MH3.h
===================================================================
--- trunk/MagicSoft/Mars/mhbase/MH3.h	(revision 2737)
+++ trunk/MagicSoft/Mars/mhbase/MH3.h	(revision 2737)
@@ -0,0 +1,69 @@
+#ifndef MARS_MH3
+#define MARS_MH3
+
+#ifndef ROOT_TH1
+#include <TH1.h>
+#endif
+#ifndef MARS_MH
+#include "MH.h"
+#endif
+
+class TH1;
+class TMethodCall;
+class MDataChain;
+
+class MH3 : public MH
+{
+protected:
+    // Could be const but root < 3.02/06 doesn't like this...
+    Int_t       fDimension;      // Number of dimensions of histogram
+    TH1        *fHist;           // Histogram to fill
+    MDataChain *fData[3];        // Object from which the data is filled
+    Double_t    fScale[3];       // Scale for the three axis (eg unit)
+
+    void StreamPrimitive(ofstream &out) const;
+
+    enum {
+        kIsLogx = BIT(17),
+        kIsLogy = BIT(18),
+        kIsLogz = BIT(19)
+    };
+
+public:
+    MH3(const unsigned int dim=0);
+    MH3(const char *memberx);
+    MH3(const char *memberx, const char *membery);
+    MH3(const char *memberx, const char *membery, const char *memberz);
+    ~MH3();
+
+    void SetScaleX(Double_t scale) { fScale[0] = scale; }
+    void SetScaleY(Double_t scale) { fScale[1] = scale; }
+    void SetScaleZ(Double_t scale) { fScale[2] = scale; }
+
+    Int_t GetDimension() const { return fDimension; }
+    Int_t GetNbins() const;
+    Int_t FindFixBin(Double_t x, Double_t y=0, Double_t z=0) const;
+
+    void SetName(const char *name);
+    void SetTitle(const char *title);
+
+    Bool_t SetupFill(const MParList *pList);
+    Bool_t Fill(const MParContainer *par, const Stat_t w=1);
+
+    TString GetDataMember() const;
+    TString GetRule(const Char_t axis='x') const;
+
+    TH1 &GetHist() { return *fHist; }
+    const TH1 &GetHist() const { return *fHist; }
+
+    TH1 *GetHistByName(const TString name="") { return fHist; }
+
+    void SetColors() const;
+    void Draw(Option_t *opt=NULL);
+
+    MParContainer *New() const;
+
+    ClassDef(MH3, 1) // Generalized 1/2/3D-histogram for Mars variables
+};
+
+#endif
Index: trunk/MagicSoft/Mars/mhbase/Makefile
===================================================================
--- trunk/MagicSoft/Mars/mhbase/Makefile	(revision 2736)
+++ trunk/MagicSoft/Mars/mhbase/Makefile	(revision 2737)
@@ -32,4 +32,5 @@
            MWeight.cc \
            MH.cc \
+           MH3.cc \
            MHArray.cc
 
Index: trunk/MagicSoft/Mars/mhist/MH3.cc
===================================================================
--- trunk/MagicSoft/Mars/mhist/MH3.cc	(revision 2736)
+++ 	(revision )
@@ -1,722 +1,0 @@
-/* ======================================================================== *\
-!
-! *
-! * 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  2002 <mailto:tbretz@astro.uni-wuerzburg.de>
-!
-!   Copyright: MAGIC Software Development, 2000-2002
-!
-!
-\* ======================================================================== */
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// MH3
-//
-// With this histogram you can fill a histogram with up to three
-// variables from Mars parameter containers in an eventloop.
-//
-// In the constructor you can give up to three variables which should be
-// filled in the histogram. Dependend on the number of given variables
-// (data members) a TH1F, TH2F or TH3F is created.
-// Specify the data mamber like the following:
-//   "MHillas.fLength"
-// Where MHillas is the name of the parameter container in the parameter
-// list and fLength is the name of the data member which should be filled
-// in the histogram. Assuming that your MHillas container has a different
-// name (MyHillas) the name to give would be:
-//   "MyHillas.fLength"
-//
-// The axis binning is retrieved from the parameter list, too. Create a
-// MBinning with the name "Binning" plus the name of your MH3 container
-// plus the axis name ("X", "Y" or "Z") and add it to the parameter list.
-//
-// If you want to use a different unit for histogramming use SetScaleX,
-// SetScaleY and SetScaleZ.
-//
-// For example:
-//   MH3 myhist("MHillas.fLength");
-//   myhist.SetName("MyHist");
-//   myhist.SetScaleX(geomcam.GetConvMm2Deg()); //convert length to degree
-//   MBinning bins("BinningMyHistX");
-//   bins.SetEdges(10, 0, 150);
-//   plist.AddToList(&myhist);
-//   plist.AddToList(&bins);
-//
-/////////////////////////////////////////////////////////////////////////////
-#include "MH3.h"
-
-#include <ctype.h>   // tolower
-#include <fstream>
-
-#include <TPad.h>
-#include <TStyle.h>
-#include <TCanvas.h>
-
-#include <TH2.h>
-#include <TH3.h>
-#include <TProfile.h>
-#include <TProfile2D.h>
-
-#include "MLog.h"
-#include "MLogManip.h"
-
-#include "MParList.h"
-#include "MBinning.h"
-#include "MDataChain.h"
-
-ClassImp(MH3);
-
-using namespace std;
-
-static const TString gsDefName  = "MH3";
-static const TString gsDefTitle = "Container for a %dD Mars Histogram";
-
-// --------------------------------------------------------------------------
-//
-// Default constructor.
-//
-MH3::MH3(const unsigned int dim)
-    : fDimension(dim>3?3:dim), fHist(NULL)
-{  
-    switch (fDimension)
-    {
-    case 1:
-        fHist = new TH1F;
-        fHist->SetYTitle("Counts");
-        break;
-    case 2:
-        fHist = new TH2F;
-        fHist->SetZTitle("Counts");
-        break;
-    case 3:
-        fHist = new TH3F;
-        break;
-    }
-
-    fData[0] = NULL;
-    fData[1] = NULL;
-    fData[2] = NULL;
-
-    fName  = gsDefName;
-    fTitle = Form(gsDefTitle.Data(), 1);
-
-    if (fHist)
-    {
-        fHist->SetDirectory(NULL);
-        fHist->UseCurrentStyle();
-    }
-
-    fScale[0] = 1;
-    fScale[1] = 1;
-    fScale[2] = 1;
-}
-
-// --------------------------------------------------------------------------
-//
-// Creates an TH1F. memberx is filled into the X-bins. For a more detailed
-// description see the class description above.
-//
-MH3::MH3(const char *memberx)
-    : fDimension(1)
-{
-    fHist = new TH1F;
-
-    fData[0] = new MDataChain(memberx);
-    fData[1] = NULL;
-    fData[2] = NULL;
-
-    fName  = gsDefName;
-    fTitle = Form(gsDefTitle.Data(), 1);
-
-    fHist->UseCurrentStyle();
-    fHist->SetDirectory(NULL);
-    fHist->SetYTitle("Counts");
-
-    fScale[0] = 1;
-    fScale[1] = 1;
-    fScale[2] = 1;
-}
-
-// --------------------------------------------------------------------------
-//
-// Creates an TH2F. memberx is filled into the X-bins. membery is filled
-// into the Y-bins. For a more detailed description see the class
-// description above.
-//
-MH3::MH3(const char *memberx, const char *membery)
-    : fDimension(2)
-{
-    fHist = new TH2F;
-
-    fData[0] = new MDataChain(memberx);
-    fData[1] = new MDataChain(membery);
-    fData[2] = NULL;
-
-    fName  = gsDefName;
-    fTitle = Form(gsDefTitle.Data(), 2);
-
-    fHist->UseCurrentStyle();
-    fHist->SetDirectory(NULL);
-    fHist->SetZTitle("Counts");
-
-    fScale[0] = 1;
-    fScale[1] = 1;
-    fScale[2] = 1;
-}
-
-// --------------------------------------------------------------------------
-//
-// Creates an TH3F. memberx is filled into the X-bins. membery is filled
-// into the Y-bins. membery is filled into the Z-bins. For a more detailed
-// description see the class description above.
-//
-MH3::MH3(const char *memberx, const char *membery, const char *memberz)
-    : fDimension(3)
-{
-    fHist = new TH3F;
-
-    fData[0] = new MDataChain(memberx);
-    fData[1] = new MDataChain(membery);
-    fData[2] = new MDataChain(memberz);
-
-    fName  = gsDefName;
-    fTitle = Form(gsDefTitle.Data(), 3);
-
-    fHist->UseCurrentStyle();
-    fHist->SetDirectory(NULL);
-
-    fScale[0] = 1;
-    fScale[1] = 1;
-    fScale[2] = 1;
-}
-
-// --------------------------------------------------------------------------
-//
-// Deletes the histogram
-//
-MH3::~MH3()
-{
-    delete fHist;
-
-    for (int i=0; i<3; i++)
-        if (fData[i])
-            delete fData[i];
-}
-
-// --------------------------------------------------------------------------
-//
-// Return the data members used by the data chain to be used in
-// MTask::AddBranchToList
-//
-TString MH3::GetDataMember() const
-{
-    TString str=fData[0]->GetDataMember();
-    if (fData[1])
-    {
-        str += ";";
-        str += fData[1]->GetDataMember();
-    }
-    if (fData[2])
-    {
-        str += ";";
-        str += fData[2]->GetDataMember();
-    }
-    return str;
-}
-
-// --------------------------------------------------------------------------
-//
-// Setup the Binning for the histograms automatically if the correct
-// instances of MBinning are found in the parameter list
-// For a more detailed description see class description above.
-//
-Bool_t MH3::SetupFill(const MParList *plist)
-{
-    // reset histogram (necessary if the same eventloop is run more than once) 
-    fHist->Reset();
-
-    TString bname("Binning");
-    bname += fName;
-
-    MBinning *binsx = NULL;
-    MBinning *binsy = NULL;
-    MBinning *binsz = NULL;
-
-    switch (fDimension)
-    {
-    case 3:
-        binsz = (MBinning*)plist->FindObject(bname+"Z", "MBinning");
-        if (!binsz)
-        {
-            *fLog << err << dbginf << "MBinning '" << bname << "X' not found... aborting." << endl;
-            return kFALSE;
-        }
-        if (binsz->IsLogarithmic())
-            fHist->SetBit(kIsLogz);
-        if (fData[2]) fHist->SetZTitle(fData[2]->GetTitle());
-        if (fData[2] && !fData[2]->PreProcess(plist))
-            return kFALSE;
-    case 2:
-        binsy = (MBinning*)plist->FindObject(bname+"Y", "MBinning");
-        if (!binsy)
-        {
-            *fLog << err << dbginf << "MBinning '" << bname << "Y' not found... aborting." << endl;
-            return kFALSE;
-        }
-        if (binsy->IsLogarithmic())
-            fHist->SetBit(kIsLogy);
-        if (fData[1]) fHist->SetYTitle(fData[1]->GetTitle());
-        if (fData[1] && !fData[1]->PreProcess(plist))
-            return kFALSE;
-    case 1:
-        binsx = (MBinning*)plist->FindObject(bname+"X", "MBinning");
-        if (!binsx)
-        {
-            if (fDimension==1)
-                binsx = (MBinning*)plist->FindObject(bname, "MBinning");
-
-            if (!binsx)
-            {
-                *fLog << err << dbginf << "Neither MBinning '" << bname << "X' nor '" << bname << "' found... aborting." << endl;
-                return kFALSE;
-            }
-
-        }
-        if (binsx->IsLogarithmic())
-            fHist->SetBit(kIsLogx);
-
-      if (fData[0]!=NULL)  fHist->SetXTitle(fData[0]->GetTitle());
-        if (fData[0] && !fData[0]->PreProcess(plist))
-            return kFALSE;
-    }
-
-    fHist->SetName(fName);
-
-    TString title("Histogram for ");
-    title += fName;
-
-    switch (fDimension)
-    {
-    case 1:
-        fHist->SetTitle(title+" (1D)");
-        SetBinning(fHist, binsx);
-        return kTRUE;
-    case 2:
-        fHist->SetTitle(title+" (2D)");
-        SetBinning((TH2*)fHist, binsx, binsy);
-        return kTRUE;
-    case 3:
-        fHist->SetTitle(title+" (3D)");
-        SetBinning((TH3*)fHist, binsx, binsy, binsz);
-        return kTRUE;
-    }
-    cout << "Still alive...?" << endl;
-    return kTRUE;
-}
-
-// --------------------------------------------------------------------------
-//
-// Set the name of the histogram ant the MH3 container
-//
-void MH3::SetName(const char *name)
-{
-    fHist->SetName(name);
-    MParContainer::SetName(name);
-}
-
-// --------------------------------------------------------------------------
-//
-// Set the title of the histogram ant the MH3 container
-//
-void MH3::SetTitle(const char *title)
-{
-    fHist->SetTitle(title);
-    MParContainer::SetTitle(title);
-}
-
-// --------------------------------------------------------------------------
-//
-// Fills the one, two or three data members into our histogram
-//
-Bool_t MH3::Fill(const MParContainer *par, const Stat_t w)
-{
-    Double_t x=0;
-    Double_t y=0;
-    Double_t z=0;
-
-    switch (fDimension)
-    {
-    case 3:
-        z = fData[2]->GetValue()*fScale[2];
-    case 2:
-        y = fData[1]->GetValue()*fScale[1];
-    case 1:
-        x = fData[0]->GetValue()*fScale[0];
-    }
-
-    switch (fDimension)
-    {
-    case 3:
-        ((TH3*)fHist)->Fill(x, y, z, w);
-        return kTRUE;
-    case 2:
-        ((TH2*)fHist)->Fill(x, y, w);
-        return kTRUE;
-    case 1:
-        fHist->Fill(x, w);
-        return kTRUE;
-    }
-
-    return kFALSE;
-}
-/*
-// --------------------------------------------------------------------------
-//
-// Set the palette you wanna use:
-//  - you could set the root "Pretty Palette Violet->Red" by
-//    gStyle->SetPalette(1, 0), but in some cases this may look
-//    confusing
-//  - The maximum colors root allowes us to set by ourself
-//    is 50 (idx: 51-100). This colors are set to a grayscaled
-//    palette
-//  - the number of contours must be two less than the number
-//    of palette entries
-//
-void MHStarMap::PrepareDrawing() const
-{
-    const Int_t numg = 32; // number of gray scaled colors
-    const Int_t numw = 32; // number of white
-
-    Int_t palette[numg+numw];
-
-    //
-    // The first half of the colors are white.
-    // This is some kind of optical background supression
-    //
-    gROOT->GetColor(51)->SetRGB(1, 1, 1);
-
-    Int_t i;
-    for (i=0; i<numw; i++)
-        palette[i] = 51;
-
-    //
-    // now the (gray) scaled part is coming
-    //
-    for (;i<numw+numg; i++)
-    {
-        const Float_t gray = 1.0-(float)(i-numw)/(numg-1.0);
-
-        gROOT->GetColor(52+i)->SetRGB(gray, gray, gray);
-        palette[i] = 52+i;
-    }
-
-    //
-    // Set the palette and the number of contour levels
-    //
-    gStyle->SetPalette(numg+numw, palette);
-    fStarMap->SetContour(numg+numw-2);
-}
-*/
-// --------------------------------------------------------------------------
-//
-// Setup a inversed deep blue sea palette for the fCenter histogram.
-//
-void MH3::SetColors() const
-{
-    // FIXME: This must be redone each time the canvas is repainted....
-    gStyle->SetPalette(51, NULL);
-    Int_t c[50];
-    for (int i=0; i<50; i++)
-        c[49-i] = gStyle->GetColorPalette(i);
-    gStyle->SetPalette(50, c);
-}
-
-// --------------------------------------------------------------------------
-//
-// Draw clone of histogram. So that the object can be deleted
-//
-// Possible options are:
-//   PROFX: Draw a x-profile into the histogram (for 2D histograms only)
-//   PROFY: Draw a y-profile into the histogram (for 2D histograms only)
-//   ONLY:  Draw the profile histogram only (for 2D histograms only)
-//
-// If the kIsLog?-Bit is set the axis is displayed lkogarithmically.
-// eg this is set when applying a logarithmic MBinning
-//
-// and the histogram is still visible in the canvas.
-// The cloned object are deleted together with the canvas if the canvas is
-// destroyed. If you want to handle destroying the canvas you can get a
-// pointer to it from this function
-//
-/*
-TObject *MH3::DrawClone(Option_t *opt) const
-{
-    TString str(opt);
-
-    TVirtualPad *c = gPad;
-    if (!str.Contains("nonew", TString::kIgnoreCase))
-    {
-        c = MH::MakeDefCanvas(fHist);
-
-        //
-        // This is necessary to get the expected bahviour of DrawClone
-        //
-        gROOT->SetSelectedPad(NULL);
-    }
-
-    if (str.Contains("COL", TString::kIgnoreCase))
-        SetColors();
-
-    Bool_t only = str.Contains("ONLY", TString::kIgnoreCase) && fDimension==2;
-    if (!only)
-        fHist->DrawCopy(opt);
-
-    if (str.Contains("PROFX", TString::kIgnoreCase) && fDimension==2)
-    {
-        TProfile *p = ((TH2*)fHist)->ProfileX("_pfx", -1, 9999, "s");
-        p->SetLineColor(kBlue);
-        p->Draw(only?"":"same");
-        p->SetBit(kCanDelete);
-        p->SetDirectory(NULL);
-    }
-    if (str.Contains("PROFY", TString::kIgnoreCase) && fDimension==2)
-    {
-        TProfile *p = ((TH2*)fHist)->ProfileY("_pfy", -1, 9999, "s");
-        p->SetLineColor(kBlue);
-        p->Draw(only?"":"same");
-        p->SetBit(kCanDelete);
-        p->SetDirectory(NULL);
-    }
-
-    if (fHist->TestBit(kIsLogx)) c->SetLogx();
-    if (fHist->TestBit(kIsLogy)) c->SetLogy();
-    if (fHist->TestBit(kIsLogz)) c->SetLogz();
-
-    c->Modified();
-    c->Update();
-
-    return c;
-}
-*/
-
-// --------------------------------------------------------------------------
-//
-// Creates a new canvas and draws the histogram into it.
-//
-// Possible options are:
-//   PROFX: Draw a x-profile into the histogram (for 2D histograms only)
-//   PROFY: Draw a y-profile into the histogram (for 2D histograms only)
-//   ONLY:  Draw the profile histogram only (for 2D histograms only)
-//
-// If the kIsLog?-Bit is set the axis is displayed lkogarithmically.
-// eg this is set when applying a logarithmic MBinning
-//
-// Be careful: The histogram belongs to this object and won't get deleted
-// together with the canvas.
-//
-void MH3::Draw(Option_t *opt)
-{
-    TVirtualPad *pad = gPad ? gPad : MakeDefCanvas(fHist);
-    pad->SetBorderMode(0);
-
-    AppendPad("");
-
-    TString str(opt);
-
-    // FIXME: Do it in Paint()
-    if (str.Contains("COL", TString::kIgnoreCase))
-        SetColors();
-
-    fHist->SetFillStyle(4000);
-
-    Bool_t only = str.Contains("ONLY", TString::kIgnoreCase) && fDimension==2;
-    if (!only)
-        fHist->Draw(opt);
-
-    if (str.Contains("PROFX", TString::kIgnoreCase) && fDimension==2)
-    {
-        TProfile *p = ((TH2*)fHist)->ProfileX("_pfx", -1, 9999, "s");
-        p->SetLineColor(kBlue);
-        p->Draw(only?"":"same");
-        p->SetBit(kCanDelete);
-        p->SetDirectory(NULL);
-    }
-    if (str.Contains("PROFY", TString::kIgnoreCase) && fDimension==2)
-    {
-        TProfile *p = ((TH2*)fHist)->ProfileY("_pfy", -1, 9999, "s");
-        p->SetLineColor(kBlue);
-        p->Draw(only?"":"same");
-        p->SetBit(kCanDelete);
-        p->SetDirectory(NULL);
-    }
-
-    if (fHist->TestBit(kIsLogx)) pad->SetLogx();
-    if (fHist->TestBit(kIsLogy)) pad->SetLogy();
-    if (fHist->TestBit(kIsLogz)) pad->SetLogz();
-
-    pad->Modified();
-    pad->Update();
-}
-
-// --------------------------------------------------------------------------
-//
-// Implementation of SavePrimitive. Used to write the call to a constructor
-// to a macro. In the original root implementation it is used to write
-// gui elements to a macro-file.
-//
-void MH3::StreamPrimitive(ofstream &out) const
-{
-    TString name = GetUniqueName();
-
-    out << "   MH3 " << name << "(\"";
-    out << fData[0]->GetRule() << "\"";
-    if (fDimension>1)
-        out << ", \"" << fData[1]->GetRule() << "\"";
-    if (fDimension>2)
-        out << ", \"" << fData[2]->GetRule() << "\"";
-
-    out << ");" << endl;
-
-    if (fName!=gsDefName)
-        out << "   " << name << ".SetName(\"" << fName << "\");" << endl;
-
-    if (fTitle!=Form(gsDefTitle.Data(), fDimension))
-        out << "   " << name << ".SetTitle(\"" << fTitle << "\");" << endl;
-
-    switch (fDimension)
-    {
-    case 3:
-        if (fScale[2]!=1)
-            out << "   " << name << ".SetScaleZ(" << fScale[2] << ");" << endl;
-    case 2:
-        if (fScale[1]!=1)
-            out << "   " << name << ".SetScaleY(" << fScale[1] << ");" << endl;
-    case 1:
-        if (fScale[0]!=1)
-            out << "   " << name << ".SetScaleX(" << fScale[0] << ");" << endl;
-    }
-}
-
-// --------------------------------------------------------------------------
-//
-// Used to rebuild a MH3 object of the same type (data members,
-// dimension, ...)
-//
-MParContainer *MH3::New() const
-{
-    MH3 *h = NULL;
-
-    if (fData[0] == NULL)
-        h=new MH3(fDimension);
-    else
-        switch (fDimension)
-        {
-        case 1:
-            h=new MH3(fData[0]->GetRule());
-            break;
-        case 2:
-            h=new MH3(fData[0]->GetRule(), fData[1]->GetRule());
-            break;
-        case 3:
-            h=new MH3(fData[0]->GetRule(), fData[1]->GetRule(), fData[2]->GetRule());
-            break;
-        }
-    switch (fDimension)
-    {
-    case 3:
-        h->SetScaleZ(fScale[2]);
-    case 2:
-        h->SetScaleY(fScale[1]);
-    case 1:
-        h->SetScaleX(fScale[0]);
-    }
-    return h;
-}
-
-TString MH3::GetRule(const Char_t axis) const
-{
-    switch (tolower(axis))
-    {
-    case 'x':
-        return fData[0] ? fData[0]->GetRule() : TString("");
-    case 'y':
-        return fData[1] ? fData[1]->GetRule() : TString("");
-    case 'z':
-        return fData[2] ? fData[2]->GetRule() : TString("");
-    default:
-        return "<n/a>";
-    }
-}
-
-// --------------------------------------------------------------------------
-//
-// Returns the total number of bins in a histogram (excluding under- and
-// overflow bins)
-//
-Int_t MH3::GetNbins() const
-{
-    Int_t num = 1;
-
-    switch (fDimension)
-    {
-    case 3:
-        num *= fHist->GetNbinsZ()+2;
-    case 2:
-        num *= fHist->GetNbinsY()+2;
-    case 1:
-        num *= fHist->GetNbinsX()+2;
-    }
-
-    return num;
-}
-
-// --------------------------------------------------------------------------
-//
-// Returns the total number of bins in a histogram (excluding under- and
-// overflow bins) Return -1 if bin is underflow or overflow
-//
-Int_t MH3::FindFixBin(Double_t x, Double_t y, Double_t z) const
-{
-    const TAxis &axex = *fHist->GetXaxis();
-    const TAxis &axey = *fHist->GetYaxis();
-    const TAxis &axez = *fHist->GetZaxis();
-
-    Int_t binz = 0;
-    Int_t biny = 0;
-    Int_t binx = 0;
-
-    switch (fDimension)
-    {
-    case 3:
-        binz = axez.FindFixBin(z);
-        if (binz>axez.GetLast() || binz<axez.GetFirst())
-            return -1;
-    case 2:
-        biny = axey.FindFixBin(y);
-        if (biny>axey.GetLast() || biny<axey.GetFirst())
-            return -1;
-    case 1:
-        binx = axex.FindFixBin(x);
-        if (binx<axex.GetFirst() || binx>axex.GetLast())
-            return -1;
-    }
-
-    const Int_t nx = fHist->GetNbinsX()+2;
-    const Int_t ny = fHist->GetNbinsY()+2;
-
-    return binx + nx*(biny +ny*binz);
-}
Index: trunk/MagicSoft/Mars/mhist/MH3.h
===================================================================
--- trunk/MagicSoft/Mars/mhist/MH3.h	(revision 2736)
+++ 	(revision )
@@ -1,69 +1,0 @@
-#ifndef MARS_MH3
-#define MARS_MH3
-
-#ifndef ROOT_TH1
-#include <TH1.h>
-#endif
-#ifndef MARS_MH
-#include "MH.h"
-#endif
-
-class TH1;
-class TMethodCall;
-class MDataChain;
-
-class MH3 : public MH
-{
-protected:
-    // Could be const but root < 3.02/06 doesn't like this...
-    Int_t       fDimension;      // Number of dimensions of histogram
-    TH1        *fHist;           // Histogram to fill
-    MDataChain *fData[3];        // Object from which the data is filled
-    Double_t    fScale[3];       // Scale for the three axis (eg unit)
-
-    void StreamPrimitive(ofstream &out) const;
-
-    enum {
-        kIsLogx = BIT(17),
-        kIsLogy = BIT(18),
-        kIsLogz = BIT(19)
-    };
-
-public:
-    MH3(const unsigned int dim=0);
-    MH3(const char *memberx);
-    MH3(const char *memberx, const char *membery);
-    MH3(const char *memberx, const char *membery, const char *memberz);
-    ~MH3();
-
-    void SetScaleX(Double_t scale) { fScale[0] = scale; }
-    void SetScaleY(Double_t scale) { fScale[1] = scale; }
-    void SetScaleZ(Double_t scale) { fScale[2] = scale; }
-
-    Int_t GetDimension() const { return fDimension; }
-    Int_t GetNbins() const;
-    Int_t FindFixBin(Double_t x, Double_t y=0, Double_t z=0) const;
-
-    void SetName(const char *name);
-    void SetTitle(const char *title);
-
-    Bool_t SetupFill(const MParList *pList);
-    Bool_t Fill(const MParContainer *par, const Stat_t w=1);
-
-    TString GetDataMember() const;
-    TString GetRule(const Char_t axis='x') const;
-
-    TH1 &GetHist() { return *fHist; }
-    const TH1 &GetHist() const { return *fHist; }
-
-    TH1 *GetHistByName(const TString name="") { return fHist; }
-
-    void SetColors() const;
-    void Draw(Option_t *opt=NULL);
-
-    MParContainer *New() const;
-
-    ClassDef(MH3, 1) // Generalized 1/2/3D-histogram for Mars variables
-};
-
-#endif
Index: trunk/MagicSoft/Mars/mhist/Makefile
===================================================================
--- trunk/MagicSoft/Mars/mhist/Makefile	(revision 2736)
+++ trunk/MagicSoft/Mars/mhist/Makefile	(revision 2737)
@@ -31,5 +31,4 @@
 
 SRCFILES = MHVsTime.cc \
-           MH3.cc \
            MHEvent.cc \
            MHCamEvent.cc \
Index: trunk/MagicSoft/Mars/mhistmc/Makefile
===================================================================
--- trunk/MagicSoft/Mars/mhistmc/Makefile	(revision 2736)
+++ trunk/MagicSoft/Mars/mhistmc/Makefile	(revision 2737)
@@ -22,5 +22,5 @@
 #  connect the include files defined in the config.mk file
 #
-INCLUDES = -I. -I../mbase -I../mhist -I../mmc -I../manalysis \
+INCLUDES = -I. -I../mbase -I../mhbase -I../mhist -I../mmc -I../manalysis \
     	   -I../mimage -I../mgeom
 
Index: trunk/MagicSoft/Mars/mimage/Makefile
===================================================================
--- trunk/MagicSoft/Mars/mimage/Makefile	(revision 2736)
+++ trunk/MagicSoft/Mars/mimage/Makefile	(revision 2737)
@@ -22,5 +22,5 @@
 #  connect the include files defined in the config.mk file
 #
-INCLUDES = -I. -I../mbase -I../mhist -I../mgeom -I../manalysis -I../mgui -I../mmc
+INCLUDES = -I. -I../mbase -I../mhbase -I../mgeom -I../manalysis -I../mgui -I../mmc
 
 #------------------------------------------------------------------------------
