Project
Loading...
Searching...
No Matches
Geometry.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
17
18#ifndef ALICEO2_FV0_GEOMETRY_H_
19#define ALICEO2_FV0_GEOMETRY_H_
22#include <Rtypes.h>
23#include <TGeoPhysicalNode.h>
24#include <vector>
25#include <array>
26#include <TGeoMatrix.h>
27#include <TGeoVolume.h>
28#include <TVirtualMC.h>
29
30class TGeoPNEntry;
31
32namespace o2
33{
34namespace fv0
35{
36
38 float x;
39 float y;
40 float z;
41 void SetCoordinates(float x, float y, float z)
42 {
43 this->x = x;
44 this->y = y;
45 this->z = z;
46 };
47};
48
51{
52 public:
65
76
80 Geometry() : mGeometryType(eUninitialized), mLeftTransformation(nullptr), mRightTransformation(nullptr){};
81
83 Geometry(const Geometry& geometry);
84
87 static Geometry* instance(EGeoType initType = eUninitialized);
88
89 ~Geometry();
90
96 int getCurrentCellId(const TVirtualMC* fMC) const;
97
100 const std::vector<std::string>& getSensitiveVolumeNames() const { return mSensitiveVolumeNames; };
101
107 bool enableComponent(EGeoComponent component, bool enable = true);
108
110 void buildGeometry() const;
111
113
118 void getGlobalPosition(float& x, float& y, float& z);
119 Point3Dsimple& getCellCenter(UInt_t cellId);
120 Point3Dsimple& getReadoutCenter(UInt_t cellId);
121 static constexpr int getNumberOfReadoutChannels() { return sNumberOfReadoutChannels; };
122
126 bool isRing5(UInt_t cellId);
127
129 TGeoPNEntry* getPNEntry(int index) const
130 {
134 }
135
137 static constexpr float getPmtDensity()
138 {
139 return sDensityPmt;
140 }
141
142 private:
143 explicit Geometry(EGeoType initType);
144
145 inline static const std::string sDetectorName = "FV0";
146
147 // General geometry constants
148 static constexpr float sEpsilon = 0.01;
149 static constexpr float sDzScintillator = 4;
150 static constexpr float sDzPlastic = 1;
151
152 static constexpr float sXGlobal = 0;
153 static constexpr float sYGlobal = 0;
154 // FT0 starts at z=328
155 static constexpr float sZGlobal = 320 - sDzScintillator / 2;
156 static constexpr float sDxHalvesSeparation = 0;
157 static constexpr float sDyHalvesSeparation = 0;
158 static constexpr float sDzHalvesSeparation = 0;
159
161 static constexpr int sNumberOfCellSectors = 4;
162 static constexpr int sNumberOfCellRings = 5;
163 static constexpr int sNumberOfCells = sNumberOfCellRings * sNumberOfCellSectors * 2;
164 static constexpr int sNumberOfReadoutChannels = sNumberOfCells + sNumberOfCellSectors * 2;
165
167 static constexpr int sCellToRing[sNumberOfCells] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4};
168 static constexpr int sCellToSector[sNumberOfCells] = {0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7};
169
171 static constexpr float sCellRingRadii[sNumberOfCellRings + 1]{4.01, 7.3, 12.9, 21.25, 38.7, 72.115};
172 static constexpr char sCellTypes[sNumberOfCellSectors]{'a', 'b', 'b', 'a'};
174 static constexpr float sDrSeparationScint = 0.03 + 0.04;
175
177 static constexpr float sXShiftInnerRadiusScintillator = -0.15;
179 static constexpr float sDxHoleExtensionScintillator = 0.2;
180 static constexpr float sDrHoleSmallScintillator = 0.265;
181 static constexpr float sDrHoleLargeScintillator = 0.415;
182
183 // Container constants
184 static constexpr float sDzContainer = 30;
185 static constexpr float sDrContainerHole = 4.05;
186 static constexpr float sXShiftContainerHole = -0.15;
187 static constexpr float sDrMaxContainerBack = 83.1;
188 static constexpr float sDzContainerBack = 1;
189 static constexpr float sDrMinContainerFront = 45.7;
190 static constexpr float sDrMaxContainerFront = 83.1;
191 static constexpr float sDzContainerFront = 1;
192 static constexpr float sDxContainerStand = 40;
193 static constexpr float sDyContainerStand = 3;
194 static constexpr float sDrMinContainerCone = 24.3;
195 static constexpr float sDzContainerCone = 16.2;
196 static constexpr float sThicknessContainerCone = 0.6;
197 static constexpr float sXYThicknessContainerCone = 0.975;
198 static constexpr float sDrMinContainerOuterShield = 82.5;
199 static constexpr float sDrMaxContainerOuterShield = 82.65;
200 static constexpr float sDrMinContainerInnerShield = 4;
201 static constexpr float sDrMaxContainerInnerShield = 4.05;
202 static constexpr float sDxContainerCover = 0.15;
203 static constexpr float sDxContainerStandBottom = 38.5;
204 static constexpr float sDyContainerStandBottom = 2;
205
206 // PMT constants
207 static constexpr int sNumberOfPMTs = 24;
208 static constexpr int sNumberOfPMTsPerSector = 6;
209 static constexpr float sDrPmt = 3.75;
210 static constexpr float sDzPmt = 12.199;
211 static constexpr float sMPmt = 376.77;
212 static constexpr float sDensityPmt = sMPmt / (M_PI * sDrPmt * sDrPmt * sDzPmt);
213
214 // Fiber constants
215 static constexpr int sNumberOfPMTFiberVolumes = 5;
217 static constexpr int sPMTFiberCellOrder[sNumberOfPMTsPerSector] = {2, 5, 4, 3, 5, 1};
218
219 // Local position constants
220
222 static constexpr float sXScintillator = sDxContainerCover;
224 static constexpr float sZScintillator = 0;
226 static constexpr float sZPlastic = sZScintillator + sDzScintillator / 2 + sDzPlastic / 2;
228 static constexpr float sZContainerBack = sZScintillator - sDzScintillator / 2 - sDzContainerBack / 2;
230 static constexpr float sZContainerFront = sZContainerBack - sDzContainerBack / 2 + sDzContainer - sDzContainerFront / 2;
232 static constexpr float sZContainerMid = (sZContainerBack + sZContainerFront) / 2;
234 static constexpr float sZFiber = (sZPlastic + sZContainerFront) / 2;
236 static constexpr float sZCone = sZContainerFront + sDzContainerFront / 2 - sDzContainerCone / 2;
238 static constexpr float sXShiftScrews = sXScintillator;
240 static constexpr float sXPmt[sNumberOfPMTs] = {8.023, 16.612, 24.987, 33.042, 40.671, 47.778, 59.646, 64.73, 68.982, 72.348, 74.783, 76.257, 76.330, 74.931, 72.569, 69.273, 65.088, 60.065, 48.3, 41.238, 33.645, 25.62, 17.265, 8.688};
242 static constexpr float sYPmt[sNumberOfPMTs] = {76.33, 74.931, 72.569, 69.273, 65.088, 60.065, 48.3, 41.238, 33.645, 25.62, 17.265, 8.688, -8.023, -16.612, -24.987, -33.042, -40.671, -47.778, -59.646, -64.73, -68.982, -72.348, -74.783, -76.257};
244 static constexpr float sZPmt = sZContainerBack + sDzContainerBack / 2 + sDzPmt / 2;
245
246 // Screw and rod dimensions
247
249 static constexpr int sNumberOfScrewTypes = 6;
251 static constexpr float sDrMinScrewTypes[sNumberOfScrewTypes]{0.25, 0.25, 0.4, 0.4, 0.4, 0.4};
253 static constexpr float sDrMaxScrewTypes[sNumberOfScrewTypes]{0, 0.5, 0.6, 0.6, 0.6, 0};
255 static constexpr float sDzMaxScrewTypes[sNumberOfScrewTypes]{6.02, 13.09, 13.1, 23.1, 28.3, 5};
257 static constexpr float sDzMinScrewTypes[sNumberOfScrewTypes]{0, 6.78, 6.58, 15.98, 21.48, 0};
259 static constexpr float sZShiftScrew = 0;
260
262 static constexpr int sNumberOfRodTypes = 4;
264 static constexpr float sDxMinRodTypes[sNumberOfRodTypes]{0.366, 0.344, 0.344, 0.344};
266 static constexpr float sDxMaxRodTypes[sNumberOfRodTypes]{0.536, 0.566, 0.566, 0.716};
268 static constexpr float sDyMinRodTypes[sNumberOfRodTypes]{0.5, 0.8, 0.8, 0.8};
270 static constexpr float sDyMaxRodTypes[sNumberOfRodTypes]{0.9, 1.2, 1.2, 1.2};
272 static constexpr float sDzMaxRodTypes[sNumberOfRodTypes]{12.5, 12.5, 22.5, 27.7};
274 static constexpr float sDzMinRodTypes[sNumberOfRodTypes]{7.45, 7.45, 17.45, 22.65};
276 static constexpr float sZShiftRod = -0.05;
277
278 // Strings for volume names, etc.
279 inline static const std::string sScintillatorName = "SCINT";
280 inline static const std::string sPlasticName = "PLAST";
281 inline static const std::string sSectorName = "SECTOR";
282 inline static const std::string sCellName = "CELL";
283 inline static const std::string sScintillatorSectorName = sScintillatorName + sSectorName;
284 inline static const std::string sScintillatorCellName = sScintillatorName + sCellName;
285 inline static const std::string sPlasticSectorName = sPlasticName + sSectorName;
286 inline static const std::string sPlasticCellName = sPlasticName + sCellName;
287 inline static const std::string sPmtName = "PMT";
288 inline static const std::string sFiberName = "FIBER";
289 inline static const std::string sScrewName = "SCREW";
290 inline static const std::string sScrewHolesCSName = "FV0SCREWHOLES";
291 inline static const std::string sRodName = "ROD";
292 inline static const std::string sRodHolesCSName = "FV0RODHOLES";
293 inline static const std::string sContainerName = "CONTAINER";
294
296 void initializeGeometry();
297
299 void initializeMaps();
300
302 void initializeVectors();
303
305 void initializeTransformations();
306
308 void initializeCellRingRadii();
309
311 void initializeSectorTransformations();
312
314 void initializeFiberVolumeRadii();
315
317 void initializeFiberMedium();
318
320 void initializeScrewAndRodRadii();
321
323 void initializeScrewTypeMedium();
324
326 void initializeRodTypeMedium();
327
332 void addScrewProperties(int screwTypeID, int iRing, float phi);
333
337 void addRodProperties(int rodTypeID, int iRing);
338
340 void initializeScrewAndRodPositionsAndDimensions();
341
343 void initializeSensVols();
344
346 void initializeNonSensVols();
347
350 void initializeScrewHoles();
351
354 void initializeRodHoles();
355
361 void initializeCells(const std::string& cellType, const float zThickness, const TGeoMedium* medium, bool isSensitive);
362
364 void initializeScintCells();
365
367 void initializePlasticCells();
368
370 void initializePmts();
371
373 void initializeFibers();
374
376 void initializeScrews();
377
379 void initializeRods();
380
382 void initializeMetalContainer();
383
387 void assembleSensVols(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left) const;
388
392 void assembleNonSensVols(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left) const;
393
397 void assembleScintSectors(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left) const;
398
402 void assemblePlasticSectors(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left) const;
403
407 void assemblePmts(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left) const;
408
412 void assembleFibers(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left) const;
413
417 void assembleScrews(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left) const;
418
422 void assembleRods(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left) const;
423
427 void assembleMetalContainer(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left) const;
428
432 TGeoVolumeAssembly* buildSectorAssembly(const std::string& cellName) const;
433
438 TGeoVolumeAssembly* buildSector(const std::string& cellType, int iSector) const;
439
447 TGeoShape* createScrewShape(const std::string& shapeName, int screwTypeID, float xEpsilon = 0, float yEpsilon = 0,
448 float zEpsilon = 0) const;
449
457 TGeoShape* createRodShape(const std::string& shapeName, int rodTypeID, float xEpsilon = 0, float yEpsilon = 0,
458 float zEpsilon = 0) const;
459
466 TGeoTranslation* createAndRegisterTrans(const std::string& name, double dx = 0, double dy = 0, double dz = 0) const;
467
474 TGeoRotation* createAndRegisterRot(const std::string& name, double phi = 0, double theta = 0, double psi = 0) const;
475
480 const std::string createVolumeName(const std::string& volumeType, int number = -1) const;
481
483 void initializeCellCenters();
484 void initializeReadoutCenters();
485
486 std::vector<std::string> mSensitiveVolumeNames;
487
491 std::vector<float> mRAvgRing;
492 std::vector<float> mRMinScintillator;
493 std::vector<float> mRMaxScintillator;
494 std::vector<float> mRMinFiber;
495 std::vector<float> mRMaxFiber;
496
499 std::vector<TGeoMedium*> mMediumFiberRings;
500 std::vector<TGeoMedium*> mMediumFiberPMTs;
501
502 std::vector<float> mRScrewAndRod;
503
504 std::vector<float> mDrMinScrews;
505 std::vector<float> mDrMaxScrews;
506 std::vector<float> mDzMaxScrews;
507 std::vector<float> mDzMinScrews;
508
509 std::vector<float> mRScrews;
510 std::vector<int> mScrewTypeIDs;
511
512 std::vector<float> mDxMinRods;
513 std::vector<float> mDxMaxRods;
514 std::vector<float> mDyMinRods;
515 std::vector<float> mDyMaxRods;
516 std::vector<float> mDzMaxRods;
517 std::vector<float> mDzMinRods;
518 std::vector<int> mRodTypeIDs;
519
520 std::vector<TGeoMatrix*> mSectorTrans;
521 std::vector<std::vector<float>> mScrewPos;
522 std::vector<std::vector<float>> mRodPos;
523 std::vector<TGeoMedium*> mMediumScrewTypes;
524 std::vector<TGeoMedium*> mMediumRodTypes;
525
526 const int mGeometryType;
527 std::map<EGeoComponent, bool> mEnabledComponents;
528 TGeoMatrix* mLeftTransformation;
529 TGeoMatrix* mRightTransformation;
530
532 std::array<Point3Dsimple, sNumberOfCells> mCellCenter;
533 std::array<Point3Dsimple, sNumberOfReadoutChannels> mReadoutCenter;
534
535 static Geometry* sInstance;
536
537 ClassDefNV(Geometry, 1);
538};
539} // namespace fv0
540} // namespace o2
541#endif
Definition of the GeometryManager class.
static TGeoPNEntry * getPNEntry(o2::detectors::DetID detid, Int_t sensid)
static constexpr ID FV0
Definition DetID.h:76
FV0 Geometry.
Definition Geometry.h:51
void buildGeometry() const
Build the geometry.
Definition Geometry.cxx:95
Point3Dsimple & getReadoutCenter(UInt_t cellId)
Definition Geometry.cxx:130
int getCurrentCellId(const TVirtualMC *fMC) const
Definition Geometry.cxx:61
static constexpr int getNumberOfReadoutChannels()
Definition Geometry.h:121
static Geometry * instance(EGeoType initType=eUninitialized)
bool enableComponent(EGeoComponent component, bool enable=true)
Definition Geometry.cxx:85
Point3Dsimple & getCellCenter(UInt_t cellId)
Definition Geometry.cxx:125
static constexpr o2::detectors::DetID::ID getDetID()
Definition Geometry.h:128
TGeoPNEntry * getPNEntry(int index) const
Definition Geometry.h:129
bool isRing5(UInt_t cellId)
Definition Geometry.cxx:135
EGeoComponent
Geometry components possible to be enabled/disabled. Only enabled components will be created.
Definition Geometry.h:67
const std::vector< std::string > & getSensitiveVolumeNames() const
Definition Geometry.h:100
static constexpr float getPmtDensity()
Get the density of the PMTs.
Definition Geometry.h:137
void getGlobalPosition(float &x, float &y, float &z)
Utility functions to be accessed externally.
Definition Geometry.cxx:118
GLint GLenum GLint x
Definition glcorearb.h:403
GLuint index
Definition glcorearb.h:781
GLuint const GLchar * name
Definition glcorearb.h:781
GLboolean enable
Definition glcorearb.h:3991
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
void SetCoordinates(float x, float y, float z)
Definition Geometry.h:41