00001 #ifndef ANP_HISTMAN_H
00002 #define ANP_HISTMAN_H
00003
00004
00005 #include <iostream>
00006 #include <map>
00007 #include <string>
00008 #include <vector>
00009
00010
00011 #include "PhysicsNtuple/Hist1d.h"
00012 #include "PhysicsNtuple/Mutex.h"
00013
00014 class TiXmlElement;
00015 class TDirectory;
00016 class TH1;
00017 class TH2;
00018
00019 namespace Anp
00020 {
00021 class AxisInfo
00022 {
00023 public:
00024
00025 AxisInfo();
00026 ~AxisInfo();
00027
00028 const std::string& GetTitle() const;
00029
00030 double GetMin() const;
00031 double GetMax() const;
00032 int GetNbins() const;
00033
00034 bool Valid() const;
00035
00036 const std::vector<double>& GetBins() const;
00037
00038 void Print(std::ostream& o = std::cout) const;
00039
00040 protected:
00041
00042 friend class HistMan;
00043
00044 int fNbins;
00045 double fMin;
00046 double fMax;
00047
00048 bool fValid;
00049
00050 std::vector<double> fBins;
00051
00052 std::string fTitle;
00053 };
00054
00055 class HistInfo
00056 {
00057 public:
00058
00059 HistInfo();
00060 ~HistInfo();
00061
00062 const std::string& GetName() const;
00063 const std::string& GetTitle() const;
00064
00065 const AxisInfo& GetXaxis() const;
00066 const AxisInfo& GetYaxis() const;
00067
00068 const std::string& GetKey() const;
00069
00070 bool operator <(const HistInfo &rhs) const;
00071 bool operator==(const HistInfo &rhs) const;
00072
00073 void Print(std::ostream& o = std::cout) const;
00074
00075 friend class HistMan;
00076
00077 protected:
00078
00079 std::string fKey;
00080
00081 std::string fName;
00082 std::string fTitle;
00083
00084 AxisInfo fXaxis;
00085 AxisInfo fYaxis;
00086 };
00087
00088 class HistMan
00089 {
00090 public:
00091
00092 typedef std::map<std::string, HistInfo> InfoMap;
00093 typedef InfoMap::const_iterator InfoIter;
00094 typedef std::map<std::string, InfoMap> DirMap;
00095 typedef DirMap::const_iterator DirIter;
00096
00097 public:
00098
00099 static HistMan& Instance();
00100
00101 bool ReadFile(const std::string file);
00102
00103 bool KeyExists(int key, const std::string &dir = ".") const;
00104 bool KeyExists(const std::string &key, const std::string &dir = ".") const;
00105
00106 unsigned int NMiss() const;
00107
00108 const Hist1d<double> CreateHist1d(int key, const std::string &dir = ".");
00109 const Hist1d<double> CreateHist1d(const std::string &key, const std::string &dir = ".");
00110
00111 TH1* CreateTH1(int key, const std::string &dir = ".");
00112 TH2* CreateTH2(int key, const std::string &dir = ".");
00113
00114 TH1* CreateTH1(const std::string &key, const std::string &dir = ".");
00115 TH2* CreateTH2(const std::string &key, const std::string &dir = ".");
00116
00117 TH2* GetTH2(int xkey, int ykey, const std::string &dir = ".");
00118 TH2* GetTH2(const std::string &xkey, const std::string &ykey, const std::string &dir = ".");
00119
00120 void Print(std::ostream& o = std::cout) const;
00121
00122 private:
00123
00124 HistMan();
00125 ~HistMan();
00126
00127 HistMan(const HistMan &);
00128 const HistMan& operator=(const HistMan &);
00129
00130 private:
00131
00132 const Hist1d<double> CreateHist1d(const HistInfo &info);
00133
00134 TH1* CreateTH1(const HistInfo &info, const std::string &opt = "double");
00135 TH2* CreateTH2(const HistInfo &info, const std::string &opt = "float");
00136
00137 bool ReadHistogramBlock(TiXmlElement &hist);
00138 bool ReadHistogram(const TiXmlElement &hist, HistInfo &info);
00139 bool ReadAxis(const TiXmlElement &hist, AxisInfo &info);
00140
00141 const std::vector<int> GetIntVec(const std::string &list) const;
00142 const std::vector<std::string> GetStringVec(const std::string &list) const;
00143
00144 const std::string Convert(int key, int width = 0) const;
00145 unsigned short ComputeWidth(int key) const;
00146
00147 private:
00148
00149 unsigned int fNMiss;
00150
00151 unsigned short fKeyWidth;
00152
00153 DirMap fDirMap;
00154
00155 static HistMan *fgInstance;
00156
00157 static Mutex fMutex;
00158 };
00159
00160 TH1* MakeTH1(const std::string &dir, TDirectory *dir_, const std::string &key);
00161 TH2* MakeTH2(const std::string &dir, TDirectory *dir_, const std::string &key);
00162
00163 std::ostream& operator<<(std::ostream& o, const HistInfo &self);
00164 std::ostream& operator<<(std::ostream& o, const AxisInfo &self);
00165 }
00166
00167 #endif