Skip to content

Commit 035030b

Browse files
Rita SadekRita Sadek
authored andcommitted
[FT3] Modular structure for OT disks - first version of modules structure with dynamic disks paving for ALICE 3 sensors and initial material estimations
1 parent 72e6d01 commit 035030b

File tree

6 files changed

+959
-8
lines changed

6 files changed

+959
-8
lines changed

Detectors/Upgrades/ALICE3/FT3/simulation/CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,18 @@
1010
# or submit itself to any jurisdiction.
1111

1212
o2_add_library(FT3Simulation
13-
SOURCES src/FT3Layer.cxx
13+
SOURCES
14+
src/FT3Module.cxx
15+
src/FT3Layer.cxx
1416
src/Detector.cxx
1517
PUBLIC_LINK_LIBRARIES O2::FT3Base
1618
O2::ITSMFTSimulation
1719
ROOT::Physics)
1820

1921
o2_target_root_dictionary(FT3Simulation
20-
HEADERS include/FT3Simulation/Detector.h
22+
HEADERS
23+
include/FT3Simulation/FT3Module.h
24+
include/FT3Simulation/Detector.h
2125
include/FT3Simulation/FT3Layer.h)
2226

2327
o2_data_file(COPY data DESTINATION Detectors/FT3/simulation)

Detectors/Upgrades/ALICE3/FT3/simulation/include/FT3Simulation/FT3Layer.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,24 @@ class FT3Layer : public TObject
5757
/// \param motherVolume the TGeoVolume owing the volume structure
5858
virtual void createLayer(TGeoVolume* motherVolume);
5959

60+
static void initialize_mat();
61+
62+
// create layer for disk support
63+
void createSeparationLayer(TGeoVolume* motherVolume, const std::string& separationLayerName);
64+
void createSeparationLayer_waterCooling(TGeoVolume* motherVolume, const std::string& separationLayerName);
65+
66+
static TGeoMaterial* carbonFiberMat;
67+
static TGeoMedium* medCarbonFiber;
68+
69+
static TGeoMaterial* kaptonMat;
70+
static TGeoMedium* kaptonMed;
71+
72+
static TGeoMaterial* waterMat;
73+
static TGeoMedium* waterMed;
74+
75+
static TGeoMaterial* foamMat;
76+
static TGeoMedium* medFoam;
77+
6078
private:
6179
Int_t mLayerNumber = -1; ///< Current layer number
6280
Int_t mDirection; ///< Layer direction 0=Forward 1 = Backward
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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+
12+
/// \file FT3Module.h
13+
/// \brief Definition of the FT3Module class
14+
15+
#ifndef FT3MODULE_H
16+
#define FT3MODULE_H
17+
18+
#include <TGeoVolume.h>
19+
#include <string>
20+
21+
class FT3Module
22+
{
23+
24+
public:
25+
static void initialize_materials();
26+
static TGeoMaterial* siliconMat;
27+
static TGeoMedium* siliconMed;
28+
static TGeoMaterial* copperMat;
29+
static TGeoMedium* copperMed;
30+
static TGeoMaterial* kaptonMat;
31+
static TGeoMedium* kaptonMed;
32+
static TGeoMaterial* epoxyMat;
33+
static TGeoMedium* epoxyMed;
34+
static TGeoMaterial* AluminumMat;
35+
static TGeoMedium* AluminumMed;
36+
37+
const char* mDetName;
38+
39+
static void createModule(double mZ, int layerNumber, int direction, double Rin, double Rout, double overlap, const std::string& face, const std::string& layout_type, TGeoVolume* motherVolume);
40+
41+
private:
42+
static void create_layout(double mZ, int layerNumber, int direction, double Rin, double Rout, double overlap, const std::string& face, const std::string& layout_type, TGeoVolume* motherVolume);
43+
};
44+
45+
#endif // FT3MODULE_H

Detectors/Upgrades/ALICE3/FT3/simulation/src/Detector.cxx

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040

4141
#include <cstdio> // for NULL, snprintf
4242

43+
#define MAX_SENSORS 2000
44+
4345
class FairModule;
4446

4547
class TGeoMedium;
@@ -729,9 +731,23 @@ void Detector::defineSensitiveVolumes()
729731
for (int direction : {0, 1}) {
730732
for (int iLayer = 0; iLayer < mNumberOfLayers; iLayer++) {
731733
volumeName = o2::ft3::GeometryTGeo::getFT3SensorPattern() + std::to_string(iLayer);
732-
v = geoManager->GetVolume(Form("%s_%d_%d", GeometryTGeo::getFT3SensorPattern(), direction, iLayer));
733-
LOG(info) << "Adding FT3 Sensitive Volume => " << v->GetName();
734-
AddSensitiveVolume(v);
734+
if (iLayer < 3) { // ML disks
735+
v = geoManager->GetVolume(Form("%s_%d_%d", GeometryTGeo::getFT3SensorPattern(), direction, iLayer));
736+
AddSensitiveVolume(v);
737+
} else { // OT disks
738+
for (int sensor_count = 0; sensor_count < MAX_SENSORS; ++sensor_count) {
739+
std::string sensor_name_front = "FT3sensor_front_" + std::to_string(iLayer) + "_" + std::to_string(direction) + "_" + std::to_string(sensor_count);
740+
std::string sensor_name_back = "FT3sensor_back_" + std::to_string(iLayer) + "_" + std::to_string(direction) + "_" + std::to_string(sensor_count);
741+
v = geoManager->GetVolume(sensor_name_front.c_str());
742+
if (v) {
743+
AddSensitiveVolume(v);
744+
}
745+
v = geoManager->GetVolume(sensor_name_back.c_str());
746+
if (v) {
747+
AddSensitiveVolume(v);
748+
}
749+
}
750+
}
735751
}
736752
}
737753
}

Detectors/Upgrades/ALICE3/FT3/simulation/src/FT3Layer.cxx

Lines changed: 173 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#include "TMathBase.h" // for Abs
2929
#include <TMath.h> // for Sin, RadToDeg, DegToRad, Cos, Tan, etc
3030

31+
#include <TGeoBBox.h>
32+
#include <string>
3133
#include <cstdio> // for snprintf
3234

3335
class TGeoMedium;
@@ -40,6 +42,18 @@ ClassImp(FT3Layer);
4042

4143
FT3Layer::~FT3Layer() = default;
4244

45+
TGeoMaterial* FT3Layer::carbonFiberMat = nullptr;
46+
TGeoMedium* FT3Layer::medCarbonFiber = nullptr;
47+
48+
TGeoMaterial* FT3Layer::kaptonMat = nullptr;
49+
TGeoMedium* FT3Layer::kaptonMed = nullptr;
50+
51+
TGeoMaterial* FT3Layer::waterMat = nullptr;
52+
TGeoMedium* FT3Layer::waterMed = nullptr;
53+
54+
TGeoMaterial* FT3Layer::foamMat = nullptr;
55+
TGeoMedium* FT3Layer::medFoam = nullptr;
56+
4357
FT3Layer::FT3Layer(Int_t layerDirection, Int_t layerNumber, std::string layerName, Float_t z, Float_t rIn, Float_t rOut, Float_t Layerx2X0)
4458
{
4559
// Creates a simple parametrized EndCap layer covering the given
@@ -59,10 +73,151 @@ FT3Layer::FT3Layer(Int_t layerDirection, Int_t layerNumber, std::string layerNam
5973
LOG(info) << " Layer z = " << mZ << " ; R_in = " << mInnerRadius << " ; R_out = " << mOuterRadius << " ; x2X0 = " << mx2X0 << " ; ChipThickness = " << mChipThickness;
6074
}
6175

76+
void FT3Layer::initialize_mat()
77+
{
78+
79+
if (carbonFiberMat)
80+
return;
81+
82+
carbonFiberMat = new TGeoMaterial("CarbonFiber", 12.0, 6.0, 1.6);
83+
medCarbonFiber = new TGeoMedium("CarbonFiber", 1, carbonFiberMat);
84+
85+
auto* itsC = new TGeoElement("FT3_C", "Carbon", 6, 12.0107);
86+
87+
auto* itsFoam = new TGeoMixture("FT3_Foam", 1);
88+
itsFoam->AddElement(itsC, 1);
89+
itsFoam->SetDensity(0.17);
90+
91+
medFoam = new TGeoMedium("FT3_Foam", 1, itsFoam);
92+
foamMat = medFoam->GetMaterial();
93+
94+
kaptonMat = new TGeoMaterial("Kapton (cooling pipe)", 13.84, 6.88, 1.346);
95+
kaptonMed = new TGeoMedium("Kapton (cooling pipe)", 1, kaptonMat);
96+
97+
waterMat = new TGeoMaterial("Water", 18.01528, 8.0, 1.064);
98+
waterMed = new TGeoMedium("Water", 2, waterMat);
99+
}
100+
101+
void FT3Layer::createSeparationLayer_waterCooling(TGeoVolume* motherVolume, const std::string& separationLayerName)
102+
{
103+
104+
FT3Layer::initialize_mat();
105+
106+
double carbonFiberThickness = 0.01;
107+
double foamSpacingThickness = 0.5;
108+
109+
TGeoTube* carbonFiberLayer = new TGeoTube(mInnerRadius, mOuterRadius, carbonFiberThickness / 2);
110+
111+
// volumes
112+
TGeoVolume* carbonFiberLayerVol1 = new TGeoVolume((separationLayerName + "_CarbonFiber1").c_str(), carbonFiberLayer, medCarbonFiber);
113+
TGeoVolume* carbonFiberLayerVol2 = new TGeoVolume((separationLayerName + "_CarbonFiber2").c_str(), carbonFiberLayer, medCarbonFiber);
114+
115+
carbonFiberLayerVol1->SetLineColor(kGray + 2);
116+
carbonFiberLayerVol2->SetLineColor(kGray + 2);
117+
118+
double zSeparation = foamSpacingThickness / 2.0 + carbonFiberThickness / 2.0;
119+
120+
motherVolume->AddNode(carbonFiberLayerVol1, 1, new TGeoTranslation(0, 0, mZ - zSeparation));
121+
motherVolume->AddNode(carbonFiberLayerVol2, 1, new TGeoTranslation(0, 0, mZ + zSeparation));
122+
123+
double pipeOuterRadius = 0.20;
124+
double kaptonThickness = 0.0025;
125+
double pipeInnerRadius = pipeOuterRadius - kaptonThickness;
126+
double pipeMaxLength = mOuterRadius * 2.0;
127+
128+
int name_it = 0;
129+
130+
// positions of the pipes depending on the overlap of the sensors inactive regions: (ALICE 3 dimensions)
131+
// partial:
132+
// 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};
133+
// complete:
134+
// 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};
135+
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};
136+
137+
for (double xPos : X_pos) {
138+
139+
double pipeLength = pipeMaxLength;
140+
double yMax = 0.0;
141+
142+
TGeoRotation* rotation = new TGeoRotation();
143+
rotation->RotateX(90);
144+
145+
if (std::abs(xPos) < mInnerRadius) {
146+
double yInner = std::abs(y_circle(xPos, mInnerRadius));
147+
double yOuter = std::abs(y_circle(xPos, mOuterRadius));
148+
149+
yMax = 2 * yOuter;
150+
pipeLength = yMax;
151+
152+
double positiveYLength = yOuter - yInner;
153+
154+
TGeoVolume* kaptonPipePos = new TGeoVolume((separationLayerName + "_KaptonPipePos_" + std::to_string(name_it)).c_str(), new TGeoTube(pipeInnerRadius, pipeOuterRadius, positiveYLength / 2), kaptonMed);
155+
kaptonPipePos->SetLineColor(kGray);
156+
TGeoVolume* waterVolumePos = new TGeoVolume((separationLayerName + "_WaterVolumePos_" + std::to_string(name_it)).c_str(), new TGeoTube(0.0, pipeInnerRadius, positiveYLength / 2), waterMed);
157+
waterVolumePos->SetLineColor(kBlue);
158+
159+
motherVolume->AddNode(waterVolumePos, 1, new TGeoCombiTrans(xPos, (yInner + yOuter) / 2.0, mZ, rotation));
160+
161+
TGeoVolume* kaptonPipeNeg = new TGeoVolume((separationLayerName + "_KaptonPipeNeg_" + std::to_string(name_it)).c_str(), new TGeoTube(pipeInnerRadius, pipeOuterRadius, positiveYLength / 2), kaptonMed);
162+
kaptonPipeNeg->SetLineColor(kGray);
163+
TGeoVolume* waterVolumeNeg = new TGeoVolume((separationLayerName + "_WaterVolumeNeg_" + std::to_string(name_it)).c_str(), new TGeoTube(0.0, pipeInnerRadius, positiveYLength / 2), waterMed);
164+
waterVolumeNeg->SetLineColor(kBlue);
165+
166+
motherVolume->AddNode(waterVolumeNeg, 1, new TGeoCombiTrans(xPos, -(yInner + yOuter) / 2.0, mZ, rotation));
167+
168+
motherVolume->AddNode(kaptonPipePos, 1, new TGeoCombiTrans(xPos, (yInner + yOuter) / 2.0, mZ, rotation));
169+
motherVolume->AddNode(kaptonPipeNeg, 1, new TGeoCombiTrans(xPos, -(yInner + yOuter) / 2.0, mZ, rotation));
170+
171+
} else {
172+
173+
double yOuter = std::abs(y_circle(xPos, mOuterRadius));
174+
yMax = 2 * yOuter;
175+
pipeLength = yMax;
176+
177+
TGeoVolume* kaptonPipe = new TGeoVolume((separationLayerName + "_KaptonPipe_" + std::to_string(name_it)).c_str(), new TGeoTube(pipeInnerRadius, pipeOuterRadius, pipeLength / 2), kaptonMed);
178+
kaptonPipe->SetLineColor(kGray);
179+
TGeoVolume* waterVolume = new TGeoVolume((separationLayerName + "_WaterVolume_" + std::to_string(name_it)).c_str(), new TGeoTube(0.0, pipeInnerRadius, pipeLength / 2), waterMed);
180+
waterVolume->SetLineColor(kBlue);
181+
182+
motherVolume->AddNode(waterVolume, 1, new TGeoCombiTrans(xPos, 0, mZ, rotation));
183+
motherVolume->AddNode(kaptonPipe, 1, new TGeoCombiTrans(xPos, 0, mZ, rotation));
184+
}
185+
186+
name_it++;
187+
}
188+
}
189+
190+
void FT3Layer::createSeparationLayer(TGeoVolume* motherVolume, const std::string& separationLayerName)
191+
{
192+
193+
FT3Layer::initialize_mat();
194+
195+
double carbonFiberThickness = 0.01;
196+
double foamSpacingThickness = 1.0;
197+
198+
TGeoTube* carbonFiberLayer = new TGeoTube(mInnerRadius, mOuterRadius, carbonFiberThickness / 2);
199+
TGeoTube* foamLayer = new TGeoTube(mInnerRadius, mOuterRadius, foamSpacingThickness / 2);
200+
201+
// volumes
202+
TGeoVolume* carbonFiberLayerVol1 = new TGeoVolume((separationLayerName + "_CarbonFiber1").c_str(), carbonFiberLayer, medCarbonFiber);
203+
TGeoVolume* foamLayerVol = new TGeoVolume((separationLayerName + "_Foam").c_str(), foamLayer, medFoam);
204+
TGeoVolume* carbonFiberLayerVol2 = new TGeoVolume((separationLayerName + "_CarbonFiber2").c_str(), carbonFiberLayer, medCarbonFiber);
205+
206+
carbonFiberLayerVol1->SetLineColor(kGray + 2);
207+
foamLayerVol->SetLineColor(kBlack);
208+
foamLayerVol->SetFillColorAlpha(kBlack, 1.0);
209+
carbonFiberLayerVol2->SetLineColor(kGray + 2);
210+
211+
double zSeparation = foamSpacingThickness / 2.0 + carbonFiberThickness / 2.0;
212+
213+
motherVolume->AddNode(carbonFiberLayerVol1, 1, new TGeoTranslation(0, 0, mZ - zSeparation));
214+
motherVolume->AddNode(foamLayerVol, 1, new TGeoTranslation(0, 0, mZ));
215+
motherVolume->AddNode(carbonFiberLayerVol2, 1, new TGeoTranslation(0, 0, mZ + zSeparation));
216+
}
217+
62218
void FT3Layer::createLayer(TGeoVolume* motherVolume)
63219
{
64-
if (mLayerNumber >= 0) {
65-
// Create tube, set sensitive volume, add to mother volume
220+
if (mLayerNumber >= 0 && mLayerNumber < 3) {
66221

67222
std::string chipName = o2::ft3::GeometryTGeo::getFT3ChipPattern() + std::to_string(mLayerNumber),
68223
sensName = Form("%s_%d_%d", GeometryTGeo::getFT3SensorPattern(), mDirection, mLayerNumber);
@@ -93,6 +248,21 @@ void FT3Layer::createLayer(TGeoVolume* motherVolume)
93248
LOG(info) << "Inserting " << layerVol->GetName() << " inside " << motherVolume->GetName();
94249
motherVolume->AddNode(layerVol, 1, FwdDiskCombiTrans);
95250

96-
return;
251+
} else if (mLayerNumber >= 3) {
252+
253+
FT3Module module;
254+
std::string frontLayerName = "FT3Layer" + std::to_string(mLayerNumber) + "_Front";
255+
std::string backLayerName = "FT3Layer" + std::to_string(mLayerNumber) + "_Back";
256+
std::string separationLayerName = "SeparationLayer" + std::to_string(mLayerNumber);
257+
258+
TGeoVolume* separationLayerVol = new TGeoVolume(separationLayerName.c_str(), new TGeoTube(mInnerRadius, mOuterRadius, 2.5), gGeoManager->GetMedium("FT3_AIR$"));
259+
separationLayerVol->SetLineColor(kGray);
260+
261+
// create disk faces
262+
module.createModule(mZ, mInnerRadius, mOuterRadius, 0., "front", "rectangular", motherVolume);
263+
module.createModule(mZ, mInnerRadius, mOuterRadius, 0., "back", "rectangular", motherVolume);
264+
265+
// createSeparationLayer_waterCooling(motherVolume, separationLayerName);
266+
createSeparationLayer(motherVolume, separationLayerName);
97267
}
98268
}

0 commit comments

Comments
 (0)