Belle II Software  release-05-01-25
SVDAPVHistograms.h
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2017 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Eugenio Paoloni, Giulia Casarosa *
7  * *
8  * This software is provided "as is" without any warranty. *
9  * WARNING! Have the potential to cause addiction, but not always... *
10  **************************************************************************/
11 
12 #pragma once
13 #include <vxd/dataobjects/VxdID.h>
14 #include <vxd/geometry/GeoCache.h>
15 #include <vxd/geometry/SensorInfoBase.h>
16 #include <string>
17 #include <regex>
18 
19 namespace Belle2 {
26  template < class H > // H is an histogram
27  class SVDAPVHistograms: public TObject {
28 
29  public:
32  SVDAPVHistograms(H()) {};
33 
35  explicit SVDAPVHistograms(const H& templateAPV);
36 
38  ~SVDAPVHistograms() { clean(); };
39 
42  enum E_side { VIndex = 0 , UIndex = 1 };
43 
47  H* getHistogram(const VxdID& vxdID, int view, int apv)
48  {
49  H* returnValue = m_defaultHistogram;
50  try {
51  auto layer = m_histograms.at(vxdID.getLayerNumber());
52  auto ladder = layer.at(vxdID.getLadderNumber());
53  auto sensor = ladder.at(vxdID.getSensorNumber());
54  auto theView = sensor.at(view);
55  returnValue = theView.at(apv);
56  } catch (...) {
57  B2WARNING("Unexpected VxdID/view/apv. VxdID: " << (std::string)(vxdID)
58  << " view : " << view
59  << " apv : " << apv);
60 
61  returnValue = m_defaultHistogram;
62  }
63 
64  return returnValue;
65  }
66 
67  // variable number of arguments for TH1 TH2...
69  template< class ... Types>
70  void fill(const VxdID& vxdID, int view, int apv, Types ... args)
71  {
72  getHistogram(vxdID, view, apv)->Fill(args...);
73  }
74 
75  // variable number of arguments for TH1 TH2...
77  template< class ... Types>
78  void fill(const VxdID& vxdID, bool isU, int apv, Types ... args)
79  {
80  int view = isU ? UIndex : VIndex;
81  getHistogram(vxdID, view, apv)->Fill(args...);
82  }
83 
85  void customizeString(std::string& base, const VxdID& vxdID, bool isU, int user_apv)
86  {
87  std::string layer = std::to_string(vxdID.getLayerNumber());
88  std::string ladder = std::to_string(vxdID.getLadderNumber());
89  std::string sensor = std::to_string(vxdID.getSensorNumber());
90  std::string apv = std::to_string(user_apv);
91  std::string view = isU ? "U" : "V" ;
92  base = std::regex_replace(base, std::regex("[@]layer") , layer);
93  base = std::regex_replace(base, std::regex("[@]ladder"), ladder);
94  base = std::regex_replace(base, std::regex("[@]sensor"), sensor);
95  base = std::regex_replace(base, std::regex("[@]view") , view);
96  std::string side = isU ? "P" : "N" ;
97  base = std::regex_replace(base, std::regex("[@]side") , side);
98  base = std::regex_replace(base, std::regex("[@]apv") , apv);
99  }
100 
102  void clean()
103  {
104 
105  for (auto layer : m_histograms)
106  for (auto ladder : layer)
107  for (auto sensor : ladder)
108  for (auto view : sensor)
109  for (auto apv : view)
110  delete apv;
111  }
112 
113 
114 
115 
116  private:
123  typedef std::vector< H* > t_Views;
125  typedef std::vector< t_Views > t_SVDSensor;
128  typedef std::vector< t_SVDSensor > t_SVDLadder;
131  typedef std::vector< t_SVDLadder > t_SVDLayer;
134  typedef std::vector< t_SVDLayer > t_SVD;
139  void customize(H& histogram, VxdID vxdID, int view, int apv);
142  };
143 
145  template <class H>
147  {
148  m_defaultHistogram = new H(templateAPV);
149 
151  for (auto layer : geoCache.getLayers(VXD::SensorInfoBase::SVD)) {
152  unsigned int layerNumber = layer.getLayerNumber();
153  if (m_histograms.size() <= layerNumber)
154  m_histograms.resize(layerNumber + 1);
155 
156  for (auto ladder : geoCache.getLadders(layer)) {
157  unsigned int ladderNumber = ladder.getLadderNumber();
158  if (m_histograms[layerNumber].size() <= ladderNumber)
159  m_histograms[layerNumber].resize(ladderNumber + 1);
160 
161  for (Belle2::VxdID sensor : geoCache.getSensors(ladder)) {
162  unsigned int sensorNumber = sensor.getSensorNumber();
163  if (m_histograms[layerNumber][ladderNumber].size() <= sensorNumber)
164  m_histograms[layerNumber][ladderNumber].resize(sensorNumber + 1);
165  m_histograms[layerNumber][ladderNumber][sensorNumber].resize(2);
166 
167  for (int view = VIndex ; view < UIndex + 1; view++) {
168  int nAPV = 6;
169  unsigned int viewNumber = 3;
170 
171  if (m_histograms[layerNumber][ladderNumber][view].size() < viewNumber)
172  m_histograms[layerNumber][ladderNumber][sensorNumber].resize(viewNumber);
173  m_histograms[layerNumber][ladderNumber][sensorNumber][view].resize(nAPV);
174  for (int apv = 0; apv < nAPV; apv ++) {
175 
176  H h = templateAPV;
177  customize(h , sensor, view, apv);
178  m_histograms[layerNumber][ladderNumber][sensorNumber][view][apv] = new H(h);
179  }
180  }
181  }
182  }
183  }
184  }
185 
187  template < class H >
188  void SVDAPVHistograms<H>::customize(H& histogram, VxdID vxdID, int view, int apv)
189  {
190  bool isU = view == UIndex;
191  std::string name = histogram.GetName();
192  customizeString(name, vxdID, isU, apv);
193  histogram.SetName(name.c_str());
194 
195  std::string title = histogram.GetTitle();
196  customizeString(title, vxdID, isU, apv);
197  histogram.SetTitle(title.c_str());
198 
199  std::string xAxis = histogram.GetXaxis()->GetTitle();
200  customizeString(xAxis, vxdID, isU, apv);
201  histogram.SetXTitle(xAxis.c_str());
202 
203  std::string yAxis = histogram.GetYaxis()->GetTitle();
204  customizeString(yAxis, vxdID, isU, apv);
205  histogram.SetYTitle(yAxis.c_str());
206 
207  std::string zAxis = histogram.GetZaxis()->GetTitle();
208  customizeString(zAxis, vxdID, isU, apv);
209  histogram.SetZTitle(zAxis.c_str());
210 
211  }
213 }
Belle2::SVDAPVHistograms::m_defaultHistogram
H * m_defaultHistogram
the default histogram
Definition: SVDAPVHistograms.h:146
Belle2::SVDAPVHistograms::t_SVD
std::vector< t_SVDLayer > t_SVD
The t_SVD is a vector of t_SVDLayers.
Definition: SVDAPVHistograms.h:143
Belle2::SVDAPVHistograms::E_side
E_side
This enumeration assure the same semantic of the isU methods defined by Peter Kv.
Definition: SVDAPVHistograms.h:51
Belle2::VxdID
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:43
Belle2::SVDAPVHistograms::t_SVDLadder
std::vector< t_SVDSensor > t_SVDLadder
A t_SVDLadder is a vector of t_SVDSensors.
Definition: SVDAPVHistograms.h:137
Belle2::VxdID::getLadderNumber
baseType getLadderNumber() const
Get the ladder id.
Definition: VxdID.h:108
Belle2::SVDAPVHistograms::t_Views
std::vector< H * > t_Views
A t_SVDView is a vector of H that will have length = # APV chips.
Definition: SVDAPVHistograms.h:132
Belle2::SVDAPVHistograms::customizeString
void customizeString(std::string &base, const VxdID &vxdID, bool isU, int user_apv)
replaces layer ladder sensor view and apv with the current numbers
Definition: SVDAPVHistograms.h:94
Belle2::SVDAPVHistograms::SVDAPVHistograms
SVDAPVHistograms()
Default constructor.
Definition: SVDAPVHistograms.h:40
Belle2::SVDAPVHistograms::getHistogram
H * getHistogram(const VxdID &vxdID, int view, int apv)
get a reference to the histogram for
Definition: SVDAPVHistograms.h:56
Belle2::SVDAPVHistograms::clean
void clean()
delete pointers
Definition: SVDAPVHistograms.h:111
Belle2::SVDAPVHistograms::fill
void fill(const VxdID &vxdID, int view, int apv, Types ... args)
fill the histogram for
Definition: SVDAPVHistograms.h:79
Belle2::SVDAPVHistograms::customize
void customize(H &histogram, VxdID vxdID, int view, int apv)
customize the histogram with the sensor, view and APV numbers
Definition: SVDAPVHistograms.h:197
Belle2::VXD::GeoCache::getInstance
static GeoCache & getInstance()
Return a reference to the singleton instance.
Definition: GeoCache.cc:215
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::SVDAPVHistograms::m_histograms
t_SVD m_histograms
the vector of vector ...
Definition: SVDAPVHistograms.h:145
Belle2::SVDAPVHistograms::t_SVDLayer
std::vector< t_SVDLadder > t_SVDLayer
A t_SVDLayer is a vector of t_SVDLadders.
Definition: SVDAPVHistograms.h:140
Belle2::VXD::SensorInfoBase::SVD
@ SVD
SVD Sensor.
Definition: SensorInfoBase.h:45
Belle2::SVDAPVHistograms::~SVDAPVHistograms
~SVDAPVHistograms()
clean everything in the destructor
Definition: SVDAPVHistograms.h:47
Belle2::VxdID::getSensorNumber
baseType getSensorNumber() const
Get the sensor id.
Definition: VxdID.h:110
Belle2::SVDAPVHistograms::t_SVDSensor
std::vector< t_Views > t_SVDSensor
a vector of vector of H, length = 2
Definition: SVDAPVHistograms.h:134
Belle2::SVDAPVHistograms::ClassDef
ClassDef(SVDAPVHistograms, 1)
needed by root
Belle2::VXD::GeoCache
Class to faciliate easy access to sensor information of the VXD like coordinate transformations or pi...
Definition: GeoCache.h:41
Belle2::SVDAPVHistograms
template class for the APV Histograms
Definition: SVDAPVHistograms.h:36
Belle2::VxdID::getLayerNumber
baseType getLayerNumber() const
Get the layer id.
Definition: VxdID.h:106