Skip to content

Commit 74c8049

Browse files
authored
[ALICE3] IOTOF: allow reduced sensor thickness wihout reducing chip size (#15247)
* Enhance Layer class with sensor thickness handling Added sensor thickness parameter and validation checks. * Add sensor thickness to Layer class Added sensor thickness parameter to Layer constructor and updated member variables accordingly. * Modify configLayers to include sensorThickness Added sensorThickness parameter to configLayers function for ITOF and OTOF layers. * Update Detector.h * Modify thickness parameters in IOTOFBaseParam.h Updated the radiation length thickness and added sensor thickness parameter. * Revise options table in README for IOTOF Updated options table with new sensor thickness parameter and corrected default value for x2x0. * Simplify chip size calculation in Layer.cxx Removed sensor thickness adjustment for chip size calculation. * Update sensor size calculation in Layer.cxx
1 parent 4f64fb9 commit 74c8049

File tree

6 files changed

+35
-24
lines changed

6 files changed

+35
-24
lines changed

Detectors/Upgrades/ALICE3/IOTOF/README.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,18 @@ Configurables for various sub-detectors are presented in the following Table:
1414

1515
[link to definitions](./base/include/IOTOFBase/IOTOFBaseParam.h)
1616

17-
| Options | Choices | Comments |
18-
| ----------------------------- | ---------------------------------------------------------------- | ---------------------------------------------- |
19-
| `IOTOFBase.enableInnerTOF` | `true` (default), `false` | Enable inner TOF barrel layer |
20-
| `IOTOFBase.enableOuterTOF` | `true` (default), `false` | Enable outer TOF barrel layer |
21-
| `IOTOFBase.enableForwardTOF` | `true` (default), `false` | Enable forward TOF endcap |
22-
| `IOTOFBase.enableBackwardTOF` | `true` (default), `false` | Enable backward TOF endcap |
23-
| `IOTOFBase.segmentedInnerTOF` | `false` (default), `true` | Use segmented geometry for inner TOF |
24-
| `IOTOFBase.segmentedOuterTOF` | `false` (default), `true` | Use segmented geometry for outer TOF |
25-
| `IOTOFBase.detectorPattern` | ` ` (default), `v3b`, `v3b1a`, `v3b1b`, `v3b2a`, `v3b2b`, `v3b3` | Optional layout pattern |
26-
| `IOTOFBase.x2x0` | `0.000527` (default) | Chip thickness in fractions of the rad. lenght |
17+
| Options | Choices | Comments |
18+
| ----------------------------- | ---------------------------------------------------------------- | -------------------------------------------------------------------------- |
19+
| `IOTOFBase.enableInnerTOF` | `true` (default), `false` | Enable inner TOF barrel layer |
20+
| `IOTOFBase.enableOuterTOF` | `true` (default), `false` | Enable outer TOF barrel layer |
21+
| `IOTOFBase.enableForwardTOF` | `true` (default), `false` | Enable forward TOF endcap |
22+
| `IOTOFBase.enableBackwardTOF` | `true` (default), `false` | Enable backward TOF endcap |
23+
| `IOTOFBase.segmentedInnerTOF` | `false` (default), `true` | Use segmented geometry for inner TOF |
24+
| `IOTOFBase.segmentedOuterTOF` | `false` (default), `true` | Use segmented geometry for outer TOF |
25+
| `IOTOFBase.detectorPattern` | ` ` (default), `v3b`, `v3b1a`, `v3b1b`, `v3b2a`, `v3b2b`, `v3b3` | Optional layout pattern |
26+
| `IOTOFBase.x2x0` | `0.02` (default) | Chip thickness in fractions of the rad. lenght |
27+
| `IOTOFBase.sensorThickness` | `0.0050` (default) | Sensor thickness in cm, can be at maximum equivalent to the chip thickness |
28+
2729

2830

2931
For example, a geometry with fully cylindrical tracker barrel (for all layers in VD, ML and OT) can be obtained by

Detectors/Upgrades/ALICE3/IOTOF/base/include/IOTOFBase/IOTOFBaseParam.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ struct IOTOFBaseParam : public o2::conf::ConfigurableParamHelper<IOTOFBaseParam>
2828
std::string detectorPattern = ""; // Layouts of the detector
2929
bool segmentedInnerTOF = false; // If the inner TOF layer is segmented
3030
bool segmentedOuterTOF = false; // If the outer TOF layer is segmented
31-
float x2x0 = 0.000527f; // thickness expressed in radiation length, for all layers for the moment
31+
float x2x0 = 0.02f; // thickness expressed in radiation length, for all layers for the moment
32+
float sensorThickness = 0.0050f; // thickness of the sensor in cm, for all layers for the moment, the default is set to 50 microns
3233

3334
O2ParamDef(IOTOFBaseParam, "IOTOFBase");
3435
};

Detectors/Upgrades/ALICE3/IOTOF/simulation/include/IOTOFSimulation/Detector.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class Detector : public o2::base::DetImpl<Detector>
6060
return nullptr;
6161
}
6262

63-
void configLayers(bool itof = true, bool otof = true, bool ftof = true, bool btof = true, std::string pattern = "", bool itofSegmented = false, bool otofSegmented = false, const float x2x0 = 0.02f);
63+
void configLayers(bool itof = true, bool otof = true, bool ftof = true, bool btof = true, std::string pattern = "", bool itofSegmented = false, bool otofSegmented = false, const float x2x0 = 0.02f, const float sensorThickness = 0.0050f);
6464

6565
void configServices();
6666
void createMaterials();
@@ -104,4 +104,4 @@ struct UseShm<o2::iotof::Detector> {
104104
} // namespace base
105105
} // namespace o2
106106
#endif
107-
#endif
107+
#endif

Detectors/Upgrades/ALICE3/IOTOF/simulation/include/IOTOFSimulation/Layer.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class Layer
2626
public:
2727
Layer() = default;
2828
Layer(std::string layerName, float rInn, float rOut, float zLength, float zOffset, float layerX2X0,
29-
int layout = kBarrel, int nStaves = 0, float staveSize = 0.0, double staveTiltAngle = 0.0, int modulesPerStave = 0);
29+
int layout = kBarrel, int nStaves = 0, float staveSize = 0.0, double staveTiltAngle = 0.0, int modulesPerStave = 0, float sensorThickness = 0.0f);
3030
~Layer() = default;
3131

3232
auto getInnerRadius() const { return mInnerRadius; }
@@ -52,8 +52,9 @@ class Layer
5252
float mZLength;
5353
float mZOffset{0.f}; // Of use when fwd layers
5454
float mX2X0;
55-
float mChipThickness;
56-
int mLayout{kBarrel}; // Identifier of the type of layer layout (barrel, disk, barrel segmented, disk segmented)
55+
float mChipThickness; // Thickness of the chip in cm, derived from mX2X0 and the radiation length of silicon
56+
float mSensorThickness; // Thickness of the sensor in cm, to be subtracted from the chip thickness to get the total module thickness
57+
int mLayout{kBarrel}; // Identifier of the type of layer layout (barrel, disk, barrel segmented, disk segmented)
5758
// To be used only in case of the segmented layout, to define the number of staves in phi (for barrel) or in r (for disk)
5859
std::pair<int, float> mStaves{0, 0.0f}; // Number and size of staves in phi (for barrel) or in r (for disk) in case of segmented layout
5960
int mModulesPerStave{0}; // Number of modules along a stave
@@ -92,4 +93,4 @@ class BTOFLayer : public Layer
9293

9394
} // namespace iotof
9495
} // namespace o2
95-
#endif // ALICEO2_IOTOF_LAYER_H
96+
#endif // ALICEO2_IOTOF_LAYER_H

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void Detector::ConstructGeometry()
5858
}
5959

6060
void Detector::configLayers(bool itof, bool otof, bool ftof, bool btof, std::string pattern, bool itofSegmented, bool otofSegmented,
61-
const float x2x0)
61+
const float x2x0, const float sensorThickness)
6262
{
6363

6464
const std::pair<float, float> dInnerTof = {21.f, 129.f}; // Radius and length
@@ -102,7 +102,7 @@ void Detector::configLayers(bool itof, bool otof, bool ftof, bool btof, std::str
102102
const int modulesPerStave = itofSegmented ? 10 : 0; // number of modules per stave in segmented case
103103
mITOFLayer = ITOFLayer(name,
104104
dInnerTof.first, 0.f, dInnerTof.second, 0.f, x2x0, itofSegmented ? ITOFLayer::kBarrelSegmented : ITOFLayer::kBarrel,
105-
nStaves, staveWidth, staveTiltAngle, modulesPerStave);
105+
nStaves, staveWidth, staveTiltAngle, modulesPerStave, itofSegmented ? sensorThickness : 0.0f);
106106
}
107107
if (otof) { // oTOF
108108
const std::string name = GeometryTGeo::getOTOFLayerPattern();
@@ -112,7 +112,7 @@ void Detector::configLayers(bool itof, bool otof, bool ftof, bool btof, std::str
112112
const int modulesPerStave = otofSegmented ? 54 : 0; // number of modules per stave in segmented case
113113
mOTOFLayer = OTOFLayer(name,
114114
dOuterTof.first, 0.f, dOuterTof.second, 0.f, x2x0, otofSegmented ? OTOFLayer::kBarrelSegmented : OTOFLayer::kBarrel,
115-
nStaves, staveWidth, staveTiltAngle, modulesPerStave);
115+
nStaves, staveWidth, staveTiltAngle, modulesPerStave, otofSegmented ? sensorThickness : 0.0f);
116116
}
117117
if (ftof) {
118118
const std::string name = GeometryTGeo::getFTOFLayerPattern();

Detectors/Upgrades/ALICE3/IOTOF/simulation/src/Layer.cxx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,20 @@ namespace o2
2828
namespace iotof
2929
{
3030
Layer::Layer(std::string layerName, float rInn, float rOut, float zLength, float zOffset, float layerX2X0,
31-
int layout, int nStaves, float staveSize, double staveTiltAngle, int modulesPerStave)
31+
int layout, int nStaves, float staveSize, double staveTiltAngle, int modulesPerStave, float sensorThickness)
3232
: mLayerName(layerName),
3333
mInnerRadius(rInn),
3434
mOuterRadius(rOut),
3535
mZLength(zLength),
3636
mZOffset(zOffset),
37+
mSensorThickness(sensorThickness),
3738
mX2X0(layerX2X0),
3839
mLayout(layout),
3940
mStaves(nStaves, staveSize),
4041
mModulesPerStave(modulesPerStave),
4142
mTiltAngle(staveTiltAngle)
4243
{
43-
const float Si_X0 = 9.5f;
44+
const float Si_X0 = 9.5f; // cm, radiation length of silicon
4445
mChipThickness = mX2X0 * Si_X0;
4546
std::string name = "";
4647
switch (layout) {
@@ -76,6 +77,12 @@ Layer::Layer(std::string layerName, float rInn, float rOut, float zLength, float
7677
if ((mTiltAngle < 0.0 || mTiltAngle > 90.0) && (layout == kBarrelSegmented || layout == kDiskSegmented)) {
7778
LOG(fatal) << "Invalid configuration: tilt angle " << mTiltAngle << " is too large, it must be between 0 and 90 degrees";
7879
}
80+
if (mSensorThickness < 0.0f || mSensorThickness > mChipThickness) {
81+
LOG(fatal) << "Invalid configuration: sensor thickness " << mSensorThickness << " cm is out of range (0, " << mChipThickness << ") cm";
82+
}
83+
if (sensorThickness > 0.0f && (layout == kBarrel || layout == kDisk)) {
84+
LOG(fatal) << "Invalid configuration: sensor thickness " << mSensorThickness << " cm is set for non-segmented layout, it should be 0";
85+
}
7986

8087
LOGP(info, "TOF: Creating {} layer: rInner: {} (cm) rOuter: {} (cm) zLength: {} (cm) zOffset: {} x2X0: {}", name.c_str(), mInnerRadius, mOuterRadius, mZLength, mZOffset, mX2X0);
8188
}
@@ -193,7 +200,7 @@ void ITOFLayer::createLayer(TGeoVolume* motherVolume)
193200
const int sensorsPerChipX = 2; // we assume that each chip is divided in 2 sensors along the x direction
194201
const int sensorsPerChipZ = 2; // we assume that each chip is divided in 2 sensors along the z direction
195202
const double sensorSizeX = chipSizeX / sensorsPerChipX; // cm
196-
const double sensorSizeY = chipSizeY; // cm
203+
const double sensorSizeY = mSensorThickness; // cm
197204
const double sensorSizeZ = chipSizeZ / sensorsPerChipZ; // cm
198205
TGeoBBox* sensor = new TGeoBBox(sensorSizeX * 0.5, sensorSizeY * 0.5, sensorSizeZ * 0.5);
199206
TGeoVolume* sensVol = new TGeoVolume(sensName, sensor, medSi);
@@ -327,7 +334,7 @@ void OTOFLayer::createLayer(TGeoVolume* motherVolume)
327334
const int sensorsPerChipX = 2; // we assume that each chip is divided in 2 sensors along the x direction
328335
const int sensorsPerChipZ = 2; // we assume that each chip is divided in 2 sensors along the z direction
329336
const double sensorSizeX = chipSizeX / sensorsPerChipX; // cm
330-
const double sensorSizeY = chipSizeY; // cm
337+
const double sensorSizeY = mSensorThickness; // cm
331338
const double sensorSizeZ = chipSizeZ / sensorsPerChipZ; // cm
332339
TGeoBBox* sensor = new TGeoBBox(sensorSizeX * 0.5, sensorSizeY * 0.5, sensorSizeZ * 0.5);
333340
TGeoVolume* sensVol = new TGeoVolume(sensName, sensor, medSi);

0 commit comments

Comments
 (0)