Project
Loading...
Searching...
No Matches
FT3Layer.cxx
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
16
20
21#include <fairlogger/Logger.h> // for LOG
22
23#include <TGeoManager.h> // for TGeoManager, gGeoManager
24#include <TGeoMatrix.h> // for TGeoCombiTrans, TGeoRotation, etc
25#include <TGeoTube.h> // for TGeoTube, TGeoTubeSeg
26#include <TGeoVolume.h> // for TGeoVolume, TGeoVolumeAssembly
27#include <TGeoCompositeShape.h> // for TGeoCompositeShape
28#include "TMathBase.h" // for Abs
29#include <TMath.h> // for Sin, RadToDeg, DegToRad, Cos, Tan, etc
30
31#include <TGeoBBox.h>
32#include <string>
33#include <cstdio> // for snprintf
34#include <cmath>
35
36class TGeoMedium;
37
38using namespace TMath;
39using namespace o2::ft3;
40using namespace o2::itsmft;
41
43
44FT3Layer::~FT3Layer() = default;
45
46TGeoMaterial* FT3Layer::carbonFiberMat = nullptr;
47TGeoMedium* FT3Layer::medCarbonFiber = nullptr;
48
49TGeoMaterial* FT3Layer::kaptonMat = nullptr;
50TGeoMedium* FT3Layer::kaptonMed = nullptr;
51
52TGeoMaterial* FT3Layer::waterMat = nullptr;
53TGeoMedium* FT3Layer::waterMed = nullptr;
54
55TGeoMaterial* FT3Layer::foamMat = nullptr;
56TGeoMedium* FT3Layer::medFoam = nullptr;
57
58FT3Layer::FT3Layer(Int_t layerDirection, Int_t layerNumber, std::string layerName, Float_t z, Float_t rIn, Float_t rOut, Float_t Layerx2X0)
59{
60 // Creates a simple parametrized EndCap layer covering the given
61 // pseudorapidity range at the z layer position
62 mDirection = layerDirection;
63 mLayerNumber = layerNumber;
64 mLayerName = layerName;
65 mZ = layerDirection ? std::abs(z) : -std::abs(z);
66 mx2X0 = Layerx2X0;
67 mInnerRadius = rIn;
68 mOuterRadius = rOut;
69 auto Si_X0 = 9.5;
70 mChipThickness = Layerx2X0 * Si_X0;
71
72 LOG(info) << "Creating FT3 Layer " << mLayerNumber << " ; direction " << mDirection;
73 LOG(info) << " Using silicon X0 = " << Si_X0 << " to emulate layer radiation length.";
74 LOG(info) << " Layer z = " << mZ << " ; R_in = " << mInnerRadius << " ; R_out = " << mOuterRadius << " ; x2X0 = " << mx2X0 << " ; ChipThickness = " << mChipThickness;
75}
76
78{
79
80 if (carbonFiberMat) {
81 return;
82 }
83
84 carbonFiberMat = new TGeoMaterial("CarbonFiber", 12.0, 6.0, 1.6);
85 medCarbonFiber = new TGeoMedium("CarbonFiber", 1, carbonFiberMat);
86
87 auto* itsC = new TGeoElement("FT3_C", "Carbon", 6, 12.0107);
88
89 auto* itsFoam = new TGeoMixture("FT3_Foam", 1);
90 itsFoam->AddElement(itsC, 1);
91 itsFoam->SetDensity(0.17);
92
93 medFoam = new TGeoMedium("FT3_Foam", 1, itsFoam);
94 foamMat = medFoam->GetMaterial();
95
96 kaptonMat = new TGeoMaterial("Kapton (cooling pipe)", 13.84, 6.88, 1.346);
97 kaptonMed = new TGeoMedium("Kapton (cooling pipe)", 1, kaptonMat);
98
99 waterMat = new TGeoMaterial("Water", 18.01528, 8.0, 1.064);
100 waterMed = new TGeoMedium("Water", 2, waterMat);
101}
102
103static double y_circle(double x, double radius)
104{
105 return (x * x < radius * radius) ? std::sqrt(radius * radius - x * x) : 0;
106}
107
108void FT3Layer::createSeparationLayer_waterCooling(TGeoVolume* motherVolume, const std::string& separationLayerName)
109{
110
112
113 double carbonFiberThickness = 0.01;
114 double foamSpacingThickness = 0.5;
115
116 TGeoTube* carbonFiberLayer = new TGeoTube(mInnerRadius, mOuterRadius, carbonFiberThickness / 2);
117
118 // volumes
119 TGeoVolume* carbonFiberLayerVol1 = new TGeoVolume((separationLayerName + "_CarbonFiber1").c_str(), carbonFiberLayer, medCarbonFiber);
120 TGeoVolume* carbonFiberLayerVol2 = new TGeoVolume((separationLayerName + "_CarbonFiber2").c_str(), carbonFiberLayer, medCarbonFiber);
121
122 carbonFiberLayerVol1->SetLineColor(kGray + 2);
123 carbonFiberLayerVol2->SetLineColor(kGray + 2);
124
125 double zSeparation = foamSpacingThickness / 2.0 + carbonFiberThickness / 2.0;
126
127 motherVolume->AddNode(carbonFiberLayerVol1, 1, new TGeoTranslation(0, 0, mZ - zSeparation));
128 motherVolume->AddNode(carbonFiberLayerVol2, 1, new TGeoTranslation(0, 0, mZ + zSeparation));
129
130 double pipeOuterRadius = 0.20;
131 double kaptonThickness = 0.0025;
132 double pipeInnerRadius = pipeOuterRadius - kaptonThickness;
133 double pipeMaxLength = mOuterRadius * 2.0;
134
135 int name_it = 0;
136
137 // positions of the pipes depending on the overlap of the sensors inactive regions: (ALICE 3 dimensions)
138 // partial:
139 // std::vector<double> X_pos = {-63.2, -58.4, -53.6, -48.8, -44.0, -39.199999999999996, -34.4, -29.599999999999994, -24.799999999999997, -19.999999999999993, -15.199999999999998, -10.399999999999993, -5.599999999999998, -0.7999999999999936, 4.000000000000002, 8.800000000000006, 13.600000000000001, 18.400000000000006, 23.200000000000003, 28.000000000000007, 32.800000000000004, 37.60000000000001, 42.400000000000006, 47.20000000000001, 52.00000000000001, 56.80000000000001, 61.60000000000001, 66.4};
140 // complete:
141 // std::vector<double> X_pos = {-63.4, -58.8, -54.199999999999996, -49.599999999999994, -44.99999999999999, -40.39999999999999, -35.79999999999999, -31.199999999999992, -26.59999999999999, -21.999999999999993, -17.39999999999999, -12.799999999999994, -8.199999999999992, -3.5999999999999934, 1.000000000000008, 5.600000000000007, 10.200000000000008, 14.800000000000008, 19.40000000000001, 24.000000000000007, 28.60000000000001, 33.20000000000001, 37.80000000000001, 42.40000000000001, 47.000000000000014, 51.600000000000016, 56.20000000000002, 60.80000000000002, 65.40000000000002};
142 std::vector<double> X_pos = {-62.3168, -57.9836, -53.650400000000005, -49.317200000000014, -44.984000000000016, -40.65080000000002, -36.31760000000002, -31.984400000000026, -27.65120000000003, -23.318000000000037, -18.98480000000004, -14.651600000000043, -10.318400000000047, -5.98520000000005, -1.6520000000000519, 2.6811999999999445, 7.014399999999941, 11.347599999999936, 15.680799999999934, 20.01399999999993, 24.347199999999926, 28.68039999999992, 33.013599999999926, 37.34679999999992, 41.980000000000004, 46.613200000000006, 51.246399999999994, 55.87960000000001, 60.5128};
143
144 for (double xPos : X_pos) {
145
146 double pipeLength = pipeMaxLength;
147 double yMax = 0.0;
148
149 TGeoRotation* rotation = new TGeoRotation();
150 rotation->RotateX(90);
151
152 if (std::abs(xPos) < mInnerRadius) {
153 double yInner = std::abs(y_circle(xPos, mInnerRadius));
154 double yOuter = std::abs(y_circle(xPos, mOuterRadius));
155
156 yMax = 2 * yOuter;
157 pipeLength = yMax;
158
159 double positiveYLength = yOuter - yInner;
160
161 TGeoVolume* kaptonPipePos = new TGeoVolume((separationLayerName + "_KaptonPipePos_" + std::to_string(name_it)).c_str(), new TGeoTube(pipeInnerRadius, pipeOuterRadius, positiveYLength / 2), kaptonMed);
162 kaptonPipePos->SetLineColor(kGray);
163 TGeoVolume* waterVolumePos = new TGeoVolume((separationLayerName + "_WaterVolumePos_" + std::to_string(name_it)).c_str(), new TGeoTube(0.0, pipeInnerRadius, positiveYLength / 2), waterMed);
164 waterVolumePos->SetLineColor(kBlue);
165
166 motherVolume->AddNode(waterVolumePos, 1, new TGeoCombiTrans(xPos, (yInner + yOuter) / 2.0, mZ, rotation));
167
168 TGeoVolume* kaptonPipeNeg = new TGeoVolume((separationLayerName + "_KaptonPipeNeg_" + std::to_string(name_it)).c_str(), new TGeoTube(pipeInnerRadius, pipeOuterRadius, positiveYLength / 2), kaptonMed);
169 kaptonPipeNeg->SetLineColor(kGray);
170 TGeoVolume* waterVolumeNeg = new TGeoVolume((separationLayerName + "_WaterVolumeNeg_" + std::to_string(name_it)).c_str(), new TGeoTube(0.0, pipeInnerRadius, positiveYLength / 2), waterMed);
171 waterVolumeNeg->SetLineColor(kBlue);
172
173 motherVolume->AddNode(waterVolumeNeg, 1, new TGeoCombiTrans(xPos, -(yInner + yOuter) / 2.0, mZ, rotation));
174
175 motherVolume->AddNode(kaptonPipePos, 1, new TGeoCombiTrans(xPos, (yInner + yOuter) / 2.0, mZ, rotation));
176 motherVolume->AddNode(kaptonPipeNeg, 1, new TGeoCombiTrans(xPos, -(yInner + yOuter) / 2.0, mZ, rotation));
177
178 } else {
179
180 double yOuter = std::abs(y_circle(xPos, mOuterRadius));
181 yMax = 2 * yOuter;
182 pipeLength = yMax;
183
184 TGeoVolume* kaptonPipe = new TGeoVolume((separationLayerName + "_KaptonPipe_" + std::to_string(name_it)).c_str(), new TGeoTube(pipeInnerRadius, pipeOuterRadius, pipeLength / 2), kaptonMed);
185 kaptonPipe->SetLineColor(kGray);
186 TGeoVolume* waterVolume = new TGeoVolume((separationLayerName + "_WaterVolume_" + std::to_string(name_it)).c_str(), new TGeoTube(0.0, pipeInnerRadius, pipeLength / 2), waterMed);
187 waterVolume->SetLineColor(kBlue);
188
189 motherVolume->AddNode(waterVolume, 1, new TGeoCombiTrans(xPos, 0, mZ, rotation));
190 motherVolume->AddNode(kaptonPipe, 1, new TGeoCombiTrans(xPos, 0, mZ, rotation));
191 }
192
193 name_it++;
194 }
195}
196
197void FT3Layer::createSeparationLayer(TGeoVolume* motherVolume, const std::string& separationLayerName)
198{
199
201
202 double carbonFiberThickness = 0.01;
203 double foamSpacingThickness = 1.0;
204
205 TGeoTube* carbonFiberLayer = new TGeoTube(mInnerRadius, mOuterRadius, carbonFiberThickness / 2);
206 TGeoTube* foamLayer = new TGeoTube(mInnerRadius, mOuterRadius, foamSpacingThickness / 2);
207
208 // volumes
209 TGeoVolume* carbonFiberLayerVol1 = new TGeoVolume((separationLayerName + "_CarbonFiber1").c_str(), carbonFiberLayer, medCarbonFiber);
210 TGeoVolume* foamLayerVol = new TGeoVolume((separationLayerName + "_Foam").c_str(), foamLayer, medFoam);
211 TGeoVolume* carbonFiberLayerVol2 = new TGeoVolume((separationLayerName + "_CarbonFiber2").c_str(), carbonFiberLayer, medCarbonFiber);
212
213 carbonFiberLayerVol1->SetLineColor(kGray + 2);
214 foamLayerVol->SetLineColor(kBlack);
215 foamLayerVol->SetFillColorAlpha(kBlack, 1.0);
216 carbonFiberLayerVol2->SetLineColor(kGray + 2);
217
218 double zSeparation = foamSpacingThickness / 2.0 + carbonFiberThickness / 2.0;
219
220 motherVolume->AddNode(carbonFiberLayerVol1, 1, new TGeoTranslation(0, 0, mZ - zSeparation));
221 motherVolume->AddNode(foamLayerVol, 1, new TGeoTranslation(0, 0, mZ));
222 motherVolume->AddNode(carbonFiberLayerVol2, 1, new TGeoTranslation(0, 0, mZ + zSeparation));
223}
224
225void FT3Layer::createLayer(TGeoVolume* motherVolume)
226{
227 if (mLayerNumber >= 0 && mLayerNumber < 3) {
228
229 std::string chipName = o2::ft3::GeometryTGeo::getFT3ChipPattern() + std::to_string(mLayerNumber),
230 sensName = Form("%s_%d_%d", GeometryTGeo::getFT3SensorPattern(), mDirection, mLayerNumber);
231 TGeoTube* sensor = new TGeoTube(mInnerRadius, mOuterRadius, mChipThickness / 2);
232 TGeoTube* chip = new TGeoTube(mInnerRadius, mOuterRadius, mChipThickness / 2);
233 TGeoTube* layer = new TGeoTube(mInnerRadius, mOuterRadius, mChipThickness / 2);
234
235 TGeoMedium* medSi = gGeoManager->GetMedium("FT3_SILICON$");
236 TGeoMedium* medAir = gGeoManager->GetMedium("FT3_AIR$");
237
238 TGeoVolume* sensVol = new TGeoVolume(sensName.c_str(), sensor, medSi);
239 sensVol->SetLineColor(kYellow);
240 TGeoVolume* chipVol = new TGeoVolume(chipName.c_str(), chip, medSi);
241 chipVol->SetLineColor(kYellow);
242 TGeoVolume* layerVol = new TGeoVolume(mLayerName.c_str(), layer, medAir);
243 layerVol->SetLineColor(kYellow);
244
245 LOG(info) << "Inserting " << sensVol->GetName() << " inside " << chipVol->GetName();
246 chipVol->AddNode(sensVol, 1, nullptr);
247
248 LOG(info) << "Inserting " << chipVol->GetName() << " inside " << layerVol->GetName();
249 layerVol->AddNode(chipVol, 1, nullptr);
250
251 // Finally put everything in the mother volume
252 auto* FwdDiskRotation = new TGeoRotation("FwdDiskRotation", 0, 0, 180);
253 auto* FwdDiskCombiTrans = new TGeoCombiTrans(0, 0, mZ, FwdDiskRotation);
254
255 LOG(info) << "Inserting " << layerVol->GetName() << " inside " << motherVolume->GetName();
256 motherVolume->AddNode(layerVol, 1, FwdDiskCombiTrans);
257
258 } else if (mLayerNumber >= 3) {
259
260 FT3Module module;
261
262 // layer structure
263 std::string frontLayerName = o2::ft3::GeometryTGeo::getFT3LayerPattern() + std::to_string(mDirection) + std::to_string(mLayerNumber) + "_Front";
264 std::string backLayerName = o2::ft3::GeometryTGeo::getFT3LayerPattern() + std::to_string(mDirection) + std::to_string(mLayerNumber) + "_Back";
265 std::string separationLayerName = "FT3SeparationLayer" + std::to_string(mDirection) + std::to_string(mLayerNumber);
266
267 // createSeparationLayer_waterCooling(motherVolume, separationLayerName);
268 createSeparationLayer(motherVolume, separationLayerName);
269
270 // create disk faces
271 module.createModule(mZ, mLayerNumber, mDirection, mInnerRadius, mOuterRadius, 0., "front", "rectangular", motherVolume);
272 module.createModule(mZ, mLayerNumber, mDirection, mInnerRadius, mOuterRadius, 0., "back", "rectangular", motherVolume);
273 }
274}
ClassImp(FT3Layer)
Definition of the FT3Layer class.
float & yMax
Definition of the GeometryTGeo class.
Definition of the Detector class.
static TGeoMaterial * waterMat
Definition FT3Layer.h:73
virtual void createLayer(TGeoVolume *motherVolume)
Definition FT3Layer.cxx:225
static TGeoMedium * medFoam
Definition FT3Layer.h:77
static TGeoMedium * medCarbonFiber
Definition FT3Layer.h:68
void createSeparationLayer_waterCooling(TGeoVolume *motherVolume, const std::string &separationLayerName)
Definition FT3Layer.cxx:108
static void initialize_mat()
Definition FT3Layer.cxx:77
static TGeoMedium * waterMed
Definition FT3Layer.h:74
~FT3Layer() override
Default destructor.
FT3Layer()=default
static TGeoMaterial * carbonFiberMat
Definition FT3Layer.h:67
static TGeoMedium * kaptonMed
Definition FT3Layer.h:71
static TGeoMaterial * kaptonMat
Definition FT3Layer.h:70
void createSeparationLayer(TGeoVolume *motherVolume, const std::string &separationLayerName)
Definition FT3Layer.cxx:197
static TGeoMaterial * foamMat
Definition FT3Layer.h:76
static const char * getFT3SensorPattern()
static const char * getFT3ChipPattern()
static const char * getFT3LayerPattern()
GLint GLenum GLint x
Definition glcorearb.h:403
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
std::string to_string(gsl::span< T, Size > span)
Definition common.h:52
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"