Belle II Software  release-05-01-25
ARICHAerogelHist.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2017 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Leonid Burmistrov *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 //my
12 #include <arich/utility/ARICHAerogelHist.h>
13 
14 //c, c++
15 #include <iostream>
16 #include <string>
17 #include <iomanip>
18 #include <vector>
19 
20 //root
21 #include <TVector2.h>
22 #include <TCanvas.h>
23 #include <TMath.h>
24 #include <TPad.h>
25 #include <TString.h>
26 #include <TFile.h>
27 #include <TAxis.h>
28 
29 using namespace std;
30 using namespace Belle2;
31 
32 ARICHAerogelHist::ARICHAerogelHist(const char* name, const char* title) : TH2Poly(), m_histName(name), m_histTitle(title)
33 {
34  SetName(m_histName.Data());
35  SetTitle(m_histTitle.Data());
38 
39  if (m_verboseLevel > 0) {
40  std::cout << setw(10) << "ring" << setw(10) << "nTiles" << setw(10) << "tileRmin" << setw(10) << "tileRmax" << std::endl;
41  for (unsigned int i = 0; i < m_nTiles.size(); i++)
42  std::cout << setw(10) << i + 1 << setw(10) << m_nTiles[i] << setw(10) << m_tileRmin[i] << setw(10) << m_tileRmax[i] << std::endl;
44  }
45 
46  unsigned int n;
47  double* x;
48  double* y;
49 
50  double xold;
51  double yold;
52  double xnew;
53  double ynew;
54  double phi;
55 
56  //Add "poly bins" to the histogram
57  //Loop over rings with different radiuses
58  unsigned int iR = 0;
59  for (auto& m : m_verticesMap) {
60  //Loop aerogel tiles (bins) within one ring.
61  double phi0 = m_tileDeltaPhiCenter[iR] / 2.0;
62  double deltaPhi = m_tileDeltaPhiCenter[iR] + m_aerogelAriGapDeltaPhiCenter[iR];
63  for (Int_t j = 0; j < m_nTiles[iR]; j++) {
64  phi = phi0 + deltaPhi * j;
65  n = m.second.size();
66  x = new double [n];
67  y = new double [n];
68  //Loop over polygonal points which defines bins.
69  for (unsigned int i = 0; i < n; i++) {
70  xold = m.second[i].X();
71  yold = m.second[i].Y();
72  makeRotation(xold, yold, xnew, ynew, phi);
73  x[i] = xnew;
74  y[i] = ynew;
75  }
76  AddBin(n, x, y);
77  delete []x;
78  delete []y;
79  }
80  iR++;
81  }// for (auto& m: m_verticesMap) {
82 
83 }
84 
85 Int_t ARICHAerogelHist::GetBinIDFromRingColumn(Int_t ring, Int_t column)
86 {
87 
88  Int_t binID = 0;
89  unsigned int ringu = ring;
90  //cout<<" ewewe "<<m_nTiles[ring-1]<<endl;
91  if (ringu > m_nTiles.size() || ringu < 1)
92  return -999;
93  if (column > m_nTiles[ring - 1] || column < 1)
94  return -999;
95  for (Int_t i = 1; i < ring; i++)
96  binID += m_nTiles[i - 1];
97  return binID + column;
98 
99 }
100 
101 void ARICHAerogelHist::makeRotation(double xold, double yold, double& xnew, double& ynew, double phi)
102 {
103 
104  TVector2 v(xold, yold);
105  TVector2 vrot;
106  vrot = v.Rotate(phi);
107  xnew = vrot.X();
108  ynew = vrot.Y();
109 
110 }
111 
112 void ARICHAerogelHist::DrawHisto(TString opt = "ZCOLOT text same", TString outDirName = "./")
113 {
114 
115  TCanvas* c1 = new TCanvas("c1", "c1", 1000, 1000);
116  c1->SetTitle(m_histTitle.Data());
117  c1->SetName(m_histName.Data());
118  c1->SetRightMargin(0.17);
119  c1->SetLeftMargin(0.12);
120  c1->SetTopMargin(0.15);
121  c1->SetBottomMargin(0.15);
122 
123  TH2F* frame = new TH2F("h2", "h2", 40, -1200, 1200, 40, -1200, 1200);
124  //TH2F *frame = new TH2F("h2","h2",40, 400, 650, 40, -50, 200);
125  frame->GetXaxis()->SetTitle("x (mm)");
126  frame->GetYaxis()->SetTitle("y (mm)");
127  frame->GetXaxis()->CenterTitle();
128  frame->GetYaxis()->CenterTitle();
129  frame->GetYaxis()->SetTitleOffset(1.5);
130  frame->SetStats(kFALSE);
131  frame->SetTitle("");
132  frame->Draw();
133 
134  Draw(opt.Data());
135  c1->Modified();
136  c1->Update();
137  if (outDirName.Length() > 0) {
138  std::cout << "outDirName.Length() " << outDirName.Length() << std::endl;
139  TString outnamePDF = outDirName; outnamePDF += m_histName; outnamePDF += ".pdf";
140  TString outnameEPS = outDirName; outnameEPS += m_histName; outnameEPS += ".eps";
141  c1->SaveAs(outnamePDF.Data());
142  c1->SaveAs(outnameEPS.Data());
143  }
144 
145 }
146 
148 {
149 
150  unsigned int i;
151  for (auto& m : m_verticesMap) {
152  std::cout << " --> Aerogel ring : " << m.first << '\n';
153  for (i = 0; i < m.second.size(); i++) {
154  std::cout << " " << setw(15) << m.second[i].X() << setw(15) << m.second[i].Y() << std::endl;
155  }
156  }
157 
158 }
159 
161 {
162 
163  for (unsigned int i = 0; i < m_nTiles.size(); i++) {
164  std::vector<TVector2> vecTvec;
165  int nTiles = m_nTiles[i];
166  double rmin = m_tileRmin[i];
167  double rmax = m_tileRmax[i];
168  double lmin = 2 * TMath::Pi() * rmin / nTiles - m_aerogelTileGap;
169  double lmax = 2 * TMath::Pi() * rmax / nTiles - m_aerogelTileGap;
170  double phimin = lmin / rmin;
171  double phimax = lmax / rmax;
172  double x1 = rmin * TMath::Cos(phimin / 2.0);
173  double y1 = rmin * TMath::Sin(phimin / 2.0);
174  TVector2 v1(x1, y1);
175  vecTvec.push_back(v1);
176  double x2 = rmax * TMath::Cos(phimax / 2.0);
177  double y2 = rmax * TMath::Sin(phimax / 2.0);
178  TVector2 v2(x2, y2);
179  vecTvec.push_back(v2);
180  //Add circular points from outer radious (clockwise added)
181  if (m_nCircularPoints > 0) {
182  double dPhi = phimax / (m_nCircularPoints + 1);
183  for (int j = 0; j < m_nCircularPoints; j++) {
184  TVector2 v;
185  v.SetMagPhi(rmax, (phimax / 2.0 - dPhi * (j + 1)));
186  vecTvec.push_back(v);
187  }
188  }
189 
190  double x3 = x2;
191  double y3 = -y2;
192  TVector2 v3(x3, y3);
193  vecTvec.push_back(v3);
194  double x4 = x1;
195  double y4 = -y1;
196  TVector2 v4(x4, y4);
197  vecTvec.push_back(v4);
198  //Add circular points inner radious
199  if (m_nCircularPoints > 0) {
200  double dPhi = phimin / (m_nCircularPoints + 1);
201  for (int j = 0; j < m_nCircularPoints; j++) {
202  TVector2 v;
203  v.SetMagPhi(rmin, (-phimax / 2.0 + dPhi * (j + 1)));
204  vecTvec.push_back(v);
205  }
206  }
207 
208  vecTvec.push_back(v1);
209  m_verticesMap[i] = vecTvec;
210  }
211 
212 }
213 
215 {
216 
217  //Verbose level
218  m_verboseLevel = 0;
219  //Distance between aerogel tiles
220  m_aerogelTileGap = 1;
221  //Number of circular points
222  m_nCircularPoints = 10;
223  //Number of tiles per ring.
224  m_nTiles.push_back(22);
225  m_nTiles.push_back(28);
226  m_nTiles.push_back(34);
227  m_nTiles.push_back(40);
228  //Minimum radius of aerogel ring
229  m_tileRmin.push_back(441.0);
230  m_tileRmin.push_back(614.0);
231  m_tileRmin.push_back(787.0);
232  m_tileRmin.push_back(960.0);
233  //Maximum radius of aerogel ring
234  m_tileRmax.push_back(613.0);
235  m_tileRmax.push_back(786.0);
236  m_tileRmax.push_back(959.0);
237  m_tileRmax.push_back(1117.0);
238  for (unsigned int i = 0; i < m_nTiles.size(); i++) {
239  m_tileRcenter.push_back((m_tileRmax[i] + m_tileRmin[i]) / 2.0);
240  double r = m_tileRcenter[i];
241  double l = 2 * TMath::Pi() * r / m_nTiles[i] - m_aerogelTileGap;
242  double phi = l / r;
243  m_tileDeltaPhiCenter.push_back(phi);
245  }
246 
247 }
Belle2::ARICHAerogelHist::m_aerogelAriGapDeltaPhiCenter
std::vector< double > m_aerogelAriGapDeltaPhiCenter
Angle opening (phi) of the air gap between aerogel tiles.
Definition: ARICHAerogelHist.h:107
Belle2::ARICHAerogelHist::m_verboseLevel
Int_t m_verboseLevel
Verbose level.
Definition: ARICHAerogelHist.h:108
Belle2::ARICHAerogelHist::makeRotation
void makeRotation(double xold, double yold, double &xnew, double &ynew, double phi)
Function to rotate 2D point (x and y) around z axis by angle phi.
Definition: ARICHAerogelHist.cc:101
Belle2::ARICHAerogelHist::m_tileRmin
std::vector< double > m_tileRmin
Minimum radius of aerogel ring.
Definition: ARICHAerogelHist.h:101
Belle2::ARICHAerogelHist::m_tileRmax
std::vector< double > m_tileRmax
Maximum radius of aerogel ring.
Definition: ARICHAerogelHist.h:102
Belle2::ARICHAerogelHist::SetInitialParametersByDefault
void SetInitialParametersByDefault()
Function which set initial values of input parameters.
Definition: ARICHAerogelHist.cc:214
Belle2::ARICHAerogelHist::DrawHisto
void DrawHisto(TString opt, TString outDirName)
Function to draw the histogram.
Definition: ARICHAerogelHist.cc:112
Belle2::ARICHAerogelHist::m_aerogelTileGap
double m_aerogelTileGap
Distance between aerogel tiles.
Definition: ARICHAerogelHist.h:110
Belle2::ARICHAerogelHist::dumpVerticesMap
void dumpVerticesMap()
Function to print vertices for one aerogel tile.
Definition: ARICHAerogelHist.cc:147
Belle2::ARICHAerogelHist::m_nCircularPoints
Int_t m_nCircularPoints
Number of circular points.
Definition: ARICHAerogelHist.h:109
Belle2::ARICHAerogelHist::m_verticesMap
std::map< Int_t, std::vector< TVector2 > > m_verticesMap
Aerogel vertices map.
Definition: ARICHAerogelHist.h:113
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::ARICHAerogelHist::GetBinIDFromRingColumn
Int_t GetBinIDFromRingColumn(Int_t ring, Int_t column)
Function which return histogram bin id from ring and column id's.
Definition: ARICHAerogelHist.cc:85
Belle2::ARICHAerogelHist::m_tileRcenter
std::vector< double > m_tileRcenter
Center radius of aerogel ring.
Definition: ARICHAerogelHist.h:103
Belle2::ARICHAerogelHist::SetUpVerticesMap
void SetUpVerticesMap()
Function for calculation vertices for one aerogel tile.
Definition: ARICHAerogelHist.cc:160
Belle2::ARICHAerogelHist::m_histName
TString m_histName
Histogram name.
Definition: ARICHAerogelHist.h:115
Belle2::ARICHAerogelHist::m_histTitle
TString m_histTitle
Histogram title.
Definition: ARICHAerogelHist.h:116
Belle2::ARICHAerogelHist::m_tileDeltaPhiCenter
std::vector< double > m_tileDeltaPhiCenter
Angle opening (phi) of the aerogel tile measured between two rays (0.0,0.0 : and centre of the ring f...
Definition: ARICHAerogelHist.h:105
Belle2::ARICHAerogelHist::m_nTiles
std::vector< Int_t > m_nTiles
Number of tiles per ring.
Definition: ARICHAerogelHist.h:100