Project
Loading...
Searching...
No Matches
FT3Materials.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
14
15#ifndef FT3MATERIALS_H
16#define FT3MATERIALS_H
17
18#include <array>
19#include <unordered_map>
20#include <TColor.h>
21
22class TGeoMedium;
23
24namespace o2::ft3
25{
26namespace Materials
27{
28// The name FT3 registers itself under with the MaterialManager. getMedium()
29// looks media up under this key, so it has to be the same name the Detector
30// hands to DetImpl<Detector>.
31constexpr const char* moduleName = "FT3";
32
33/*
34 * Materials of the FT3 detector.
35 *
36 * Everything the simulation needs to know about a material lives in the
37 * materials map below, keyed by its FT3-local ID: composition, density,
38 * transport parameters and the colour its volumes are drawn in.
39 * Detector::createMaterials() registers the whole map with the MaterialManager,
40 * and FT3Module/FT3Layer reach the media through getMedium() below, so no ID,
41 * density or colour is ever written out by hand.
42 */
43enum class MaterialID : unsigned {
44 Air = 1,
45 Silicon,
46 Copper,
47 Kapton,
49 Epoxy,
51 Foam,
52 Water
53};
54
55// Transport parameters of a medium, in the order expected by Detector::Medium()
57 float tmaxfd; // maximum field-induced angular deviation per step, degrees
58 float stemax; // maximum step length, cm
59 float deemax; // maximum fractional energy loss per step
60 float epsil; // tracking precision, cm
61 float stmin; // minimum step length, cm
62};
63
64constexpr TrackingParams sensitiveTracking = {0.1f, 0.0075f, 0.1f, 1.0e-4f, 0.0f};
65constexpr TrackingParams passiveTracking = {0.1f, 1.0f, 0.1f, 1.0e-4f, 0.0f};
66
67// Maximum number of elements any of the mixtures below is built from
68constexpr unsigned maxMaterialComponents = 4;
69using ComponentArray = std::array<float, maxMaterialComponents>;
70
72 const char* name;
73 int colour; // ROOT colour every volume made of this material is drawn in
74 float density; // g/cm3
75 // Radiation and nuclear interaction length, cm. Only single elements carry
76 // them: Mixture() derives both from the composition and takes no such
77 // arguments. A non-positive value lets the transport engine compute it.
78 float radl;
79 float absl;
80 int nComponents; // 0: single element; > 0: mixture by weight; < 0: mixture by atom count
81 ComponentArray a; // mass numbers; only a[0] is used for a single element
82 ComponentArray z; // atomic numbers; only z[0] is used for a single element
83 ComponentArray w; // weight fractions or atom counts; unused for a single element
85};
86
87/*
88 * Silicon, copper and carbon fibre are shared with TRK and are kept numerically
89 * identical to its SILICON$, COPPER$ and CARBONFIBER$ (TRK Detector::createMaterials()),
90 * down to the radiation lengths. Kapton, epoxy and aluminium have no TRK
91 * counterpart: TRK models the flex as the effective FPC$ mixture instead.
92 */
93inline const std::unordered_map<MaterialID, MaterialProperties> materials = {
94 // Air volumes get their colour set individually where they are built
95 {MaterialID::Air, {"Air", kWhite, 1.20479e-3f, 0.0f, 0.0f, 4, {12.0107f, 14.0067f, 15.9994f, 39.948f}, {6.0f, 7.0f, 8.0f, 18.0f}, {0.000124f, 0.755267f, 0.231781f, 0.012827f}, passiveTracking}},
96 {MaterialID::Silicon, {"Silicon", kGreen, 2.33f, 9.36f, 999.0f, 0, {28.086f}, {14.0f}, {}, sensitiveTracking}},
97 // Copper planes of the end-of-stave cards: X0 = 1.436 cm
98 {MaterialID::Copper, {"Copper", kOrange, 8.96f, 1.436f, 999.0f, 0, {63.546f}, {29.0f}, {}, passiveTracking}},
99 // Kapton: C22 H10 N2 O5, by weight fraction. Also the cooling pipe material.
100 {MaterialID::Kapton, {"Kapton", kYellow, 1.346f, 0.0f, 0.0f, 4, {12.0107f, 1.00794f, 14.0067f, 15.999f}, {6.0f, 1.0f, 7.0f, 8.0f}, {0.5641f, 0.2564f, 0.0513f, 0.1282f}, passiveTracking}},
101 // Carbon fibre: density tuned so X0 ~ 27 cm, as in TRK
102 // TODO: Check with Rene the exact type of carbon fiber
103 {MaterialID::CarbonFiber, {"CarbonFiber", kGray + 1, 1.45f, 27.0f, 999.0f, 0, {12.0107f}, {6.0f}, {}, passiveTracking}},
104 // Epoxy: C18 H19 O3, by atom count (negative nComponents)
105 {MaterialID::Epoxy, {"Epoxy", kBlue, 2.186f, 0.0f, 0.0f, -3, {12.0107f, 1.00794f, 15.999f}, {6.0f, 1.0f, 8.0f}, {18.0f, 19.0f, 3.0f}, passiveTracking}},
106 // No TRK counterpart; X0 and lambda are left to the transport engine
107 {MaterialID::Aluminum, {"Aluminum", kBlack, 2.7f, 0.0f, 0.0f, 0, {26.98f}, {13.0f}, {}, passiveTracking}},
108 // Carbon foam core of the disk separation layer
109 {MaterialID::Foam, {"Foam", kBlack, 0.17f, 0.0f, 0.0f, 0, {12.0107f}, {6.0f}, {}, passiveTracking}},
110 // Coolant inside the kapton pipes
111 {MaterialID::Water, {"Water", kBlue, 1.064f, 0.0f, 0.0f, 0, {18.01528f}, {8.0f}, {}, passiveTracking}}};
112// The inactive rim of a sensor is made of silicon as well, but is drawn
113// separately so that it can be told apart from the active area.
114const int SiInactiveColor = kRed;
115} // namespace Materials
116
122TGeoMedium* getMedium(Materials::MaterialID id);
123} // namespace o2::ft3
124
125#endif // FT3MATERIALS_H
constexpr const char * moduleName
const std::unordered_map< MaterialID, MaterialProperties > materials
constexpr unsigned maxMaterialComponents
std::array< float, maxMaterialComponents > ComponentArray
constexpr TrackingParams passiveTracking
const int SiInactiveColor
constexpr TrackingParams sensitiveTracking
TGeoMedium * getMedium(Materials::MaterialID id)