Belle II Software  release-08-01-10
SVDSummaryPlots.h
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #pragma once
10 #include <vxd/dataobjects/VxdID.h>
11 #include <string>
12 #include <regex>
13 #include <TH2F.h>
14 #include <TProfile.h>
15 
16 namespace Belle2 {
23  class SVDSummaryPlots: public TObject {
24 
25  public:
28  SVDSummaryPlots("", "") {};
34  SVDSummaryPlots(TString name, TString title)
35  {
36  m_defaultHistogram = new TH2F(name.Data(), title.Data(),
37  16, 0.5, 16.5,
38  19, 0, 19);
39 
40  for (int view = VIndex ; view < UIndex + 1; view++) {
41  std::string hname = name.Data();
42  bool isU = (view == UIndex);
43  customizeString(hname, isU);
44  m_histos[view] = new TH2F(hname.c_str(), title.Data(),
45  16, 0.5, 16.5,
46  19, 0, 19);
47  customize(*m_histos[view], view);
48  m_Title[view] = m_histos[view]->GetTitle();
49  }
50  }
51 
52 
55 
58  enum E_side { VIndex = 0, UIndex = 1 };
59 
63  TH2F* getHistogram(int view)
64  {
65  TH2F* returnValue = m_defaultHistogram;
66  try {
67  returnValue = m_histos[view];
68  } catch (...) {
69  B2WARNING("Unexpected view: " << view);
70 
71  returnValue = m_defaultHistogram;
72  }
73 
74  return returnValue;
75  }
76 
78  float getValue(const VxdID& vxdID, int view)
79  {
80  int layer = vxdID.getLayerNumber();
81  int ladder = vxdID.getLadderNumber();
82  int sensor = vxdID.getSensorNumber();
83 
84  int bin = m_histos[view]->FindBin(ladder, findBinY(layer, sensor));
85  return getHistogram(view)->GetBinContent(bin);
86  }
87 
94  float getValue(int layer, int ladder, int sensor, int view)
95  {
96  int bin = m_histos[view]->FindBin(ladder, findBinY(layer, sensor));
97  return getHistogram(view)->GetBinContent(bin);
98  }
99 
107  void fill(int layer, int ladder, int sensor, int view, float value)
108  {
109  getHistogram(view)->Fill(ladder, findBinY(layer, sensor), value);
110  }
111 
115  void fill(const VxdID& vxdID, int view, float value)
116  {
117  int layer = vxdID.getLayerNumber();
118  int ladder = vxdID.getLadderNumber();
119  int sensor = vxdID.getSensorNumber();
120 
121  getHistogram(view)->Fill(ladder, findBinY(layer, sensor), value);
122  }
123 
127  void setRunID(const TString& runID)
128  {
129  for (int view = VIndex ; view < UIndex + 1; view++) {
130  // add blank if needed before adding runID
131  if (!m_Title[view].EndsWith(" "))
132  m_Title[view].Append(" ");
133 
134  getHistogram(view)->SetTitle(m_Title[view] + runID);
135  }
136  }
137 
140  void reset()
141  {
142  for (int view = VIndex ; view < UIndex + 1; view++)
143  getHistogram(view)->Reset();
144  }
145 
149  void setStats(bool stats = true)
150  {
151  for (int view = VIndex ; view < UIndex + 1; view++)
152  getHistogram(view)->SetStats(stats);
153  }
154 
156  void fill(const VxdID& vxdID, bool isU, float value)
157  {
158  int view = isU ? UIndex : VIndex;
159 
160  int layer = vxdID.getLayerNumber();
161  int ladder = vxdID.getLadderNumber();
162  int sensor = vxdID.getSensorNumber();
163 
164  getHistogram(view)->Fill(ladder, findBinY(layer, sensor), value);
165  }
166 
168  void customizeString(std::string& base, bool isU)
169  {
170  std::string view = isU ? "U" : "V" ;
171  base = std::regex_replace(base, std::regex("[@]view"), view);
172  std::string side = isU ? "P" : "N" ;
173  base = std::regex_replace(base, std::regex("[@]side"), side);
174  }
175 
177  void clean()
178  {
179  delete m_histos[0];
180  delete m_histos[1];
181  delete m_defaultHistogram;
182  }
183 
184  private:
185 
187  Int_t findBinY(Int_t layer, Int_t sensor)
188  {
189 
190  if (layer == 3)
191  return sensor; //2
192  if (layer == 4)
193  return 2 + 1 + sensor; //6
194  if (layer == 5)
195  return 6 + 1 + sensor; // 11
196  if (layer == 6)
197  return 11 + 1 + sensor; // 17
198  else
199  return -1;
200  }
201 
202  TH2F* m_histos[2];
204  TH2F* m_defaultHistogram = nullptr;
206  TString m_Title[2];
209  void customize(TH2F& histogram, int view)
210  {
211 
212  const int nY = 19;
213  TString Ylabels[nY] = {"", "L3.x.1", "L3.x.2",
214  " ", "L4.x.1", "L4.x.2", "L4.x.3",
215  " ", "L5.x.1", "L5.x.2", "L5.x.3", "L5.x.4",
216  " ", "L6.x.1", "L6.x.2", "L6.x.3", "L6.x.4", "L6.x.5", " "
217  };
218 
219  histogram.SetMarkerSize(1.1);
220  histogram.GetXaxis()->SetTitle("ladder number");
221  histogram.GetXaxis()->SetLabelSize(0.04);
222  for (unsigned short i = 0; i < nY; i++)
223  histogram.GetYaxis()->SetBinLabel(i + 1, Ylabels[i].Data());
224 
225  bool isU = view == UIndex;
226  std::string title = histogram.GetTitle();
227  customizeString(title, isU);
228  histogram.SetTitle(title.c_str());
229 
230  std::string xAxis = histogram.GetXaxis()->GetTitle();
231  customizeString(xAxis, isU);
232  histogram.SetXTitle(xAxis.c_str());
233 
234  std::string yAxis = histogram.GetYaxis()->GetTitle();
235  customizeString(yAxis, isU);
236  histogram.SetYTitle(yAxis.c_str());
237 
238  std::string zAxis = histogram.GetZaxis()->GetTitle();
239  customizeString(zAxis, isU);
240  histogram.SetZTitle(zAxis.c_str());
241 
242  }
243 
244 
246  };
247 
248 
250 }
class to summarize SVD quantities per sensor and side
TH2F * m_histos[2]
vector containing the U and V histograms
void fill(const VxdID &vxdID, int view, float value)
fill the histogram for
~SVDSummaryPlots()
clean everything in the destructor
void clean()
delete pointers
Int_t findBinY(Int_t layer, Int_t sensor)
find the Y bin given the layer and sensor number
void setStats(bool stats=true)
set histograms stat
void customizeString(std::string &base, bool isU)
replaces layer ladder sensor view and apv with the current numbers
SVDSummaryPlots(TString name, TString title)
this is the default constructor
float getValue(const VxdID &vxdID, int view)
get the value contained in the corresponding bin, given VxdID and view
void fill(int layer, int ladder, int sensor, int view, float value)
fill the histogram for
void fill(const VxdID &vxdID, bool isU, float value)
fill the histogram for
TH2F * getHistogram(int view)
get a reference to the histogram for
TString m_Title[2]
Base title.
SVDSummaryPlots()
Default constructor.
float getValue(int layer, int ladder, int sensor, int view)
get the value contained in the corresponding bin, given
void customize(TH2F &histogram, int view)
customize the histogram with the sensor, view
TH2F * m_defaultHistogram
default histograms
void setRunID(const TString &runID)
set run ids in title
void reset()
Reset histograms.
E_side
This enumeration assure the same semantic of the isU methods defined by Peter Kv.
ClassDef(SVDSummaryPlots, 2)
needed by root
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:33
baseType getSensorNumber() const
Get the sensor id.
Definition: VxdID.h:100
baseType getLadderNumber() const
Get the ladder id.
Definition: VxdID.h:98
baseType getLayerNumber() const
Get the layer id.
Definition: VxdID.h:96
Abstract base class for different kinds of events.