ROOT logo
#ifndef ALIHISTOGRAMCOLLECTION_H
#define ALIHISTOGRAMCOLLECTION_H

/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* See cxx source for full Copyright notice                               */

// $Id$

///////////////////////////////////////////////////////////////////////////////
///
/// AliHistogramCollection
///
/// Collection of histograms, indexed by key-tuples
///
/// Important point is that AliHistogramCollection is *always* the
/// owner of the histograms it holds. This is why you should not
/// use the (inherited from TCollection) Add() method but the Adopt() methods
///
/// \author Laurent Aphecetche

#ifndef ROOT_TNamed
#  include "TNamed.h"
#endif
#ifndef ROOT_TString
#  include "TString.h"
#endif
#ifndef ROOT_TCollection
#  include "TCollection.h"
#endif
#include "Riostream.h"
#include <map>
#include <string>

class TH1;
class TMap;
class AliHistogramCollectionIterator;
class AliMergeableCollection;

class AliHistogramCollection : public TNamed
{
  friend class AliHistogramCollectionIterator; // our iterator class

public:

  AliHistogramCollection(const char* name="", const char* title="");
  virtual ~AliHistogramCollection();

  virtual AliHistogramCollection* Clone(const char* name="") const;
  
  AliMergeableCollection* Convert() const;
  
  Bool_t Adopt(TH1* histo);
  Bool_t Adopt(const char* keyA, TH1* histo);
  Bool_t Adopt(const char* keyA, const char* keyB, TH1* histo);
  Bool_t Adopt(const char* keyA, const char* keyB, const char* keyC, TH1* histo);
  Bool_t Adopt(const char* keyA, const char* keyB, const char* keyC, const char* keyD, TH1* histo);
    
  virtual void Clear(Option_t *option="") { Delete(option); }
  
  virtual TObject* FindObject(const char* identifier) const;

  virtual TObject* FindObject(const TObject* key) const;

  virtual void Delete(Option_t *option="");
  
  virtual Int_t NumberOfHistograms() const;

  virtual Int_t NumberOfKeys() const;

  TH1* Histo(const char* identifier) const;
  TH1* Histo(const char* keyA, const char* histoname) const;
  TH1* Histo(const char* keyA, const char* keyB, const char* histoname) const;
  TH1* Histo(const char* keyA, const char* keyB, const char* keyC, const char* histoname) const;
  TH1* Histo(const char* keyA, const char* keyB, const char* keyC, const char* keyD, const char* histoname) const;
  
  virtual TIterator* CreateIterator(Bool_t dir = kIterForward) const;
  
  virtual TList* CreateListOfKeysA() const;
  virtual TList* CreateListOfKeysB() const;
  virtual TList* CreateListOfKeysC() const;
  virtual TList* CreateListOfKeysD() const;
  
  virtual TList* CreateListOfHistogramNames(const char* keyA, const char* keyB="", const char* keyC="", const char* keyD="") const;
  
  virtual TObject* Remove(TObject *obj);

  TString KeyA(const char* identifier) const;
  TString KeyB(const char* identifier) const;
  TString KeyC(const char* identifier) const;
  TString KeyD(const char* identifier) const;
  TString HistoName(const char* identifier) const;
  
  void Print(Option_t *option="") const;
  
  void ClearMessages();
  void PrintMessages(const char* prefix="") const;
  
  Long64_t Merge(TCollection* list);
  
  AliHistogramCollection* Project(const char* keyA, const char* keyB="", const char* keyC="", const char* keyD="") const;
  
  UInt_t EstimateSize(Bool_t show=kFALSE) const;
  
  /// Turn on the display of empty histograms for the Print method
  void ShowEmptyHistograms(Bool_t show=kTRUE) {
    fMustShowEmptyHistogram = show;
  }
  
  void PruneEmptyHistograms();
  
private:
  
  AliHistogramCollection(const AliHistogramCollection& rhs);
  AliHistogramCollection& operator=(const AliHistogramCollection& rhs);

  TList* CreateListOfKeys(Int_t index) const;

  Bool_t InternalAdopt(const char* identifier, TH1* histo);
  
  Bool_t HistoSameAxis(TH1 *h0, TH1 *h1) const;

  TString InternalDecode(const char* identifier, Int_t index) const;
  
  TH1* InternalHisto(const char* identifier, const char* histoname) const;  
  TObjArray* SortAllIdentifiers() const;
  
  TString NormalizeName(const char* identifier, const char* action) const;
  
  TMap* Map() const;

private:
  
  mutable TMap* fMap; // map of TMap of THashList* of TH1*...
  Bool_t fMustShowEmptyHistogram; // Whether or not to show empty histograms with the Print method
  mutable Int_t fMapVersion; // internal version of map (to avoid custom streamer...)
  mutable std::map<std::string,int> fMessages; //! log messages
  
  ClassDef(AliHistogramCollection,7) // A collection of histograms
};

class AliHistogramCollectionIterator : public TIterator
{  
public:
  virtual ~AliHistogramCollectionIterator();
  
  AliHistogramCollectionIterator(const AliHistogramCollection* hcol, Bool_t direction=kIterForward);
  AliHistogramCollectionIterator& operator=(const TIterator &rhs);
  
  const TCollection *GetCollection() const { return 0x0; }

  TObject* Next();
  
  void Reset();
  
private:
  const AliHistogramCollection* fkHistogramCollection; // histogram collection being iterated
  TIterator* fMapIterator; // Iterator for the internal map
  TIterator* fHashListIterator; // Iterator for the current hash list
  Bool_t fDirection; // forward or reverse
  
  AliHistogramCollectionIterator() : fkHistogramCollection(0x0), fMapIterator(0x0), fHashListIterator(0x0), fDirection(kIterForward) {}
  
  /// not implemented
  AliHistogramCollectionIterator& operator=(const AliHistogramCollectionIterator &rhs);
  /// not implemented
  AliHistogramCollectionIterator(const AliHistogramCollectionIterator &iter);
    
  ClassDef(AliHistogramCollectionIterator,0)  // Histogram collection iterator
};

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