Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
#ifndef __GFHISTMANAGER_H
#define __GFHISTMANAGER_H

 // ROOT includes
#include <TObject.h>
#include <TArrayI.h>
#include <TArrayC.h>
#include <TH1.h> // for type Color_t etc.

class TObjArray;
class TCollection;
// class TH1;
class TCanvas;
class TVirtualPad;
class TFile; 
class TLegend; 
class TLegendEntry; 
class GFHistArray;

class GFHistManager : public TObject{
public:
  GFHistManager();
  explicit GFHistManager(TH1* hist); 
  explicit GFHistManager(TCollection* hists); 
  virtual ~GFHistManager(); 
  
  virtual TLegendEntry* AddHist(TH1* hist, Int_t layer = 0, const char* legendTitle = NULL,
				const char* legOpt = NULL);
  virtual void AddHists(TCollection* hists, Int_t layer = 0,
			const char* legendTitle = NULL, const char* legOpt = NULL);
  virtual TLegendEntry* AddHistSame(TH1* hist, Int_t layer, Int_t nPad, 
				    const char* legendTitle=NULL, const char* legOpt=NULL);
  virtual void AddHistsSame(GFHistArray* hists, Int_t layer,
			    const char* legendTitle = NULL, const char* legOpt = NULL);
  virtual void AddHistsSame(GFHistArray* hists, Int_t layer, Int_t nPad);
  virtual void AddLayers(GFHistManager* other);
  virtual void AddLayer(GFHistManager* other, Int_t layer);
  virtual void Overlay(GFHistManager* other, Int_t otherLayer, Int_t myLayer,
		       const char* legendTitle);
  virtual TLegend* AddLegend(Int_t layer, Int_t nPad, const char* header = NULL, 
			     Bool_t referAll = kTRUE);
  virtual Bool_t RemoveLegend(Int_t layer, Int_t nPad);
  virtual void AddLegend(TLegend* leg, Int_t layer, Int_t nPad);
  virtual void AddObject(TObject* obj, Int_t layer, Int_t histoNum, Option_t* opt = NULL);

  virtual void Draw(Option_t * opt = "");
  virtual void Draw(Int_t layer);
  using TObject::Print;
  virtual void Print(const char* filename, Bool_t add = kFALSE);
//   virtual void Print(const char* filename, Int_t layer);
  virtual void Clear(Bool_t deleteHists);
  void Clear(Option_t * = "") {this->Clear(kFALSE);}
  void Delete(Option_t * = "") {this->Clear(kTRUE);}
  virtual void SetLegendX1Y1X2Y2(Double_t x1, Double_t y1, Double_t x2, Double_t y2);
  virtual void SetLegendX1(Double_t x1);// {fLegendX1 = x1;}
  virtual void SetLegendY1(Double_t y1);// {fLegendY1 = y1;}
  virtual void SetLegendX2(Double_t x2);// {fLegendX2 = x2;}
  virtual void SetLegendY2(Double_t y2);// {fLegendY2 = y2;}
  virtual void SetStatsX1Y1X2Y2(Double_t x1, Double_t y1, Double_t x2, Double_t y2);
  virtual void SetNumHistsX(UInt_t numX);
  virtual void SetNumHistsX(UInt_t numX, Int_t layer);
  virtual void SetNumHistsY(UInt_t numY);
  virtual void SetNumHistsY(UInt_t numY, Int_t layer);
  virtual void SetNumHistsXY(UInt_t numX, UInt_t numY);
  virtual void SetNumHistsXY(UInt_t numX, UInt_t numY, Int_t layer);
  virtual void SetLogY(Bool_t yesNo = kTRUE);
  virtual void SetLogY(Int_t layer, Bool_t yesNo = kTRUE);
  void SetCanvasName(const TString& name);
  virtual void SetCanvasWidth(Int_t w) {fCanvasWidth = w;}
  virtual void SetCanvasHeight(Int_t h) {fCanvasHeight = h;}
  virtual void SetHistsOption(Option_t* option);
  virtual void SetHistsOption(Option_t* option, Int_t layer);
  virtual void SetHistsMinMax(Double_t minMax, Bool_t min);
  virtual void SetHistsMinMax(Double_t minMax, Bool_t min, Int_t layer);
  static void SetLegendEntryOption(const char* option) {fgLegendEntryOption = option;} // some of "lpf"
  virtual void AddHistsOption(Option_t* option);
  virtual void AddHistsOption(Option_t* option, Int_t layer);
  virtual void SetHistsXTitle(const char* title);
  virtual void SetHistsXTitle(const char* title, Int_t layer);
  virtual void SetHistsYTitle(const char* title);
  virtual void SetHistsYTitle(const char* title, Int_t layer);
  virtual void SetHistsFillColor(Color_t color);
  virtual void SetHistsFillColor(Color_t color, Int_t layer);
  virtual void SetHistsLineWidth(Width_t width);
  virtual void SetHistsLineWidth(Width_t  width, Int_t layer);
  virtual void SetHistsLineStyle(Int_t style);
  virtual void SetHistsLineStyle(Int_t style, Int_t layer, Int_t numHistInPad = -1);
  virtual void SetHistsLineColor(Color_t color);
  virtual void SetHistsLineColor(Color_t color, Int_t layer);
  virtual void WriteCanvases(TFile* file);
  virtual void WriteHistos(TFile* file);
  virtual void Update();
  virtual void Update(Int_t layer);
  virtual Bool_t SetBatch(Bool_t set = kTRUE) {Bool_t r = fBatch; fBatch = set; return r;}
  virtual Bool_t IsBatch() const {return fBatch;}
  virtual void ExpandTo(Int_t newDepth);

  virtual GFHistArray* GetHistsOf(Int_t layer, Int_t histNum, Bool_t mayExpand = kFALSE);
  virtual TList* GetObjectsOf(Int_t layer, Int_t histNum);
  virtual Int_t GetNumHistsOf(Int_t layer);
  virtual TLegend* GetLegendOf(Int_t layer, Int_t nPad);
  virtual Int_t GetCanvasWidth() const {return fCanvasWidth;}
  virtual Int_t GetCanvasHeight() const {return fCanvasHeight;}
  virtual Int_t GetNumHistsX(Int_t layer) const;
  virtual Int_t GetNumHistsY(Int_t layer) const;
  virtual Double_t MaxOfHist(const TH1* h) const;
  virtual Double_t MaxOfHists(const TObjArray* hists) const;
  virtual Double_t MinOfHist(const TH1* h) const;
  virtual Double_t MinOfHists(const TObjArray* hists) const;
  virtual TVirtualPad* GetPad(Int_t layer, Int_t histNum);
  virtual TCanvas* GetCanvas(Int_t layer, Int_t number = 0);// after draw!!
  Int_t GetNumLayers() const {return fDepth;}
  virtual void GetLegendX1Y1X2Y2(Double_t& x1, Double_t& y1, Double_t& x2, Double_t& y2) const;

  static const Int_t kDefaultPadsPerCanX;// = 2; Doesn't work! Why ???
  static const Int_t kDefaultPadsPerCanY;// = 2; It should. And it DOES, if we make
  static const Int_t kDefaultDepth;// = 1;        these static const datamembers protected!

  static  Int_t NumberOfSubPadsOf(TCanvas* can);
  static void MakeDifferentStyle(GFHistArray* hists);
  Bool_t   DrawDiffStyle(Bool_t yesNo) {
    const Bool_t old = fDrawDiffStyle; fDrawDiffStyle = yesNo; return old;}
  Bool_t SameWithStats(Bool_t yesNo) {
    const Bool_t old = fSameWithStats; fSameWithStats = yesNo; return old;}

protected:
  virtual void DrawReally(Int_t layer);
  virtual void DrawLegend(Int_t layer, Int_t histNo);
  virtual void DrawObjects(Int_t layer, Int_t histNo);
  virtual void MakeCanvases(Int_t layer);
  virtual TObjArray* MakeLegends(Int_t layer);
  virtual TList* MakeObjList(Int_t layer, Int_t histoNum);
  virtual void Initialise();
  virtual Bool_t CheckDepth(const char* method, Int_t layer, Bool_t mayExpand = kTRUE);
  virtual Bool_t CheckHistNum(const char* method, Int_t layer, Int_t histNum, 
			      Bool_t mayExpand = kFALSE);
  void DrawFuncs(const TH1* hist) const;
  void ColourStatsBoxes(GFHistArray *hists) const;
  void ColourFuncs(GFHistArray *hists) const;

private:
  Int_t        fDepth;         // how many layers of histograms in arrays?
  TArrayI      fNoX;           // how many hists in x...
  TArrayI      fNoY;           // ... and in y in each canvas array
  TArrayC      fLogY;          // whether or not a layer should be plotted in log(y)
  Double_t     fLegendX1;      // default position
  Double_t     fLegendY1;      // ...of TLegends
  Double_t     fLegendX2;      // ... in x
  Double_t     fLegendY2;      // .. and y
  Double_t     fStatsX1;       // default positions in x and y
  Double_t     fStatsX2;       // ...of first statsbox in case
  Double_t     fStatsY1;       // ... many have to be drawn
  Double_t     fStatsY2;       // ... (subsequent boxes are shifted)
  TString      fCanvasName;
  Int_t        fCanvasWidth;   // pixel width
  Int_t        fCanvasHeight;  //       height of canvases (maybe relativly manipulated...) 
  static TString fgLegendEntryOption; // option used for legend entry style
  TObjArray*   fHistArrays;    // array of arrays of arrays of histograms
  TObjArray*   fLegendArrays;     // array of arrays to hold potential TLegend's
  TObjArray*   fObjLists;      // array of array of lists to hold potential objects
  TObjArray*   fCanArrays;     // array of arrays to hold canvases for drawing
  Bool_t       fBatch;         // if true: ignore Draw()
  Bool_t       fDrawDiffStyle; // if true(default): call MakeDifferentStyle while Draw
  Bool_t       fSameWithStats;  // if true(non-default): use SAMES option to add all stats boxes

  ClassDef(GFHistManager, 0)   // Gero's histogram manager (not writable!)
};

#endif