Belle II Software  release-08-00-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/gearbox/Unit.h>
14 #include <framework/logging/Logger.h>
15 
16 /* ROOT headers. */
17 #include <TMath.h>
18 
19 /* C++ headers. */
20 #include <cmath>
21 
22 using namespace Belle2;
23 
24 //ECL has 16-fold symmetry in phi. Multiply this by 16 to get the total number of crystals at each theta location.
25 int const ECLCrystalData::Ring[69] = {
26  3, 3, 4, 4, 4, 6, 6, 6, 6, 6, 6, 9, 9, //forward calorimeter
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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, //barrel
29  9, 9, 9, 9, 9, 9, //barrel
30  9, 9, 6, 6, 6, 6, 6, 4, 4, 4 //backward calorimeter
31 };
32 
33 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};
34 
35 //endcap crystal masses
36 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,
37  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,
38  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,
39  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,
40  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,
41  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,
42  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,
43  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,
44  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,
45  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,
46  4.58, 4.56
47  };
48 
49 //Barrel crystal masses
50 float const ECLCrystalData::CrystalMassBarrel[46] = {4.599, 4.619, 4.639, 4.659, 4.680, 4.701, 4.722, 4.744, 4.765,
51  4.786, 4.807, 4.828, 4.848, 4.868, 4.887, 4.906, 4.923, 4.940,
52  4.955, 4.969, 4.981, 4.992, 5.001, 5.008, 5.013, 5.016, 5.017,
53  5.016, 4.455, 4.455, 5.016, 5.017, 5.016, 5.013, 5.008, 5.001,
54  4.992, 4.981, 4.969, 4.955, 4.940, 4.923, 4.906, 4.887, 4.868,
55  4.848
56  };
57 
58 
59 //Theta ID to theta(deg)
60 double const ECLCrystalData::theta[69] = {13.9486666667, 15.4862, 17.110575, 18.757625, 20.255425, 21.8637333333,
61  23.4259666667, 24.96125, 26.4777833333, 27.9407, 29.36275, 30.8382555556,
62  32.2618444444, 33.667039, 35.062886, 36.509337, 38.007345, 39.557769,
63  41.161373, 42.818633, 44.530027, 46.295838, 48.115876, 49.990235, 51.91882,
64  53.900865, 55.935415, 58.021324, 60.157158, 62.3412, 64.571442, 66.8455,
65  69.160698, 71.513983, 73.902011, 76.321253, 78.767888, 81.237718, 83.726351,
66  86.229301, 88.741891, 90, 90, 91.258109, 93.770699, 96.273649, 98.762282,
67  101.232112, 103.678747, 106.097989, 108.486017, 110.839302, 113.154501,
68  115.428558, 117.658801, 119.842842, 121.978676, 124.064585, 126.099135,
69  128.2902222222, 130.4424444444, 132.6918333333, 134.9551666667, 137.3811666667,
70  139.9081666667, 142.5951666667, 145.374, 148.0185, 150.8355
71  };
72 
74 double const ECLCrystalData::EndcapRadius[132] = {
75 // 3,3,4,4,4,6,6,6,6,6,6,9,9, //forward calorimeter
76  217.25, 217.25, 217.25,
77  218.72, 218.72, 218.72,
78  220.29, 220.29, 220.29, 220.29,
79  222.00, 222.00, 222.00, 222.00,
80  223.96, 223.96, 223.96, 223.96,
81  226.01, 226.01, 226.01, 226.01, 226.01, 226.01,
82  228.21, 228.21, 228.21, 228.21, 228.21, 228.21,
83  230.67, 230.67, 230.67, 230.67, 230.67, 230.67,
84  233.20, 233.20, 233.20, 233.20, 233.20, 233.20,
85  235.89, 235.89, 235.89, 235.89, 235.89, 235.89,
86  238.89, 238.89, 238.89, 238.89, 238.89, 238.89,
87  241.94, 241.94, 241.94, 241.94, 241.94, 241.94, 241.94, 241.94, 241.94,
88  245.16, 245.16, 245.16, 245.16, 245.16, 245.16, 245.16, 245.16, 245.16,
89 // 9,9,6,6,6,6,6,4,4,4 //backward calorimeter
90  172.06, 172.06, 172.06, 172.06, 172.06, 172.06, 172.06, 172.06, 172.06,
91  165.69, 165.69, 165.69, 165.69, 165.69, 165.69, 165.69, 165.69, 165.69,
92  159.78, 159.78, 159.78, 159.78, 159.78, 159.78,
93  154.36, 154.36, 154.36, 154.36, 154.36, 154.36,
94  149.37, 149.37, 149.37, 149.37, 149.37, 149.37,
95  144.82, 144.82, 144.82, 144.82, 144.82, 144.82,
96  140.67, 140.67, 140.67, 140.67, 140.67, 140.67,
97  136.89, 136.89, 136.89, 136.89,
98  133.49, 133.49, 133.49, 133.49,
99  133.49, 133.49, 133.49, 133.49
100 };
101 
102 
104 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};
105 
106 
107 
108 
111 {
112  m_cell_ID = -1;
113  m_phi_ID = -1;
114  m_theta_ID = -1;
115  m_phi_idx = -1;
116  m_theta_idx = -1;
117 
118  m_mass = -1;
119  m_volume = -1;
120  m_PosR = -1;
121  m_PosP = -1;
122  m_PosX = -1;
123  m_PosY = -1;
124  m_PosZ = -1;
125 }
126 
128 {
129  m_cell_ID = cid;
130  Mapping(cid);
131 
132  Eval();
133 
134 }
135 
137 {
138  m_phi_idx = -1;
139  m_theta_idx = -1;
140  m_theta_ID = tid;
141  m_phi_ID = pid;
142  m_cell_ID = GetCellID(tid, pid);
143 
144  Eval();
145 }
146 
148 {
149 }
150 
151 
154 {
155  //Crystal properties
156  m_mass = EvalMass();
157  m_volume = m_mass / 4.51;
158 
159  //Crystal Location
160  m_PosP = EvalPhi();
161  m_PosR = EvalR();
162 
163  m_PosZ = EvalZ();
164  m_PosX = EvalX();
165  m_PosY = EvalY();
166 
167 
168 }
169 
171 {
172  return m_PosR * cos(TMath::DegToRad() * m_PosP);
173 }
174 
176 {
177  return m_PosR * sin(TMath::DegToRad() * m_PosP);
178 }
179 
180 
181 //Determine mass of crystal
183 {
184  if (IsEndCap()) {
186 
187  } else {
189  }
190 }
191 
193 {
194  if (m_theta_ID <= 12) { //forward ECL crystal
196 
197  } else if (m_theta_ID >= 59) { //backward ECL crystal
198  return m_phi_ID % Ring[m_theta_ID] + sumPrevious[m_theta_ID - 46];
199 
200  } else if (12 < m_theta_ID && m_theta_ID < 59) { //barrel ECL crystal
201  return m_theta_ID - 13;
202  }
203 
204  B2ERROR("ERROR: invalid theta_ID=" << m_theta_ID);
205  return -1;
206 }
207 
209 {
210  return m_theta_ID < 13 || m_theta_ID > 58 ;
211 }
212 
214 {
215  return !IsEndCap();
216 }
217 
218 
220 {
221  return m_cell_ID;
222 }
223 
225 {
226  return 22.5 * m_phi_ID / Ring[m_theta_ID];
227 }
228 
230 {
231  if (IsEndCap()) {
232  return EndcapRadius[GetCrystalIndex()] * cos(TMath::DegToRad() * theta[m_theta_ID]);
233  }
234 
235  return BarrelZ[GetCrystalIndex()];
236 }
237 
239 {
240  if (IsEndCap()) {
241  return EndcapRadius[GetCrystalIndex()] * sin(TMath::DegToRad() * theta[m_theta_ID]);
242  }
243 
244  return 147.7;
245 }
246 
247 
248 //Get CellID from theta and phi IDs
249 int ECLCrystalData::GetCellID(int ThetaId, int PhiId)
250 {
254  if (ThetaId < 13) {
255  const int forwRing[13] = {0, 3, 6, 10, 14, 18, 24, 30, 36, 42, 48, 54, 63 };
256  return forwRing[ThetaId] * 16 + PhiId;
257 
258  } else if (ThetaId > 58) {
259  const int backRing[10] = {0, 9, 18, 24, 30, 36, 42, 48, 52, 56} ;
260  return ECLElementNumbers::c_NCrystalsForwardBarrel + backRing[ThetaId - 59] * 16 + PhiId;
261 
262  }
263 
264  return ECLElementNumbers::c_NCrystalsForward + 144 * (ThetaId - 13) + PhiId;
265 }
266 
268 {
269  if (cid < 0) {
270  B2ERROR("ECL ECLGeometryPar Mapping " << cid << ". Out of range.");
271 
272  } else if (cid < 3 * 16) { //Forkward start
273  m_theta_ID = 0;
274  m_phi_ID = cid;
275  m_phi_idx = m_phi_ID % 3;
276  m_theta_idx = m_phi_ID / 3;
277  } else if (cid < 6 * 16) {
278  m_theta_ID = 1;
279  m_phi_ID = cid - 3 * 16;
280  m_phi_idx = m_phi_ID % 3 + 3;
281  m_theta_idx = m_phi_ID / 3;
282  } else if (cid < 10 * 16) {
283  m_theta_ID = 2;
284  m_phi_ID = cid - 6 * 16 ;
285  m_phi_idx = m_phi_ID % 4 + 6;
286  m_theta_idx = m_phi_ID / 4;
287  } else if (cid < 14 * 16) {
288  m_theta_ID = 3;
289  m_phi_ID = cid - 10 * 16 ;
290  m_phi_idx = m_phi_ID % 4 + 10;
291  m_theta_idx = m_phi_ID / 4;
292  } else if (cid < 18 * 16) {
293  m_theta_ID = 4;
294  m_phi_ID = cid - 14 * 16 ;
295  m_phi_idx = m_phi_ID % 4 + 14;
296  m_theta_idx = m_phi_ID / 4;
297  } else if (cid < 24 * 16) {
298  m_theta_ID = 5;
299  m_phi_ID = cid - 18 * 16 ;
300  m_phi_idx = m_phi_ID % 6 + 18;
301  m_theta_idx = m_phi_ID / 6;
302  } else if (cid < 30 * 16) {
303  m_theta_ID = 6;
304  m_phi_ID = cid - 24 * 16 ;
305  m_phi_idx = m_phi_ID % 6 + 24;
306  m_theta_idx = m_phi_ID / 6;
307  } else if (cid < 36 * 16) {
308  m_theta_ID = 7;
309  m_phi_ID = cid - 30 * 16 ;
310  m_phi_idx = m_phi_ID % 6 + 30;
311  m_theta_idx = m_phi_ID / 6;
312  } else if (cid < 42 * 16) {
313  m_theta_ID = 8;
314  m_phi_ID = cid - 36 * 16 ;
315  m_phi_idx = m_phi_ID % 6 + 36;
316  m_theta_idx = m_phi_ID / 6;
317  } else if (cid < 48 * 16) {
318  m_theta_ID = 9;
319  m_phi_ID = cid - 42 * 16 ;
320  m_phi_idx = m_phi_ID % 6 + 42;
321  m_theta_idx = m_phi_ID / 6;
322  } else if (cid < 54 * 16) {
323  m_theta_ID = 10;
324  m_phi_ID = cid - 48 * 16 ;
325  m_phi_idx = m_phi_ID % 6 + 48;
326  m_theta_idx = m_phi_ID / 6;
327  } else if (cid < 63 * 16) {
328  m_theta_ID = 11;
329  m_phi_ID = cid - 54 * 16 ;
330  m_phi_idx = m_phi_ID % 9 + 54;
331  m_theta_idx = m_phi_ID / 9;
332  } else if (cid < 72 * 16) {
333  m_theta_ID = 12;
334  m_phi_ID = cid - 63 * 16 ;
335  m_phi_idx = m_phi_ID % 9 + 63;
336  m_theta_idx = m_phi_ID / 9;
337  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel) {//Barrel start
342  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 9 * 16) { //Backward start
343  m_theta_ID = 59;
345  m_phi_idx = m_phi_ID % 9 + 72;
346  m_theta_idx = m_phi_ID / 9;
347  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 18 * 16) {
348  m_theta_ID = 60;
350  m_phi_idx = m_phi_ID % 9 + 81;
351  m_theta_idx = m_phi_ID / 9;
352  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 24 * 16) {
353  m_theta_ID = 61;
355  m_phi_idx = m_phi_ID % 6 + 90;
356  m_theta_idx = m_phi_ID / 6;
357  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 30 * 16) {
358  m_theta_ID = 62;
360  m_phi_idx = m_phi_ID % 6 + 96;
361  m_theta_idx = m_phi_ID / 6;
362  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 36 * 16) {
363  m_theta_ID = 63;
365  m_phi_idx = m_phi_ID % 6 + 102;
366  m_theta_idx = m_phi_ID / 6;
367  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 42 * 16) {
368  m_theta_ID = 64;
370  m_phi_idx = m_phi_ID % 6 + 108;
371  m_theta_idx = m_phi_ID / 6;
372  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 48 * 16) {
373  m_theta_ID = 65;
375  m_phi_idx = m_phi_ID % 6 + 114;
376  m_theta_idx = m_phi_ID / 6;
377  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 52 * 16) {
378  m_theta_ID = 66;
380  m_phi_idx = m_phi_ID % 4 + 120;
381  m_theta_idx = m_phi_ID / 4;
382  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 56 * 16) {
383  m_theta_ID = 67;
385  m_phi_idx = m_phi_ID % 4 + 124;
386  m_theta_idx = m_phi_ID / 4;
387  } else if (cid < ECLElementNumbers::c_NCrystalsForwardBarrel + 60 * 16) {
388  m_theta_ID = 68;
390  m_phi_idx = m_phi_ID % 4 + 128;
391  m_theta_idx = m_phi_ID / 4;
392  } else {
393  B2ERROR("ECL ECLCrystalData Mapping " << cid << ". Out of range.");
394  }
395 }
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.