ROOT logo
/**
 * @file   SummaryDrawer.C
 * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
 * @date   Sun Nov 25 11:36:41 2012
 * 
 * @brief  Base class for classes to draw summaries 
 * 
 * 
 */
#ifndef SUMMARYDRAWER_C
# define SUMMARYDRAWER_C
# ifndef __CINT__
#  include <THStack.h>
#  include <TH1.h>
#  include <TH2.h>
#  include <TH3.h>
#  include <TParameter.h>
#  include <TCanvas.h>
#  include <TList.h>
#  include <TFile.h>
#  include <TError.h>
#  include <TLatex.h>
#  include <TLegend.h>
#  include <TLegendEntry.h>
#  include <TMath.h>
#  include <TString.h>
#  include <TStyle.h>
#  include <TSystem.h>
#  include <TProfile.h>
#  include <TGaxis.h>
#  include <TPad.h>
#  include <TRegexp.h>
#  include <TGraph.h>
#  include <sstream>
#  include <iomanip>
# else 
#  ifdef __ACLIC__
class THStack;
class TH1;
class TH2;
class TH3;
class TCollection;
class TCanvas;
class TVirtualPad;
class TPad;
class TLatex;
class TAxis;
#  endif
# endif

/**
 * Base class for summary drawers
 * 
 */
class SummaryDrawer 
{
public:
  enum { 
    kLogx   = 0x1, 
    kLogy   = 0x2, 
    kLogz   = 0x4, 
    kLegend = 0x10, 
    kGridx  = 0x100, 
    kGridy  = 0x200, 
    kGridz  = 0x400,
    kSilent = 0x800,
    kNorth  = 0x1000, 
    kMiddle = 0x2000,
    kSouth  = 0x3000, 
    kEast   = 0x10000, 
    kCenter = 0x20000,
    kWest   = 0x30000
  };
  enum { 
    kLandscape         = 0x100, 
    kPause             = 0x200
  };    
  SummaryDrawer() 
    : fCanvas(0), 
      fTop(0), 
      fBody(0),
      fHeader(0),
      fParName(0),
      fParVal(0),
      fPause(false),
      fLandscape(false), 
      fRingMap(0), 
      fPDF(true),
      fLastTitle("")
  {
    fRingMap = new TVirtualPad*[6];
    fRingMap[0] = 0;
    fRingMap[1] = 0;
    fRingMap[2] = 0;
    fRingMap[3] = 0;
    fRingMap[4] = 0;
    fRingMap[5] = 0;
  }
  virtual ~SummaryDrawer() {}

protected:
  //____________________________________________________________________
  /** 
   * Get null terminated array of ring names 
   * 
   * @param lower If true, return in the form FMD[1-3][io], otherwise 
   *              in the form FMD[1-3][IO]
   * 
   * @return Null terminated array of ring names 
   */
  static const Char_t** GetRingNames(Bool_t lower=false) 
  {
    static const Char_t* lN[]={ "FMD1i", "FMD2i", "FMD2o", "FMD3o", "FMD3i", 0};
    static const Char_t* uN[]={ "FMD1I", "FMD2I", "FMD2O", "FMD3O", "FMD3I", 0};
    return (lower ? lN : uN);
  }
  //____________________________________________________________________
  /** 
   * Get the standard color for a ring  
   *
   * @param d Detector
   * @param r Ring 
   * 
   * @return 
   */
  static Color_t RingColor(UShort_t d, Char_t r)
  { 
    return ((d == 1 ? kRed : (d == 2 ? kGreen : kBlue))
	    + ((r == 'I' || r == 'i') ? 2 : -3));
  }
  //____________________________________________________________________
  TLegend* DrawRingLegend(TVirtualPad* p, UInt_t flags)
  {
    TLegend* l = MakeLegend(p, flags, false);

    for (UShort_t i = 0; i < 5; i++) {
      UShort_t      d = (i+1)/2+1;
      Char_t        r = (i/2 == 1) ? 'o' : 'i';
      TLegendEntry* e = l->AddEntry("dummy", Form("FMD%d%c", d, r), "f");
      e->SetFillColor(RingColor(d, r));
      e->SetFillStyle(1001);
      e->SetLineColor(kBlack);
    }
   
    l->Draw();
    return l;
  }
  //____________________________________________________________________
  static void SysString(UShort_t sys, TString& str)
  {
    str = "?";
    switch (sys) { 
    case 1: str = "pp"; break;
    case 2: str = "PbPb"; break;
    case 3: str = "pPb"; break;
    }
  }
  //____________________________________________________________________
  static void SNNString(UShort_t sNN, TString& str)
  {
    str = "?";
    if      (sNN < 1000) str = Form("%dGeV", sNN);
    else if (sNN < 3000) str = Form("%4.2fTeV", 0.001*sNN);
    else                 str = Form("%dTeV", sNN/1000);
  }
  //____________________________________________________________________
  /** 
   * Append an & to a string and the next term.
   * 
   * @param trg  Output string
   * @param what Term
   */
  static void AppendAnd(TString& trg, const TString& what)
  {
    if (!trg.IsNull()) trg.Append(" & ");
    trg.Append(what);
  }
  //____________________________________________________________________
  static void TriggerString(ULong_t trigger, TString& str)
  {
    str = "";
        /** 
     * Bits of the trigger pattern
     */
    enum { 
      /** In-elastic collision */
      kInel        = 0x0001, 
      /** In-elastic collision with at least one SPD tracklet */
      kInelGt0     = 0x0002, 
      /** Non-single diffractive collision */
      kNSD         = 0x0004, 
      /** Empty bunch crossing */
      kEmpty       = 0x0008, 
      /** A-side trigger */
      kA           = 0x0010, 
      /** B(arrel) trigger */
      kB           = 0x0020, 
      /** C-side trigger */
      kC           = 0x0080,  
      /** Empty trigger */
      kE           = 0x0100,
      /** pileup from SPD */
      kPileUp      = 0x0200,    
      /** true NSD from MC */
      kMCNSD       = 0x0400,    
      /** Offline MB triggered */
      kOffline     = 0x0800,
      /** At least one SPD cluster */ 
      kNClusterGt0 = 0x1000,
      /** V0-AND trigger */
      kV0AND       = 0x2000, 
      /** Satellite event */
      kSatellite   = 0x4000
    };
    if ((trigger & kInel)        != 0x0) AppendAnd(str, "INEL");
    if ((trigger & kInelGt0)     != 0x0) AppendAnd(str, "INEL>0");
    if ((trigger & kNSD)         != 0x0) AppendAnd(str, "NSD");
    if ((trigger & kV0AND)       != 0x0) AppendAnd(str, "V0AND");
    if ((trigger & kA)           != 0x0) AppendAnd(str, "A");
    if ((trigger & kB)           != 0x0) AppendAnd(str, "B");
    if ((trigger & kC)           != 0x0) AppendAnd(str, "C");
    if ((trigger & kE)           != 0x0) AppendAnd(str, "E");
    if ((trigger & kMCNSD)       != 0x0) AppendAnd(str, "MCNSD");
    if ((trigger & kNClusterGt0) != 0x0) AppendAnd(str, "NCluster>0");
    if ((trigger & kSatellite)   != 0x0) AppendAnd(str, "Satellite");
  }
    
  //__________________________________________________________________
  /** 
   * Find an object in a collection
   * 
   * @param parent Parent directory
   * @param name   Name of object
   * @param verb   Be verbose 
   * 
   * @return Pointer to object or null 
   */
  static TObject* GetObject(const TObject* parent, 
			    const TString& name, 
			    Bool_t verb=true)
  {
    if (!parent) {
      if (verb) Warning("GetObject", "No parent given");
      return 0;
    }
    if (name.IsNull()) { 
      if (verb) Warning("GetObject", "No name specified");
      return 0;
    }
    TObject* o = 0;
    if (parent->IsA()->InheritsFrom(TCollection::Class())) {
      const TCollection* p = static_cast<const TCollection*>(parent);
      o = p->FindObject(name);
    }
    else if (parent->IsA()->InheritsFrom(TDirectory::Class())) {
      const TDirectory* d = static_cast<const TDirectory*>(parent);
      o = const_cast<TDirectory*>(d)->Get(name);
    }
    else 
      Warning("GetObject", "Do not know how to find an object (%s) in "
	      "%s (of class %s)", name.Data(), 
	      parent ? parent->GetName() : "?", 
	      parent ? parent->ClassName() : "?");
    if (!o) {
      if (verb) Warning("GetObject", "Object \"%s\" not found in parent \"%s\"",
			name.Data(), parent->GetName());
      return 0;
    }
    return o;    
  }
  //____________________________________________________________________
  /** 
   * Check the type of a found object 
   * 
   * @param o   Object 
   * @param cl  Class 
   * @param src Source of object
   * 
   * @return true on success, false otherwise 
   */
  static Bool_t CheckType(const TObject* o, 
			  const TClass*  cl, 
			  const TString& src)
  {
    if (!o->IsA()->InheritsFrom(cl)) { 
      Warning("CheckType", "Object \"%s\" retrieved from \"%s\" is not a "
	      "%s but a %s", o->GetName(), src.Data(), cl->GetName(), 
	      o->ClassName());
      return false;
    }
    return true;
  }
  //__________________________________________________________________
  /** 
   * Check a possibly returned object. 
   * 
   * @param o  Object found - if any
   * @param p  Parent of object
   * 
   * @return A pointer to the object cast to the right type
   */
  template <typename T>
  static T* DoGetObject(TObject* o, const TObject* p) 
  {
    if (!o) return 0;
    if (!CheckType(o, T::Class(), p->GetName())) return 0;
    return static_cast<T*>(o);
  }
  //__________________________________________________________________
  /** 
   * Check a returned parameter from a parent
   * 
   * @param o     Possibly found object
   * @param p     Parent object
   * @param value Value 
   * 
   * @return true on success, false otherwise 
   */
  template <typename T>
  static Bool_t DoGetParameter(TObject* o, const TObject* p, T& value) 
  {
    TParameter<T>* r = DoGetObject<TParameter<T> >(o, p);
    if (!r) return false;
    // if (r->TestBit(TParameter<T>::kFirst)) value = r->GetVal();
    // else                                   value = r->GetUniqueID();
    value = r->GetVal();
    if (!r->TestBit(BIT(19))) {
      TObject* oc = GetObject(p, "count", false);
      if (oc) {
	TParameter<int>* pc = static_cast<TParameter<int>*>(oc);
	int cnt = pc->GetVal();
	value /= cnt;
      }
      else 
	value = r->GetUniqueID();
    }
    // value = r->GetUniqueID();
    return true;
  }
    
  //___________________________________________________________________
  /** 
   * Get a Short_t parameter value 
   * 
   * @param c      Parent collection
   * @param name   Name of parameter
   * @param value  On return the value
   * @param verb   If true, complain if not found 
   */
  static Bool_t GetParameter(const TObject*  c, 
			     const TString&  name, 
			     Short_t&        value,
			     Bool_t          verb=true)
  {
    int v;
    Bool_t r = DoGetParameter(GetObject(c, name, verb), c, v); 
    value = v;
    return r;
  }
  //___________________________________________________________________
  /** 
   * Get a UShort_t parameter value 
   * 
   * @param c      Parent collection
   * @param name   Name of parameter
   * @param value  On return the value
   * @param verb   If true, complain if not found 
   */
  static Bool_t GetParameter(const TObject*  c, 
			     const TString&  name, 
			     UShort_t&       value,
			     Bool_t          verb=true)
  {
    int v;
    Bool_t r = DoGetParameter(GetObject(c, name, verb), c, v); 
    value = v;
    return r;
  }
  //___________________________________________________________________
  /** 
   * Get a ULong_t parameter value 
   * 
   * @param c      Parent collection
   * @param name   Name of parameter
   * @param value  On return the value
   * @param verb   If true, complain if not found 
   */
  static Bool_t GetParameter(const TObject*  c, 
			     const TString&  name, 
			     ULong_t&        value,
			     Bool_t          verb=true)
  {
    Long_t v;
    Bool_t r = DoGetParameter(GetObject(c, name, verb), c, v); 
    value = v;
    return r;
  }
  //_____________________________________________________________________
  /** 
   * Get a Int_t parameter value 
   * 
   * @param c      Parent collection
   * @param name   Name of parameter
   * @param value  On return the value
   * @param verb   If true, complain if not found 
   */
  static Bool_t GetParameter(const TObject*  c, 
			     const TString&  name, 
			     Int_t&          value,
			     Bool_t          verb=true)
  {
    return DoGetParameter(GetObject(c, name, verb), c, value);
  }
  //_____________________________________________________________________
  /** 
   * Get a Double_t parameter value 
   * 
   * @param c      Parent collection
   * @param name   Name of parameter
   * @param value  On return the value
   * @param verb   If true, complain if not found 
   */
  static Bool_t GetParameter(const TObject*      c, 
			     const TString&      name, 
			     Double_t&           value,
			     Bool_t              verb=true);
  //_____________________________________________________________________
  /** 
   * Get a Bool_t parameter value 
   * 
   * @param c      Parent collection
   * @param name   Name of parameter
   * @param value  On return the value
   * @param verb   If true, complain if not found 
   */
  static Bool_t GetParameter(const TObject*  c, 
			     const TString&      name, 
			     Bool_t&             value,
			     Bool_t              verb=true)
  {
    return DoGetParameter(GetObject(c, name, verb), c, value);
  }
  //____________________________________________________________________
  /** 
   * Find a collection in another collection 
   * 
   * @param parent Parent collection 
   * @param name   Name of the collection 
   * @param verb   If true and not found, complain
   *
   * @return pointer to collection on success, otherwise null 
   */
  static TCollection* GetCollection(const TObject*     parent, 
				    const TString&     name,
				    Bool_t             verb=true)
  {
    return DoGetObject<TCollection>(GetObject(parent, name, verb), parent);
  }
  //____________________________________________________________________
  /** 
   * Check a 1D histogram object from a parent
   * 
   * @param parent Parent collection 
   * @param name   Name of histogram
   * @param verb   Possibly be verbose
   * 
   * @return pointer or null
   */
  static TH1* GetH1(const TObject*     parent, 
		    const TString&     name,
		    Bool_t             verb=true)
  {
    return DoGetObject<TH1>(GetObject(parent, name, verb), parent);
  }
  //____________________________________________________________________
  /** 
   * Get a 2D histogram from a collection
   * 
   * @param parent Parent collection 
   * @param name   Name of histogram 
   * @param verb   If true and not found, complain
   * 
   * @return pointer or null
   */
  static TH2* GetH2(const TObject*     parent, 
		    const TString&     name, 
		    Bool_t             verb=true)
  {
    return DoGetObject<TH2>(GetObject(parent, name, verb), parent);
  }
  //____________________________________________________________________
  /** 
   * Get a 2D histogram from a collection
   * 
   * @param parent Parent collection 
   * @param name   Name of histogram 
   * @param verb   If true and not found, complain
   * 
   * @return pointer or null
   */
  static TH3* GetH3(const TCollection* parent, 
		    const TString&     name, 
		    Bool_t             verb=true)
  {
    // Info("GetH2", "Getting 2D histogram of %s from %p", name.Data(), c);
    // --- Find the object -------------------------------------------
    return DoGetObject<TH3>(GetObject(parent, name, verb), parent);
  }
  //__________________________________________________________________
  /** 
   * Get a histogram stack from a collection
   * 
   * @param parent Parent collection 
   * @param name   Name of histogram 
   * @param sub    If set, fill from sub-component 
   * @param verb   If true and not found, complain
   * 
   * @return pointer or null
   */
  static THStack* GetStack(const TObject*  parent, 
			   const TString&  name,
			   const char*     sub=0,
			   Bool_t          verb=true)
  {
    THStack* stack = DoGetObject<THStack>(GetObject(parent,name,verb),parent);
    if (!stack) return 0;
    if (sub == 0) return stack;
  
    if (stack->GetHists()->GetEntries() <= 0 ||stack->GetMaximum() < 1) { 
      // Info("GetStack", "No entries in %s", name.Data());
      stack->GetHists()->Delete();
      const char** ptr   = GetRingNames(false);
      while (*ptr) { 
	TCollection* sc = GetCollection(parent, *ptr, true);
	if (!sc) { ptr++; continue; }

	TObject* obj = GetObject(sc, sub);
	if (!obj) {
	  continue;
	  ptr++;
	}

	if (obj->IsA()->InheritsFrom(TH2::Class())) {
	  TH2* h = static_cast<TH2*>(obj);
	  TH1* p = h->ProjectionX(*ptr, 1, h->GetNbinsY(), "e");
	  p->Scale(1., "width");
	  p->SetTitle(*ptr);
	  p->SetDirectory(0);
	  stack->Add(p);
	}
	else if (obj->IsA()->InheritsFrom(TH1::Class())) {
	  TH1* hh = static_cast<TH1*>(obj);
	  hh->SetTitle(*ptr);
	  stack->Add(hh);
	}
	ptr++;
      }
    }
    // --- Return the collection -------------------------------------
    return stack;
  }
  //____________________________________________________________________
  /** 
   * Clear canvas 
   * 
   */
  void ClearCanvas()
  {
    if (fTop) {
      fTop->Clear();
      fTop->SetNumber(1);
      fTop->SetFillColor(kBlue-5);
      fTop->SetBorderSize(0);
      fTop->SetBorderMode(0);
    }

    fBody->Clear();
    fBody->SetNumber(2);
    fBody->SetFillColor(0);
    fBody->SetFillStyle(0);
    fBody->SetBorderSize(0);
    fBody->SetBorderMode(0);
    fBody->SetTopMargin(0.01);
    fBody->SetLeftMargin(0.10);
    fBody->SetRightMargin(0.01);
    fBody->SetBottomMargin(0.10);

    fRingMap[0] = 0;
    fRingMap[1] = 0;
    fRingMap[2] = 0;
    fRingMap[3] = 0;
    fRingMap[4] = 0;
    fRingMap[5] = 0;
    
    fCanvas->cd();    
  }
  //____________________________________________________________________
  /** 
   * Create a canvas 
   * 
   * @param pname     Name of PDF file to make 
   * @param landscape If true, print in landscape 
   * @param pdf       Make PDF
   *
   * @return Created canvas 
   */
  void CreateCanvas(const TString& pname, 
		    Bool_t landscape=false, 
		    Bool_t pdf=true,
		    Bool_t useTop=true)
  {
    // Info("CreateCanvas", "Creating canvas");
    fLandscape = landscape;
    fPDF       = pdf;
    Int_t height = 1000;
    Int_t width  = height / TMath::Sqrt(2);
    if (fLandscape) {
      Int_t tmp = height; 
      height    = width;
      width     = tmp;
    }
    fCanvas = new TCanvas("c", pname.Data(), width, height);
    fCanvas->SetFillColor(0);
    fCanvas->SetBorderSize(0);
    fCanvas->SetBorderMode(0);
    if (fPDF) 
      fCanvas->Print(Form("%s[", pname.Data()), 
		     Form("pdf %s", fLandscape ? "Landscape" : ""));
    fCanvas->SetLeftMargin(.1);
    fCanvas->SetRightMargin(.05);
    fCanvas->SetBottomMargin(.1);
    fCanvas->SetTopMargin(.05);
  
    gStyle->SetOptStat(0);
    gStyle->SetTitleColor(0);
    gStyle->SetTitleStyle(0);
    gStyle->SetTitleBorderSize(0);
    gStyle->SetTitleX(.5);
    gStyle->SetTitleY(1);
    gStyle->SetTitleW(.8);
    gStyle->SetTitleH(.09);
    gStyle->SetFrameFillColor(kWhite);
    gStyle->SetFrameBorderSize(1);
    gStyle->SetFrameBorderMode(1);
    gStyle->SetPalette(1);

    Float_t dy = useTop ? .05 : 0;
    if (useTop) {
      fTop = new TPad("top", "Top", 0, 1-dy, 1, 1, 0, 0);
      fTop->SetNumber(1);
      fTop->SetFillColor(kBlue-5);
      fTop->SetBorderSize(0);
      fTop->SetBorderMode(0);
      fCanvas->cd();
      fTop->Draw();
    }

    fBody = new TPad("body", "Body", 0, 0, 1, 1-dy, 0, 0);
    fBody->SetNumber(2);
    fBody->SetFillColor(0);
    fBody->SetFillStyle(0);
    fBody->SetBorderSize(0);
    fBody->SetBorderMode(0);
    fCanvas->cd();
    fBody->Draw();

    fHeader = new TLatex(.5, .5, "Title");
    fHeader->SetNDC();
    fHeader->SetTextAlign(22);
    fHeader->SetTextSize(.7);
    fHeader->SetTextColor(kWhite);
    fHeader->SetTextFont(62);

    Double_t x1 = .1;
    Double_t x2 = .6;
    Double_t y  = .8;
    Double_t s  = fLandscape ? 0.08 : 0.05;
    fParName = new TLatex(x1, y, "");
    fParName->SetTextAlign(13);
    fParName->SetNDC();
    fParName->SetTextSize(s);
    fParName->SetTextFont(62);
    
    fParVal = new TLatex(x2, y, "");
    fParVal->SetTextAlign(13);
    fParVal->SetNDC();
    fParVal->SetTextSize(s);
    fParVal->SetTextFont(42);

    fCanvas->cd();
  }

  //____________________________________________________________________
  /** 
   * Close the PDF
   * 
   */
  void CloseCanvas()
  {
    // Info("CloseCanvas", "Closing canvas");
    // ClearCanvas();
    if (fPDF && fCanvas) {
      // Printf("Closing canvas with last title %s", fLastTitle.Data());
      fCanvas->Print(Form("%s]", fCanvas->GetTitle()),
		     Form("pdf %s Title:%s", 
			  fLandscape ? "Landscape" : "",
			  fLastTitle.Data()));
    }
    if (fCanvas)
      fCanvas->Close();
    fCanvas = 0;
  }

  //__________________________________________________________________
  /** 
   * Print the canvas 
   * 
   * @param title  Title 
   * @param size   Size of text 
   */
  void PrintCanvas(const TString& title, Float_t size=.7)
  {
    if (fTop) {
      fTop->cd();
      fHeader->SetTextSize(size);
      fHeader->DrawLatex(.5,.5,title);
    }
  
    fCanvas->Modified();
    fCanvas->Update();
    fCanvas->cd();

    if (fPDF) {
      TString tit;
      tit.Form("pdf %s Title:%s", fLandscape ? "Landscape" : "",
	       title.Data());

#ifdef DEBUG
      Info("PrintCanvas", "Printing to %s (%s)", 
	   fCanvas->GetTitle(), tit.Data());
#else
      gSystem->RedirectOutput("/dev/null");
#endif
      fCanvas->Print(fCanvas->GetTitle(), tit);
#ifndef DEBUG
      gSystem->RedirectOutput(0);
#endif
      fLastTitle = title;
      Pause();
      
      ClearCanvas();
    }
  }
  //__________________________________________________________________
  /** 
   * Make a chapter page 
   * 
   * @param title Title 
   */
  void MakeChapter(const TString& title)
  {
    fBody->cd();

    TLatex* ltx = new TLatex(.5, .5, title);
    ltx->SetNDC();
    ltx->SetTextAlign(22);
    ltx->Draw();
    
    PrintCanvas(title);
  }
  //__________________________________________________________________
  /** 
   * Draw an object in pad 
   * 
   * @param c       PArent pad 
   * @param padNo   Sub-pad number (0 is self)
   * @param h       Object to draw 
   * @param opts    Options
   * @param flags   Flags
   * @param title   Title on plot
   *
   * @return Drawn object - if any
   */
  TObject* DrawInPad(TVirtualPad* c, 
		     Int_t        padNo, 
		     TObject*     h, 
		     Option_t*    opts="",
		     UInt_t       flags=0x0,
		     const char*  title="")
  {
    TVirtualPad* p = c->GetPad(padNo);
    if (!p) { 
      Warning("DrawInPad", "Pad # %d not found in %s", padNo, c->GetName());
      return 0;
    }
    return DrawInPad(p, h, opts, flags, title);
  }
  /** 
   * Draw a clone of an object
   * 
   * @param o       Object
   * @param options Draw options
   * @param title   Title of object
   *
   * @return Drawn object - if any
   */
  virtual TObject* DrawObjClone(TObject* o, Option_t* options, 
				const char* title)
  {
    if (o->IsA()->InheritsFrom(TH1::Class())) 
      return DrawObjClone(static_cast<TH1*>(o), options, title);
    else if (o->IsA()->InheritsFrom(THStack::Class())) 
      return DrawObjClone(static_cast<THStack*>(o), options, title);
    else if (o->IsA()->InheritsFrom(TGraph::Class()))
      return o->DrawClone(options);
    else 
      o->Draw(options);
    return o;
  }
  /** 
   * Draw an object clone 
   * 
   * @param o        Stack object
   * @param options  Draw options 
   * @param title    Title on plot
   *
   * @return Drawn object - if any
   */
  virtual TObject* DrawObjClone(THStack* o, Option_t* options, 
				const char* title)
  {
    // THStack* tmp = static_cast<THStack*>(o->Clone());
    o->Draw(options);
    if (title && title[0] != '\0') o->GetHistogram()->SetTitle(title);
    TAxis*   xAxis = o->GetXaxis();
    if (!xAxis) {
      Warning("DrawObjClone", "No X-axis for drawn stack %s", o->GetName());
      return o;
    }
    TH1*     h     = 0;
    Int_t    nBins = xAxis->GetNbins();
    Double_t xMin  = xAxis->GetXmin();
    Double_t xMax  = xAxis->GetXmax();
    TIter  next(o->GetHists());
    while ((h = static_cast<TH1*>(next()))) {
      TAxis* a = h->GetXaxis();
      nBins    = TMath::Max(nBins, a->GetNbins()); 
      xMin     = TMath::Min(xMin, a->GetXmin());
      xMax     = TMath::Max(xMax, a->GetXmax());
    }
    if (nBins != xAxis->GetNbins() || 
	xMin  != xAxis->GetXmin() || 
	xMax  != xAxis->GetXmax()) {
      xAxis->Set(nBins, xMin, xMax);
      o->GetHistogram()->Rebuild();
    }
    return o;
  }
  /** 
   * Draw an object clone 
   * 
   * @param o        Histogram
   * @param options  Draw options 
   * @param title    Title on plot 
   *
   * @return Drawn object - if any
   */
  virtual TObject* DrawObjClone(TH1* o, Option_t* options, const char* title)
  {
    TH1* tmp = o->DrawCopy(options);
    if (title && title[0] != '\0') tmp->SetTitle(title);
    return tmp;
  }    
  //__________________________________________________________________
  static void GetLegendPosition(UInt_t    flags, TVirtualPad* p, 
				Double_t& x1,    Double_t&    y1, 
				Double_t& x2,    Double_t&    y2)
  {
    UInt_t   horiz = (flags & 0xF0000);
    UInt_t   verti = (flags & 0xF000);
    Double_t eps   = .01;
    Double_t dY    = .4;
    Double_t dX    = .4;
    Double_t yB    = p->GetBottomMargin()+eps;
    Double_t yT    = 1-p->GetTopMargin()-eps;
    Double_t xL    = p->GetLeftMargin()+eps;
    Double_t xR    = 1-p->GetRightMargin()-eps;
    switch (verti) { 
    case kNorth:  y1 = yT-dY;           break;
    case kSouth:  y1 = yB;              break;
    case kMiddle: y1 = (yB+yT-dY)/2;    break;
    }
    y2 = TMath::Min(y1 + dY, yT);
    
    switch (horiz) { 
    case kEast:   x1 = xL;              break;
    case kWest:   x1 = xR-dX;           break;
    case kCenter: x1 = (xL+xR-dX)/2;    break;
    }
    x2 = TMath::Min(x1 + dX, xR);
  } 
  //__________________________________________________________________
  /** 
   * Make a legend 
   * 
   * @param p 
   * @param flags 
   * @param autoFill 
   * 
   * @return 
   */
  TLegend* MakeLegend(TVirtualPad* p, UInt_t flags, Bool_t autoFill)
  {
    Double_t x1 = fParVal->GetX();
    Double_t y1 = fParVal->GetY();
    Double_t x2 = 0;
    Double_t y2 = 0;
    GetLegendPosition(flags, p, x1, y1, x2, y2);

    //Printf("Legend at (%f,%f)x(%f,%f)", x1, y1, x2, y2);
    TLegend* l = 0;
    if (autoFill) l = p->BuildLegend(x1, y1, x2, y2);
    else          l = new TLegend(x1, y1, x2, y2);
    l->SetFillColor(0);
    l->SetFillStyle(0);
    l->SetBorderSize(0);

    return l;
  }
  //__________________________________________________________________
  /** 
   * Draw an object in pad 
   * 
   * @param p       Pad
   * @param h       Object to draw 
   * @param opts    Options
   * @param flags   Flags
   * @param title   Title on plot
   *
   * @return Drawn object - if any
   */
  TObject* DrawInPad(TVirtualPad* p, 
		     TObject*     h, 
		     Option_t*    opts="",
		     UInt_t       flags=0x0,
		     const char*  title="")
  {
    if (!p) { 
      Warning("DrawInPad", "No pad specified");
      return 0;
    }
    p->cd();
    // Info("DrawInPad", "Drawing in pad %p", p);
    // fBody->ls();
    if (flags & kLogx) p->SetLogx();
    if (flags & kLogy) p->SetLogy();
    if (flags & kLogz) p->SetLogz();
    if (flags & kGridx) p->SetGridx();
    if (flags & kGridy) p->SetGridy();
    // if (flags & kGridz) p->SetGridz();
    p->SetFillColor(0);
    TString o(opts);
    if (o.Contains("colz", TString::kIgnoreCase)) 
      p->SetRightMargin(0.15);
    if (!h) {
      if (!(flags & kSilent))
	Warning("DrawInPad", "Nothing to draw in pad # %s", p->GetName());
      return 0;
    }
    if (o.Contains("text", TString::kIgnoreCase)) {
      TH1* hh = static_cast<TH1*>(h);
      hh->SetMaximum(1.1*hh->GetMaximum());
      hh->SetMarkerSize(2);
      o.Append("30");
    }
    TObject* ret = DrawObjClone(h, o, title);
    
    if (flags & kLegend) {
      MakeLegend(p, flags, true);
    }
    p->Modified();
    p->Update();
    p->cd();

    return ret;
  }
  //__________________________________________________________________
  /** 
   * Draw two graphs in the same frame, but with separate y-axis 
   * 
   * @param c      Mother pad 
   * @param padNo  Sub-pad number (0 is self)
   * @param h1     First histogram
   * @param h2     Second histogram
   * @param opts   Options
   * @param flags  Flags
   */
  void DrawTwoInPad(TVirtualPad* c, Int_t padNo, TH1* h1, TH1* h2,
		    Option_t* opts="", UShort_t flags=0x0)
  {
    TVirtualPad* p = c->cd(padNo);
    if (!p) { 
      Warning("DrawInPad", "Pad # %d not found in %s", padNo, c->GetName());
      return;
    }
    if (flags & kLogx) p->SetLogx();
    if (flags & kLogy) p->SetLogy();
    if (flags & kLogz) p->SetLogz();
    if (flags & kGridx) p->SetGridx();
    if (flags & kGridy) p->SetGridy();
    // if (flags & kGridz) p->SetGridz();
    p->SetFillColor(0);

    TString o(opts);
    o.ToLower();
    TString fopts(o);
    Bool_t e3 = o.Contains("e3");
    if (e3) {
      fopts.ReplaceAll("e3", " same");
    }
    
    h1->GetYaxis()->SetLabelSize(0);
    h1->GetYaxis()->SetTicks("");
    h1->GetYaxis()->SetNdivisions(0);
    h1->DrawCopy(o); // First draw with opts 
    if (e3) h1->DrawCopy(fopts);
    p->Update();

    Double_t m1 = 1.05 * h1->GetMaximum();
    if (m1 > 0) {
      TGaxis*  a1 = new TGaxis(p->GetUxmin(), p->GetUymin(), 
			       p->GetUxmin(), p->GetUymax(), 
			       0, m1, 510);
      a1->SetLineColor(h1->GetLineColor());
      a1->Draw();
    }

    o.Append(" same");
    Double_t m2    = 1.1 * h2->GetMaximum();
    Double_t scale = m2 > 0 ? m1 / m2 : 1;
    h2->Scale(scale);
    h2->DrawCopy(o);
    if (e3) h2->DrawCopy(fopts);

    if (m2 > 0) {
      TGaxis*  a2 = new TGaxis(p->GetUxmax(), p->GetUymin(), 
			       p->GetUxmax(), p->GetUymax(), 
			       0, m2, 510, "+L");
      a2->SetLineColor(h2->GetLineColor());
      a2->Draw();
    }
    if (flags& kLegend) { 
      MakeLegend(p, flags, true);
    }
    p->Modified();
    p->Update();
    p->cd();
  }  
  
  //____________________________________________________________________
  /** 
   * Draw a parameter.  
   * 
   * @param y       Current y position. On return new y position
   * @param name    Parameter name
   * @param value   Parameter value 
   * @param size    Optional text size
   */
  void DrawParameter(Double_t&      y, 
		     const TString& name, 
		     const TString& value,
		     Double_t       size=0)
  {
    Double_t s = fParName->GetTextSize();
    Double_t t = fParVal->GetTextSize();
    if (name.IsNull() && value.IsNull()) return;
    if (size > 0) { 
      fParName->SetTextSize(size);
      fParVal->SetTextSize(size);
    }
    if (!name.IsNull())
      fParName->DrawLatex(fParName->GetX(), y, Form("%s:", name.Data()));
    if (!value.IsNull())
      fParVal->DrawLatex(fParVal->GetX(), y, value.Data());
    if (!name.IsNull())
      y -= 1.2 * fParName->GetTextSize();
    else if (!value.IsNull())
      y -= 1.2 * fParVal->GetTextSize();

    fParName->SetTextSize(s);
    fParVal->SetTextSize(t);
  }  
  template <typename T>
  void DrawTParameter(Double_t&      y,
		      TList*         list, 
		      const TString& name) {
    T value;
    if (!GetParameter(list, name, value)) 
      return;
    std::stringstream s;
    s << std::boolalpha << value;
    DrawParameter(y, name, s.str().c_str(), 0);
  }
      
  //__________________________________________________________________
  /**
   * Structure to hold a dived pad 
   */
  struct DividedPad { 
    TVirtualPad*  fParent;
    TVirtualPad** fSubs;
    Bool_t        fLandscape;
    Int_t         fNCol;
    Int_t         fNRow;

    DividedPad(TVirtualPad* p, Bool_t landscape, Int_t nCol, Int_t nRow) 
      : fParent(p), 
	fSubs(0),
	fLandscape(landscape),
	fNCol(landscape ? nRow : nCol),
	fNRow(landscape ? nCol : nRow)
    {
      Int_t nPad = fNCol * fNRow;
      fSubs      = new TVirtualPad*[nPad];
    }
    void Divide(Bool_t commonX, Bool_t commonY) {
      if ((!commonX && !commonY) || (commonX && commonY)) {
	// In case we have no common axis or do have both to be common,
	// we directly use the TVirtualPad::Divide member function 
	fParent->Divide(fNCol, fNRow, commonX ? 0 : 0.01, commonY ? 0 : 0.01);
	for (Int_t iPad = 1; iPad <= fNRow*fNCol; iPad++) 
	  fSubs[iPad-1] = fParent->GetPad(iPad);
      }
      else if (commonX && !commonY) {
	// We need to have common X axis, but not common Y axis. We first
	// divide the pad in fNCol columns, and then each in to fNRow rows
	fParent->Divide(fNCol, 1);
	for (Int_t iCol = 1; iCol <= fNCol; iCol++) { 
	  TVirtualPad* q = fParent->GetPad(iCol);

	  if (fNRow == 1) {
	    fSubs[GetIdx(iCol,0)] = q;
	    continue;
	  }

	  q->Divide(1,fNRow,0,0);
	  for (Int_t iRow = 1; iRow <= fNRow; iRow++) 
	    fSubs[GetIdx(iCol, iRow)] = q->GetPad(iRow);
	}
      }
      else if (!commonX && commonY) { 
	// We need to have common Y axis, but not common X axis. We first
	// divide the pad in fNRow rows, and then each in to fNCol columns
	fParent->Divide(1, fNRow);
	for (Int_t iRow = 1; iRow <= fNRow; iRow++) { 
	  TVirtualPad* q = fParent->GetPad(iRow);

	  if (fNCol == 1) {
	    fSubs[GetIdx(0,iRow)] = q;
	    continue;
	  }
	  
	  q->Divide(fNCol,1,0,0);
	  for (Int_t iCol = 1; iCol <= fNCol; iCol++) 
	    fSubs[GetIdx(iCol, iRow)] = q->GetPad(iCol);
	}
      }
    }
    virtual ~DividedPad() { if (fSubs) delete [] fSubs; }
    /** 
     * Get a sub-pad 
     * 
     * @param idx Index (0 based)
     * 
     * @return Pad or null
     */
    TVirtualPad* GetPad(Int_t idx) {
      if (!fSubs) {
	::Warning("GetPad","No sub-pads");
	return 0;
      }
      if (idx < 0 || idx >= (fNRow*fNCol)) {
	::Warning("GetPad", "Inded %d out of bounds [%d,%d]", 
		  idx, 0, fNRow*fNCol);
	return 0;
      }
      return fSubs[idx];
    }
    Int_t GetIdx(Int_t iCol, Int_t iRow) const 
    {
      return (iRow-1) * fNCol + iCol;
    }
    /** 
     * Get a sub-pad 
     * 
     * @param iRow  Row number (1-based)
     * @param iCol  Column number (1-based)
     * 
     * @return Pad or null
     */
    TVirtualPad* GetPad(Int_t iCol, Int_t iRow) { 
      if (iRow < 0 || iRow > fNRow) return 0;
      if (iCol < 0 || iRow > fNCol) return 0;
      return GetPad(GetIdx(iCol, iRow));
    }
  };
    
  //__________________________________________________________________
  void DivideForRings(Bool_t commonX, Bool_t commonY)
  {
    // 
    // Divide canvas for rings 
    // 
    if ((!commonX && !commonY) || 
	(commonX  && commonY)) {
    // Portrait:
    //    +----------+----------+
    //    | 1: FMD1i | 2: Free  |
    //    +----------+----------+
    //    | 3: FMD2i | 4: FMD2o |
    //    +----------+----------+
    //    | 5: FMD3i | 6: FMD3o |
    //    +----------+----------+
    // 
    // Landscape:
    //    +----------+----------+----------+
    //    | 1: FMD1i | 2: FMD2i | 3: FMD3i |
    //    +----------+----------+----------+
    //    | 4: Free  | 5: FMD2o | 6: FMD3o |
    //    +----------+----------+----------+
    // 
      fBody->Divide(fLandscape ? 3 : 2, fLandscape ? 2 : 3,
		    commonX ? 0 : 0.01, commonY ? 0 : 0.01);
      fRingMap[0] = fBody->GetPad(1);                  // FMD1i;
      fRingMap[1] = fBody->GetPad(fLandscape ? 2 : 3); // FMD2i;
      fRingMap[2] = fBody->GetPad(fLandscape ? 5 : 4); // FMD2o;
      fRingMap[3] = fBody->GetPad(fLandscape ? 3 : 5); // FMD3i;
      fRingMap[4] = fBody->GetPad(6);                  // FMD3o;
      fRingMap[5] = fBody->GetPad(fLandscape ? 4 : 2); // Free
    }
    else if (commonX && !commonY) {
      // Divide into two  - left/right
      // Portrait:
      //    +----------++----------+
      //    | 1: FMD1i || 1: Free  |
      //    +----------++----------+
      //    | 2: FMD2i || 2: FMD2o |
      //    +----------++----------+
      //    | 3: FMD3i || 3: FMD3o |
      //    +----------++----------+
      // 
      // Landscape:
      //    +----------++----------++----------+
      //    | 1: FMD1i || 1: FMD2i || 1: FMD3i |
      //    +----------++----------++----------+
      //    | 2: Free  || 2: FMD2o || 2: FMD3o |
      //    +----------++----------++----------+
      // 
      fBody->Divide(fLandscape ? 3 : 2, 1);
      TVirtualPad* left = fBody->cd(1);
      left->Divide(fLandscape ? 2 : 3);
      TVirtualPad* middle = fBody->cd(2);
      middle->Divide(fLandscape ? 2 : 3);

      Info("left","%p",left); left->ls();
      Info("middle","%p",middle); middle->ls();

      fRingMap[0] = left->GetPad(1); // FMD1i;
      if (!fLandscape) {
	fRingMap[1] = left->GetPad(2);   // FMD2i
	fRingMap[2] = middle->GetPad(2); // FMD2o
	fRingMap[3] = left->GetPad(3);   // FMD3i
	fRingMap[4] = middle->GetPad(3); // FMD3o
	fRingMap[5] = middle->GetPad(1); // Free
      }
      else {
	TVirtualPad* right = fBody->cd(3);
	right->Divide(fLandscape ? 2 : 3);
	fRingMap[1] = middle->GetPad(1); // FMD2i
	fRingMap[2] = middle->GetPad(2); // FMD2o
	fRingMap[3] = right->GetPad(1);  // FMD3i
	fRingMap[4] = right->GetPad(2);  // FMD3o
	fRingMap[5] = left->GetPad(2);   // Free
      }
    }
    else { 
      // Divide into two  - left/right
      // Portrait:
      //    +----------+----------+
      //    | 1: FMD1i | 2: Free  |
      //    +----------+----------+
      //    +----------+----------+
      //    | 1: FMD2i | 2: FMD2o |
      //    +----------+----------+
      //    +----------+----------+
      //    | 1: FMD3i | 2: FMD3o |
      //    +----------+----------+
      // 
      // Landscape:
      //    +----------+----------+----------+
      //    | 1: FMD1i | 2: FMD2i | 3: FMD3i |
      //    +----------+----------+----------+
      //    +----------+----------+----------+
      //    | 1: Free  | 2: FMD2o | 3: FMD3o |
      //    +----------+----------+----------+
      // 
      fBody->Divide(1, fLandscape ? 2 : 3);
      TVirtualPad* top = fBody->cd(1);
      top->Divide(fLandscape ? 3 : 2);
      TVirtualPad* middle = fBody->cd(2);
      middle->Divide(fLandscape ? 3 : 2);

      fRingMap[0] = top->GetPad(1); // FMD1i;
      if (!fLandscape) {
	TVirtualPad* bottom = fBody->cd(2);
	bottom->Divide(2);

	fRingMap[1] = middle->GetPad(1); // FMD2i
	fRingMap[2] = middle->GetPad(2); // FMD2o
	fRingMap[3] = bottom->GetPad(1); // FMD3i
	fRingMap[4] = bottom->GetPad(2); // FMD3o
	fRingMap[5] = top->GetPad(2);    // Free
      }
      else {
	fRingMap[1] = top->GetPad(2);    // FMD2i
	fRingMap[2] = middle->GetPad(2); // FMD2o
	fRingMap[3] = top->GetPad(3);    // FMD3i
	fRingMap[4] = middle->GetPad(3); // FMD3o
	fRingMap[5] = middle->GetPad(1); // Free
      }
    }
    if (fRingMap[0]) fRingMap[0]->SetTitle("FMD1i");
    if (fRingMap[1]) fRingMap[1]->SetTitle("FMD2i");
    if (fRingMap[2]) fRingMap[2]->SetTitle("FMD2o");
    if (fRingMap[3]) fRingMap[3]->SetTitle("FMD3i");
    if (fRingMap[4]) fRingMap[4]->SetTitle("FMD3o");
    if (fRingMap[5]) fRingMap[5]->SetTitle("Other");
  }
  //__________________________________________________________________
  TVirtualPad* RingPad(UShort_t d, Char_t r) const
  {
    Int_t idx = 0;
    switch (d) { 
    case 0:     idx = 5; break;
    case 1:     idx = 0; break;
    case 2:     idx = 1 + ((r == 'I' || r == 'i') ? 0 : 1); break;
    case 3:     idx = 3 + ((r == 'I' || r == 'i') ? 0 : 1); break;
    default: return 0;
    }
    return fRingMap[idx];
    // return fBody->GetPad(no);
  }
  //__________________________________________________________________
  TVirtualPad* RingPad(const char* name) const
  {
    TString n(name);
    Int_t idx = n.Index("FMD");
    if (n == kNPOS) return 0;
    n.Remove(0, idx+3);
    Int_t det = n.Atoi();
    n.Remove(0,1);
    Char_t rng = n[0];
    return RingPad(det, rng);
  }
  //__________________________________________________________________
  /** 
   * Draw an object in pad 
   * 
   * @param d       Detector 
   * @param r       Ring 
   * @param h       Object to draw 
   * @param opts    Options
   * @param flags   Flags
   * @param title   Title on plot
   */
  void DrawInRingPad(UShort_t    d, 
		     Char_t      r, 
		     TObject*    h, 
		     Option_t*   opts="",
		     UShort_t    flags=0x0,
		     const char* title="")
  {
    TVirtualPad* p = RingPad(d, r);
    if (!p) {
      Warning("DrawInRingPad", "No pad found for FMD%d%c", d, r);
      return;
    }
    DrawInPad(p, h, opts, flags, title);
  }
  /** 
   * Draw object in a ring pad
   * 
   * @param name    Name of ring
   * @param h       Object to draw
   * @param opts    Options
   * @param flags   Flags
   * @param title   Possible new title
   */
  void DrawInRingPad(const char* name, 
		     TObject*    h, 
		     Option_t*   opts="", 
		     UShort_t    flags=0x0, 
		     const char* title="")
  {
    TVirtualPad* p = RingPad(name);
    if (!p) {
      Warning("DrawInRingPad", "No pad found for \"%s\"", name);
      return;
    }
    DrawInPad(p, h, opts, flags, title);
  }
  /** 
   * Draw object in a ring pad. Which pad to draw in depends on the
   * name or title of the drawn object (must contain the ring name as
   * a sub-string).
   * 
   * @param h       Object to draw
   * @param opts    Options
   * @param flags   Flags
   * @param title   Possible new title
   */
  void DrawInRingPad(TObject*    h, 
		     Option_t*   opts="", 
		     UShort_t    flags=0x0, 
		     const char* title="")
  {
    if (!h) return;
    TVirtualPad* p = RingPad(h->GetName());
    if (!p) {
      p = RingPad(h->GetTitle());
      if (!p) {
	Warning("DrawInRingPad", "No pad found for %s/%s", 
		h->GetName(), h->GetTitle());
	return;
      }
    }
    DrawInPad(p, h, opts, flags, title);
  }
    

  //__________________________________________________________________
  /** 
   * Pause after each plot
   * 
   */
  void Pause()
  {
    if (!fPause) return;
    printf("Press enter to continue");
    std::cin.get();
  }
  static void CompileScript(const TString& name, 
			    const TString& sub, 
			    const TString& check,
			    Bool_t         force)
  {
    if (!check.IsNull() && gROOT->GetClass(check)) return;

    TString fwd =gSystem->ExpandPathName("$ALICE_ROOT/PWGLF/FORWARD/analysis2");
    TString macPath(gROOT->GetMacroPath());
    TString incPath(gSystem->GetIncludePath());
    if (!macPath.Contains(fwd)) macPath.Append(Form(":%s", fwd.Data()));
    if (!incPath.Contains(fwd)) gSystem->AddIncludePath(Form("-I%s",
							     fwd.Data()));
    if (!sub.IsNull()) { 
      TObjArray* subs = sub.Tokenize(": ");
      TObject*   pSub = 0;
      TIter      iSub(subs);
      while ((pSub = iSub())) {
	TString subDir = gSystem->ConcatFileName(fwd, pSub->GetName());
	if (!macPath.Contains(subDir))
	  macPath.Append(Form(":%s", subDir.Data()));
	if (!incPath.Contains(subDir)) 
	  gSystem->AddIncludePath(Form("-I%s", subDir.Data()));
      }
    }
    gROOT->SetMacroPath(macPath);
    gROOT->LoadMacro(Form("%s%s", name.Data(), (force ? "++g" : "+")));
  }
  //____________________________________________________________________
  virtual void DrawEventInspector(TCollection* parent)
  {
    Info("DrawEventInspector", "Drawing event inspector");
    TCollection* c = GetCollection(parent, "fmdEventInspector");
    if (!c) return;

    UShort_t sys=0, sNN=0;
    Int_t field=0;
    ULong_t runNo=0;
    Int_t lowFlux=0, nPileUp=0, ipMethod=0;
    ULong_t aliRev=0, aliBra=0;    
    Bool_t v0and=false;
    Double_t dPileUp=0.;
    Double_t y = .8;

    fBody->cd();

    Double_t save = fParName->GetTextSize();
    fParName->SetTextSize(0.03);
    fParVal->SetTextSize(0.03);
    
    GetParameter(c, "sys", sys);
    GetParameter(c, "sNN", sNN);
    GetParameter(c, "field", field);
    GetParameter(c, "runNo", runNo);
    GetParameter(c, "lowFlux", lowFlux);
    GetParameter(c, "ipMethod", ipMethod, false);
    GetParameter(c, "v0and", v0and);
    GetParameter(c, "nPileUp", nPileUp);
    GetParameter(c, "dPileup", dPileUp);
    GetParameter(c, "alirootRev", aliRev);
    GetParameter(c, "alirootBranch", aliBra);
    
    TString tS; SysString(sys, tS); DrawParameter(y, "System", tS);
    TString tE; SNNString(sNN, tE); DrawParameter(y, "#sqrt{s_{NN}}", tE);
    DrawParameter(y, "L3 B field", Form("%+2dkG", field));
    DrawParameter(y, "Run #", Form("%lu", runNo));
    DrawParameter(y, "Low flux cut", Form("%d", lowFlux));
    TString sIpMeth("unknown");
    switch(ipMethod) { 
    case 0: sIpMeth = "Normal"; break;
    case 1: sIpMeth = "pA in 2012"; break;
    case 2: sIpMeth = "pA in 2013"; break;
    case 3: sIpMeth = "PWG-UD"; break;
    case 4: sIpMeth = "Satellite"; break;
    }
    DrawParameter(y, "Use PWG-UD vertex", sIpMeth);
    DrawParameter(y, "Use V0AND for NSD", (v0and ? "yes" : "no"));
    DrawParameter(y, "Least # of pile-up vertex", Form("%d", nPileUp));
    DrawParameter(y, "Least distance of pile-up vertex",
		  Form("%fcm", dPileUp));
    DrawParameter(y, "AliROOT", Form("%lu/0x%08lx", ULong_t(aliRev), 
				     ULong_t(aliBra)));

    TH1*    triggers     = GetH1(c, "triggers");
    TH1*    vertex       = GetH1(c, "vertex", false);
    Bool_t  mc           = (vertex != 0);
    if (mc) { 
      Int_t nInelMC = vertex->GetEntries();
      Int_t nInel   = triggers->GetBinContent(1);
      Int_t nNSDMC  = triggers->GetBinContent(11);
      Int_t nNSD    = triggers->GetBinContent(4);
      DrawParameter(y, 
		    Form("#varepsilon_{INEL} = #bf{%d/%d}", nInel, nInelMC),
		    Form("%5.3f", float(nInel)/nInelMC));
      DrawParameter(y, 
		    Form("#varepsilon_{NSD} = #bf{%d/%d}", nNSD, nNSDMC),
		    Form("%5.3f", float(nNSD)/nNSDMC));
    }

    PrintCanvas("Event Inspector");
    fParName->SetTextSize(save);
    fParVal->SetTextSize(save);

    if (fLandscape) fBody->Divide(4,2);
    else            fBody->Divide(2,4);
    
    TH1*    nEventsTr    = GetH1(c, "nEventsTr");
    TH1*    nEventsTrVtx = GetH1(c, "nEventsTrVtx");
    TH1*    nEventsAcc   = GetH1(c, "nEventsAccepted");
    if (nEventsTr)    nEventsTr->Rebin(2);
    if (nEventsTrVtx) nEventsTrVtx->Rebin(2);
    if (vertex) {
      // vertex->Rebin(2);
      vertex->SetFillColor(kMagenta+2);
    }
    DrawInPad(fBody, 1, nEventsTr, "", kLogy, 
	      "Events w/trigger, trigger+vertex, accepted");
    if (vertex) DrawInPad(fBody, 1, vertex, "same");
    DrawInPad(fBody, 1, nEventsTrVtx, "same"); 
    DrawInPad(fBody, 1, nEventsAcc, "same", kLegend);


    DrawInPad(fBody, 2, GetH2(c, "nEventsAcceptedXY"), "colz", kLogz);
    DrawInPad(fBody, 3, triggers,          "hist text");
    if (GetH1(c, "trgStatus"))
      DrawInPad(fBody, 4, GetH1(c, "trgStatus"),       "hist text");
    else  // Old one 
      DrawInPad(fBody, 4, GetH2(c, "triggerCorr"),     "colz", kLogz);
    DrawInPad(fBody, 5, GetH1(c, "status"),            "hist text");
    if (GetH1(c, "vtxStatus"))
      DrawInPad(fBody, 6, GetH1(c, "vtxStatus"),       "hist text");
    else // old 
      DrawInPad(fBody, 6, GetH1(c, "type"),            "hist text");

    TH1* cent     = GetH1(c, "cent");
    if (cent) { 
      cent->Scale(1, "width");
      DrawInPad(fBody, 7, cent, "", kLogy);
    }

    TH1* pileupStatus = GetH1(c, "pileupStatus", false);
    if (pileupStatus) DrawInPad(fBody, 8, pileupStatus, "hist text30");
    else {
      TH2* centQual = GetH2(c, "centVsQuality");
      if (centQual) { 
	centQual->Scale(1, "width");
	DrawInPad(fBody, 8, centQual, "colz", kLogz);
      }
    }
    
    PrintCanvas("EventInspector - Histograms");  

    if (!mc) return; // not MC 
  
    TH1* phiR         = GetH1(c, "phiR");
    TH1* b            = GetH1(c, "b");
    TH2* bVsNpart     = GetH2(c, "bVsParticipants");
    TH2* bVsNbin      = GetH2(c, "bVsBinary");
    TH2* bVsCent      = GetH2(c, "bVsCentrality");
    TH2* vzComparison = GetH2(c, "vzComparison");
    TH2* centVsNpart  = GetH2(c, "centralityVsParticipans");// Spelling!
    TH2* centVsNbin   = GetH2(c, "centralityVsBinary");
  
    fBody->Divide(2,3);

    DrawInPad(fBody, 1, phiR);
    DrawInPad(fBody, 2, vzComparison, "colz", kLogz);
    DrawInPad(fBody, 3, b);

    TProfile* nPartB = bVsNpart->ProfileX("nPartB",1,-1,"s");
    TProfile* nBinB  = bVsNbin->ProfileX("nBinB",1,-1,"s");
    nPartB->SetMarkerColor(kBlue+2);
    nPartB->SetMarkerStyle(20);
    nPartB->SetLineColor(kBlue+2);
    nPartB->SetFillColor(kBlue-10);
    nPartB->SetFillStyle(1001);
    nPartB->SetMarkerSize(0.7);
    nBinB->SetMarkerColor(kRed+2);
    nBinB->SetMarkerStyle(21);
    nBinB->SetLineColor(kRed+2);
    nBinB->SetFillColor(kRed-10);
    nBinB->SetMarkerSize(0.7);
    nBinB->SetFillStyle(1001);

    DrawTwoInPad(fBody, 4, nPartB, nBinB, "e3 p", kLegend);

    DrawInPad(fBody, 5, bVsCent, "colz", kLogz);

    TProfile* nPartC = centVsNpart->ProfileY("nPartC",1,-1,"s");
    TProfile* nBinC  = centVsNbin->ProfileY("nBinC",1,-1,"s");
    nPartC->SetMarkerColor(kBlue+2);
    nPartC->SetMarkerStyle(20);
    nPartC->SetLineColor(kBlue+2);
    nPartC->SetFillColor(kBlue-10);
    nPartC->SetFillStyle(1001);
    nPartC->SetMarkerSize(0.7);
    nBinC->SetMarkerColor(kRed+2);
    nBinC->SetMarkerStyle(21);
    nBinC->SetLineColor(kRed+2);
    nBinC->SetFillColor(kRed-10);
    nBinC->SetMarkerSize(0.7);
    nBinC->SetFillStyle(1001);

    DrawTwoInPad(fBody, 6, nPartC, nBinC, "e3 p", kLegend);

    PrintCanvas("EventInspector - Monte-Carlo");  
  }
  //____________________________________________________________________
  virtual void DrawESDFixer(TCollection* parent)
  {
    Info("DrawESDFixer", "Drawing ESD fixer");
    TCollection* c = GetCollection(parent, "fmdESDFixer");
    if (!c) return;

    Int_t  recoFactor = 0;
    Bool_t recalcEta = false;
    Bool_t invalidIsEmpty = false;

    fBody->cd();

    Double_t save = fParName->GetTextSize();
    fParName->SetTextSize(0.05);
    fParVal->SetTextSize(0.05);

    fBody->Divide(2,2);
    fBody->cd(1);
    
    Double_t y = .8;
    if (GetParameter(c, "recoFactor", recoFactor))
	DrawParameter(y, "Noise factor used in reco",
		      Form("%d (assumed)", recoFactor));
    if (GetParameter(c, "recalcEta", recalcEta))
	DrawParameter(y, "Recalculate #eta",
		      Form("%s", (recalcEta ? "yes" : "no")));
    if (GetParameter(c, "invalidIsEmpty", invalidIsEmpty))
	DrawParameter(y, "Assume invalid strips are empty",
		      Form("%s", (invalidIsEmpty ? "yes" : "no")));

    TCollection* xd = GetCollection(c, "extraDead");
    if (xd) 
      DrawParameter(y, "# extra dead strips", 
		    Form("%d", xd->GetEntries()));
    
    DrawInPad(fBody, 2, GetH1(c, "noiseChange"), "", kLogy);
    DrawInPad(fBody, 3, GetH1(c, "etaChange"), "", kLogy);
    DrawInPad(fBody, 4, GetH1(c, "deadChange"), "", kLogy);
	
    PrintCanvas("ESD Fixer");
    fParName->SetTextSize(save);
    fParVal->SetTextSize(save);
  }
  //____________________________________________________________________
  void DrawTrackDensity(TCollection* parent, 
			const char* folderName="mcTrackDensity")
  {
    Info("DrawTrackDensity", "Drawing track density");

    // --- MC --------------------------------------------------------
    TCollection* mc = GetCollection(parent, folderName, false);
    if (!mc) return; // Not MC 

    fBody->Divide(2,3);
    DrawInPad(fBody, 1, GetH2(mc, "binFlow"),    "colz", kLogz);
    DrawInPad(fBody, 2, GetH2(mc, "binFlowEta"), "colz", kLogz);
    DrawInPad(fBody, 3, GetH2(mc, "binFlowPhi"), "colz", kLogz);
    DrawInPad(fBody, 4, GetH1(mc, "nRefs"),       "",    kLogy,
	      "# of references");
    DrawInPad(fBody, 4, GetH1(mc, "clusterRefs",   false), "same");
    DrawInPad(fBody, 4, GetH1(mc, "clusterSize",   false), "same");
    DrawInPad(fBody, 4, GetH1(mc, "nClusters",     false), "same", kLegend);
    DrawInPad(fBody, 5, GetH2(mc, "clusterVsRefs", false),"colz", kLogz);

    PrintCanvas("Track density");  
  }
  //__________________________________________________________________
  TCanvas* fCanvas;  // Our canvas 
  TPad*    fTop;     // Top part 
  TPad*    fBody;    // Body part 
  TLatex*  fHeader;  // Header text 
  TLatex*  fParName; // Parameter name 
  TLatex*  fParVal;  // Parameter value 
  Bool_t   fPause;   // Whether to pause after drawing a canvas
  Bool_t   fLandscape; // Landscape or Portrait orientation
  TVirtualPad** fRingMap;
  Bool_t   fPDF;
  TString  fLastTitle;
};
#if 0
template <> 
inline Bool_t 
SummaryDrawer::DoGetParameter<Double_t>(TObject* o, const TObject* p, 
					Double_t& value)
{
  TParameter<Double_t>* r = DoGetObject<TParameter<Double_t>(o, p);
  UInt_t  i = o->GetUniqueID();
  Float_t v = *reinterpret_cast<Float_t*>(&i);
  value = v;
  return true;
}
#endif
inline Bool_t 
SummaryDrawer::GetParameter(const TObject*   c, 
			    const TString&   name, 
			    Double_t&        value,
			    Bool_t           verb)
  
{
  return DoGetParameter(GetObject(c, name, verb), c, value);
}

#endif
//
// EOF
//

 SummaryDrawer.C:1
 SummaryDrawer.C:2
 SummaryDrawer.C:3
 SummaryDrawer.C:4
 SummaryDrawer.C:5
 SummaryDrawer.C:6
 SummaryDrawer.C:7
 SummaryDrawer.C:8
 SummaryDrawer.C:9
 SummaryDrawer.C:10
 SummaryDrawer.C:11
 SummaryDrawer.C:12
 SummaryDrawer.C:13
 SummaryDrawer.C:14
 SummaryDrawer.C:15
 SummaryDrawer.C:16
 SummaryDrawer.C:17
 SummaryDrawer.C:18
 SummaryDrawer.C:19
 SummaryDrawer.C:20
 SummaryDrawer.C:21
 SummaryDrawer.C:22
 SummaryDrawer.C:23
 SummaryDrawer.C:24
 SummaryDrawer.C:25
 SummaryDrawer.C:26
 SummaryDrawer.C:27
 SummaryDrawer.C:28
 SummaryDrawer.C:29
 SummaryDrawer.C:30
 SummaryDrawer.C:31
 SummaryDrawer.C:32
 SummaryDrawer.C:33
 SummaryDrawer.C:34
 SummaryDrawer.C:35
 SummaryDrawer.C:36
 SummaryDrawer.C:37
 SummaryDrawer.C:38
 SummaryDrawer.C:39
 SummaryDrawer.C:40
 SummaryDrawer.C:41
 SummaryDrawer.C:42
 SummaryDrawer.C:43
 SummaryDrawer.C:44
 SummaryDrawer.C:45
 SummaryDrawer.C:46
 SummaryDrawer.C:47
 SummaryDrawer.C:48
 SummaryDrawer.C:49
 SummaryDrawer.C:50
 SummaryDrawer.C:51
 SummaryDrawer.C:52
 SummaryDrawer.C:53
 SummaryDrawer.C:54
 SummaryDrawer.C:55
 SummaryDrawer.C:56
 SummaryDrawer.C:57
 SummaryDrawer.C:58
 SummaryDrawer.C:59
 SummaryDrawer.C:60
 SummaryDrawer.C:61
 SummaryDrawer.C:62
 SummaryDrawer.C:63
 SummaryDrawer.C:64
 SummaryDrawer.C:65
 SummaryDrawer.C:66
 SummaryDrawer.C:67
 SummaryDrawer.C:68
 SummaryDrawer.C:69
 SummaryDrawer.C:70
 SummaryDrawer.C:71
 SummaryDrawer.C:72
 SummaryDrawer.C:73
 SummaryDrawer.C:74
 SummaryDrawer.C:75
 SummaryDrawer.C:76
 SummaryDrawer.C:77
 SummaryDrawer.C:78
 SummaryDrawer.C:79
 SummaryDrawer.C:80
 SummaryDrawer.C:81
 SummaryDrawer.C:82
 SummaryDrawer.C:83
 SummaryDrawer.C:84
 SummaryDrawer.C:85
 SummaryDrawer.C:86
 SummaryDrawer.C:87
 SummaryDrawer.C:88
 SummaryDrawer.C:89
 SummaryDrawer.C:90
 SummaryDrawer.C:91
 SummaryDrawer.C:92
 SummaryDrawer.C:93
 SummaryDrawer.C:94
 SummaryDrawer.C:95
 SummaryDrawer.C:96
 SummaryDrawer.C:97
 SummaryDrawer.C:98
 SummaryDrawer.C:99
 SummaryDrawer.C:100
 SummaryDrawer.C:101
 SummaryDrawer.C:102
 SummaryDrawer.C:103
 SummaryDrawer.C:104
 SummaryDrawer.C:105
 SummaryDrawer.C:106
 SummaryDrawer.C:107
 SummaryDrawer.C:108
 SummaryDrawer.C:109
 SummaryDrawer.C:110
 SummaryDrawer.C:111
 SummaryDrawer.C:112
 SummaryDrawer.C:113
 SummaryDrawer.C:114
 SummaryDrawer.C:115
 SummaryDrawer.C:116
 SummaryDrawer.C:117
 SummaryDrawer.C:118
 SummaryDrawer.C:119
 SummaryDrawer.C:120
 SummaryDrawer.C:121
 SummaryDrawer.C:122
 SummaryDrawer.C:123
 SummaryDrawer.C:124
 SummaryDrawer.C:125
 SummaryDrawer.C:126
 SummaryDrawer.C:127
 SummaryDrawer.C:128
 SummaryDrawer.C:129
 SummaryDrawer.C:130
 SummaryDrawer.C:131
 SummaryDrawer.C:132
 SummaryDrawer.C:133
 SummaryDrawer.C:134
 SummaryDrawer.C:135
 SummaryDrawer.C:136
 SummaryDrawer.C:137
 SummaryDrawer.C:138
 SummaryDrawer.C:139
 SummaryDrawer.C:140
 SummaryDrawer.C:141
 SummaryDrawer.C:142
 SummaryDrawer.C:143
 SummaryDrawer.C:144
 SummaryDrawer.C:145
 SummaryDrawer.C:146
 SummaryDrawer.C:147
 SummaryDrawer.C:148
 SummaryDrawer.C:149
 SummaryDrawer.C:150
 SummaryDrawer.C:151
 SummaryDrawer.C:152
 SummaryDrawer.C:153
 SummaryDrawer.C:154
 SummaryDrawer.C:155
 SummaryDrawer.C:156
 SummaryDrawer.C:157
 SummaryDrawer.C:158
 SummaryDrawer.C:159
 SummaryDrawer.C:160
 SummaryDrawer.C:161
 SummaryDrawer.C:162
 SummaryDrawer.C:163
 SummaryDrawer.C:164
 SummaryDrawer.C:165
 SummaryDrawer.C:166
 SummaryDrawer.C:167
 SummaryDrawer.C:168
 SummaryDrawer.C:169
 SummaryDrawer.C:170
 SummaryDrawer.C:171
 SummaryDrawer.C:172
 SummaryDrawer.C:173
 SummaryDrawer.C:174
 SummaryDrawer.C:175
 SummaryDrawer.C:176
 SummaryDrawer.C:177
 SummaryDrawer.C:178
 SummaryDrawer.C:179
 SummaryDrawer.C:180
 SummaryDrawer.C:181
 SummaryDrawer.C:182
 SummaryDrawer.C:183
 SummaryDrawer.C:184
 SummaryDrawer.C:185
 SummaryDrawer.C:186
 SummaryDrawer.C:187
 SummaryDrawer.C:188
 SummaryDrawer.C:189
 SummaryDrawer.C:190
 SummaryDrawer.C:191
 SummaryDrawer.C:192
 SummaryDrawer.C:193
 SummaryDrawer.C:194
 SummaryDrawer.C:195
 SummaryDrawer.C:196
 SummaryDrawer.C:197
 SummaryDrawer.C:198
 SummaryDrawer.C:199
 SummaryDrawer.C:200
 SummaryDrawer.C:201
 SummaryDrawer.C:202
 SummaryDrawer.C:203
 SummaryDrawer.C:204
 SummaryDrawer.C:205
 SummaryDrawer.C:206
 SummaryDrawer.C:207
 SummaryDrawer.C:208
 SummaryDrawer.C:209
 SummaryDrawer.C:210
 SummaryDrawer.C:211
 SummaryDrawer.C:212
 SummaryDrawer.C:213
 SummaryDrawer.C:214
 SummaryDrawer.C:215
 SummaryDrawer.C:216
 SummaryDrawer.C:217
 SummaryDrawer.C:218
 SummaryDrawer.C:219
 SummaryDrawer.C:220
 SummaryDrawer.C:221
 SummaryDrawer.C:222
 SummaryDrawer.C:223
 SummaryDrawer.C:224
 SummaryDrawer.C:225
 SummaryDrawer.C:226
 SummaryDrawer.C:227
 SummaryDrawer.C:228
 SummaryDrawer.C:229
 SummaryDrawer.C:230
 SummaryDrawer.C:231
 SummaryDrawer.C:232
 SummaryDrawer.C:233
 SummaryDrawer.C:234
 SummaryDrawer.C:235
 SummaryDrawer.C:236
 SummaryDrawer.C:237
 SummaryDrawer.C:238
 SummaryDrawer.C:239
 SummaryDrawer.C:240
 SummaryDrawer.C:241
 SummaryDrawer.C:242
 SummaryDrawer.C:243
 SummaryDrawer.C:244
 SummaryDrawer.C:245
 SummaryDrawer.C:246
 SummaryDrawer.C:247
 SummaryDrawer.C:248
 SummaryDrawer.C:249
 SummaryDrawer.C:250
 SummaryDrawer.C:251
 SummaryDrawer.C:252
 SummaryDrawer.C:253
 SummaryDrawer.C:254
 SummaryDrawer.C:255
 SummaryDrawer.C:256
 SummaryDrawer.C:257
 SummaryDrawer.C:258
 SummaryDrawer.C:259
 SummaryDrawer.C:260
 SummaryDrawer.C:261
 SummaryDrawer.C:262
 SummaryDrawer.C:263
 SummaryDrawer.C:264
 SummaryDrawer.C:265
 SummaryDrawer.C:266
 SummaryDrawer.C:267
 SummaryDrawer.C:268
 SummaryDrawer.C:269
 SummaryDrawer.C:270
 SummaryDrawer.C:271
 SummaryDrawer.C:272
 SummaryDrawer.C:273
 SummaryDrawer.C:274
 SummaryDrawer.C:275
 SummaryDrawer.C:276
 SummaryDrawer.C:277
 SummaryDrawer.C:278
 SummaryDrawer.C:279
 SummaryDrawer.C:280
 SummaryDrawer.C:281
 SummaryDrawer.C:282
 SummaryDrawer.C:283
 SummaryDrawer.C:284
 SummaryDrawer.C:285
 SummaryDrawer.C:286
 SummaryDrawer.C:287
 SummaryDrawer.C:288
 SummaryDrawer.C:289
 SummaryDrawer.C:290
 SummaryDrawer.C:291
 SummaryDrawer.C:292
 SummaryDrawer.C:293
 SummaryDrawer.C:294
 SummaryDrawer.C:295
 SummaryDrawer.C:296
 SummaryDrawer.C:297
 SummaryDrawer.C:298
 SummaryDrawer.C:299
 SummaryDrawer.C:300
 SummaryDrawer.C:301
 SummaryDrawer.C:302
 SummaryDrawer.C:303
 SummaryDrawer.C:304
 SummaryDrawer.C:305
 SummaryDrawer.C:306
 SummaryDrawer.C:307
 SummaryDrawer.C:308
 SummaryDrawer.C:309
 SummaryDrawer.C:310
 SummaryDrawer.C:311
 SummaryDrawer.C:312
 SummaryDrawer.C:313
 SummaryDrawer.C:314
 SummaryDrawer.C:315
 SummaryDrawer.C:316
 SummaryDrawer.C:317
 SummaryDrawer.C:318
 SummaryDrawer.C:319
 SummaryDrawer.C:320
 SummaryDrawer.C:321
 SummaryDrawer.C:322
 SummaryDrawer.C:323
 SummaryDrawer.C:324
 SummaryDrawer.C:325
 SummaryDrawer.C:326
 SummaryDrawer.C:327
 SummaryDrawer.C:328
 SummaryDrawer.C:329
 SummaryDrawer.C:330
 SummaryDrawer.C:331
 SummaryDrawer.C:332
 SummaryDrawer.C:333
 SummaryDrawer.C:334
 SummaryDrawer.C:335
 SummaryDrawer.C:336
 SummaryDrawer.C:337
 SummaryDrawer.C:338
 SummaryDrawer.C:339
 SummaryDrawer.C:340
 SummaryDrawer.C:341
 SummaryDrawer.C:342
 SummaryDrawer.C:343
 SummaryDrawer.C:344
 SummaryDrawer.C:345
 SummaryDrawer.C:346
 SummaryDrawer.C:347
 SummaryDrawer.C:348
 SummaryDrawer.C:349
 SummaryDrawer.C:350
 SummaryDrawer.C:351
 SummaryDrawer.C:352
 SummaryDrawer.C:353
 SummaryDrawer.C:354
 SummaryDrawer.C:355
 SummaryDrawer.C:356
 SummaryDrawer.C:357
 SummaryDrawer.C:358
 SummaryDrawer.C:359
 SummaryDrawer.C:360
 SummaryDrawer.C:361
 SummaryDrawer.C:362
 SummaryDrawer.C:363
 SummaryDrawer.C:364
 SummaryDrawer.C:365
 SummaryDrawer.C:366
 SummaryDrawer.C:367
 SummaryDrawer.C:368
 SummaryDrawer.C:369
 SummaryDrawer.C:370
 SummaryDrawer.C:371
 SummaryDrawer.C:372
 SummaryDrawer.C:373
 SummaryDrawer.C:374
 SummaryDrawer.C:375
 SummaryDrawer.C:376
 SummaryDrawer.C:377
 SummaryDrawer.C:378
 SummaryDrawer.C:379
 SummaryDrawer.C:380
 SummaryDrawer.C:381
 SummaryDrawer.C:382
 SummaryDrawer.C:383
 SummaryDrawer.C:384
 SummaryDrawer.C:385
 SummaryDrawer.C:386
 SummaryDrawer.C:387
 SummaryDrawer.C:388
 SummaryDrawer.C:389
 SummaryDrawer.C:390
 SummaryDrawer.C:391
 SummaryDrawer.C:392
 SummaryDrawer.C:393
 SummaryDrawer.C:394
 SummaryDrawer.C:395
 SummaryDrawer.C:396
 SummaryDrawer.C:397
 SummaryDrawer.C:398
 SummaryDrawer.C:399
 SummaryDrawer.C:400
 SummaryDrawer.C:401
 SummaryDrawer.C:402
 SummaryDrawer.C:403
 SummaryDrawer.C:404
 SummaryDrawer.C:405
 SummaryDrawer.C:406
 SummaryDrawer.C:407
 SummaryDrawer.C:408
 SummaryDrawer.C:409
 SummaryDrawer.C:410
 SummaryDrawer.C:411
 SummaryDrawer.C:412
 SummaryDrawer.C:413
 SummaryDrawer.C:414
 SummaryDrawer.C:415
 SummaryDrawer.C:416
 SummaryDrawer.C:417
 SummaryDrawer.C:418
 SummaryDrawer.C:419
 SummaryDrawer.C:420
 SummaryDrawer.C:421
 SummaryDrawer.C:422
 SummaryDrawer.C:423
 SummaryDrawer.C:424
 SummaryDrawer.C:425
 SummaryDrawer.C:426
 SummaryDrawer.C:427
 SummaryDrawer.C:428
 SummaryDrawer.C:429
 SummaryDrawer.C:430
 SummaryDrawer.C:431
 SummaryDrawer.C:432
 SummaryDrawer.C:433
 SummaryDrawer.C:434
 SummaryDrawer.C:435
 SummaryDrawer.C:436
 SummaryDrawer.C:437
 SummaryDrawer.C:438
 SummaryDrawer.C:439
 SummaryDrawer.C:440
 SummaryDrawer.C:441
 SummaryDrawer.C:442
 SummaryDrawer.C:443
 SummaryDrawer.C:444
 SummaryDrawer.C:445
 SummaryDrawer.C:446
 SummaryDrawer.C:447
 SummaryDrawer.C:448
 SummaryDrawer.C:449
 SummaryDrawer.C:450
 SummaryDrawer.C:451
 SummaryDrawer.C:452
 SummaryDrawer.C:453
 SummaryDrawer.C:454
 SummaryDrawer.C:455
 SummaryDrawer.C:456
 SummaryDrawer.C:457
 SummaryDrawer.C:458
 SummaryDrawer.C:459
 SummaryDrawer.C:460
 SummaryDrawer.C:461
 SummaryDrawer.C:462
 SummaryDrawer.C:463
 SummaryDrawer.C:464
 SummaryDrawer.C:465
 SummaryDrawer.C:466
 SummaryDrawer.C:467
 SummaryDrawer.C:468
 SummaryDrawer.C:469
 SummaryDrawer.C:470
 SummaryDrawer.C:471
 SummaryDrawer.C:472
 SummaryDrawer.C:473
 SummaryDrawer.C:474
 SummaryDrawer.C:475
 SummaryDrawer.C:476
 SummaryDrawer.C:477
 SummaryDrawer.C:478
 SummaryDrawer.C:479
 SummaryDrawer.C:480
 SummaryDrawer.C:481
 SummaryDrawer.C:482
 SummaryDrawer.C:483
 SummaryDrawer.C:484
 SummaryDrawer.C:485
 SummaryDrawer.C:486
 SummaryDrawer.C:487
 SummaryDrawer.C:488
 SummaryDrawer.C:489
 SummaryDrawer.C:490
 SummaryDrawer.C:491
 SummaryDrawer.C:492
 SummaryDrawer.C:493
 SummaryDrawer.C:494
 SummaryDrawer.C:495
 SummaryDrawer.C:496
 SummaryDrawer.C:497
 SummaryDrawer.C:498
 SummaryDrawer.C:499
 SummaryDrawer.C:500
 SummaryDrawer.C:501
 SummaryDrawer.C:502
 SummaryDrawer.C:503
 SummaryDrawer.C:504
 SummaryDrawer.C:505
 SummaryDrawer.C:506
 SummaryDrawer.C:507
 SummaryDrawer.C:508
 SummaryDrawer.C:509
 SummaryDrawer.C:510
 SummaryDrawer.C:511
 SummaryDrawer.C:512
 SummaryDrawer.C:513
 SummaryDrawer.C:514
 SummaryDrawer.C:515
 SummaryDrawer.C:516
 SummaryDrawer.C:517
 SummaryDrawer.C:518
 SummaryDrawer.C:519
 SummaryDrawer.C:520
 SummaryDrawer.C:521
 SummaryDrawer.C:522
 SummaryDrawer.C:523
 SummaryDrawer.C:524
 SummaryDrawer.C:525
 SummaryDrawer.C:526
 SummaryDrawer.C:527
 SummaryDrawer.C:528
 SummaryDrawer.C:529
 SummaryDrawer.C:530
 SummaryDrawer.C:531
 SummaryDrawer.C:532
 SummaryDrawer.C:533
 SummaryDrawer.C:534
 SummaryDrawer.C:535
 SummaryDrawer.C:536
 SummaryDrawer.C:537
 SummaryDrawer.C:538
 SummaryDrawer.C:539
 SummaryDrawer.C:540
 SummaryDrawer.C:541
 SummaryDrawer.C:542
 SummaryDrawer.C:543
 SummaryDrawer.C:544
 SummaryDrawer.C:545
 SummaryDrawer.C:546
 SummaryDrawer.C:547
 SummaryDrawer.C:548
 SummaryDrawer.C:549
 SummaryDrawer.C:550
 SummaryDrawer.C:551
 SummaryDrawer.C:552
 SummaryDrawer.C:553
 SummaryDrawer.C:554
 SummaryDrawer.C:555
 SummaryDrawer.C:556
 SummaryDrawer.C:557
 SummaryDrawer.C:558
 SummaryDrawer.C:559
 SummaryDrawer.C:560
 SummaryDrawer.C:561
 SummaryDrawer.C:562
 SummaryDrawer.C:563
 SummaryDrawer.C:564
 SummaryDrawer.C:565
 SummaryDrawer.C:566
 SummaryDrawer.C:567
 SummaryDrawer.C:568
 SummaryDrawer.C:569
 SummaryDrawer.C:570
 SummaryDrawer.C:571
 SummaryDrawer.C:572
 SummaryDrawer.C:573
 SummaryDrawer.C:574
 SummaryDrawer.C:575
 SummaryDrawer.C:576
 SummaryDrawer.C:577
 SummaryDrawer.C:578
 SummaryDrawer.C:579
 SummaryDrawer.C:580
 SummaryDrawer.C:581
 SummaryDrawer.C:582
 SummaryDrawer.C:583
 SummaryDrawer.C:584
 SummaryDrawer.C:585
 SummaryDrawer.C:586
 SummaryDrawer.C:587
 SummaryDrawer.C:588
 SummaryDrawer.C:589
 SummaryDrawer.C:590
 SummaryDrawer.C:591
 SummaryDrawer.C:592
 SummaryDrawer.C:593
 SummaryDrawer.C:594
 SummaryDrawer.C:595
 SummaryDrawer.C:596
 SummaryDrawer.C:597
 SummaryDrawer.C:598
 SummaryDrawer.C:599
 SummaryDrawer.C:600
 SummaryDrawer.C:601
 SummaryDrawer.C:602
 SummaryDrawer.C:603
 SummaryDrawer.C:604
 SummaryDrawer.C:605
 SummaryDrawer.C:606
 SummaryDrawer.C:607
 SummaryDrawer.C:608
 SummaryDrawer.C:609
 SummaryDrawer.C:610
 SummaryDrawer.C:611
 SummaryDrawer.C:612
 SummaryDrawer.C:613
 SummaryDrawer.C:614
 SummaryDrawer.C:615
 SummaryDrawer.C:616
 SummaryDrawer.C:617
 SummaryDrawer.C:618
 SummaryDrawer.C:619
 SummaryDrawer.C:620
 SummaryDrawer.C:621
 SummaryDrawer.C:622
 SummaryDrawer.C:623
 SummaryDrawer.C:624
 SummaryDrawer.C:625
 SummaryDrawer.C:626
 SummaryDrawer.C:627
 SummaryDrawer.C:628
 SummaryDrawer.C:629
 SummaryDrawer.C:630
 SummaryDrawer.C:631
 SummaryDrawer.C:632
 SummaryDrawer.C:633
 SummaryDrawer.C:634
 SummaryDrawer.C:635
 SummaryDrawer.C:636
 SummaryDrawer.C:637
 SummaryDrawer.C:638
 SummaryDrawer.C:639
 SummaryDrawer.C:640
 SummaryDrawer.C:641
 SummaryDrawer.C:642
 SummaryDrawer.C:643
 SummaryDrawer.C:644
 SummaryDrawer.C:645
 SummaryDrawer.C:646
 SummaryDrawer.C:647
 SummaryDrawer.C:648
 SummaryDrawer.C:649
 SummaryDrawer.C:650
 SummaryDrawer.C:651
 SummaryDrawer.C:652
 SummaryDrawer.C:653
 SummaryDrawer.C:654
 SummaryDrawer.C:655
 SummaryDrawer.C:656
 SummaryDrawer.C:657
 SummaryDrawer.C:658
 SummaryDrawer.C:659
 SummaryDrawer.C:660
 SummaryDrawer.C:661
 SummaryDrawer.C:662
 SummaryDrawer.C:663
 SummaryDrawer.C:664
 SummaryDrawer.C:665
 SummaryDrawer.C:666
 SummaryDrawer.C:667
 SummaryDrawer.C:668
 SummaryDrawer.C:669
 SummaryDrawer.C:670
 SummaryDrawer.C:671
 SummaryDrawer.C:672
 SummaryDrawer.C:673
 SummaryDrawer.C:674
 SummaryDrawer.C:675
 SummaryDrawer.C:676
 SummaryDrawer.C:677
 SummaryDrawer.C:678
 SummaryDrawer.C:679
 SummaryDrawer.C:680
 SummaryDrawer.C:681
 SummaryDrawer.C:682
 SummaryDrawer.C:683
 SummaryDrawer.C:684
 SummaryDrawer.C:685
 SummaryDrawer.C:686
 SummaryDrawer.C:687
 SummaryDrawer.C:688
 SummaryDrawer.C:689
 SummaryDrawer.C:690
 SummaryDrawer.C:691
 SummaryDrawer.C:692
 SummaryDrawer.C:693
 SummaryDrawer.C:694
 SummaryDrawer.C:695
 SummaryDrawer.C:696
 SummaryDrawer.C:697
 SummaryDrawer.C:698
 SummaryDrawer.C:699
 SummaryDrawer.C:700
 SummaryDrawer.C:701
 SummaryDrawer.C:702
 SummaryDrawer.C:703
 SummaryDrawer.C:704
 SummaryDrawer.C:705
 SummaryDrawer.C:706
 SummaryDrawer.C:707
 SummaryDrawer.C:708
 SummaryDrawer.C:709
 SummaryDrawer.C:710
 SummaryDrawer.C:711
 SummaryDrawer.C:712
 SummaryDrawer.C:713
 SummaryDrawer.C:714
 SummaryDrawer.C:715
 SummaryDrawer.C:716
 SummaryDrawer.C:717
 SummaryDrawer.C:718
 SummaryDrawer.C:719
 SummaryDrawer.C:720
 SummaryDrawer.C:721
 SummaryDrawer.C:722
 SummaryDrawer.C:723
 SummaryDrawer.C:724
 SummaryDrawer.C:725
 SummaryDrawer.C:726
 SummaryDrawer.C:727
 SummaryDrawer.C:728
 SummaryDrawer.C:729
 SummaryDrawer.C:730
 SummaryDrawer.C:731
 SummaryDrawer.C:732
 SummaryDrawer.C:733
 SummaryDrawer.C:734
 SummaryDrawer.C:735
 SummaryDrawer.C:736
 SummaryDrawer.C:737
 SummaryDrawer.C:738
 SummaryDrawer.C:739
 SummaryDrawer.C:740
 SummaryDrawer.C:741
 SummaryDrawer.C:742
 SummaryDrawer.C:743
 SummaryDrawer.C:744
 SummaryDrawer.C:745
 SummaryDrawer.C:746
 SummaryDrawer.C:747
 SummaryDrawer.C:748
 SummaryDrawer.C:749
 SummaryDrawer.C:750
 SummaryDrawer.C:751
 SummaryDrawer.C:752
 SummaryDrawer.C:753
 SummaryDrawer.C:754
 SummaryDrawer.C:755
 SummaryDrawer.C:756
 SummaryDrawer.C:757
 SummaryDrawer.C:758
 SummaryDrawer.C:759
 SummaryDrawer.C:760
 SummaryDrawer.C:761
 SummaryDrawer.C:762
 SummaryDrawer.C:763
 SummaryDrawer.C:764
 SummaryDrawer.C:765
 SummaryDrawer.C:766
 SummaryDrawer.C:767
 SummaryDrawer.C:768
 SummaryDrawer.C:769
 SummaryDrawer.C:770
 SummaryDrawer.C:771
 SummaryDrawer.C:772
 SummaryDrawer.C:773
 SummaryDrawer.C:774
 SummaryDrawer.C:775
 SummaryDrawer.C:776
 SummaryDrawer.C:777
 SummaryDrawer.C:778
 SummaryDrawer.C:779
 SummaryDrawer.C:780
 SummaryDrawer.C:781
 SummaryDrawer.C:782
 SummaryDrawer.C:783
 SummaryDrawer.C:784
 SummaryDrawer.C:785
 SummaryDrawer.C:786
 SummaryDrawer.C:787
 SummaryDrawer.C:788
 SummaryDrawer.C:789
 SummaryDrawer.C:790
 SummaryDrawer.C:791
 SummaryDrawer.C:792
 SummaryDrawer.C:793
 SummaryDrawer.C:794
 SummaryDrawer.C:795
 SummaryDrawer.C:796
 SummaryDrawer.C:797
 SummaryDrawer.C:798
 SummaryDrawer.C:799
 SummaryDrawer.C:800
 SummaryDrawer.C:801
 SummaryDrawer.C:802
 SummaryDrawer.C:803
 SummaryDrawer.C:804
 SummaryDrawer.C:805
 SummaryDrawer.C:806
 SummaryDrawer.C:807
 SummaryDrawer.C:808
 SummaryDrawer.C:809
 SummaryDrawer.C:810
 SummaryDrawer.C:811
 SummaryDrawer.C:812
 SummaryDrawer.C:813
 SummaryDrawer.C:814
 SummaryDrawer.C:815
 SummaryDrawer.C:816
 SummaryDrawer.C:817
 SummaryDrawer.C:818
 SummaryDrawer.C:819
 SummaryDrawer.C:820
 SummaryDrawer.C:821
 SummaryDrawer.C:822
 SummaryDrawer.C:823
 SummaryDrawer.C:824
 SummaryDrawer.C:825
 SummaryDrawer.C:826
 SummaryDrawer.C:827
 SummaryDrawer.C:828
 SummaryDrawer.C:829
 SummaryDrawer.C:830
 SummaryDrawer.C:831
 SummaryDrawer.C:832
 SummaryDrawer.C:833
 SummaryDrawer.C:834
 SummaryDrawer.C:835
 SummaryDrawer.C:836
 SummaryDrawer.C:837
 SummaryDrawer.C:838
 SummaryDrawer.C:839
 SummaryDrawer.C:840
 SummaryDrawer.C:841
 SummaryDrawer.C:842
 SummaryDrawer.C:843
 SummaryDrawer.C:844
 SummaryDrawer.C:845
 SummaryDrawer.C:846
 SummaryDrawer.C:847
 SummaryDrawer.C:848
 SummaryDrawer.C:849
 SummaryDrawer.C:850
 SummaryDrawer.C:851
 SummaryDrawer.C:852
 SummaryDrawer.C:853
 SummaryDrawer.C:854
 SummaryDrawer.C:855
 SummaryDrawer.C:856
 SummaryDrawer.C:857
 SummaryDrawer.C:858
 SummaryDrawer.C:859
 SummaryDrawer.C:860
 SummaryDrawer.C:861
 SummaryDrawer.C:862
 SummaryDrawer.C:863
 SummaryDrawer.C:864
 SummaryDrawer.C:865
 SummaryDrawer.C:866
 SummaryDrawer.C:867
 SummaryDrawer.C:868
 SummaryDrawer.C:869
 SummaryDrawer.C:870
 SummaryDrawer.C:871
 SummaryDrawer.C:872
 SummaryDrawer.C:873
 SummaryDrawer.C:874
 SummaryDrawer.C:875
 SummaryDrawer.C:876
 SummaryDrawer.C:877
 SummaryDrawer.C:878
 SummaryDrawer.C:879
 SummaryDrawer.C:880
 SummaryDrawer.C:881
 SummaryDrawer.C:882
 SummaryDrawer.C:883
 SummaryDrawer.C:884
 SummaryDrawer.C:885
 SummaryDrawer.C:886
 SummaryDrawer.C:887
 SummaryDrawer.C:888
 SummaryDrawer.C:889
 SummaryDrawer.C:890
 SummaryDrawer.C:891
 SummaryDrawer.C:892
 SummaryDrawer.C:893
 SummaryDrawer.C:894
 SummaryDrawer.C:895
 SummaryDrawer.C:896
 SummaryDrawer.C:897
 SummaryDrawer.C:898
 SummaryDrawer.C:899
 SummaryDrawer.C:900
 SummaryDrawer.C:901
 SummaryDrawer.C:902
 SummaryDrawer.C:903
 SummaryDrawer.C:904
 SummaryDrawer.C:905
 SummaryDrawer.C:906
 SummaryDrawer.C:907
 SummaryDrawer.C:908
 SummaryDrawer.C:909
 SummaryDrawer.C:910
 SummaryDrawer.C:911
 SummaryDrawer.C:912
 SummaryDrawer.C:913
 SummaryDrawer.C:914
 SummaryDrawer.C:915
 SummaryDrawer.C:916
 SummaryDrawer.C:917
 SummaryDrawer.C:918
 SummaryDrawer.C:919
 SummaryDrawer.C:920
 SummaryDrawer.C:921
 SummaryDrawer.C:922
 SummaryDrawer.C:923
 SummaryDrawer.C:924
 SummaryDrawer.C:925
 SummaryDrawer.C:926
 SummaryDrawer.C:927
 SummaryDrawer.C:928
 SummaryDrawer.C:929
 SummaryDrawer.C:930
 SummaryDrawer.C:931
 SummaryDrawer.C:932
 SummaryDrawer.C:933
 SummaryDrawer.C:934
 SummaryDrawer.C:935
 SummaryDrawer.C:936
 SummaryDrawer.C:937
 SummaryDrawer.C:938
 SummaryDrawer.C:939
 SummaryDrawer.C:940
 SummaryDrawer.C:941
 SummaryDrawer.C:942
 SummaryDrawer.C:943
 SummaryDrawer.C:944
 SummaryDrawer.C:945
 SummaryDrawer.C:946
 SummaryDrawer.C:947
 SummaryDrawer.C:948
 SummaryDrawer.C:949
 SummaryDrawer.C:950
 SummaryDrawer.C:951
 SummaryDrawer.C:952
 SummaryDrawer.C:953
 SummaryDrawer.C:954
 SummaryDrawer.C:955
 SummaryDrawer.C:956
 SummaryDrawer.C:957
 SummaryDrawer.C:958
 SummaryDrawer.C:959
 SummaryDrawer.C:960
 SummaryDrawer.C:961
 SummaryDrawer.C:962
 SummaryDrawer.C:963
 SummaryDrawer.C:964
 SummaryDrawer.C:965
 SummaryDrawer.C:966
 SummaryDrawer.C:967
 SummaryDrawer.C:968
 SummaryDrawer.C:969
 SummaryDrawer.C:970
 SummaryDrawer.C:971
 SummaryDrawer.C:972
 SummaryDrawer.C:973
 SummaryDrawer.C:974
 SummaryDrawer.C:975
 SummaryDrawer.C:976
 SummaryDrawer.C:977
 SummaryDrawer.C:978
 SummaryDrawer.C:979
 SummaryDrawer.C:980
 SummaryDrawer.C:981
 SummaryDrawer.C:982
 SummaryDrawer.C:983
 SummaryDrawer.C:984
 SummaryDrawer.C:985
 SummaryDrawer.C:986
 SummaryDrawer.C:987
 SummaryDrawer.C:988
 SummaryDrawer.C:989
 SummaryDrawer.C:990
 SummaryDrawer.C:991
 SummaryDrawer.C:992
 SummaryDrawer.C:993
 SummaryDrawer.C:994
 SummaryDrawer.C:995
 SummaryDrawer.C:996
 SummaryDrawer.C:997
 SummaryDrawer.C:998
 SummaryDrawer.C:999
 SummaryDrawer.C:1000
 SummaryDrawer.C:1001
 SummaryDrawer.C:1002
 SummaryDrawer.C:1003
 SummaryDrawer.C:1004
 SummaryDrawer.C:1005
 SummaryDrawer.C:1006
 SummaryDrawer.C:1007
 SummaryDrawer.C:1008
 SummaryDrawer.C:1009
 SummaryDrawer.C:1010
 SummaryDrawer.C:1011
 SummaryDrawer.C:1012
 SummaryDrawer.C:1013
 SummaryDrawer.C:1014
 SummaryDrawer.C:1015
 SummaryDrawer.C:1016
 SummaryDrawer.C:1017
 SummaryDrawer.C:1018
 SummaryDrawer.C:1019
 SummaryDrawer.C:1020
 SummaryDrawer.C:1021
 SummaryDrawer.C:1022
 SummaryDrawer.C:1023
 SummaryDrawer.C:1024
 SummaryDrawer.C:1025
 SummaryDrawer.C:1026
 SummaryDrawer.C:1027
 SummaryDrawer.C:1028
 SummaryDrawer.C:1029
 SummaryDrawer.C:1030
 SummaryDrawer.C:1031
 SummaryDrawer.C:1032
 SummaryDrawer.C:1033
 SummaryDrawer.C:1034
 SummaryDrawer.C:1035
 SummaryDrawer.C:1036
 SummaryDrawer.C:1037
 SummaryDrawer.C:1038
 SummaryDrawer.C:1039
 SummaryDrawer.C:1040
 SummaryDrawer.C:1041
 SummaryDrawer.C:1042
 SummaryDrawer.C:1043
 SummaryDrawer.C:1044
 SummaryDrawer.C:1045
 SummaryDrawer.C:1046
 SummaryDrawer.C:1047
 SummaryDrawer.C:1048
 SummaryDrawer.C:1049
 SummaryDrawer.C:1050
 SummaryDrawer.C:1051
 SummaryDrawer.C:1052
 SummaryDrawer.C:1053
 SummaryDrawer.C:1054
 SummaryDrawer.C:1055
 SummaryDrawer.C:1056
 SummaryDrawer.C:1057
 SummaryDrawer.C:1058
 SummaryDrawer.C:1059
 SummaryDrawer.C:1060
 SummaryDrawer.C:1061
 SummaryDrawer.C:1062
 SummaryDrawer.C:1063
 SummaryDrawer.C:1064
 SummaryDrawer.C:1065
 SummaryDrawer.C:1066
 SummaryDrawer.C:1067
 SummaryDrawer.C:1068
 SummaryDrawer.C:1069
 SummaryDrawer.C:1070
 SummaryDrawer.C:1071
 SummaryDrawer.C:1072
 SummaryDrawer.C:1073
 SummaryDrawer.C:1074
 SummaryDrawer.C:1075
 SummaryDrawer.C:1076
 SummaryDrawer.C:1077
 SummaryDrawer.C:1078
 SummaryDrawer.C:1079
 SummaryDrawer.C:1080
 SummaryDrawer.C:1081
 SummaryDrawer.C:1082
 SummaryDrawer.C:1083
 SummaryDrawer.C:1084
 SummaryDrawer.C:1085
 SummaryDrawer.C:1086
 SummaryDrawer.C:1087
 SummaryDrawer.C:1088
 SummaryDrawer.C:1089
 SummaryDrawer.C:1090
 SummaryDrawer.C:1091
 SummaryDrawer.C:1092
 SummaryDrawer.C:1093
 SummaryDrawer.C:1094
 SummaryDrawer.C:1095
 SummaryDrawer.C:1096
 SummaryDrawer.C:1097
 SummaryDrawer.C:1098
 SummaryDrawer.C:1099
 SummaryDrawer.C:1100
 SummaryDrawer.C:1101
 SummaryDrawer.C:1102
 SummaryDrawer.C:1103
 SummaryDrawer.C:1104
 SummaryDrawer.C:1105
 SummaryDrawer.C:1106
 SummaryDrawer.C:1107
 SummaryDrawer.C:1108
 SummaryDrawer.C:1109
 SummaryDrawer.C:1110
 SummaryDrawer.C:1111
 SummaryDrawer.C:1112
 SummaryDrawer.C:1113
 SummaryDrawer.C:1114
 SummaryDrawer.C:1115
 SummaryDrawer.C:1116
 SummaryDrawer.C:1117
 SummaryDrawer.C:1118
 SummaryDrawer.C:1119
 SummaryDrawer.C:1120
 SummaryDrawer.C:1121
 SummaryDrawer.C:1122
 SummaryDrawer.C:1123
 SummaryDrawer.C:1124
 SummaryDrawer.C:1125
 SummaryDrawer.C:1126
 SummaryDrawer.C:1127
 SummaryDrawer.C:1128
 SummaryDrawer.C:1129
 SummaryDrawer.C:1130
 SummaryDrawer.C:1131
 SummaryDrawer.C:1132
 SummaryDrawer.C:1133
 SummaryDrawer.C:1134
 SummaryDrawer.C:1135
 SummaryDrawer.C:1136
 SummaryDrawer.C:1137
 SummaryDrawer.C:1138
 SummaryDrawer.C:1139
 SummaryDrawer.C:1140
 SummaryDrawer.C:1141
 SummaryDrawer.C:1142
 SummaryDrawer.C:1143
 SummaryDrawer.C:1144
 SummaryDrawer.C:1145
 SummaryDrawer.C:1146
 SummaryDrawer.C:1147
 SummaryDrawer.C:1148
 SummaryDrawer.C:1149
 SummaryDrawer.C:1150
 SummaryDrawer.C:1151
 SummaryDrawer.C:1152
 SummaryDrawer.C:1153
 SummaryDrawer.C:1154
 SummaryDrawer.C:1155
 SummaryDrawer.C:1156
 SummaryDrawer.C:1157
 SummaryDrawer.C:1158
 SummaryDrawer.C:1159
 SummaryDrawer.C:1160
 SummaryDrawer.C:1161
 SummaryDrawer.C:1162
 SummaryDrawer.C:1163
 SummaryDrawer.C:1164
 SummaryDrawer.C:1165
 SummaryDrawer.C:1166
 SummaryDrawer.C:1167
 SummaryDrawer.C:1168
 SummaryDrawer.C:1169
 SummaryDrawer.C:1170
 SummaryDrawer.C:1171
 SummaryDrawer.C:1172
 SummaryDrawer.C:1173
 SummaryDrawer.C:1174
 SummaryDrawer.C:1175
 SummaryDrawer.C:1176
 SummaryDrawer.C:1177
 SummaryDrawer.C:1178
 SummaryDrawer.C:1179
 SummaryDrawer.C:1180
 SummaryDrawer.C:1181
 SummaryDrawer.C:1182
 SummaryDrawer.C:1183
 SummaryDrawer.C:1184
 SummaryDrawer.C:1185
 SummaryDrawer.C:1186
 SummaryDrawer.C:1187
 SummaryDrawer.C:1188
 SummaryDrawer.C:1189
 SummaryDrawer.C:1190
 SummaryDrawer.C:1191
 SummaryDrawer.C:1192
 SummaryDrawer.C:1193
 SummaryDrawer.C:1194
 SummaryDrawer.C:1195
 SummaryDrawer.C:1196
 SummaryDrawer.C:1197
 SummaryDrawer.C:1198
 SummaryDrawer.C:1199
 SummaryDrawer.C:1200
 SummaryDrawer.C:1201
 SummaryDrawer.C:1202
 SummaryDrawer.C:1203
 SummaryDrawer.C:1204
 SummaryDrawer.C:1205
 SummaryDrawer.C:1206
 SummaryDrawer.C:1207
 SummaryDrawer.C:1208
 SummaryDrawer.C:1209
 SummaryDrawer.C:1210
 SummaryDrawer.C:1211
 SummaryDrawer.C:1212
 SummaryDrawer.C:1213
 SummaryDrawer.C:1214
 SummaryDrawer.C:1215
 SummaryDrawer.C:1216
 SummaryDrawer.C:1217
 SummaryDrawer.C:1218
 SummaryDrawer.C:1219
 SummaryDrawer.C:1220
 SummaryDrawer.C:1221
 SummaryDrawer.C:1222
 SummaryDrawer.C:1223
 SummaryDrawer.C:1224
 SummaryDrawer.C:1225
 SummaryDrawer.C:1226
 SummaryDrawer.C:1227
 SummaryDrawer.C:1228
 SummaryDrawer.C:1229
 SummaryDrawer.C:1230
 SummaryDrawer.C:1231
 SummaryDrawer.C:1232
 SummaryDrawer.C:1233
 SummaryDrawer.C:1234
 SummaryDrawer.C:1235
 SummaryDrawer.C:1236
 SummaryDrawer.C:1237
 SummaryDrawer.C:1238
 SummaryDrawer.C:1239
 SummaryDrawer.C:1240
 SummaryDrawer.C:1241
 SummaryDrawer.C:1242
 SummaryDrawer.C:1243
 SummaryDrawer.C:1244
 SummaryDrawer.C:1245
 SummaryDrawer.C:1246
 SummaryDrawer.C:1247
 SummaryDrawer.C:1248
 SummaryDrawer.C:1249
 SummaryDrawer.C:1250
 SummaryDrawer.C:1251
 SummaryDrawer.C:1252
 SummaryDrawer.C:1253
 SummaryDrawer.C:1254
 SummaryDrawer.C:1255
 SummaryDrawer.C:1256
 SummaryDrawer.C:1257
 SummaryDrawer.C:1258
 SummaryDrawer.C:1259
 SummaryDrawer.C:1260
 SummaryDrawer.C:1261
 SummaryDrawer.C:1262
 SummaryDrawer.C:1263
 SummaryDrawer.C:1264
 SummaryDrawer.C:1265
 SummaryDrawer.C:1266
 SummaryDrawer.C:1267
 SummaryDrawer.C:1268
 SummaryDrawer.C:1269
 SummaryDrawer.C:1270
 SummaryDrawer.C:1271
 SummaryDrawer.C:1272
 SummaryDrawer.C:1273
 SummaryDrawer.C:1274
 SummaryDrawer.C:1275
 SummaryDrawer.C:1276
 SummaryDrawer.C:1277
 SummaryDrawer.C:1278
 SummaryDrawer.C:1279
 SummaryDrawer.C:1280
 SummaryDrawer.C:1281
 SummaryDrawer.C:1282
 SummaryDrawer.C:1283
 SummaryDrawer.C:1284
 SummaryDrawer.C:1285
 SummaryDrawer.C:1286
 SummaryDrawer.C:1287
 SummaryDrawer.C:1288
 SummaryDrawer.C:1289
 SummaryDrawer.C:1290
 SummaryDrawer.C:1291
 SummaryDrawer.C:1292
 SummaryDrawer.C:1293
 SummaryDrawer.C:1294
 SummaryDrawer.C:1295
 SummaryDrawer.C:1296
 SummaryDrawer.C:1297
 SummaryDrawer.C:1298
 SummaryDrawer.C:1299
 SummaryDrawer.C:1300
 SummaryDrawer.C:1301
 SummaryDrawer.C:1302
 SummaryDrawer.C:1303
 SummaryDrawer.C:1304
 SummaryDrawer.C:1305
 SummaryDrawer.C:1306
 SummaryDrawer.C:1307
 SummaryDrawer.C:1308
 SummaryDrawer.C:1309
 SummaryDrawer.C:1310
 SummaryDrawer.C:1311
 SummaryDrawer.C:1312
 SummaryDrawer.C:1313
 SummaryDrawer.C:1314
 SummaryDrawer.C:1315
 SummaryDrawer.C:1316
 SummaryDrawer.C:1317
 SummaryDrawer.C:1318
 SummaryDrawer.C:1319
 SummaryDrawer.C:1320
 SummaryDrawer.C:1321
 SummaryDrawer.C:1322
 SummaryDrawer.C:1323
 SummaryDrawer.C:1324
 SummaryDrawer.C:1325
 SummaryDrawer.C:1326
 SummaryDrawer.C:1327
 SummaryDrawer.C:1328
 SummaryDrawer.C:1329
 SummaryDrawer.C:1330
 SummaryDrawer.C:1331
 SummaryDrawer.C:1332
 SummaryDrawer.C:1333
 SummaryDrawer.C:1334
 SummaryDrawer.C:1335
 SummaryDrawer.C:1336
 SummaryDrawer.C:1337
 SummaryDrawer.C:1338
 SummaryDrawer.C:1339
 SummaryDrawer.C:1340
 SummaryDrawer.C:1341
 SummaryDrawer.C:1342
 SummaryDrawer.C:1343
 SummaryDrawer.C:1344
 SummaryDrawer.C:1345
 SummaryDrawer.C:1346
 SummaryDrawer.C:1347
 SummaryDrawer.C:1348
 SummaryDrawer.C:1349
 SummaryDrawer.C:1350
 SummaryDrawer.C:1351
 SummaryDrawer.C:1352
 SummaryDrawer.C:1353
 SummaryDrawer.C:1354
 SummaryDrawer.C:1355
 SummaryDrawer.C:1356
 SummaryDrawer.C:1357
 SummaryDrawer.C:1358
 SummaryDrawer.C:1359
 SummaryDrawer.C:1360
 SummaryDrawer.C:1361
 SummaryDrawer.C:1362
 SummaryDrawer.C:1363
 SummaryDrawer.C:1364
 SummaryDrawer.C:1365
 SummaryDrawer.C:1366
 SummaryDrawer.C:1367
 SummaryDrawer.C:1368
 SummaryDrawer.C:1369
 SummaryDrawer.C:1370
 SummaryDrawer.C:1371
 SummaryDrawer.C:1372
 SummaryDrawer.C:1373
 SummaryDrawer.C:1374
 SummaryDrawer.C:1375
 SummaryDrawer.C:1376
 SummaryDrawer.C:1377
 SummaryDrawer.C:1378
 SummaryDrawer.C:1379
 SummaryDrawer.C:1380
 SummaryDrawer.C:1381
 SummaryDrawer.C:1382
 SummaryDrawer.C:1383
 SummaryDrawer.C:1384
 SummaryDrawer.C:1385
 SummaryDrawer.C:1386
 SummaryDrawer.C:1387
 SummaryDrawer.C:1388
 SummaryDrawer.C:1389
 SummaryDrawer.C:1390
 SummaryDrawer.C:1391
 SummaryDrawer.C:1392
 SummaryDrawer.C:1393
 SummaryDrawer.C:1394
 SummaryDrawer.C:1395
 SummaryDrawer.C:1396
 SummaryDrawer.C:1397
 SummaryDrawer.C:1398
 SummaryDrawer.C:1399
 SummaryDrawer.C:1400
 SummaryDrawer.C:1401
 SummaryDrawer.C:1402
 SummaryDrawer.C:1403
 SummaryDrawer.C:1404
 SummaryDrawer.C:1405
 SummaryDrawer.C:1406
 SummaryDrawer.C:1407
 SummaryDrawer.C:1408
 SummaryDrawer.C:1409
 SummaryDrawer.C:1410
 SummaryDrawer.C:1411
 SummaryDrawer.C:1412
 SummaryDrawer.C:1413
 SummaryDrawer.C:1414
 SummaryDrawer.C:1415
 SummaryDrawer.C:1416
 SummaryDrawer.C:1417
 SummaryDrawer.C:1418
 SummaryDrawer.C:1419
 SummaryDrawer.C:1420
 SummaryDrawer.C:1421
 SummaryDrawer.C:1422
 SummaryDrawer.C:1423
 SummaryDrawer.C:1424
 SummaryDrawer.C:1425
 SummaryDrawer.C:1426
 SummaryDrawer.C:1427
 SummaryDrawer.C:1428
 SummaryDrawer.C:1429
 SummaryDrawer.C:1430
 SummaryDrawer.C:1431
 SummaryDrawer.C:1432
 SummaryDrawer.C:1433
 SummaryDrawer.C:1434
 SummaryDrawer.C:1435
 SummaryDrawer.C:1436
 SummaryDrawer.C:1437
 SummaryDrawer.C:1438
 SummaryDrawer.C:1439
 SummaryDrawer.C:1440
 SummaryDrawer.C:1441
 SummaryDrawer.C:1442
 SummaryDrawer.C:1443
 SummaryDrawer.C:1444
 SummaryDrawer.C:1445
 SummaryDrawer.C:1446
 SummaryDrawer.C:1447
 SummaryDrawer.C:1448
 SummaryDrawer.C:1449
 SummaryDrawer.C:1450
 SummaryDrawer.C:1451
 SummaryDrawer.C:1452
 SummaryDrawer.C:1453
 SummaryDrawer.C:1454
 SummaryDrawer.C:1455
 SummaryDrawer.C:1456
 SummaryDrawer.C:1457
 SummaryDrawer.C:1458
 SummaryDrawer.C:1459
 SummaryDrawer.C:1460
 SummaryDrawer.C:1461
 SummaryDrawer.C:1462
 SummaryDrawer.C:1463
 SummaryDrawer.C:1464
 SummaryDrawer.C:1465
 SummaryDrawer.C:1466
 SummaryDrawer.C:1467
 SummaryDrawer.C:1468
 SummaryDrawer.C:1469
 SummaryDrawer.C:1470
 SummaryDrawer.C:1471
 SummaryDrawer.C:1472
 SummaryDrawer.C:1473
 SummaryDrawer.C:1474
 SummaryDrawer.C:1475
 SummaryDrawer.C:1476
 SummaryDrawer.C:1477
 SummaryDrawer.C:1478
 SummaryDrawer.C:1479
 SummaryDrawer.C:1480
 SummaryDrawer.C:1481
 SummaryDrawer.C:1482
 SummaryDrawer.C:1483
 SummaryDrawer.C:1484
 SummaryDrawer.C:1485
 SummaryDrawer.C:1486
 SummaryDrawer.C:1487
 SummaryDrawer.C:1488
 SummaryDrawer.C:1489
 SummaryDrawer.C:1490
 SummaryDrawer.C:1491
 SummaryDrawer.C:1492
 SummaryDrawer.C:1493
 SummaryDrawer.C:1494
 SummaryDrawer.C:1495
 SummaryDrawer.C:1496
 SummaryDrawer.C:1497
 SummaryDrawer.C:1498
 SummaryDrawer.C:1499
 SummaryDrawer.C:1500
 SummaryDrawer.C:1501
 SummaryDrawer.C:1502
 SummaryDrawer.C:1503
 SummaryDrawer.C:1504
 SummaryDrawer.C:1505
 SummaryDrawer.C:1506
 SummaryDrawer.C:1507
 SummaryDrawer.C:1508
 SummaryDrawer.C:1509
 SummaryDrawer.C:1510
 SummaryDrawer.C:1511
 SummaryDrawer.C:1512
 SummaryDrawer.C:1513
 SummaryDrawer.C:1514
 SummaryDrawer.C:1515
 SummaryDrawer.C:1516
 SummaryDrawer.C:1517
 SummaryDrawer.C:1518
 SummaryDrawer.C:1519
 SummaryDrawer.C:1520
 SummaryDrawer.C:1521
 SummaryDrawer.C:1522
 SummaryDrawer.C:1523
 SummaryDrawer.C:1524
 SummaryDrawer.C:1525
 SummaryDrawer.C:1526
 SummaryDrawer.C:1527
 SummaryDrawer.C:1528
 SummaryDrawer.C:1529
 SummaryDrawer.C:1530
 SummaryDrawer.C:1531
 SummaryDrawer.C:1532
 SummaryDrawer.C:1533
 SummaryDrawer.C:1534
 SummaryDrawer.C:1535
 SummaryDrawer.C:1536
 SummaryDrawer.C:1537
 SummaryDrawer.C:1538
 SummaryDrawer.C:1539
 SummaryDrawer.C:1540
 SummaryDrawer.C:1541
 SummaryDrawer.C:1542
 SummaryDrawer.C:1543
 SummaryDrawer.C:1544
 SummaryDrawer.C:1545
 SummaryDrawer.C:1546
 SummaryDrawer.C:1547
 SummaryDrawer.C:1548
 SummaryDrawer.C:1549
 SummaryDrawer.C:1550
 SummaryDrawer.C:1551
 SummaryDrawer.C:1552
 SummaryDrawer.C:1553
 SummaryDrawer.C:1554
 SummaryDrawer.C:1555
 SummaryDrawer.C:1556
 SummaryDrawer.C:1557
 SummaryDrawer.C:1558
 SummaryDrawer.C:1559
 SummaryDrawer.C:1560
 SummaryDrawer.C:1561
 SummaryDrawer.C:1562
 SummaryDrawer.C:1563
 SummaryDrawer.C:1564
 SummaryDrawer.C:1565
 SummaryDrawer.C:1566
 SummaryDrawer.C:1567
 SummaryDrawer.C:1568
 SummaryDrawer.C:1569
 SummaryDrawer.C:1570
 SummaryDrawer.C:1571
 SummaryDrawer.C:1572
 SummaryDrawer.C:1573
 SummaryDrawer.C:1574
 SummaryDrawer.C:1575
 SummaryDrawer.C:1576
 SummaryDrawer.C:1577
 SummaryDrawer.C:1578
 SummaryDrawer.C:1579
 SummaryDrawer.C:1580
 SummaryDrawer.C:1581
 SummaryDrawer.C:1582
 SummaryDrawer.C:1583
 SummaryDrawer.C:1584
 SummaryDrawer.C:1585
 SummaryDrawer.C:1586
 SummaryDrawer.C:1587
 SummaryDrawer.C:1588
 SummaryDrawer.C:1589
 SummaryDrawer.C:1590
 SummaryDrawer.C:1591
 SummaryDrawer.C:1592
 SummaryDrawer.C:1593
 SummaryDrawer.C:1594
 SummaryDrawer.C:1595
 SummaryDrawer.C:1596
 SummaryDrawer.C:1597
 SummaryDrawer.C:1598
 SummaryDrawer.C:1599
 SummaryDrawer.C:1600
 SummaryDrawer.C:1601
 SummaryDrawer.C:1602
 SummaryDrawer.C:1603
 SummaryDrawer.C:1604
 SummaryDrawer.C:1605
 SummaryDrawer.C:1606
 SummaryDrawer.C:1607
 SummaryDrawer.C:1608
 SummaryDrawer.C:1609
 SummaryDrawer.C:1610
 SummaryDrawer.C:1611
 SummaryDrawer.C:1612
 SummaryDrawer.C:1613
 SummaryDrawer.C:1614
 SummaryDrawer.C:1615
 SummaryDrawer.C:1616
 SummaryDrawer.C:1617
 SummaryDrawer.C:1618
 SummaryDrawer.C:1619
 SummaryDrawer.C:1620
 SummaryDrawer.C:1621
 SummaryDrawer.C:1622
 SummaryDrawer.C:1623
 SummaryDrawer.C:1624
 SummaryDrawer.C:1625
 SummaryDrawer.C:1626
 SummaryDrawer.C:1627
 SummaryDrawer.C:1628
 SummaryDrawer.C:1629
 SummaryDrawer.C:1630
 SummaryDrawer.C:1631
 SummaryDrawer.C:1632
 SummaryDrawer.C:1633
 SummaryDrawer.C:1634
 SummaryDrawer.C:1635
 SummaryDrawer.C:1636
 SummaryDrawer.C:1637
 SummaryDrawer.C:1638
 SummaryDrawer.C:1639
 SummaryDrawer.C:1640
 SummaryDrawer.C:1641
 SummaryDrawer.C:1642
 SummaryDrawer.C:1643
 SummaryDrawer.C:1644
 SummaryDrawer.C:1645
 SummaryDrawer.C:1646
 SummaryDrawer.C:1647
 SummaryDrawer.C:1648
 SummaryDrawer.C:1649
 SummaryDrawer.C:1650
 SummaryDrawer.C:1651
 SummaryDrawer.C:1652
 SummaryDrawer.C:1653
 SummaryDrawer.C:1654
 SummaryDrawer.C:1655
 SummaryDrawer.C:1656
 SummaryDrawer.C:1657
 SummaryDrawer.C:1658
 SummaryDrawer.C:1659
 SummaryDrawer.C:1660
 SummaryDrawer.C:1661
 SummaryDrawer.C:1662
 SummaryDrawer.C:1663
 SummaryDrawer.C:1664
 SummaryDrawer.C:1665
 SummaryDrawer.C:1666
 SummaryDrawer.C:1667
 SummaryDrawer.C:1668
 SummaryDrawer.C:1669
 SummaryDrawer.C:1670
 SummaryDrawer.C:1671
 SummaryDrawer.C:1672
 SummaryDrawer.C:1673
 SummaryDrawer.C:1674
 SummaryDrawer.C:1675
 SummaryDrawer.C:1676
 SummaryDrawer.C:1677
 SummaryDrawer.C:1678
 SummaryDrawer.C:1679
 SummaryDrawer.C:1680
 SummaryDrawer.C:1681
 SummaryDrawer.C:1682
 SummaryDrawer.C:1683
 SummaryDrawer.C:1684
 SummaryDrawer.C:1685
 SummaryDrawer.C:1686
 SummaryDrawer.C:1687
 SummaryDrawer.C:1688
 SummaryDrawer.C:1689
 SummaryDrawer.C:1690
 SummaryDrawer.C:1691
 SummaryDrawer.C:1692
 SummaryDrawer.C:1693
 SummaryDrawer.C:1694
 SummaryDrawer.C:1695
 SummaryDrawer.C:1696
 SummaryDrawer.C:1697
 SummaryDrawer.C:1698
 SummaryDrawer.C:1699
 SummaryDrawer.C:1700
 SummaryDrawer.C:1701
 SummaryDrawer.C:1702
 SummaryDrawer.C:1703
 SummaryDrawer.C:1704
 SummaryDrawer.C:1705
 SummaryDrawer.C:1706
 SummaryDrawer.C:1707
 SummaryDrawer.C:1708
 SummaryDrawer.C:1709
 SummaryDrawer.C:1710
 SummaryDrawer.C:1711
 SummaryDrawer.C:1712
 SummaryDrawer.C:1713
 SummaryDrawer.C:1714
 SummaryDrawer.C:1715
 SummaryDrawer.C:1716
 SummaryDrawer.C:1717
 SummaryDrawer.C:1718
 SummaryDrawer.C:1719
 SummaryDrawer.C:1720
 SummaryDrawer.C:1721
 SummaryDrawer.C:1722
 SummaryDrawer.C:1723
 SummaryDrawer.C:1724
 SummaryDrawer.C:1725
 SummaryDrawer.C:1726
 SummaryDrawer.C:1727
 SummaryDrawer.C:1728
 SummaryDrawer.C:1729
 SummaryDrawer.C:1730
 SummaryDrawer.C:1731
 SummaryDrawer.C:1732
 SummaryDrawer.C:1733
 SummaryDrawer.C:1734
 SummaryDrawer.C:1735
 SummaryDrawer.C:1736
 SummaryDrawer.C:1737
 SummaryDrawer.C:1738
 SummaryDrawer.C:1739
 SummaryDrawer.C:1740
 SummaryDrawer.C:1741
 SummaryDrawer.C:1742
 SummaryDrawer.C:1743
 SummaryDrawer.C:1744
 SummaryDrawer.C:1745
 SummaryDrawer.C:1746
 SummaryDrawer.C:1747
 SummaryDrawer.C:1748
 SummaryDrawer.C:1749
 SummaryDrawer.C:1750
 SummaryDrawer.C:1751
 SummaryDrawer.C:1752
 SummaryDrawer.C:1753
 SummaryDrawer.C:1754
 SummaryDrawer.C:1755
 SummaryDrawer.C:1756
 SummaryDrawer.C:1757
 SummaryDrawer.C:1758
 SummaryDrawer.C:1759
 SummaryDrawer.C:1760
 SummaryDrawer.C:1761
 SummaryDrawer.C:1762
 SummaryDrawer.C:1763
 SummaryDrawer.C:1764
 SummaryDrawer.C:1765
 SummaryDrawer.C:1766
 SummaryDrawer.C:1767