ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2014, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/*
 * Container class for histogram objects. Currenly can handle
 *   TH1
 *   TH2
 *   TH3
 *   THnSparse
 * Histograms can be stored in groups. For this the parent group is 
 * included inside the histogram name, i.e. /base/inheriting/histogram.
 * In case just the histogram name is given, it is assumed that the
 * histogram is stored at the top level.
 *
 *   Author: Markus Fasel
 */

#include <cstring>
#include <vector>
#include <TArrayD.h>
#include <TAxis.h>
#include <TH1.h>
#include <TH2.h>
#include <TH3.h>
#include <THnSparse.h>
#include <THashList.h>
#include <TObjArray.h>
#include <TObjString.h>
#include "AliEMCalHistoContainer.h"
#include <TString.h>

#include "AliLog.h"


ClassImp(EMCalTriggerPtAnalysis::AliEMCalHistoContainer)

namespace EMCalTriggerPtAnalysis {

  //______________________________________________________________________________
  AliEMCalHistoContainer::AliEMCalHistoContainer():
                		        TNamed(),
                		        fHistos(NULL),
                		        fIsOwner(true)
  {
    /*
     * Default constructor, only initialising pointers with 0
     */
  }

  //______________________________________________________________________________
  AliEMCalHistoContainer::AliEMCalHistoContainer(const char *name):
                		        TNamed(name, Form("Histogram container %s", name)),
                		        fHistos(NULL),
                		        fIsOwner(true)
  {
    /*
     * Main constructor, creating also a list for the histograms
     *
     * @param name: Name of the object (list named accordingly)
     */
    fHistos = new THashList();
    fHistos->SetName(Form("histos%s", name));
    fHistos->SetOwner();
  }

  //______________________________________________________________________________
  AliEMCalHistoContainer::~AliEMCalHistoContainer(){
    /*
     * Destructor, deletes the list of histograms if it is the owner
     */
    if(fHistos && fIsOwner) delete fHistos;
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::CreateHistoGroup(const char *groupname, const char *parent) throw(HistoContainerContentException) {
    /*
     * Create a new group of histograms within a parent group. Groups are represented as list. The default parent is
     * always the top list. List name structure accouding to unix paths (i.e. top list /, hirarchies separated by /).
     *
     * @param groupname: Name of the new group
     * @param parent (@default "/"): Name of the parent group
     * @throw HistoContainerContentException
     */
    THashList *parentgroup = FindGroup(parent);
    if(!parentgroup) throw HistoContainerContentException(NULL, parent, HistoContainerContentException::kGroupException);
    THashList *childgroup = new THashList();
    childgroup->SetName(groupname);
    parentgroup->Add(childgroup);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::CreateTH1(const char *name, const char *title, int nbins, double xmin, double xmax, Option_t *opt) throw(HistoContainerContentException){
    /*
     * Create a new TH1 within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param title: Title of the histogram
     * @param nbins: number of bins
     * @param xmin: min. value of the range
     * @param xmax: max. value of the range
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    if(parent->FindObject(hname.Data()))
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistDuplicationException);
    TH1 *hist = new TH1D(hname.Data(), title, nbins, xmin, xmax);
    TString optionstring(opt);
    optionstring.ToLower();
    if(optionstring.Contains("s"))
      hist->Sumw2();
    parent->Add(hist);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::CreateTH1(const char *name, const char *title, int nbins, const double *xbins, Option_t *opt) throw(HistoContainerContentException){
    /*
     * Create a new TH1 within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param title: Title of the histogram
     * @param nbins: number of bins
     * @param xbins: array of bin limits
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    if(parent->FindObject(hname.Data()))
      throw HistoContainerContentException(hname, dirname.Data(), HistoContainerContentException::kHistDuplicationException);
    TH1 *hist = new TH1D(hname.Data(), title, nbins, xbins);
    TString optionstring(opt);
    optionstring.ToLower();
    if(optionstring.Contains("s"))
      hist->Sumw2();
    parent->Add(hist);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::CreateTH1(const char *name, const char *title, const TArrayD &xbins, Option_t *opt) throw(HistoContainerContentException){
    /*
     * Create a new TH1 within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param title: Title of the histogram
     * @param xbins: array of bin limits (contains also number of bins)
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    if(parent->FindObject(hname.Data()))
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistDuplicationException);
    TH1 *hist = new TH1D(hname.Data(), title, xbins.GetSize()-1, xbins.GetArray());
    TString optionstring(opt);
    optionstring.ToLower();
    if(optionstring.Contains("s"))
      hist->Sumw2();
    parent->Add(hist);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::CreateTH2(const char *name, const char *title,
      int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, Option_t *opt) throw(HistoContainerContentException){
    /*
     * Create a new TH2 within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param title: Title of the histogram
     * @param nbinsx: number of bins in x-direction
     * @param xmin: min. value of the range in x-direction
     * @param xmax: max. value of the range in x-direction
     * @param nbinsy: number of bins in y-direction
     * @param ymin: min. value of the range in y-direction
     * @param ymax: max. value of the range in y-direction
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    if(parent->FindObject(hname.Data()))
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistDuplicationException);
    TH2 *hist = new TH2D(hname.Data(), title, nbinsx, xmin, xmax, nbinsy, ymin, ymax);
    TString optionstring(opt);
    optionstring.ToLower();
    if(optionstring.Contains("s"))
      hist->Sumw2();
    parent->Add(hist);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::CreateTH2(const char *name, const char *title,
      int nbinsx, const double *xbins, int nbinsy, const double *ybins, Option_t *opt) throw(HistoContainerContentException){
    /*
     * Create a new TH2 within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param title: Title of the histogram
     * @param nbinsx: number of bins in x-direction
     * @param xbins: array of bin limits in x-direction
     * @param nbinsy: number of bins in y-direction
     * @param ybins: array of bin limits in y-direction
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    if(parent->FindObject(hname.Data()))
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistDuplicationException);
    TH2 *hist = new TH2D(hname.Data(), title, nbinsx, xbins, nbinsy, ybins);
    TString optionstring(opt);
    optionstring.ToLower();
    if(optionstring.Contains("s"))
      hist->Sumw2();
    parent->Add(hist);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::CreateTH2(const char *name, const char *title, const TArrayD &xbins, const TArrayD &ybins, Option_t *opt) throw(HistoContainerContentException){
    /*
     * Create a new TH2 within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param title: Title of the histogram
     * @param xbins: array of bin limits in x-direction (contains also the number of bins)
     * @param ybins: array of bin limits in y-direction (contains also the number of bins)
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    if(parent->FindObject(hname.Data()))
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistDuplicationException);
    TH2 *hist = new TH2D(hname.Data(), title, xbins.GetSize() - 1, xbins.GetArray(), ybins.GetSize() - 1, ybins.GetArray());
    TString optionstring(opt);
    optionstring.ToLower();
    if(optionstring.Contains("s"))
      hist->Sumw2();
    parent->Add(hist);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::CreateTH3(const char* name, const char* title, int nbinsx, double xmin, double xmax,
      int nbinsy, double ymin, double ymax, int nbinsz, double zmin, double zmax, Option_t *opt) throw (HistoContainerContentException) {
    /*
     * Create a new TH3 within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param nbinsx: number of bins in x-direction
     * @param xmin: min. value of the range in x-direction
     * @param xmax: max. value of the range in x-direction
     * @param nbinsy: number of bins in y-direction
     * @param ymin: min. value of the range in y-direction
     * @param ymax: max. value of the range in y-direction
     * @param nbinsz: number of bins in z-direction
     * @param zmin: min. value of the range in z-direction
     * @param zmax: max. value of the range in z-direction
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    if(parent->FindObject(hname.Data()))
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistDuplicationException);
    TH3 *hist = new TH3D(hname.Data(), title, nbinsx, xmin, xmax, nbinsy, ymin, ymax, nbinsz, zmin, zmax);
    TString optionstring(opt);
    optionstring.ToLower();
    if(optionstring.Contains("s"))
      hist->Sumw2();
    parent->Add(hist);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::CreateTH3(const char* name, const char* title, int nbinsx, const double* xbins,
      int nbinsy, const double* ybins, int nbinsz, const double* zbins, Option_t *opt) throw (HistoContainerContentException) {
    /*
     * Create a new TH3 within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param title: Title of the histogram
     * @param nbinsx: number of bins in x-direction
     * @param xbins: array of bin limits in x-direction
     * @param nbinsy: number of bins in y-direction
     * @param ybins: array of bin limits in y-direction
     * @param nbinsz: number of bins in z-direction
     * @param zbins: array of bin limits in z-direction
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    if(parent->FindObject(hname.Data()))
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistDuplicationException);
    TH3 *hist = new TH3D(hname.Data(), title, nbinsx, xbins, nbinsy, ybins, nbinsz, zbins);
    TString optionstring(opt);
    optionstring.ToLower();
    if(optionstring.Contains("s"))
      hist->Sumw2();
    parent->Add(hist);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::CreateTH3(const char* name, const char* title, const TArrayD& xbins, const TArrayD& ybins,
      const TArrayD& zbins, Option_t *opt) throw (HistoContainerContentException) {
    /*
     * Create a new TH3 within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param title: Title of the histogram
     * @param xbins: array of bin limits in x-direction (contains also the number of bins)
     * @param ybins: array of bin limits in y-direction (contains also the number of bins)
     * @param zbins: array of bin limits in z-direction (contains also the number of bins)
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    if(parent->FindObject(hname.Data()))
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistDuplicationException);
    TH3 *hist = new TH3D(hname.Data(), title, xbins.GetSize()-1, xbins.GetArray(), ybins.GetSize()-1, ybins.GetArray(), zbins.GetSize()-1, zbins.GetArray());
    TString optionstring(opt);
    optionstring.ToLower();
    if(optionstring.Contains("s"))
      hist->Sumw2();
    parent->Add(hist);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::CreateTHnSparse(const char *name, const char *title,
      int ndim, const int *nbins, const double *min, const double *max, Option_t *opt) throw(HistoContainerContentException){
    /*
     * Create a new THnSparse within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param title: Title of the histogram
     * @param ndim: Number of dimensions
     * @param nbins: Number of bins per dimension
     * @param min: min. value of the range for each dimension
     * @param max: max. value of the range for each dimension
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    if(parent->FindObject(hname.Data()))
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistDuplicationException);
    THnSparseD *hist = new THnSparseD(hname.Data(), title, ndim, nbins, min, max);
    TString optionstring(opt);
    optionstring.ToLower();
    if(optionstring.Contains("s"))
      hist->Sumw2();
    parent->Add(hist);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::CreateTHnSparse(const char *name, const char *title, int ndim, const TAxis **axes, Option_t *opt) throw(HistoContainerContentException){
    /*
     * Create a new THnSparse within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param title: Title of the histogram
     * @param ndim: Number of dimensions
     * @param axes: Array of pointers to TAxis for containing the axis definition for each dimension
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    if(parent->FindObject(hname))
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistDuplicationException);
    TArrayD xmin(ndim), xmax(ndim);
    TArrayI nbins(ndim);
    for(int idim = 0; idim < ndim; ++idim){
      const TAxis &myaxis = *(axes[idim]);
      nbins[idim] = myaxis.GetNbins();
      xmin[idim] = myaxis.GetXmin();
      xmax[idim] = myaxis.GetXmax();
    }
    THnSparseD *hsparse = new THnSparseD(hname.Data(), title, ndim, nbins.GetArray(), xmin.GetArray(), xmax.GetArray());
    for(int id = 0; id < ndim; ++id)
      *(hsparse->GetAxis(id)) = *(axes[id]);
    TString optionstring(opt);
    optionstring.ToLower();
    if(optionstring.Contains("s"))
      hsparse->Sumw2();
    parent->Add(hsparse);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::SetObject(TObject * const o, const char *group) throw(HistoContainerContentException){
    /*
     * Set a new group into the container into the parent group
     *
     * @param o: the object ot be included

     */
    THashList *parent(FindGroup(group));
    if(!parent)
      throw HistoContainerContentException(NULL, strcmp(group, "/") ? group : "", HistoContainerContentException::kGroupException);
    if(parent->FindObject(o->GetName()))
      throw HistoContainerContentException(o->GetName(), strcmp(group, "/") ? group : "", HistoContainerContentException::kHistDuplicationException);
    if(!(dynamic_cast<THnBase *>(o) || dynamic_cast<TH1 *>(o)))
      throw HistoContainerContentException(o->GetName(), strcmp(group, "/") ? group : "", HistoContainerContentException::kTypeException);
    fHistos->Add(o);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::FillTH1(const char *name, double x, double weight) throw(HistoContainerContentException){
    /*
     * Fill a 1D histogram within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param x: x-coordinate
     * @param weight (@default 1): optional weight of the entry
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    TH1 *hist = dynamic_cast<TH1 *>(parent->FindObject(hname.Data()));
    if(!hist)
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistNotFoundException);
    hist->Fill(x, weight);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::FillTH2(const char *name, double x, double y, double weight) throw(HistoContainerContentException){
    /*
     * Fill a 2D histogram within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param x: x-coordinate
     * @param y: y-coordinate
     * @param weight (@default 1): optional weight of the entry
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    TH2 *hist = dynamic_cast<TH2 *>(parent->FindObject(hname.Data()));
    if(!hist)
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistNotFoundException);
    hist->Fill(x, y, weight);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::FillTH2(const char *name, double *point, double weight) throw(HistoContainerContentException){
    /*
     * Fill a 2D histogram within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param point: coordinates of the data
     * @param weight (@default 1): optional weight of the entry
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    TH2 *hist = dynamic_cast<TH2 *>(parent->FindObject(hname.Data()));
    if(!hist)
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistNotFoundException);
    hist->Fill(point[0], point[1], weight);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::FillTH3(const char* name, double x, double y, double z, double weight) throw (HistoContainerContentException) {
    /*
     * Fill a 3D histogram within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param x: x-coordinate
     * @param y: y-coordinate
     * @param z: z-coordinate
     * @param weight (@default 1): optional weight of the entry
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    TH3 *hist = dynamic_cast<TH3 *>(parent->FindObject(hname.Data()));
    if(!hist)
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistNotFoundException);
    hist->Fill(x, y, z, weight);
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::FillTH3(const char* name, const double* point, double weight) throw (HistoContainerContentException) {
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    TH3 *hist = dynamic_cast<TH3 *>(parent->FindObject(hname.Data()));
    if(!hist)
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistNotFoundException);
    hist->Fill(point[0], point[1], point[2], weight);
  }


  //______________________________________________________________________________
  void AliEMCalHistoContainer::FillTHnSparse(const char *name, const double *x, double weight) throw(HistoContainerContentException){
    /*
     * Fill a  nD histogram within the container. The histogram name also contains the parent group(s) according to the common
     * group notation.
     *
     * @param name: Name of the histogram
     * @param x: coordinates of the data
     * @param weight (@default 1): optional weight of the entry
     * @throw HistoContainerContentException
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent)
      throw HistoContainerContentException(NULL, dirname.Data(), HistoContainerContentException::kGroupException);
    THnSparseD *hist = dynamic_cast<THnSparseD *>(parent->FindObject(hname.Data()));
    if(!hist)
      throw HistoContainerContentException(hname.Data(), dirname.Data(), HistoContainerContentException::kHistNotFoundException);
    hist->Fill(x, weight);
  }

  //______________________________________________________________________________
  TObject *AliEMCalHistoContainer::FindObject(const char *name) const {
    /*
     * Find an object inside the container. The object can also be within a
     * histogram group. For this the name has to follow the common notation
     *
     * @param name: Name of the object to find inside the container
     * @return: pointer to the object (NULL if not found)
     */
    TString dirname(basename(name)), hname(histname(name));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent) return NULL;
    return parent->FindObject(hname);
  }

  //______________________________________________________________________________
  TObject* AliEMCalHistoContainer::FindObject(const TObject* obj) const {
    /*
     * Find and object inside the container. The object name is expected to contain the
     * full path of the histogram object, including parent groups
     *
     * @param obj: the object to find
     * @return: pointer to the object (NULL if not found)
     */
    TString dirname(basename(obj->GetName())), hname(histname(obj->GetName()));
    THashList *parent(FindGroup(dirname.Data()));
    if(!parent) return NULL;
    return parent->FindObject(hname);
  }

  //______________________________________________________________________________
  THashList *AliEMCalHistoContainer::FindGroup(const char *dirname) const {
    /*
     * Find histogram group. Name is using common notation
     *
     * @param dirname: Path of the group (treat empty path as top node
     * @return: TList of objects (NULL if group does not exist)
     */
    if(!strlen(dirname) || !strcmp(dirname, "/")) return fHistos;
    std::vector<std::string> tokens;
    TokenizeFilename(dirname, "/", tokens);
    THashList *currentdir(fHistos);
    for(std::vector<std::string>::iterator it = tokens.begin(); it != tokens.end(); ++it){
      currentdir = dynamic_cast<THashList *>(currentdir->FindObject(it->c_str()));
      if(!currentdir) break;
    }
    return currentdir;
  }

  //______________________________________________________________________________
  void AliEMCalHistoContainer::TokenizeFilename(const char *name, const char *delim, std::vector<std::string> &listoftokens) const {
    /*
     * Tokenizes a string. Results are stored inside the vector listoftokens
     *
     * @ param name: string to be tokenised
     * @ param delim: delimiter string
     * @ param listoftokens: list of tokens (C++ strings)
     */
    TString s(name);
    TObjArray *arr = s.Tokenize(delim);
    TObjString *ostr(NULL);
    TIter toks(arr);
    while((ostr = dynamic_cast<TObjString *>(toks()))){
      listoftokens.push_back(std::string(ostr->String().Data()));
    }
    delete arr;
  }

  //______________________________________________________________________________
  const char *AliEMCalHistoContainer::basename(const char *path) const {
    /*
     * Helper function extracting the basename from a given histogram path.
     *
     * @param path: histogram path
     * @return: basename extracted
     */
    TString s(path);
    int index = s.Last('/');
    if(index < 0) return "";  // no directory structure
    return TString(s(0, index)).Data();
  }

  //______________________________________________________________________________
  const char *AliEMCalHistoContainer::histname(const char *path) const {
    /*
     * Helper function extracting the histogram name from a given histogram path.
     *
     * @param path: histogram path
     * @return: basename extracted
     */
    TString s(path);
    int index = s.Last('/');
    if(index < 0) return path;    // no directory structure
    return TString(s(index+1, s.Length() - (index+1))).Data();
  }
}
 AliEMCalHistoContainer.cxx:1
 AliEMCalHistoContainer.cxx:2
 AliEMCalHistoContainer.cxx:3
 AliEMCalHistoContainer.cxx:4
 AliEMCalHistoContainer.cxx:5
 AliEMCalHistoContainer.cxx:6
 AliEMCalHistoContainer.cxx:7
 AliEMCalHistoContainer.cxx:8
 AliEMCalHistoContainer.cxx:9
 AliEMCalHistoContainer.cxx:10
 AliEMCalHistoContainer.cxx:11
 AliEMCalHistoContainer.cxx:12
 AliEMCalHistoContainer.cxx:13
 AliEMCalHistoContainer.cxx:14
 AliEMCalHistoContainer.cxx:15
 AliEMCalHistoContainer.cxx:16
 AliEMCalHistoContainer.cxx:17
 AliEMCalHistoContainer.cxx:18
 AliEMCalHistoContainer.cxx:19
 AliEMCalHistoContainer.cxx:20
 AliEMCalHistoContainer.cxx:21
 AliEMCalHistoContainer.cxx:22
 AliEMCalHistoContainer.cxx:23
 AliEMCalHistoContainer.cxx:24
 AliEMCalHistoContainer.cxx:25
 AliEMCalHistoContainer.cxx:26
 AliEMCalHistoContainer.cxx:27
 AliEMCalHistoContainer.cxx:28
 AliEMCalHistoContainer.cxx:29
 AliEMCalHistoContainer.cxx:30
 AliEMCalHistoContainer.cxx:31
 AliEMCalHistoContainer.cxx:32
 AliEMCalHistoContainer.cxx:33
 AliEMCalHistoContainer.cxx:34
 AliEMCalHistoContainer.cxx:35
 AliEMCalHistoContainer.cxx:36
 AliEMCalHistoContainer.cxx:37
 AliEMCalHistoContainer.cxx:38
 AliEMCalHistoContainer.cxx:39
 AliEMCalHistoContainer.cxx:40
 AliEMCalHistoContainer.cxx:41
 AliEMCalHistoContainer.cxx:42
 AliEMCalHistoContainer.cxx:43
 AliEMCalHistoContainer.cxx:44
 AliEMCalHistoContainer.cxx:45
 AliEMCalHistoContainer.cxx:46
 AliEMCalHistoContainer.cxx:47
 AliEMCalHistoContainer.cxx:48
 AliEMCalHistoContainer.cxx:49
 AliEMCalHistoContainer.cxx:50
 AliEMCalHistoContainer.cxx:51
 AliEMCalHistoContainer.cxx:52
 AliEMCalHistoContainer.cxx:53
 AliEMCalHistoContainer.cxx:54
 AliEMCalHistoContainer.cxx:55
 AliEMCalHistoContainer.cxx:56
 AliEMCalHistoContainer.cxx:57
 AliEMCalHistoContainer.cxx:58
 AliEMCalHistoContainer.cxx:59
 AliEMCalHistoContainer.cxx:60
 AliEMCalHistoContainer.cxx:61
 AliEMCalHistoContainer.cxx:62
 AliEMCalHistoContainer.cxx:63
 AliEMCalHistoContainer.cxx:64
 AliEMCalHistoContainer.cxx:65
 AliEMCalHistoContainer.cxx:66
 AliEMCalHistoContainer.cxx:67
 AliEMCalHistoContainer.cxx:68
 AliEMCalHistoContainer.cxx:69
 AliEMCalHistoContainer.cxx:70
 AliEMCalHistoContainer.cxx:71
 AliEMCalHistoContainer.cxx:72
 AliEMCalHistoContainer.cxx:73
 AliEMCalHistoContainer.cxx:74
 AliEMCalHistoContainer.cxx:75
 AliEMCalHistoContainer.cxx:76
 AliEMCalHistoContainer.cxx:77
 AliEMCalHistoContainer.cxx:78
 AliEMCalHistoContainer.cxx:79
 AliEMCalHistoContainer.cxx:80
 AliEMCalHistoContainer.cxx:81
 AliEMCalHistoContainer.cxx:82
 AliEMCalHistoContainer.cxx:83
 AliEMCalHistoContainer.cxx:84
 AliEMCalHistoContainer.cxx:85
 AliEMCalHistoContainer.cxx:86
 AliEMCalHistoContainer.cxx:87
 AliEMCalHistoContainer.cxx:88
 AliEMCalHistoContainer.cxx:89
 AliEMCalHistoContainer.cxx:90
 AliEMCalHistoContainer.cxx:91
 AliEMCalHistoContainer.cxx:92
 AliEMCalHistoContainer.cxx:93
 AliEMCalHistoContainer.cxx:94
 AliEMCalHistoContainer.cxx:95
 AliEMCalHistoContainer.cxx:96
 AliEMCalHistoContainer.cxx:97
 AliEMCalHistoContainer.cxx:98
 AliEMCalHistoContainer.cxx:99
 AliEMCalHistoContainer.cxx:100
 AliEMCalHistoContainer.cxx:101
 AliEMCalHistoContainer.cxx:102
 AliEMCalHistoContainer.cxx:103
 AliEMCalHistoContainer.cxx:104
 AliEMCalHistoContainer.cxx:105
 AliEMCalHistoContainer.cxx:106
 AliEMCalHistoContainer.cxx:107
 AliEMCalHistoContainer.cxx:108
 AliEMCalHistoContainer.cxx:109
 AliEMCalHistoContainer.cxx:110
 AliEMCalHistoContainer.cxx:111
 AliEMCalHistoContainer.cxx:112
 AliEMCalHistoContainer.cxx:113
 AliEMCalHistoContainer.cxx:114
 AliEMCalHistoContainer.cxx:115
 AliEMCalHistoContainer.cxx:116
 AliEMCalHistoContainer.cxx:117
 AliEMCalHistoContainer.cxx:118
 AliEMCalHistoContainer.cxx:119
 AliEMCalHistoContainer.cxx:120
 AliEMCalHistoContainer.cxx:121
 AliEMCalHistoContainer.cxx:122
 AliEMCalHistoContainer.cxx:123
 AliEMCalHistoContainer.cxx:124
 AliEMCalHistoContainer.cxx:125
 AliEMCalHistoContainer.cxx:126
 AliEMCalHistoContainer.cxx:127
 AliEMCalHistoContainer.cxx:128
 AliEMCalHistoContainer.cxx:129
 AliEMCalHistoContainer.cxx:130
 AliEMCalHistoContainer.cxx:131
 AliEMCalHistoContainer.cxx:132
 AliEMCalHistoContainer.cxx:133
 AliEMCalHistoContainer.cxx:134
 AliEMCalHistoContainer.cxx:135
 AliEMCalHistoContainer.cxx:136
 AliEMCalHistoContainer.cxx:137
 AliEMCalHistoContainer.cxx:138
 AliEMCalHistoContainer.cxx:139
 AliEMCalHistoContainer.cxx:140
 AliEMCalHistoContainer.cxx:141
 AliEMCalHistoContainer.cxx:142
 AliEMCalHistoContainer.cxx:143
 AliEMCalHistoContainer.cxx:144
 AliEMCalHistoContainer.cxx:145
 AliEMCalHistoContainer.cxx:146
 AliEMCalHistoContainer.cxx:147
 AliEMCalHistoContainer.cxx:148
 AliEMCalHistoContainer.cxx:149
 AliEMCalHistoContainer.cxx:150
 AliEMCalHistoContainer.cxx:151
 AliEMCalHistoContainer.cxx:152
 AliEMCalHistoContainer.cxx:153
 AliEMCalHistoContainer.cxx:154
 AliEMCalHistoContainer.cxx:155
 AliEMCalHistoContainer.cxx:156
 AliEMCalHistoContainer.cxx:157
 AliEMCalHistoContainer.cxx:158
 AliEMCalHistoContainer.cxx:159
 AliEMCalHistoContainer.cxx:160
 AliEMCalHistoContainer.cxx:161
 AliEMCalHistoContainer.cxx:162
 AliEMCalHistoContainer.cxx:163
 AliEMCalHistoContainer.cxx:164
 AliEMCalHistoContainer.cxx:165
 AliEMCalHistoContainer.cxx:166
 AliEMCalHistoContainer.cxx:167
 AliEMCalHistoContainer.cxx:168
 AliEMCalHistoContainer.cxx:169
 AliEMCalHistoContainer.cxx:170
 AliEMCalHistoContainer.cxx:171
 AliEMCalHistoContainer.cxx:172
 AliEMCalHistoContainer.cxx:173
 AliEMCalHistoContainer.cxx:174
 AliEMCalHistoContainer.cxx:175
 AliEMCalHistoContainer.cxx:176
 AliEMCalHistoContainer.cxx:177
 AliEMCalHistoContainer.cxx:178
 AliEMCalHistoContainer.cxx:179
 AliEMCalHistoContainer.cxx:180
 AliEMCalHistoContainer.cxx:181
 AliEMCalHistoContainer.cxx:182
 AliEMCalHistoContainer.cxx:183
 AliEMCalHistoContainer.cxx:184
 AliEMCalHistoContainer.cxx:185
 AliEMCalHistoContainer.cxx:186
 AliEMCalHistoContainer.cxx:187
 AliEMCalHistoContainer.cxx:188
 AliEMCalHistoContainer.cxx:189
 AliEMCalHistoContainer.cxx:190
 AliEMCalHistoContainer.cxx:191
 AliEMCalHistoContainer.cxx:192
 AliEMCalHistoContainer.cxx:193
 AliEMCalHistoContainer.cxx:194
 AliEMCalHistoContainer.cxx:195
 AliEMCalHistoContainer.cxx:196
 AliEMCalHistoContainer.cxx:197
 AliEMCalHistoContainer.cxx:198
 AliEMCalHistoContainer.cxx:199
 AliEMCalHistoContainer.cxx:200
 AliEMCalHistoContainer.cxx:201
 AliEMCalHistoContainer.cxx:202
 AliEMCalHistoContainer.cxx:203
 AliEMCalHistoContainer.cxx:204
 AliEMCalHistoContainer.cxx:205
 AliEMCalHistoContainer.cxx:206
 AliEMCalHistoContainer.cxx:207
 AliEMCalHistoContainer.cxx:208
 AliEMCalHistoContainer.cxx:209
 AliEMCalHistoContainer.cxx:210
 AliEMCalHistoContainer.cxx:211
 AliEMCalHistoContainer.cxx:212
 AliEMCalHistoContainer.cxx:213
 AliEMCalHistoContainer.cxx:214
 AliEMCalHistoContainer.cxx:215
 AliEMCalHistoContainer.cxx:216
 AliEMCalHistoContainer.cxx:217
 AliEMCalHistoContainer.cxx:218
 AliEMCalHistoContainer.cxx:219
 AliEMCalHistoContainer.cxx:220
 AliEMCalHistoContainer.cxx:221
 AliEMCalHistoContainer.cxx:222
 AliEMCalHistoContainer.cxx:223
 AliEMCalHistoContainer.cxx:224
 AliEMCalHistoContainer.cxx:225
 AliEMCalHistoContainer.cxx:226
 AliEMCalHistoContainer.cxx:227
 AliEMCalHistoContainer.cxx:228
 AliEMCalHistoContainer.cxx:229
 AliEMCalHistoContainer.cxx:230
 AliEMCalHistoContainer.cxx:231
 AliEMCalHistoContainer.cxx:232
 AliEMCalHistoContainer.cxx:233
 AliEMCalHistoContainer.cxx:234
 AliEMCalHistoContainer.cxx:235
 AliEMCalHistoContainer.cxx:236
 AliEMCalHistoContainer.cxx:237
 AliEMCalHistoContainer.cxx:238
 AliEMCalHistoContainer.cxx:239
 AliEMCalHistoContainer.cxx:240
 AliEMCalHistoContainer.cxx:241
 AliEMCalHistoContainer.cxx:242
 AliEMCalHistoContainer.cxx:243
 AliEMCalHistoContainer.cxx:244
 AliEMCalHistoContainer.cxx:245
 AliEMCalHistoContainer.cxx:246
 AliEMCalHistoContainer.cxx:247
 AliEMCalHistoContainer.cxx:248
 AliEMCalHistoContainer.cxx:249
 AliEMCalHistoContainer.cxx:250
 AliEMCalHistoContainer.cxx:251
 AliEMCalHistoContainer.cxx:252
 AliEMCalHistoContainer.cxx:253
 AliEMCalHistoContainer.cxx:254
 AliEMCalHistoContainer.cxx:255
 AliEMCalHistoContainer.cxx:256
 AliEMCalHistoContainer.cxx:257
 AliEMCalHistoContainer.cxx:258
 AliEMCalHistoContainer.cxx:259
 AliEMCalHistoContainer.cxx:260
 AliEMCalHistoContainer.cxx:261
 AliEMCalHistoContainer.cxx:262
 AliEMCalHistoContainer.cxx:263
 AliEMCalHistoContainer.cxx:264
 AliEMCalHistoContainer.cxx:265
 AliEMCalHistoContainer.cxx:266
 AliEMCalHistoContainer.cxx:267
 AliEMCalHistoContainer.cxx:268
 AliEMCalHistoContainer.cxx:269
 AliEMCalHistoContainer.cxx:270
 AliEMCalHistoContainer.cxx:271
 AliEMCalHistoContainer.cxx:272
 AliEMCalHistoContainer.cxx:273
 AliEMCalHistoContainer.cxx:274
 AliEMCalHistoContainer.cxx:275
 AliEMCalHistoContainer.cxx:276
 AliEMCalHistoContainer.cxx:277
 AliEMCalHistoContainer.cxx:278
 AliEMCalHistoContainer.cxx:279
 AliEMCalHistoContainer.cxx:280
 AliEMCalHistoContainer.cxx:281
 AliEMCalHistoContainer.cxx:282
 AliEMCalHistoContainer.cxx:283
 AliEMCalHistoContainer.cxx:284
 AliEMCalHistoContainer.cxx:285
 AliEMCalHistoContainer.cxx:286
 AliEMCalHistoContainer.cxx:287
 AliEMCalHistoContainer.cxx:288
 AliEMCalHistoContainer.cxx:289
 AliEMCalHistoContainer.cxx:290
 AliEMCalHistoContainer.cxx:291
 AliEMCalHistoContainer.cxx:292
 AliEMCalHistoContainer.cxx:293
 AliEMCalHistoContainer.cxx:294
 AliEMCalHistoContainer.cxx:295
 AliEMCalHistoContainer.cxx:296
 AliEMCalHistoContainer.cxx:297
 AliEMCalHistoContainer.cxx:298
 AliEMCalHistoContainer.cxx:299
 AliEMCalHistoContainer.cxx:300
 AliEMCalHistoContainer.cxx:301
 AliEMCalHistoContainer.cxx:302
 AliEMCalHistoContainer.cxx:303
 AliEMCalHistoContainer.cxx:304
 AliEMCalHistoContainer.cxx:305
 AliEMCalHistoContainer.cxx:306
 AliEMCalHistoContainer.cxx:307
 AliEMCalHistoContainer.cxx:308
 AliEMCalHistoContainer.cxx:309
 AliEMCalHistoContainer.cxx:310
 AliEMCalHistoContainer.cxx:311
 AliEMCalHistoContainer.cxx:312
 AliEMCalHistoContainer.cxx:313
 AliEMCalHistoContainer.cxx:314
 AliEMCalHistoContainer.cxx:315
 AliEMCalHistoContainer.cxx:316
 AliEMCalHistoContainer.cxx:317
 AliEMCalHistoContainer.cxx:318
 AliEMCalHistoContainer.cxx:319
 AliEMCalHistoContainer.cxx:320
 AliEMCalHistoContainer.cxx:321
 AliEMCalHistoContainer.cxx:322
 AliEMCalHistoContainer.cxx:323
 AliEMCalHistoContainer.cxx:324
 AliEMCalHistoContainer.cxx:325
 AliEMCalHistoContainer.cxx:326
 AliEMCalHistoContainer.cxx:327
 AliEMCalHistoContainer.cxx:328
 AliEMCalHistoContainer.cxx:329
 AliEMCalHistoContainer.cxx:330
 AliEMCalHistoContainer.cxx:331
 AliEMCalHistoContainer.cxx:332
 AliEMCalHistoContainer.cxx:333
 AliEMCalHistoContainer.cxx:334
 AliEMCalHistoContainer.cxx:335
 AliEMCalHistoContainer.cxx:336
 AliEMCalHistoContainer.cxx:337
 AliEMCalHistoContainer.cxx:338
 AliEMCalHistoContainer.cxx:339
 AliEMCalHistoContainer.cxx:340
 AliEMCalHistoContainer.cxx:341
 AliEMCalHistoContainer.cxx:342
 AliEMCalHistoContainer.cxx:343
 AliEMCalHistoContainer.cxx:344
 AliEMCalHistoContainer.cxx:345
 AliEMCalHistoContainer.cxx:346
 AliEMCalHistoContainer.cxx:347
 AliEMCalHistoContainer.cxx:348
 AliEMCalHistoContainer.cxx:349
 AliEMCalHistoContainer.cxx:350
 AliEMCalHistoContainer.cxx:351
 AliEMCalHistoContainer.cxx:352
 AliEMCalHistoContainer.cxx:353
 AliEMCalHistoContainer.cxx:354
 AliEMCalHistoContainer.cxx:355
 AliEMCalHistoContainer.cxx:356
 AliEMCalHistoContainer.cxx:357
 AliEMCalHistoContainer.cxx:358
 AliEMCalHistoContainer.cxx:359
 AliEMCalHistoContainer.cxx:360
 AliEMCalHistoContainer.cxx:361
 AliEMCalHistoContainer.cxx:362
 AliEMCalHistoContainer.cxx:363
 AliEMCalHistoContainer.cxx:364
 AliEMCalHistoContainer.cxx:365
 AliEMCalHistoContainer.cxx:366
 AliEMCalHistoContainer.cxx:367
 AliEMCalHistoContainer.cxx:368
 AliEMCalHistoContainer.cxx:369
 AliEMCalHistoContainer.cxx:370
 AliEMCalHistoContainer.cxx:371
 AliEMCalHistoContainer.cxx:372
 AliEMCalHistoContainer.cxx:373
 AliEMCalHistoContainer.cxx:374
 AliEMCalHistoContainer.cxx:375
 AliEMCalHistoContainer.cxx:376
 AliEMCalHistoContainer.cxx:377
 AliEMCalHistoContainer.cxx:378
 AliEMCalHistoContainer.cxx:379
 AliEMCalHistoContainer.cxx:380
 AliEMCalHistoContainer.cxx:381
 AliEMCalHistoContainer.cxx:382
 AliEMCalHistoContainer.cxx:383
 AliEMCalHistoContainer.cxx:384
 AliEMCalHistoContainer.cxx:385
 AliEMCalHistoContainer.cxx:386
 AliEMCalHistoContainer.cxx:387
 AliEMCalHistoContainer.cxx:388
 AliEMCalHistoContainer.cxx:389
 AliEMCalHistoContainer.cxx:390
 AliEMCalHistoContainer.cxx:391
 AliEMCalHistoContainer.cxx:392
 AliEMCalHistoContainer.cxx:393
 AliEMCalHistoContainer.cxx:394
 AliEMCalHistoContainer.cxx:395
 AliEMCalHistoContainer.cxx:396
 AliEMCalHistoContainer.cxx:397
 AliEMCalHistoContainer.cxx:398
 AliEMCalHistoContainer.cxx:399
 AliEMCalHistoContainer.cxx:400
 AliEMCalHistoContainer.cxx:401
 AliEMCalHistoContainer.cxx:402
 AliEMCalHistoContainer.cxx:403
 AliEMCalHistoContainer.cxx:404
 AliEMCalHistoContainer.cxx:405
 AliEMCalHistoContainer.cxx:406
 AliEMCalHistoContainer.cxx:407
 AliEMCalHistoContainer.cxx:408
 AliEMCalHistoContainer.cxx:409
 AliEMCalHistoContainer.cxx:410
 AliEMCalHistoContainer.cxx:411
 AliEMCalHistoContainer.cxx:412
 AliEMCalHistoContainer.cxx:413
 AliEMCalHistoContainer.cxx:414
 AliEMCalHistoContainer.cxx:415
 AliEMCalHistoContainer.cxx:416
 AliEMCalHistoContainer.cxx:417
 AliEMCalHistoContainer.cxx:418
 AliEMCalHistoContainer.cxx:419
 AliEMCalHistoContainer.cxx:420
 AliEMCalHistoContainer.cxx:421
 AliEMCalHistoContainer.cxx:422
 AliEMCalHistoContainer.cxx:423
 AliEMCalHistoContainer.cxx:424
 AliEMCalHistoContainer.cxx:425
 AliEMCalHistoContainer.cxx:426
 AliEMCalHistoContainer.cxx:427
 AliEMCalHistoContainer.cxx:428
 AliEMCalHistoContainer.cxx:429
 AliEMCalHistoContainer.cxx:430
 AliEMCalHistoContainer.cxx:431
 AliEMCalHistoContainer.cxx:432
 AliEMCalHistoContainer.cxx:433
 AliEMCalHistoContainer.cxx:434
 AliEMCalHistoContainer.cxx:435
 AliEMCalHistoContainer.cxx:436
 AliEMCalHistoContainer.cxx:437
 AliEMCalHistoContainer.cxx:438
 AliEMCalHistoContainer.cxx:439
 AliEMCalHistoContainer.cxx:440
 AliEMCalHistoContainer.cxx:441
 AliEMCalHistoContainer.cxx:442
 AliEMCalHistoContainer.cxx:443
 AliEMCalHistoContainer.cxx:444
 AliEMCalHistoContainer.cxx:445
 AliEMCalHistoContainer.cxx:446
 AliEMCalHistoContainer.cxx:447
 AliEMCalHistoContainer.cxx:448
 AliEMCalHistoContainer.cxx:449
 AliEMCalHistoContainer.cxx:450
 AliEMCalHistoContainer.cxx:451
 AliEMCalHistoContainer.cxx:452
 AliEMCalHistoContainer.cxx:453
 AliEMCalHistoContainer.cxx:454
 AliEMCalHistoContainer.cxx:455
 AliEMCalHistoContainer.cxx:456
 AliEMCalHistoContainer.cxx:457
 AliEMCalHistoContainer.cxx:458
 AliEMCalHistoContainer.cxx:459
 AliEMCalHistoContainer.cxx:460
 AliEMCalHistoContainer.cxx:461
 AliEMCalHistoContainer.cxx:462
 AliEMCalHistoContainer.cxx:463
 AliEMCalHistoContainer.cxx:464
 AliEMCalHistoContainer.cxx:465
 AliEMCalHistoContainer.cxx:466
 AliEMCalHistoContainer.cxx:467
 AliEMCalHistoContainer.cxx:468
 AliEMCalHistoContainer.cxx:469
 AliEMCalHistoContainer.cxx:470
 AliEMCalHistoContainer.cxx:471
 AliEMCalHistoContainer.cxx:472
 AliEMCalHistoContainer.cxx:473
 AliEMCalHistoContainer.cxx:474
 AliEMCalHistoContainer.cxx:475
 AliEMCalHistoContainer.cxx:476
 AliEMCalHistoContainer.cxx:477
 AliEMCalHistoContainer.cxx:478
 AliEMCalHistoContainer.cxx:479
 AliEMCalHistoContainer.cxx:480
 AliEMCalHistoContainer.cxx:481
 AliEMCalHistoContainer.cxx:482
 AliEMCalHistoContainer.cxx:483
 AliEMCalHistoContainer.cxx:484
 AliEMCalHistoContainer.cxx:485
 AliEMCalHistoContainer.cxx:486
 AliEMCalHistoContainer.cxx:487
 AliEMCalHistoContainer.cxx:488
 AliEMCalHistoContainer.cxx:489
 AliEMCalHistoContainer.cxx:490
 AliEMCalHistoContainer.cxx:491
 AliEMCalHistoContainer.cxx:492
 AliEMCalHistoContainer.cxx:493
 AliEMCalHistoContainer.cxx:494
 AliEMCalHistoContainer.cxx:495
 AliEMCalHistoContainer.cxx:496
 AliEMCalHistoContainer.cxx:497
 AliEMCalHistoContainer.cxx:498
 AliEMCalHistoContainer.cxx:499
 AliEMCalHistoContainer.cxx:500
 AliEMCalHistoContainer.cxx:501
 AliEMCalHistoContainer.cxx:502
 AliEMCalHistoContainer.cxx:503
 AliEMCalHistoContainer.cxx:504
 AliEMCalHistoContainer.cxx:505
 AliEMCalHistoContainer.cxx:506
 AliEMCalHistoContainer.cxx:507
 AliEMCalHistoContainer.cxx:508
 AliEMCalHistoContainer.cxx:509
 AliEMCalHistoContainer.cxx:510
 AliEMCalHistoContainer.cxx:511
 AliEMCalHistoContainer.cxx:512
 AliEMCalHistoContainer.cxx:513
 AliEMCalHistoContainer.cxx:514
 AliEMCalHistoContainer.cxx:515
 AliEMCalHistoContainer.cxx:516
 AliEMCalHistoContainer.cxx:517
 AliEMCalHistoContainer.cxx:518
 AliEMCalHistoContainer.cxx:519
 AliEMCalHistoContainer.cxx:520
 AliEMCalHistoContainer.cxx:521
 AliEMCalHistoContainer.cxx:522
 AliEMCalHistoContainer.cxx:523
 AliEMCalHistoContainer.cxx:524
 AliEMCalHistoContainer.cxx:525
 AliEMCalHistoContainer.cxx:526
 AliEMCalHistoContainer.cxx:527
 AliEMCalHistoContainer.cxx:528
 AliEMCalHistoContainer.cxx:529
 AliEMCalHistoContainer.cxx:530
 AliEMCalHistoContainer.cxx:531
 AliEMCalHistoContainer.cxx:532
 AliEMCalHistoContainer.cxx:533
 AliEMCalHistoContainer.cxx:534
 AliEMCalHistoContainer.cxx:535
 AliEMCalHistoContainer.cxx:536
 AliEMCalHistoContainer.cxx:537
 AliEMCalHistoContainer.cxx:538
 AliEMCalHistoContainer.cxx:539
 AliEMCalHistoContainer.cxx:540
 AliEMCalHistoContainer.cxx:541
 AliEMCalHistoContainer.cxx:542
 AliEMCalHistoContainer.cxx:543
 AliEMCalHistoContainer.cxx:544
 AliEMCalHistoContainer.cxx:545
 AliEMCalHistoContainer.cxx:546
 AliEMCalHistoContainer.cxx:547
 AliEMCalHistoContainer.cxx:548
 AliEMCalHistoContainer.cxx:549
 AliEMCalHistoContainer.cxx:550
 AliEMCalHistoContainer.cxx:551
 AliEMCalHistoContainer.cxx:552
 AliEMCalHistoContainer.cxx:553
 AliEMCalHistoContainer.cxx:554
 AliEMCalHistoContainer.cxx:555
 AliEMCalHistoContainer.cxx:556
 AliEMCalHistoContainer.cxx:557
 AliEMCalHistoContainer.cxx:558
 AliEMCalHistoContainer.cxx:559
 AliEMCalHistoContainer.cxx:560
 AliEMCalHistoContainer.cxx:561
 AliEMCalHistoContainer.cxx:562
 AliEMCalHistoContainer.cxx:563
 AliEMCalHistoContainer.cxx:564
 AliEMCalHistoContainer.cxx:565
 AliEMCalHistoContainer.cxx:566
 AliEMCalHistoContainer.cxx:567
 AliEMCalHistoContainer.cxx:568
 AliEMCalHistoContainer.cxx:569
 AliEMCalHistoContainer.cxx:570
 AliEMCalHistoContainer.cxx:571
 AliEMCalHistoContainer.cxx:572
 AliEMCalHistoContainer.cxx:573
 AliEMCalHistoContainer.cxx:574
 AliEMCalHistoContainer.cxx:575
 AliEMCalHistoContainer.cxx:576
 AliEMCalHistoContainer.cxx:577
 AliEMCalHistoContainer.cxx:578
 AliEMCalHistoContainer.cxx:579
 AliEMCalHistoContainer.cxx:580
 AliEMCalHistoContainer.cxx:581
 AliEMCalHistoContainer.cxx:582
 AliEMCalHistoContainer.cxx:583
 AliEMCalHistoContainer.cxx:584
 AliEMCalHistoContainer.cxx:585
 AliEMCalHistoContainer.cxx:586
 AliEMCalHistoContainer.cxx:587
 AliEMCalHistoContainer.cxx:588
 AliEMCalHistoContainer.cxx:589
 AliEMCalHistoContainer.cxx:590
 AliEMCalHistoContainer.cxx:591
 AliEMCalHistoContainer.cxx:592
 AliEMCalHistoContainer.cxx:593
 AliEMCalHistoContainer.cxx:594
 AliEMCalHistoContainer.cxx:595
 AliEMCalHistoContainer.cxx:596
 AliEMCalHistoContainer.cxx:597
 AliEMCalHistoContainer.cxx:598
 AliEMCalHistoContainer.cxx:599
 AliEMCalHistoContainer.cxx:600
 AliEMCalHistoContainer.cxx:601
 AliEMCalHistoContainer.cxx:602
 AliEMCalHistoContainer.cxx:603
 AliEMCalHistoContainer.cxx:604
 AliEMCalHistoContainer.cxx:605
 AliEMCalHistoContainer.cxx:606
 AliEMCalHistoContainer.cxx:607
 AliEMCalHistoContainer.cxx:608
 AliEMCalHistoContainer.cxx:609
 AliEMCalHistoContainer.cxx:610
 AliEMCalHistoContainer.cxx:611
 AliEMCalHistoContainer.cxx:612
 AliEMCalHistoContainer.cxx:613
 AliEMCalHistoContainer.cxx:614
 AliEMCalHistoContainer.cxx:615
 AliEMCalHistoContainer.cxx:616
 AliEMCalHistoContainer.cxx:617
 AliEMCalHistoContainer.cxx:618
 AliEMCalHistoContainer.cxx:619
 AliEMCalHistoContainer.cxx:620
 AliEMCalHistoContainer.cxx:621
 AliEMCalHistoContainer.cxx:622
 AliEMCalHistoContainer.cxx:623
 AliEMCalHistoContainer.cxx:624
 AliEMCalHistoContainer.cxx:625
 AliEMCalHistoContainer.cxx:626
 AliEMCalHistoContainer.cxx:627
 AliEMCalHistoContainer.cxx:628
 AliEMCalHistoContainer.cxx:629
 AliEMCalHistoContainer.cxx:630
 AliEMCalHistoContainer.cxx:631
 AliEMCalHistoContainer.cxx:632
 AliEMCalHistoContainer.cxx:633
 AliEMCalHistoContainer.cxx:634
 AliEMCalHistoContainer.cxx:635
 AliEMCalHistoContainer.cxx:636
 AliEMCalHistoContainer.cxx:637
 AliEMCalHistoContainer.cxx:638
 AliEMCalHistoContainer.cxx:639
 AliEMCalHistoContainer.cxx:640
 AliEMCalHistoContainer.cxx:641
 AliEMCalHistoContainer.cxx:642
 AliEMCalHistoContainer.cxx:643
 AliEMCalHistoContainer.cxx:644
 AliEMCalHistoContainer.cxx:645
 AliEMCalHistoContainer.cxx:646
 AliEMCalHistoContainer.cxx:647
 AliEMCalHistoContainer.cxx:648
 AliEMCalHistoContainer.cxx:649
 AliEMCalHistoContainer.cxx:650
 AliEMCalHistoContainer.cxx:651
 AliEMCalHistoContainer.cxx:652
 AliEMCalHistoContainer.cxx:653
 AliEMCalHistoContainer.cxx:654
 AliEMCalHistoContainer.cxx:655
 AliEMCalHistoContainer.cxx:656
 AliEMCalHistoContainer.cxx:657