Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TEveCaloData.h
Go to the documentation of this file.
1 // @(#)root/eve:$Id$
2 // Author: Matevz Tadel 2007
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TEveCaloData
13 #define ROOT_TEveCaloData
14 
15 #include <vector>
16 #include "TEveElement.h"
17 
18 #include "TMath.h"
19 
20 class TGLSelectRecord;
21 
22 class TH2F;
23 class TAxis;
24 class THStack;
25 
26 class TEveCaloData: public TEveElement,
27  public TNamed
28 {
29 public:
30  struct SliceInfo_t
31  {
32  TString fName; // Name of the slice, eg. ECAL, HCAL.
33  Float_t fThreshold; // Only display towers with higher energy.
34  Color_t fColor; // Color used to draw this longitudinal slice.
35  Color_t fTransparency; // Transparency used to draw this longitudinal slice.
36 
37  SliceInfo_t(): fName(""), fThreshold(0), fColor(kRed), fTransparency(0) {}
38 
39  virtual ~SliceInfo_t() {}
40 
41  void Setup(const char* name, Float_t threshold, Color_t col, Char_t transp = 101)
42  {
43  fName = name;
44  fThreshold = threshold;
45  fColor = col;
46  if (transp <= 100) fTransparency = transp;
47  };
48 
49  ClassDef(SliceInfo_t, 0); // Slice info for histogram stack.
50  };
51 
52  typedef std::vector<SliceInfo_t> vSliceInfo_t;
53  typedef std::vector<SliceInfo_t>::iterator vSliceInfo_i;
54 
55  /**************************************************************************/
56 
57  struct CellId_t
58  {
59  // Cell ID inner structure.
60 
61  Int_t fTower;
62  Int_t fSlice;
63 
64  Float_t fFraction;
65 
66  CellId_t(Int_t t, Int_t s, Float_t f=1.0f) : fTower(t), fSlice(s), fFraction(f) {}
67 
68  bool operator<(const CellId_t& o) const
69  { return (fTower == o.fTower) ? fSlice < o.fSlice : fTower < o.fTower; }
70  };
71 
72  struct CellGeom_t
73  {
74  // Cell geometry inner structure.
75 
76  Float_t fPhiMin;
77  Float_t fPhiMax;
78  Float_t fEtaMin;
79  Float_t fEtaMax;
80 
81  Float_t fThetaMin; // cached
82  Float_t fThetaMax; // cached
83 
84  CellGeom_t(): fPhiMin(0), fPhiMax(0), fEtaMin(0), fEtaMax(0), fThetaMin(0), fThetaMax(0) {}
85  CellGeom_t(Float_t etaMin, Float_t etaMax, Float_t phiMin, Float_t phiMax) {Configure(etaMin, etaMax, phiMin, phiMax);}
86  virtual ~CellGeom_t() {}
87 
88  void Configure(Float_t etaMin, Float_t etaMax, Float_t phiMin, Float_t phiMax);
89 
90  Float_t EtaMin() const { return fEtaMin; }
91  Float_t EtaMax() const { return fEtaMax; }
92  Float_t Eta() const { return (fEtaMin+fEtaMax)*0.5f; }
93  Float_t EtaDelta() const { return fEtaMax-fEtaMin; }
94 
95  Float_t PhiMin() const { return fPhiMin; }
96  Float_t PhiMax() const { return fPhiMax; }
97  Float_t Phi() const { return (fPhiMin+fPhiMax)*0.5f; }
98  Float_t PhiDelta() const { return fPhiMax-fPhiMin; }
99 
100  Float_t ThetaMin() const { return fThetaMin; }
101  Float_t ThetaMax() const { return fThetaMax; }
102  Float_t Theta() const { return (fThetaMax+fThetaMin)*0.5f; }
103  Float_t ThetaDelta() const { return fThetaMax-fThetaMin; }
104 
105  Bool_t IsUpperRho() const
106  {
107  const Float_t phi = Phi();
108  return ((phi > 0 && phi <= TMath::Pi()) || phi < - TMath::Pi());
109  }
110 
111  virtual void Dump() const;
112  };
113 
114  struct CellData_t : public CellGeom_t
115  {
116  // Cell data inner structure.
117 
118  Float_t fValue;
119 
120  CellData_t() : CellGeom_t(), fValue(0) {}
121  virtual ~CellData_t() {}
122 
123  Float_t Value(Bool_t) const;
124  virtual void Dump() const;
125  };
126 
127 
128  struct RebinData_t
129  {
130  Int_t fNSlices;
131 
132  std::vector<Float_t> fSliceData;
133  std::vector<Int_t> fBinData;
134 
135  Float_t* GetSliceVals(Int_t bin);
136 
137  void Clear()
138  {
139  fSliceData.clear();
140  fBinData.clear();
141  }
142  };
143 
144  /**************************************************************************/
145 
146  typedef std::vector<CellId_t> vCellId_t;
147  typedef std::vector<CellId_t>::iterator vCellId_i;
148 
149  typedef std::vector<CellGeom_t> vCellGeom_t;
150  typedef std::vector<CellGeom_t>::iterator vCellGeom_i;
151  typedef std::vector<CellGeom_t>::const_iterator vCellGeom_ci;
152 
153 private:
154  TEveCaloData(const TEveCaloData&); // Not implemented
155  TEveCaloData& operator=(const TEveCaloData&); // Not implemented
156 
157 protected:
158  vSliceInfo_t fSliceInfos;
159 
160  TAxis* fEtaAxis;
161  TAxis* fPhiAxis;
162 
163  Bool_t fWrapTwoPi;
164 
165  Float_t fMaxValEt; // cached
166  Float_t fMaxValE; // cached
167 
168  Float_t fEps;
169 
170  vCellId_t fCellsSelected;
171  vCellId_t fCellsHighlighted;
172 
173 public:
174  TEveCaloData(const char* n="TEveCalData", const char* t="");
175  virtual ~TEveCaloData() {}
176 
177  virtual void UnSelected();
178  virtual void UnHighlighted();
179 
180  virtual TString GetHighlightTooltip();
181 
182  virtual void FillImpliedSelectedSet(Set_t& impSelSet);
183 
184  virtual void GetCellList(Float_t etaMin, Float_t etaMax,
185  Float_t phi, Float_t phiRng,
186  vCellId_t &out) const = 0;
187 
188  vCellId_t& GetCellsSelected() { return fCellsSelected; }
189  vCellId_t& GetCellsHighlighted() { return fCellsHighlighted; }
190  void PrintCellsSelected();
191  void ProcessSelection(vCellId_t& sel_cells, TGLSelectRecord& rec);
192 
193  virtual void Rebin(TAxis *ax, TAxis *ay, vCellId_t &in, Bool_t et, RebinData_t &out) const = 0;
194 
195 
196  virtual void GetCellData(const CellId_t &id, CellData_t& data) const = 0;
197 
198  virtual void InvalidateUsersCellIdCache();
199  virtual void DataChanged();
200  virtual void CellSelectionChanged();
201 
202  Int_t GetNSlices() const { return fSliceInfos.size(); }
203  SliceInfo_t& RefSliceInfo(Int_t s) { return fSliceInfos[s]; }
204  void SetSliceThreshold(Int_t slice, Float_t threshold);
205  Float_t GetSliceThreshold(Int_t slice) const;
206  void SetSliceColor(Int_t slice, Color_t col);
207  Color_t GetSliceColor(Int_t slice) const;
208  void SetSliceTransparency(Int_t slice, Char_t t);
209  Char_t GetSliceTransparency(Int_t slice) const;
210 
211  virtual void GetEtaLimits(Double_t &min, Double_t &max) const = 0;
212 
213  virtual void GetPhiLimits(Double_t &min, Double_t &max) const = 0;
214 
215  virtual Float_t GetMaxVal(Bool_t et) const { return et ? fMaxValEt : fMaxValE; }
216  Bool_t Empty() const { return fMaxValEt < 1e-5; }
217 
218  virtual TAxis* GetEtaBins() const { return fEtaAxis; }
219  virtual void SetEtaBins(TAxis* ax) { fEtaAxis=ax; }
220 
221  virtual TAxis* GetPhiBins() const { return fPhiAxis; }
222  virtual void SetPhiBins(TAxis* ax) { fPhiAxis=ax; }
223 
224  virtual Float_t GetEps() const { return fEps; }
225  virtual void SetEps(Float_t eps) { fEps=eps; }
226 
227  Bool_t GetWrapTwoPi() const { return fWrapTwoPi; }
228  void SetWrapTwoPi(Bool_t w) { fWrapTwoPi=w; }
229 
230  static Float_t EtaToTheta(Float_t eta);
231 
232 
233  ClassDef(TEveCaloData, 0); // Manages calorimeter event data.
234 };
235 
236 /**************************************************************************/
237 /**************************************************************************/
238 
239 class TEveCaloDataVec: public TEveCaloData
240 {
241 
242 private:
243  TEveCaloDataVec(const TEveCaloDataVec&); // Not implemented
244  TEveCaloDataVec& operator=(const TEveCaloDataVec&); // Not implemented
245 
246 protected:
247  typedef std::vector<Float_t> vFloat_t;
248  typedef std::vector<Float_t>::iterator vFloat_i;
249 
250  typedef std::vector<vFloat_t> vvFloat_t;
251  typedef std::vector<vFloat_t>::iterator vvFloat_i;
252 
253  vvFloat_t fSliceVec;
254  vCellGeom_t fGeomVec;
255 
256  Int_t fTower; // current tower
257 
258  Float_t fEtaMin;
259  Float_t fEtaMax;
260 
261  Float_t fPhiMin;
262  Float_t fPhiMax;
263 
264 public:
265  TEveCaloDataVec(Int_t nslices);
266  virtual ~TEveCaloDataVec();
267 
268  Int_t AddSlice();
269  Int_t AddTower(Float_t etaMin, Float_t etaMax, Float_t phiMin, Float_t phiMax);
270  void FillSlice(Int_t slice, Float_t value);
271  void FillSlice(Int_t slice, Int_t tower, Float_t value);
272 
273  Int_t GetNCells() { return fGeomVec.size(); }
274  std::vector<Float_t>& GetSliceVals(Int_t slice) { return fSliceVec[slice]; }
275  std::vector<TEveCaloData::CellGeom_t>& GetCellGeom() { return fGeomVec; }
276 
277  virtual void GetCellList(Float_t etaMin, Float_t etaMax,
278  Float_t phi, Float_t phiRng,
279  vCellId_t &out) const;
280 
281  virtual void Rebin(TAxis *ax, TAxis *ay, vCellId_t &in, Bool_t et, RebinData_t &out) const;
282 
283  virtual void GetCellData(const TEveCaloData::CellId_t &id, TEveCaloData::CellData_t& data) const;
284  virtual void GetEtaLimits(Double_t &min, Double_t &max) const { min=fEtaMin, max=fEtaMax;}
285  virtual void GetPhiLimits(Double_t &min, Double_t &max) const { min=fPhiMin; max=fPhiMax;}
286 
287 
288  virtual void DataChanged();
289  void SetAxisFromBins(Double_t epsX=0.001, Double_t epsY=0.001);
290 
291  ClassDef(TEveCaloDataVec, 0); // Manages calorimeter event data.
292 };
293 
294 /**************************************************************************/
295 /**************************************************************************/
296 
297 class TEveCaloDataHist: public TEveCaloData
298 {
299 private:
300  TEveCaloDataHist(const TEveCaloDataHist&); // Not implemented
301  TEveCaloDataHist& operator=(const TEveCaloDataHist&); // Not implemented
302 
303 protected:
304  THStack* fHStack;
305 
306 public:
307  TEveCaloDataHist();
308  virtual ~TEveCaloDataHist();
309 
310  virtual void GetCellList( Float_t etaMin, Float_t etaMax,
311  Float_t phi, Float_t phiRng, vCellId_t &out) const;
312 
313  virtual void Rebin(TAxis *ax, TAxis *ay, vCellId_t &in, Bool_t et, RebinData_t &out) const;
314 
315  virtual void GetCellData(const TEveCaloData::CellId_t &id, TEveCaloData::CellData_t& data) const;
316 
317  virtual void GetEtaLimits(Double_t &min, Double_t &max) const;
318  virtual void GetPhiLimits(Double_t &min, Double_t &max) const;
319 
320 
321  virtual void DataChanged();
322 
323  THStack* GetStack() { return fHStack; }
324 
325  TH2F* GetHist(Int_t slice) const;
326 
327  Int_t AddHistogram(TH2F* hist);
328 
329  ClassDef(TEveCaloDataHist, 0); // Manages calorimeter TH2F event data.
330 };
331 
332 #endif
333