121 const double carbonFiberThickness = 0.01;
122 const double foamSpacingThickness = 0.5;
124 TGeoTube* carbonFiberLayer =
new TGeoTube(mInnerRadius, mOuterRadius, carbonFiberThickness / 2);
127 TGeoVolume* carbonFiberLayerVol1 =
new TGeoVolume((separationLayerName +
"_CarbonFiber1").c_str(), carbonFiberLayer,
medCarbonFiber);
128 TGeoVolume* carbonFiberLayerVol2 =
new TGeoVolume((separationLayerName +
"_CarbonFiber2").c_str(), carbonFiberLayer,
medCarbonFiber);
130 carbonFiberLayerVol1->SetLineColor(kGray + 2);
131 carbonFiberLayerVol2->SetLineColor(kGray + 2);
133 const double zSeparation = foamSpacingThickness / 2.0 + carbonFiberThickness / 2.0;
135 motherVolume->AddNode(carbonFiberLayerVol1, 1,
new TGeoTranslation(0, 0, mZ - zSeparation));
136 motherVolume->AddNode(carbonFiberLayerVol2, 1,
new TGeoTranslation(0, 0, mZ + zSeparation));
138 const double pipeOuterRadius = 0.20;
139 const double kaptonThickness = 0.0025;
140 const double pipeInnerRadius = pipeOuterRadius - kaptonThickness;
141 const double pipeMaxLength = mOuterRadius * 2.0;
150 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};
152 for (
double xPos : X_pos) {
154 double pipeLength = pipeMaxLength;
157 TGeoRotation* rotation =
new TGeoRotation();
158 rotation->RotateX(90);
160 if (std::abs(xPos) < mInnerRadius) {
161 double yInner = std::abs(y_circle(xPos, mInnerRadius));
162 double yOuter = std::abs(y_circle(xPos, mOuterRadius));
167 double positiveYLength = yOuter - yInner;
169 TGeoVolume* kaptonPipePos =
new TGeoVolume((separationLayerName +
"_KaptonPipePos_" +
std::to_string(name_it)).c_str(),
new TGeoTube(pipeInnerRadius, pipeOuterRadius, positiveYLength / 2),
kaptonMed);
170 kaptonPipePos->SetLineColor(kGray);
171 TGeoVolume* waterVolumePos =
new TGeoVolume((separationLayerName +
"_WaterVolumePos_" +
std::to_string(name_it)).c_str(),
new TGeoTube(0.0, pipeInnerRadius, positiveYLength / 2),
waterMed);
172 waterVolumePos->SetLineColor(kBlue);
174 motherVolume->AddNode(waterVolumePos, 1,
new TGeoCombiTrans(xPos, (yInner + yOuter) / 2.0, mZ, rotation));
176 TGeoVolume* kaptonPipeNeg =
new TGeoVolume((separationLayerName +
"_KaptonPipeNeg_" +
std::to_string(name_it)).c_str(),
new TGeoTube(pipeInnerRadius, pipeOuterRadius, positiveYLength / 2),
kaptonMed);
177 kaptonPipeNeg->SetLineColor(kGray);
178 TGeoVolume* waterVolumeNeg =
new TGeoVolume((separationLayerName +
"_WaterVolumeNeg_" +
std::to_string(name_it)).c_str(),
new TGeoTube(0.0, pipeInnerRadius, positiveYLength / 2),
waterMed);
179 waterVolumeNeg->SetLineColor(kBlue);
181 motherVolume->AddNode(waterVolumeNeg, 1,
new TGeoCombiTrans(xPos, -(yInner + yOuter) / 2.0, mZ, rotation));
183 motherVolume->AddNode(kaptonPipePos, 1,
new TGeoCombiTrans(xPos, (yInner + yOuter) / 2.0, mZ, rotation));
184 motherVolume->AddNode(kaptonPipeNeg, 1,
new TGeoCombiTrans(xPos, -(yInner + yOuter) / 2.0, mZ, rotation));
188 double yOuter = std::abs(y_circle(xPos, mOuterRadius));
192 TGeoVolume* kaptonPipe =
new TGeoVolume((separationLayerName +
"_KaptonPipe_" +
std::to_string(name_it)).c_str(),
new TGeoTube(pipeInnerRadius, pipeOuterRadius, pipeLength / 2),
kaptonMed);
193 kaptonPipe->SetLineColor(kGray);
194 TGeoVolume* waterVolume =
new TGeoVolume((separationLayerName +
"_WaterVolume_" +
std::to_string(name_it)).c_str(),
new TGeoTube(0.0, pipeInnerRadius, pipeLength / 2),
waterMed);
195 waterVolume->SetLineColor(kBlue);
197 motherVolume->AddNode(waterVolume, 1,
new TGeoCombiTrans(xPos, 0, mZ, rotation));
198 motherVolume->AddNode(kaptonPipe, 1,
new TGeoCombiTrans(xPos, 0, mZ, rotation));
210 constexpr double carbonFiberThickness = 0.01;
211 constexpr double foamSpacingThickness = 1.0;
213 TGeoTube* carbonFiberLayer =
new TGeoTube(mInnerRadius, mOuterRadius, carbonFiberThickness / 2);
214 TGeoTube* foamLayer =
new TGeoTube(mInnerRadius, mOuterRadius, foamSpacingThickness / 2);
217 TGeoVolume* carbonFiberLayerVol1 =
new TGeoVolume((separationLayerName +
"_CarbonFiber1").c_str(), carbonFiberLayer,
medCarbonFiber);
218 TGeoVolume* foamLayerVol =
new TGeoVolume((separationLayerName +
"_Foam").c_str(), foamLayer,
medFoam);
219 TGeoVolume* carbonFiberLayerVol2 =
new TGeoVolume((separationLayerName +
"_CarbonFiber2").c_str(), carbonFiberLayer,
medCarbonFiber);
221 carbonFiberLayerVol1->SetLineColor(kGray + 2);
222 foamLayerVol->SetLineColor(kBlack);
223 foamLayerVol->SetFillColorAlpha(kBlack, 1.0);
224 carbonFiberLayerVol2->SetLineColor(kGray + 2);
226 const double zSeparation = foamSpacingThickness / 2.0 + carbonFiberThickness / 2.0;
228 motherVolume->AddNode(carbonFiberLayerVol1, 1,
new TGeoTranslation(0, 0, 0 - zSeparation));
229 motherVolume->AddNode(foamLayerVol, 1,
new TGeoTranslation(0, 0, 0));
230 motherVolume->AddNode(carbonFiberLayerVol2, 1,
new TGeoTranslation(0, 0, 0 + zSeparation));
235 if (mLayerNumber < 0) {
236 LOG(fatal) <<
"Invalid layer number " << mLayerNumber <<
" for FT3 layer.";
238 if (mIsMiddleLayer) {
242 TGeoTube* sensor =
new TGeoTube(mInnerRadius, mOuterRadius, mChipThickness / 2);
243 TGeoTube* chip =
new TGeoTube(mInnerRadius, mOuterRadius, mChipThickness / 2);
244 TGeoTube*
layer =
new TGeoTube(mInnerRadius, mOuterRadius, mChipThickness / 2);
246 TGeoMedium* medSi = gGeoManager->GetMedium(
"FT3_SILICON$");
247 TGeoMedium* medAir = gGeoManager->GetMedium(
"FT3_AIR$");
249 TGeoVolume* sensVol =
new TGeoVolume(sensName.c_str(), sensor, medSi);
250 sensVol->SetLineColor(kYellow);
251 TGeoVolume* chipVol =
new TGeoVolume(chipName.c_str(), chip, medSi);
252 chipVol->SetLineColor(kYellow);
253 TGeoVolume* layerVol =
new TGeoVolume(mLayerName.c_str(),
layer, medAir);
254 layerVol->SetLineColor(kYellow);
256 LOG(info) <<
"Inserting " << sensVol->GetName() <<
" inside " << chipVol->GetName();
257 chipVol->AddNode(sensVol, 1,
nullptr);
259 LOG(info) <<
"Inserting " << chipVol->GetName() <<
" inside " << layerVol->GetName();
260 layerVol->AddNode(chipVol, 1,
nullptr);
263 auto* FwdDiskRotation =
new TGeoRotation(
"FwdDiskRotation", 0, 0, 180);
264 auto* FwdDiskCombiTrans =
new TGeoCombiTrans(0, 0, mZ, FwdDiskRotation);
266 LOG(info) <<
"Inserting " << layerVol->GetName() <<
" inside " << motherVolume->GetName();
267 motherVolume->AddNode(layerVol, 1, FwdDiskCombiTrans);
278 TGeoMedium* medAir = gGeoManager->GetMedium(
"FT3_AIR$");
279 TGeoTube*
layer =
new TGeoTube(mInnerRadius, mOuterRadius, 10 * mChipThickness / 2);
280 TGeoVolume* layerVol =
new TGeoVolume(mLayerName.c_str(),
layer, medAir);
281 layerVol->SetLineColor(kYellow + 2);
287 module.createModule(0, mLayerNumber, mDirection, mInnerRadius, mOuterRadius, 0., "front", "rectangular", layerVol);
288 module.createModule(0, mLayerNumber, mDirection, mInnerRadius, mOuterRadius, 0., "back", "rectangular", layerVol);
291 auto* FwdDiskRotation =
new TGeoRotation(
"FwdDiskRotation", 0, 0, 180);
292 auto* FwdDiskCombiTrans =
new TGeoCombiTrans(0, 0, mZ, FwdDiskRotation);
294 LOG(info) <<
"Inserting " << layerVol->GetName() <<
" inside " << motherVolume->GetName();
295 motherVolume->AddNode(layerVol, 1, FwdDiskCombiTrans);