Belle II Software  release-08-01-10
ECLCrystalData.cc
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 /* Own header. */
10 #include <ecl/modules/eclBackgroundStudy/ECLCrystalData.h>
11 
12 /* Basf2 headers. */
13 #include <framework/logging/Logger.h>
14 
15 /* ROOT headers. */
16 #include <TMath.h>
17 
18 /* C++ headers. */
19 #include <cmath>
20 
21 using namespace Belle2;
22 
23 //ECL has 16-fold symmetry in phi. Multiply this by 16 to get the total number of crystals at each theta location.
24 int const ECLCrystalData::Ring[69] = {
25  3, 3, 4, 4, 4, 6, 6, 6, 6, 6, 6, 9, 9, //forward calorimeter
26  9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, //barrel
27  9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, //barrel
28  9, 9, 9, 9, 9, 9, //barrel
29  9, 9, 6, 6, 6, 6, 6, 4, 4, 4 //backward calorimeter
30 };
31 
32 int const ECLCrystalData::sumPrevious[24] = {0, 3, 6, 10, 14, 18, 24, 30, 36, 42, 48, 54, 63, 72, 81, 90, 96, 102, 108, 114, 120, 124, 128, 132};
33 
34 //endcap crystal masses
35 float const ECLCrystalData::CrystalMassEndcap[132] = {4.99, 5.01, 4.99, 5.82, 5.94, 5.83, 4.75, 4.76, 4.77, 4.74, 5.14, 5.16, 5.16,
36  5.14, 5.76, 5.8, 5.79, 5.78, 4.14, 4.28, 4.15, 4.16, 4.28, 4.14, 4.32, 4.34,
37  4.34, 4.34, 4.34, 4.32, 4.85, 4.87, 4.87, 4.87, 4.87, 4.85, 4.99, 5.02, 5.02,
38  5.02, 5.02, 4.99, 5.37, 5.39, 5.39, 5.39, 5.39, 5.37, 5.89, 5.92, 5.92, 5.92,
39  5.92, 5.9, 4.03, 4.12, 4.05, 4.05, 4.12, 4.05, 4.05, 4.12, 4.03, 4.16, 4.18,
40  4.18, 4.18, 4.18, 4.18, 4.18, 4.18, 4.16, 4.47, 4.49, 4.49, 4.49, 4.49, 4.49,
41  4.49, 4.49, 4.47, 4.26, 4.34, 4.28, 4.28, 4.34, 4.28, 4.28, 4.34, 4.26, 5.88,
42  5.91, 5.91, 5.91, 5.91, 5.88, 5.46, 5.48, 5.48, 5.48, 5.48, 5.46, 5.02, 5.04,
43  5.04, 5.04, 5.04, 5.02, 4.63, 4.65, 4.65, 4.65, 4.65, 4.63, 4.4, 4.53, 4.42,
44  4.42, 4.53, 4.4, 5.74, 5.77, 5.76, 5.74, 5.09, 5.11, 5.11, 5.09, 4.56, 4.58,
45  4.58, 4.56
46  };
47 
48 //Barrel crystal masses
49 float const ECLCrystalData::CrystalMassBarrel[46] = {4.599, 4.619, 4.639, 4.659, 4.680, 4.701, 4.722, 4.744, 4.765,
50  4.786, 4.807, 4.828, 4.848, 4.868, 4.887, 4.906, 4.923, 4.940,
51  4.955, 4.969, 4.981, 4.992, 5.001, 5.008, 5.013, 5.016, 5.017,
52  5.016, 4.455, 4.455, 5.016, 5.017, 5.016, 5.013, 5.008, 5.001,
53  4.992, 4.981, 4.969, 4.955, 4.940, 4.923, 4.906, 4.887, 4.868,
54  4.848
55  };
56 
57 
58 //Theta ID to theta(deg)
59 double const ECLCrystalData::theta[69] = {13.9486666667, 15.4862, 17.110575, 18.757625, 20.255425, 21.8637333333,
60  23.4259666667, 24.96125, 26.4777833333, 27.9407, 29.36275, 30.8382555556,
61  32.2618444444, 33.667039, 35.062886, 36.509337, 38.007345, 39.557769,
62  41.161373, 42.818633, 44.530027, 46.295838, 48.115876, 49.990235, 51.91882,
63  53.900865, 55.935415, 58.021324, 60.157158, 62.3412, 64.571442, 66.8455,
64  69.160698, 71.513983, 73.902011, 76.321253, 78.767888, 81.237718, 83.726351,
65  86.229301, 88.741891, 90, 90, 91.258109, 93.770699, 96.273649, 98.762282,
66  101.232112, 103.678747, 106.097989, 108.486017, 110.839302, 113.154501,
67  115.428558, 117.658801, 119.842842, 121.978676, 124.064585, 126.099135,
68  128.2902222222, 130.4424444444, 132.6918333333, 134.9551666667, 137.3811666667,
69  139.9081666667, 142.5951666667, 145.374, 148.0185, 150.8355
70  };
71 
73 double const ECLCrystalData::EndcapRadius[132] = {
74 // 3,3,4,4,4,6,6,6,6,6,6,9,9, //forward calorimeter
75  217.25, 217.25, 217.25,
76  218.72, 218.72, 218.72,
77  220.29, 220.29, 220.29, 220.29,
78  222.00, 222.00, 222.00, 222.00,
79  223.96, 223.96, 223.96, 223.96,
80  226.01, 226.01, 226.01, 226.01, 226.01, 226.01,
81  228.21, 228.21, 228.21, 228.21, 228.21, 228.21,
82  230.67, 230.67, 230.67, 230.67, 230.67, 230.67,
83  233.20, 233.20, 233.20, 233.20, 233.20, 233.20,
84  235.89, 235.89, 235.89, 235.89, 235.89, 235.89,
85  238.89, 238.89, 238.89, 238.89, 238.89, 238.89,
86  241.94, 241.94, 241.94, 241.94, 241.94, 241.94, 241.94, 241.94, 241.94,
87  245.16, 245.16, 245.16, 245.16, 245.16, 245.16, 245.16, 245.16, 245.16,
88 // 9,9,6,6,6,6,6,4,4,4 //backward calorimeter
89  172.06, 172.06, 172.06, 172.06, 172.06, 172.06, 172.06, 172.06, 172.06,
90  165.69, 165.69, 165.69, 165.69, 165.69, 165.69, 165.69, 165.69, 165.69,
91  159.78, 159.78, 159.78, 159.78, 159.78, 159.78,
92  154.36, 154.36, 154.36, 154.36, 154.36, 154.36,
93  149.37, 149.37, 149.37, 149.37, 149.37, 149.37,
94  144.82, 144.82, 144.82, 144.82, 144.82, 144.82,
95  140.67, 140.67, 140.67, 140.67, 140.67, 140.67,
96  136.89, 136.89, 136.89, 136.89,
97  133.49, 133.49, 133.49, 133.49,
98  133.49, 133.49, 133.49, 133.49
99 };
100 
101 
103 double const ECLCrystalData::BarrelZ[46] = {210.15, 200.14, 190.44, 181.05, 171.95, 163.03, 154.45, 146.10, 137.98, 129.99, 122.27, 114.72, 107.34, 100.05, 92.96, 86.00, 79.15, 72.36, 65.72, 59.16, 52.69, 46.22, 39.87, 33.56, 27.29, 21.01, 14.81, 8.62, 2.78, -2.78, -14.81, -21.01, -27.29, -33.56, -39.87, -46.22, -52.69, -59.16, -65.72, -72.36, -79.15, -86.00, -92.95, -100.05, -107 - 28};
104 
105 
106 
107 
110 {
111  m_cell_ID = -1;
112  m_phi_ID = -1;
113  m_theta_ID = -1;
114  m_phi_idx = -1;
115  m_theta_idx = -1;
116 
117  m_mass = -1;
118  m_volume = -1;
119  m_PosR = -1;
120  m_PosP = -1;
121  m_PosX = -1;
122  m_PosY = -1;
123  m_PosZ = -1;
124 }
125 
127 {
128  m_cell_ID = cid;
129  Mapping(cid);
130 
131  Eval();
132 
133 }
134 
136 {
137  m_phi_idx = -1;
138  m_theta_idx = -1;
139  m_theta_ID = tid;
140  m_phi_ID = pid;
141  m_cell_ID = GetCellID(tid, pid);
142 
143  Eval();
144 }
145 
147 {
148 }
149 
150 
153 {
154  //Crystal properties
155  m_mass = EvalMass();
156  m_volume = m_mass / 4.51;
157 
158  //Crystal Location
159  m_PosP = EvalPhi();
160  m_PosR = EvalR();
161 
162  m_PosZ = EvalZ();
163  m_PosX = EvalX();
164  m_PosY = EvalY();
165 
166 
167 }
168 
170 {
171  return m_PosR * cos(TMath::DegToRad() * m_PosP);
172 }
173 
175 {
176  return m_PosR * sin(TMath::DegToRad() * m_PosP);
177 }
178 
179 
180 //Determine mass of crystal
182 {
183  if (IsEndCap()) {
185 
186  } else {
188  }
189 }
190 
192 {
193  if (m_theta_ID <= 12) { //forward ECL crystal
195 
196  } else if (m_theta_ID >= 59) { //backward ECL crystal
197  return m_phi_ID % Ring[m_theta_ID] + sumPrevious[m_theta_ID - 46];
198 
199  } else if (12 < m_theta_ID && m_theta_ID < 59) { //barrel ECL crystal
200  return m_theta_ID - 13;
201  }
202 
203  B2ERROR("ERROR: invalid theta_ID=" << m_theta_ID);
204  return -1;
205 }
206 
208 {
209  return m_theta_ID < 13 || m_theta_ID > 58 ;
210 }
211 
213 {
214  return !IsEndCap();
215 }
216 
217 
219 {
220  return m_cell_ID;
221 }
222 
224 {
225  return 22.5 * m_phi_ID / Ring[m_theta_ID];
226 }
227 
229 {
230  if (IsEndCap()) {
231  return EndcapRadius[GetCrystalIndex()] * cos(TMath::DegToRad() * theta[m_theta_ID]);
232  }
233 
234  return BarrelZ[GetCrystalIndex()];
235 }
236 
238 {
239  if (IsEndCap()) {
240  return EndcapRadius[GetCrystalIndex()] * sin(TMath::DegToRad() * theta[m_theta_ID]);
241  }
242 
243  return 147.7;
244 }
245 
246 
247 //Get CellID from theta and phi IDs
248 int ECLCrystalData::GetCellID(int ThetaId, int PhiId)
249 {
253  if (ThetaId < 13) {
254  const int forwRing[13] = {0, 3, 6, 10, 14, 18, 24, 30, 36, 42, 48, 54, 63 };
255  return forwRing[ThetaId] * 16 + PhiId;
256 
257  } else if (ThetaId > 58) {
258  const int backRing[10] = {0, 9, 18, 24, 30, 36, 42, 48, 52, 56} ;
259  return ECLElementNumbers::c_NCrystalsForwardBarrel + backRing[ThetaId - 59] * 16 + PhiId;
260 
261  }
262 
263  return ECLElementNumbers::c_NCrystalsForward + 144 * (ThetaId - 13) + PhiId;
264 }
265 
267 {
268  if (cid < 0) {
269  B2ERROR("ECL ECLGeometryPar Mapping " << cid << ". Out of range.");
270 
271  } else if (cid < 3 * 16) { //Forkward start
272  m_theta_ID = 0;
273  m_phi_ID = cid;
274  m_phi_idx = m_phi_ID % 3;
275  m_theta_idx = m_phi_ID / 3;
276  } else if (cid < 6 * 16) {
277  m_theta_ID = 1;
278  m_phi_ID = cid - 3 * 16;
279  m_phi_idx = m_phi_ID % 3 + 3;
280  m_theta_idx = m_phi_ID / 3;
281  } else if (cid < 10 * 16) {
282  m_theta_ID = 2;
283  m_phi_ID = cid - 6 * 16 ;
284  m_phi_idx = m_phi_ID % 4 + 6;
285  m_theta_idx = m_phi_ID / 4;
286  } else if (cid < 14 * 16) {
287  m_theta_ID = 3;
288  m_phi_ID = cid - 10 * 16 ;
289  m_phi_idx = m_phi_ID % 4 + 10;
290  m_theta_idx = m_phi_ID / 4;
291  } else if (cid < 18 * 16) {
292  m_theta_ID = 4;
293  m_phi_ID = cid - 14 * 16 ;
294  m_phi_idx = m_phi_ID % 4 + 14;
295  m_theta_idx = m_phi_ID / 4;
296  } else if (cid < 24 * 16) {
297  m_theta_ID = 5;
298  m_phi_ID = cid - 18 * 16 ;
299  m_phi_idx = m_phi_ID % 6 + 18;
300  m_theta_idx = m_phi_ID / 6;
301  } else if (cid < 30 * 16) {
302  m_theta_ID = 6;
303  m_phi_ID = cid - 24 * 16 ;
304  m_phi_idx = m_phi_ID % 6 + 24;
305  m_theta_idx = m_phi_ID / 6;
306  } else if (cid < 36 * 16) {
307  m_theta_ID = 7;
308  m_phi_ID = cid - 30 * 16 ;
309  m_phi_idx = m_phi_ID % 6 + 30;
310  m_theta_idx = m_phi_ID / 6;
311  } else if (cid < 42 * 16) {
312  m_theta_ID = 8;
313  m_phi_ID = cid - 36 * 16 ;
314  m_phi_idx = m_phi_ID % 6 + 36;
315  m_theta_idx = m_phi_ID / 6;
316  } else if (cid < 48 * 16) {
317  m_theta_ID = 9;
318  m_phi_ID = cid - 42 * 16 ;
319  m_phi_idx = m_phi_ID % 6 + 42;
320  m_theta_idx = m_phi_ID / 6;
321  } else if (cid < 54 * 16) {
322  m_theta_ID = 10;
323  m_phi_ID = cid - 48 * 16 ;
324  m_phi_idx = m_phi_ID % 6 + 48;
325  m_theta_idx = m_phi_ID / 6;
326  } else if (cid < 63 * 16) {
327  m_theta_ID = 11;
328  m_phi_ID = cid - 54 * 16 ;
329  m_phi_idx = m_phi_ID % 9 + 54;
330  m_theta_idx = m_phi_ID / 9;
331  } else if (cid < 72 * 16) {
332  m_theta_ID = 12;
333  m_phi_ID = cid - 63 * 16 ;
334  m_phi_idx = m_phi_ID % 9 + 63;
335  m_theta_idx = m_phi_ID / 9;
336  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel) {//Barrel start
341  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 9 * 16) { //Backward start
342  m_theta_ID = 59;
344  m_phi_idx = m_phi_ID % 9 + 72;
345  m_theta_idx = m_phi_ID / 9;
346  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 18 * 16) {
347  m_theta_ID = 60;
349  m_phi_idx = m_phi_ID % 9 + 81;
350  m_theta_idx = m_phi_ID / 9;
351  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 24 * 16) {
352  m_theta_ID = 61;
354  m_phi_idx = m_phi_ID % 6 + 90;
355  m_theta_idx = m_phi_ID / 6;
356  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 30 * 16) {
357  m_theta_ID = 62;
359  m_phi_idx = m_phi_ID % 6 + 96;
360  m_theta_idx = m_phi_ID / 6;
361  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 36 * 16) {
362  m_theta_ID = 63;
364  m_phi_idx = m_phi_ID % 6 + 102;
365  m_theta_idx = m_phi_ID / 6;
366  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 42 * 16) {
367  m_theta_ID = 64;
369  m_phi_idx = m_phi_ID % 6 + 108;
370  m_theta_idx = m_phi_ID / 6;
371  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 48 * 16) {
372  m_theta_ID = 65;
374  m_phi_idx = m_phi_ID % 6 + 114;
375  m_theta_idx = m_phi_ID / 6;
376  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 52 * 16) {
377  m_theta_ID = 66;
379  m_phi_idx = m_phi_ID % 4 + 120;
380  m_theta_idx = m_phi_ID / 4;
381  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 56 * 16) {
382  m_theta_ID = 67;
384  m_phi_idx = m_phi_ID % 4 + 124;
385  m_theta_idx = m_phi_ID / 4;
386  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 60 * 16) {
387  m_theta_ID = 68;
389  m_phi_idx = m_phi_ID % 4 + 128;
390  m_theta_idx = m_phi_ID / 4;
391  } else {
392  B2ERROR("ECL ECLCrystalData Mapping " << cid << ". Out of range.");
393  }
394 }
void Eval()
Set values for the crystal.
static const double theta[69]
Theta ID to theta(deg)
float m_PosY
Crystal Position - Y.
float m_mass
Crystal Mass.
float m_PosZ
Crystal Position - Z.
double EvalPhi()
Set phi value of crystal.
double EvalR()
Set R value of crystal.
float EvalMass()
Evaluate mass of crystal.
double EvalZ()
Set Z value of crystal.
int GetCrystalIndex()
return crystal index
float m_volume
Crystal Volume.
double EvalY()
Set Y value of crystal.
static const float CrystalMassEndcap[132]
Barrel crystal mass.
int m_cell_ID
Cell ID of crystal.
static const int sumPrevious[24]
Number of crystals in preceding theta rings (endcaps only)
bool IsEndCap()
True if crystal is in endcaps.
static const int Ring[69]
ECL has 16-fold symmetry in phi.
float m_PosR
Crystal Position - R.
float m_PosP
Crystal Position - P.
static const double EndcapRadius[132]
EndCapCrystalID to radius (spherical)
void Mapping(int cid)
set theta and phi value of crystal
ECLCrystalData()
Blank Constructor.
int m_phi_ID
phi ID of crystal
static const float CrystalMassBarrel[46]
Endcap crystal mass.
int m_theta_ID
theta ID of crystal
bool IsBarrel()
True if crystal is in barrel.
double EvalX()
Set X value of crystal.
float m_PosX
Crystal Position - X.
int GetCellID()
return cell ID
static const double BarrelZ[46]
BarrelCrystalID to z-coordinate.
const int c_NCrystalsForwardBarrel
Number of crystals in the forward and barrel ECL.
const int c_NCrystalsForward
Number of crystals in the forward ECL.
Abstract base class for different kinds of events.