145 inline static const std::string sDetectorName =
"FV0";
148 static constexpr float sEpsilon = 0.01;
149 static constexpr float sDzScintillator = 4;
150 static constexpr float sDzPlastic = 1;
152 static constexpr float sXGlobal = 0;
153 static constexpr float sYGlobal = 0;
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;
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;
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};
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;
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;
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;
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);
215 static constexpr int sNumberOfPMTFiberVolumes = 5;
217 static constexpr int sPMTFiberCellOrder[sNumberOfPMTsPerSector] = {2, 5, 4, 3, 5, 1};
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;
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;
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;
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";
296 void initializeGeometry();
299 void initializeMaps();
302 void initializeVectors();
305 void initializeTransformations();
308 void initializeCellRingRadii();
311 void initializeSectorTransformations();
314 void initializeFiberVolumeRadii();
317 void initializeFiberMedium();
320 void initializeScrewAndRodRadii();
323 void initializeScrewTypeMedium();
326 void initializeRodTypeMedium();
332 void addScrewProperties(
int screwTypeID,
int iRing,
float phi);
337 void addRodProperties(
int rodTypeID,
int iRing);
340 void initializeScrewAndRodPositionsAndDimensions();
343 void initializeSensVols();
346 void initializeNonSensVols();
350 void initializeScrewHoles();
354 void initializeRodHoles();
361 void initializeCells(
const std::string& cellType,
const float zThickness,
const TGeoMedium* medium,
bool isSensitive);
364 void initializeScintCells();
367 void initializePlasticCells();
370 void initializePmts();
373 void initializeFibers();
376 void initializeScrews();
379 void initializeRods();
382 void initializeMetalContainer();
387 void assembleSensVols(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left)
const;
392 void assembleNonSensVols(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left)
const;
397 void assembleScintSectors(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left)
const;
402 void assemblePlasticSectors(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left)
const;
407 void assemblePmts(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left)
const;
412 void assembleFibers(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left)
const;
417 void assembleScrews(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left)
const;
422 void assembleRods(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left)
const;
427 void assembleMetalContainer(TGeoVolume* vFV0Right, TGeoVolume* vFV0Left)
const;
432 TGeoVolumeAssembly* buildSectorAssembly(
const std::string& cellName)
const;
438 TGeoVolumeAssembly* buildSector(
const std::string& cellType,
int iSector)
const;
447 TGeoShape* createScrewShape(
const std::string& shapeName,
int screwTypeID,
float xEpsilon = 0,
float yEpsilon = 0,
448 float zEpsilon = 0)
const;
457 TGeoShape* createRodShape(
const std::string& shapeName,
int rodTypeID,
float xEpsilon = 0,
float yEpsilon = 0,
458 float zEpsilon = 0)
const;
466 TGeoTranslation* createAndRegisterTrans(
const std::string&
name,
double dx = 0,
double dy = 0,
double dz = 0)
const;
474 TGeoRotation* createAndRegisterRot(
const std::string&
name,
double phi = 0,
double theta = 0,
double psi = 0)
const;
480 const std::string createVolumeName(
const std::string& volumeType,
int number = -1)
const;
483 void initializeCellCenters();
484 void initializeReadoutCenters();
486 std::vector<std::string> mSensitiveVolumeNames;
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;
499 std::vector<TGeoMedium*> mMediumFiberRings;
500 std::vector<TGeoMedium*> mMediumFiberPMTs;
502 std::vector<float> mRScrewAndRod;
504 std::vector<float> mDrMinScrews;
505 std::vector<float> mDrMaxScrews;
506 std::vector<float> mDzMaxScrews;
507 std::vector<float> mDzMinScrews;
509 std::vector<float> mRScrews;
510 std::vector<int> mScrewTypeIDs;
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;
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;
526 const int mGeometryType;
527 std::map<EGeoComponent, bool> mEnabledComponents;
528 TGeoMatrix* mLeftTransformation;
529 TGeoMatrix* mRightTransformation;
532 std::array<Point3Dsimple, sNumberOfCells> mCellCenter;
533 std::array<Point3Dsimple, sNumberOfReadoutChannels> mReadoutCenter;