10 #include <ecl/geometry/ECLGeometryPar.h>
13 #include <ecl/dataobjects/ECLElementNumbers.h>
16 #include <framework/logging/Logger.h>
19 #include <G4NavigationHistory.hh>
20 #include <G4PhysicalVolumeStore.hh>
21 #include <G4Point3D.hh>
22 #include <G4Transform3D.hh>
23 #include <G4Vector3D.hh>
24 #include <G4VTouchable.hh>
39 static void Mapping(
int id,
int& ThetaId,
int& PhiId)
41 ThetaId = m_Theta[((
unsigned int)
id) >> 4];
42 PhiId =
id - m_dTheta[ThetaId] * 16 - ThetaId * 128;
46 static void Mapping(
int id,
int& ThetaId,
int& PhiId,
int& nrep,
int& indx)
48 Mapping(
id, ThetaId, PhiId);
50 int off = m_offsets[ThetaId];
51 int i = m_tbl[ThetaId];
56 nrep = (PhiId * r) >> m_RECIPROCAL_SHIFT;
57 indx = off + (PhiId - nrep * d);
61 static int CellID(
int ThetaId,
int PhiId)
63 return PhiId + m_dTheta[ThetaId] * 16 + ThetaId * 128;
69 return m_dTheta[ThetaId] + ThetaId * 8;
81 return m_denom[m_tbl[ThetaId]];
85 static const char m_dTheta[69];
86 static const unsigned char m_Theta[546];
87 static const unsigned char m_tbl[69];
88 static const unsigned char m_offsets[69];
90 static const unsigned char m_RECIPROCAL_SHIFT = 16;
91 static const unsigned int m_recip[5];
92 static const unsigned int m_denom[5];
97 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4,
98 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7,
99 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10,
100 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12,
102 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15,
103 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18,
104 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21,
105 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24,
106 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27,
107 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30,
108 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33,
109 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36,
110 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39,
111 40, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42,
112 43, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45,
113 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48,
114 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51,
115 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54,
116 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57,
117 58, 58, 58, 58, 58, 58, 58, 58, 58,
119 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60,
120 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62,
121 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64,
122 65, 65, 65, 65, 65, 65,
123 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68
127 0, -5, -10, -14, -18, -22, -24, -26, -28, -30, -32, -34, -33,
129 -32, -31, -30, -29, -28, -27, -26, -25, -24,
130 -23, -22, -21, -20, -19, -18, -17, -16, -15,
131 -14, -13, -12, -11, -10, -9, -8, -7, -6,
132 -5, -4, -3, -2, -1, 0, 1, 2, 3,
133 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
135 14, 15, 16, 14, 12, 10, 8, 6, 2, -2
139 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4,
141 0, 0, 0, 0, 0, 0, 0, 0, 0,
142 0, 0, 0, 0, 0, 0, 0, 0, 0,
143 0, 0, 0, 0, 0, 0, 0, 0, 0,
144 0, 0, 0, 0, 0, 0, 0, 0, 0,
145 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
147 4, 4, 3, 3, 3, 3, 3, 2, 2, 2
151 0, 3, 6, 10, 14, 18, 24, 30, 36, 42, 48, 54, 63,
153 132, 134, 136, 138, 140, 142, 144, 146, 148,
154 150, 152, 154, 156, 158, 160, 162, 164, 166,
155 168, 170, 172, 174, 176, 178, 180, 182, 184,
156 186, 188, 190, 192, 194, 196, 198, 200, 202,
157 204, 206, 208, 210, 212, 214, 216, 218, 220, 222,
159 72, 81, 90, 96, 102, 108, 114, 120, 124, 128
162 #define pack(x) ((1<<Mapping_t::m_RECIPROCAL_SHIFT)/x+1)
163 const unsigned int Mapping_t::m_recip[] = {pack(2), pack(3), pack(4), pack(6), pack(9)};
170 if (!m_B4ECLGeometryParDB) m_B4ECLGeometryParDB =
new ECLGeometryPar();
171 return m_B4ECLGeometryParDB;
174 ECLGeometryPar::ECLGeometryPar()
181 ECLGeometryPar::~ECLGeometryPar()
183 if (m_B4ECLGeometryParDB) {
184 delete m_B4ECLGeometryParDB;
185 B2DEBUG(150,
"m_B4ECLGeometryParDB deleted ");
187 if (m_ECLForwardGlobalT)
delete m_ECLForwardGlobalT;
188 if (m_ECLBarrelGlobalT)
delete m_ECLBarrelGlobalT;
189 if (m_ECLBackwardGlobalT)
delete m_ECLBackwardGlobalT;
192 void ECLGeometryPar::clear()
203 void ParticleGunParameters(
const G4String& comment,
const G4ThreeVector& n,
const G4ThreeVector& r0,
double dphi)
205 cout << comment << endl;
206 cout <<
"Center position = " << r0 <<
", Direction = " << n << endl;
208 double t = -(n.z() * r0.z() - n * r0) / (n.z() * n.z() - n * n);
209 G4ThreeVector r = n * t + r0;
210 cout <<
"Closest point to z-axis = " << r << endl;
211 const double r2d = 180 / M_PI;
212 double th = r2d * n.theta();
213 double phi = r2d * n.phi();
216 cout <<
" 'thetaParams': [" << th <<
", " << th <<
"]," << endl;
217 cout <<
" 'phiParams': [" << phi <<
"+0*" << dphi <<
", " << phi <<
"+0*" << dphi <<
"]," << endl;
218 cout <<
" 'zVertexParams': [" << z <<
", " << z <<
"]" << endl;
221 G4Transform3D getT(
const G4VPhysicalVolume& v)
223 return G4Transform3D(v.GetObjectRotationValue(), v.GetObjectTranslation());
226 G4Transform3D getT(
const G4String& n)
228 G4PhysicalVolumeStore* store = G4PhysicalVolumeStore::GetInstance();
240 G4VPhysicalVolume* v = store->GetVolume(n);
244 void print_trans(
const G4Transform3D& t)
246 for (
int i = 0; i < 4; i++) {
247 for (
int j = 0; j < 3; j++)
248 cout << t(j, i) <<
" ";
253 void ECLGeometryPar::read()
256 m_crystals.reserve(46 * 2 + 132);
263 G4Point3D p0(0, 0, 0); G4Vector3D v0(0, 0, 1);
266 m_ECLForwardGlobalT =
new G4Transform3D(getT(
"ECLForwardPhysical"));
267 G4Transform3D T = getT(
"ECLForwardCrystalSectorPhysical_1");
268 G4String tnamef(
"ECLForwardWrappedCrystal_Physical_");
269 for (
int i = 0; i < 72; i++) {
270 G4String vname(tnamef); vname += to_string(i);
271 G4Transform3D cT = T * getT(vname);
273 m_crystals.push_back(c);
279 m_ECLBackwardGlobalT =
new G4Transform3D(getT(
"ECLBackwardPhysical"));
280 G4Transform3D T = getT(
"ECLBackwardCrystalSectorPhysical_0");
281 G4String tnamef(
"ECLBackwardWrappedCrystal_Physical_");
282 for (
int i = 0; i < 60; i++) {
283 G4String vname(tnamef); vname += to_string(i);
284 G4Transform3D cT = T * getT(vname);
286 m_crystals.push_back(c);
295 m_ECLBarrelGlobalT =
new G4Transform3D(getT(
"ECLBarrelSectorPhysical_0") * G4RotateZ3D(M_PI / 2));
296 G4Transform3D Ts = G4RotateZ3D(-M_PI / 2);
300 G4Transform3D Ts1 = G4RotateZ3D(M_PI / 36) * Ts;
302 G4String tname(
"ECLBarrelWrappedCrystal_Physical_");
303 for (
int i = 0; i < 2 * 46; i++) {
304 G4String vname(tname); vname += to_string(i);
305 G4Transform3D cT = ((i % 2) ? Ts1 : Ts) * getT(vname);
307 m_crystals.push_back(c);
312 B2DEBUG(150,
"ECLGeometryPar::read() initialized with " << m_crystals.size() <<
" crystals.");
316 void sincos(
const double* ss,
int iphi,
double& s,
double& c)
322 if (iq & 1) {
int t = is; is = ic; ic = t;}
326 if ((((0 << 0) + (0 << 1) + (1 << 2) + (1 << 3)) >> iq) & 1) ls = -ls;
327 if ((((0 << 0) + (1 << 1) + (1 << 2) + (0 << 3)) >> iq) & 1) lc = -lc;
332 const double ss72[] = {
333 0.0000000000000000000000,
334 0.0871557427476581735581,
335 0.1736481776669303488517,
336 0.2588190451025207623489,
337 0.3420201433256687330441,
338 0.4226182617406994361870,
339 0.5000000000000000000000,
340 0.5735764363510460961080,
341 0.6427876096865393263226,
342 0.7071067811865475244008,
343 0.7660444431189780352024,
344 0.8191520442889917896845,
345 0.8660254037844386467637,
346 0.9063077870366499632426,
347 0.9396926207859083840541,
348 0.9659258262890682867497,
349 0.9848077530122080593667,
350 0.9961946980917455322950,
351 1.0000000000000000000000
354 const double ss16[] = {
355 0.0000000000000000000000,
356 0.3826834323650897717285,
357 0.7071067811865475244008,
358 0.9238795325112867561282,
359 1.0000000000000000000000
362 void ECLGeometryPar::InitCrystal(
int cid)
364 if (m_crystals.size() == 0) read();
365 int thetaid, phiid, nreplica, indx;
371 sincos<72>(ss72, nreplica, s, c);
373 sincos<16>(ss16, nreplica, s, c);
376 if (ECLElementNumbers::isForward(cid + 1)) {
377 T = m_ECLForwardGlobalT;
378 }
else if (ECLElementNumbers::isBarrel(cid + 1)) {
379 T = m_ECLBarrelGlobalT;
381 T = m_ECLBackwardGlobalT;
384 double xp = c * t.pos.x() - s * t.pos.y();
385 double yp = s * t.pos.x() + c * t.pos.y();
388 double xv = c * t.dir.x() - s * t.dir.y();
389 double yv = s * t.dir.x() + c * t.dir.y();
392 m_current_crystal.pos = (1 / CLHEP::cm) * (*T * G4Point3D(xp, yp, t.pos.z()));
393 m_current_crystal.dir = *T * G4Vector3D(xv, yv, t.dir.z());
399 int ECLGeometryPar::GetCellID(
int ThetaId,
int PhiId)
404 void ECLGeometryPar::Mapping(
int cid)
410 int ECLGeometryPar::TouchableDiodeToCellID(
const G4VTouchable* touch)
412 return TouchableToCellID(touch);
415 int ECLGeometryPar::TouchableToCellID(
const G4VTouchable* touch)
420 const G4NavigationHistory* h = touch->GetHistory();
421 int hd = h->GetDepth();
422 int i1 = h->GetReplicaNo(hd - 1);
423 int i2 = h->GetReplicaNo(hd - 2);
429 int ik = i1 - Offset;
432 PhiId = (i2 - (ik % 2)) * NCryst + ik;
433 if (PhiId < 0) PhiId += 144;
435 int i3 = h->GetReplicaNo(hd - 3);
437 PhiId = (i2 + 2 * i3) * NCryst + ik;
444 int i3r = (3 - (i3 % 4)) + 4 * (i3 / 4);
445 PhiId = (2 * i3r + (1 - i2)) * NCryst + ik;
449 int cellID = Offset * 16 + PhiId;
454 G4AffineTransform t = h->GetTopTransform();
455 G4ThreeVector o(0, 0, 0), n(0, 0, 1);
456 G4ThreeVector ro = t.Inverse().TransformPoint(o);
457 G4ThreeVector
rn = t.Inverse().TransformAxis(n);
462 G4ThreeVector dr = m_current_crystal.pos - ro, dn = m_current_crystal.dir -
rn;
463 if (dr.mag() > 1e-10 || dn.mag() > 1e-10) {
464 cout <<
"Missmatch " << h->GetVolume(hd - 1)->GetName() <<
" " << cellID <<
" " << ThetaId <<
" " << PhiId <<
" " << NCryst <<
" "
465 << hd <<
" " << i2 <<
" " << i1 <<
" " << m_current_crystal.pos <<
" " << ro <<
" " <<
rn <<
" " << dr <<
" " << dn << endl;
467 for (
int i = 0; i < 144; i++) {
470 dr = m_current_crystal.pos - ro;
471 if (dr.mag() < 1e-10) cout <<
"best PhiId = " << i << endl;
478 int ECLGeometryPar::ECLVolumeToCellID(
const G4VTouchable* touch)
480 int depth = touch->GetHistoryDepth();
481 if ((depth != 3) && (depth != 5)) {
482 B2WARNING(
"ECLGeometryPar::ECLVolumeToCellID: History depth = " << depth <<
" is out of range: should be 3 or 5.");
485 const G4String& vname = touch->GetVolume()->GetName();
486 std::size_t pos0 = vname.find(
"lv_forward_crystal_");
487 std::size_t pos1 = vname.find(
"lv_barrel_crystal_");
488 std::size_t pos2 = vname.find(
"lv_backward_crystal_");
489 if (pos0 == string::npos && pos1 == string::npos && pos2 == string::npos) {
490 B2WARNING(
"ECLGeometryPar::ECLVolumeToCellID: Volume name does not match pattern. NAME=" << vname);
493 return TouchableToCellID(touch);
496 double ECLGeometryPar::time2sensor(
int cid,
const G4ThreeVector& hit_pos)
498 if (cid != m_ini_cid) InitCrystal(cid);
499 double z = 15. - (hit_pos - m_current_crystal.pos) * m_current_crystal.dir;
500 double dt = 6.05 + z * (0.0749 - z * 0.00112);
513 m_nbrs(*new std::vector<
Identifier > (aNbr.m_nbrs)),
514 m_nearSize(aNbr.m_nearSize)
522 const std::vector< Identifier >& aNbrs,
523 const std::vector< Identifier >::size_type aNearSize
525 m_nbrs(*new std::vector<
Identifier > (aNbrs)),
526 m_nearSize(aNearSize)
529 std::sort(
m_nbrs.begin(),
m_nbrs.begin() + aNearSize, std::less< Identifier >()) ;
530 std::sort(
m_nbrs.begin() + aNearSize,
m_nbrs.end(), std::less< Identifier >()) ;
540 unsigned short i(0) ;
541 for (std::vector< EclNbr::Identifier >::const_iterator
542 iNbr(aNbr.
nbrs().begin()) ;
543 iNbr != aNbr.
nbrs().end() ; ++iNbr) {
545 if (iNbr != aNbr.
nbrs().begin() && i != aNbr.
nearSize() + 1) os <<
"," ;
546 if (i == aNbr.
nearSize() + 1) os <<
"|" ;
547 os << std::setw(4) << (*iNbr) ;
556 unsigned short Nri(0) ;
558 for (std::vector< EclNbr::Identifier >::const_iterator
560 iNbr !=
m_nbrs.end() ; ++iNbr) {
564 cout << std::setw(4) << (*iNbr) ;
593 const std::vector< EclNbr::Identifier >&
599 const std::vector< EclNbr::Identifier >::const_iterator
605 const std::vector< EclNbr::Identifier >::const_iterator
611 const std::vector< EclNbr::Identifier >::const_iterator
617 const std::vector< EclNbr::Identifier >::const_iterator
623 std::vector< EclNbr::Identifier >::size_type
629 std::vector< EclNbr::Identifier >::size_type
655 const int cellID = aCellId;
659 std::vector< EclNbr::Identifier >::size_type
nearSize(0);
660 std::vector< EclNbr::Identifier > vNbr;
665 int tm1 = thetaId - 1;
666 int tm2 = thetaId - 2;
667 int tp1 = thetaId + 1;
668 int tp2 = thetaId + 2;
679 int fm1 = (phiId + 143) % 144;
680 int fp1 = (phiId + 1) % 144;
681 int fm2 = (phiId + 142) % 144;
682 int fp2 = (phiId + 2) % 144;
721 const EclIdentifier mPerRingForward[]
722 = { 48, 48, 64, 64, 64, 96, 96, 96, 96, 96, 96, 144, 144, 144, 144 };
723 if (thetaId > 1) nm2 = mPerRingForward[ thetaId - 2 ];
724 if (thetaId > 0) nm1 = mPerRingForward[ thetaId - 1 ];
725 n00 = mPerRingForward[ thetaId ];
726 np1 = mPerRingForward[ thetaId + 1 ];
727 np2 = mPerRingForward[ thetaId + 2 ];
730 const EclIdentifier mPerRingBackward[]
731 = { 64, 64, 64, 96, 96, 96, 96, 96, 144, 144, 144, 144 };
732 if (thetaId < 67) np2 = mPerRingBackward[ 66 - thetaId ];
733 if (thetaId < 68) np1 = mPerRingBackward[ 67 - thetaId ];
734 n00 = mPerRingBackward[ 68 - thetaId ];
735 nm1 = mPerRingBackward[ 69 - thetaId ];
736 nm2 = mPerRingBackward[ 70 - thetaId ];
743 int fp100 = (f0000 * np1 + np1 / 2) / n00;
744 int fp200 = (f0000 * np2 + np2 / 2) / n00;
745 int fm100 = (f0000 * nm1 + nm1 / 2) / n00;
746 int fm200 = (f0000 * nm2 + nm2 / 2) / n00;
748 int f00m1 = (f0000 + n00 - 1) % n00;
749 int f00m2 = (f0000 + n00 - 2) % n00;
750 int f00p1 = (f0000 + 1) % n00;
751 int f00p2 = (f0000 + 2) % n00;
753 int fp1m1 = (fp100 + np1 - 1) % np1;
754 int fp1m2 = (fp100 + np1 - 2) % np1;
755 int fp1p1 = (fp100 + 1) % np1;
756 int fp1p2 = (fp100 + 2) % np1;
758 int fm1m1 = (fm100 + nm1 - 1) % nm1;
759 int fm1m2 = (fm100 + nm1 - 2) % nm1;
760 int fm1p1 = (fm100 + 1) % nm1;
761 int fm1p2 = (fm100 + 2) % nm1;
763 int fp2m1 = (fp200 + np2 - 1) % np2;
764 int fp2m2 = (fp200 + np2 - 2) % np2;
765 int fp2p1 = (fp200 + 1) % np2;
766 int fp2p2 = (fp200 + 2) % np2;
768 int fm2m1 = (fm200 + nm2 - 1) % nm2;
769 int fm2m2 = (fm200 + nm2 - 2) % nm2;
770 int fm2p1 = (fm200 + 1) % nm2;
771 int fm2p2 = (fm200 + 2) % nm2;
772 int delta = n00 / 16;
774 int nth = phiId % delta;
789 if ((nth == 0) || (nth == 1)) {
793 }
else if ((nth == 2) || (nth == 3)) {
800 if ((nth == 0) || (nth == 3)) {
801 fm2p2 = fm2m2 = 1000;
802 }
else if (nth == 1) {
804 }
else if (nth == 2) {
809 if ((nth == 2) || (nth == 5)) {
821 if ((nth == 0) || (nth == 2) || (nth == 3) || (nth == 5)) {
826 if ((nth == 2) || (nth == 5) || (nth == 8)) {
838 if ((nth == 0) || (nth == 2) || (nth == 3)
839 || (nth == 5) || (nth == 6) || (nth == 8))
843 if ((nth == 2) || (nth == 5)) {
855 if ((nth == 0) || (nth == 2) || (nth == 3) || (nth == 5))
859 if ((nth == 2) || (nth == 5) || (nth == 8)) {
871 if ((nth == 0) || (nth == 2) || (nth == 3) || (nth == 5)
872 || (nth == 6) || (nth == 8))
The Class for ECL Geometry Parameters.
std::vector< Identifier >::size_type nextSize() const
get crystals nextSize
const std::vector< Identifier >::const_iterator nextEnd() const
get crystals nextEnd
EclNbr getNbr(const Identifier aCellId)
get crystals nbr
int GetPhiID()
Get Phi Id.
EclNbr()
Constructors and destructor.
int mNbr_thetaID
The Theta ID information.
std::vector< Identifier >::size_type m_nearSize
size of near brs
virtual ~EclNbr()
destructor
const std::vector< Identifier > & nbrs() const
get crystals nbrs
int mNbr_cellID
data members
const std::vector< Identifier >::const_iterator nearEnd() const
get crystals nearEnd
int mNbr_phiID
The Phi ID information.
void printNbr()
print crystals nbrs
void Mapping(int cid)
Mapping theta, phi Id.
const std::vector< Identifier >::const_iterator nearBegin() const
get crystals nearBegin
const std::vector< Identifier >::const_iterator nextBegin() const
get crystals nextBegin
EclIdentifier Identifier
constants, enums and typedefs
std::vector< Identifier >::size_type nearSize() const
get crystals nearSize
std::vector< Identifier > & m_nbrs
id of m_brs
int GetThetaID()
Get Theta Id.
EclNbr & operator=(const EclNbr &aNbr)
assignment operator(s)
int GetCellID()
Get Cell Id.
static void Mapping(int id, int &ThetaId, int &PhiId, int &nrep, int &indx)
Retrieving theta id, phi id, reciprocal shift and index.
static const char m_dTheta[69]
array of theta offsets
static int CellID(int ThetaId, int PhiId)
return cell id as a function of theta id and phi id
static const unsigned int m_denom[5]
array of denominator values
static const unsigned int m_recip[5]
array of reciprocal values
static const unsigned char m_offsets[69]
array of offsets
static int Indx2ThetaId(int indx)
getter for theta
static const unsigned char m_tbl[69]
array of crystals per phi sector
static const unsigned char m_Theta[546]
array of theta
static int Offset(int ThetaId)
return offset based on theta id
static void Mapping(int id, int &ThetaId, int &PhiId)
Retrieving theta and phi id of crystal.
static int ThetaId2NCry(int ThetaId)
getter for number of crystals
std::ostream & operator<<(std::ostream &output, const IntervalOfValidity &iov)
TString rn()
Get random string.
bool isForward(int cellId)
Check whether the crystal is in forward ECL.
bool isBarrel(int cellId)
Check whether the crystal is in barrel ECL.
Abstract base class for different kinds of events.