Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions Detectors/Upgrades/ALICE3/IOTOF/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,18 @@ Configurables for various sub-detectors are presented in the following Table:

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

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



For example, a geometry with fully cylindrical tracker barrel (for all layers in VD, ML and OT) can be obtained by
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ struct IOTOFBaseParam : public o2::conf::ConfigurableParamHelper<IOTOFBaseParam>
std::string detectorPattern = ""; // Layouts of the detector
bool segmentedInnerTOF = false; // If the inner TOF layer is segmented
bool segmentedOuterTOF = false; // If the outer TOF layer is segmented
float x2x0 = 0.000527f; // thickness expressed in radiation length, for all layers for the moment
float x2x0 = 0.02f; // thickness expressed in radiation length, for all layers for the moment
float sensorThickness = 0.0050f; // thickness of the sensor in cm, for all layers for the moment, the default is set to 50 microns

O2ParamDef(IOTOFBaseParam, "IOTOFBase");
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class Detector : public o2::base::DetImpl<Detector>
return nullptr;
}

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);
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);

void configServices();
void createMaterials();
Expand Down Expand Up @@ -104,4 +104,4 @@ struct UseShm<o2::iotof::Detector> {
} // namespace base
} // namespace o2
#endif
#endif
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class Layer
public:
Layer() = default;
Layer(std::string layerName, float rInn, float rOut, float zLength, float zOffset, float layerX2X0,
int layout = kBarrel, int nStaves = 0, float staveSize = 0.0, double staveTiltAngle = 0.0, int modulesPerStave = 0);
int layout = kBarrel, int nStaves = 0, float staveSize = 0.0, double staveTiltAngle = 0.0, int modulesPerStave = 0, float sensorThickness = 0.0f);
~Layer() = default;

auto getInnerRadius() const { return mInnerRadius; }
Expand All @@ -52,8 +52,9 @@ class Layer
float mZLength;
float mZOffset{0.f}; // Of use when fwd layers
float mX2X0;
float mChipThickness;
int mLayout{kBarrel}; // Identifier of the type of layer layout (barrel, disk, barrel segmented, disk segmented)
float mChipThickness; // Thickness of the chip in cm, derived from mX2X0 and the radiation length of silicon
float mSensorThickness; // Thickness of the sensor in cm, to be subtracted from the chip thickness to get the total module thickness
int mLayout{kBarrel}; // Identifier of the type of layer layout (barrel, disk, barrel segmented, disk segmented)
// 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)
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
int mModulesPerStave{0}; // Number of modules along a stave
Expand Down Expand Up @@ -92,4 +93,4 @@ class BTOFLayer : public Layer

} // namespace iotof
} // namespace o2
#endif // ALICEO2_IOTOF_LAYER_H
#endif // ALICEO2_IOTOF_LAYER_H
6 changes: 3 additions & 3 deletions Detectors/Upgrades/ALICE3/IOTOF/simulation/src/Detector.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ void Detector::ConstructGeometry()
}

void Detector::configLayers(bool itof, bool otof, bool ftof, bool btof, std::string pattern, bool itofSegmented, bool otofSegmented,
const float x2x0)
const float x2x0, const float sensorThickness)
{

const std::pair<float, float> dInnerTof = {21.f, 129.f}; // Radius and length
Expand Down Expand Up @@ -102,7 +102,7 @@ void Detector::configLayers(bool itof, bool otof, bool ftof, bool btof, std::str
const int modulesPerStave = itofSegmented ? 10 : 0; // number of modules per stave in segmented case
mITOFLayer = ITOFLayer(name,
dInnerTof.first, 0.f, dInnerTof.second, 0.f, x2x0, itofSegmented ? ITOFLayer::kBarrelSegmented : ITOFLayer::kBarrel,
nStaves, staveWidth, staveTiltAngle, modulesPerStave);
nStaves, staveWidth, staveTiltAngle, modulesPerStave, itofSegmented ? sensorThickness : 0.0f);
}
if (otof) { // oTOF
const std::string name = GeometryTGeo::getOTOFLayerPattern();
Expand All @@ -112,7 +112,7 @@ void Detector::configLayers(bool itof, bool otof, bool ftof, bool btof, std::str
const int modulesPerStave = otofSegmented ? 54 : 0; // number of modules per stave in segmented case
mOTOFLayer = OTOFLayer(name,
dOuterTof.first, 0.f, dOuterTof.second, 0.f, x2x0, otofSegmented ? OTOFLayer::kBarrelSegmented : OTOFLayer::kBarrel,
nStaves, staveWidth, staveTiltAngle, modulesPerStave);
nStaves, staveWidth, staveTiltAngle, modulesPerStave, otofSegmented ? sensorThickness : 0.0f);
}
if (ftof) {
const std::string name = GeometryTGeo::getFTOFLayerPattern();
Expand Down
15 changes: 11 additions & 4 deletions Detectors/Upgrades/ALICE3/IOTOF/simulation/src/Layer.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,20 @@ namespace o2
namespace iotof
{
Layer::Layer(std::string layerName, float rInn, float rOut, float zLength, float zOffset, float layerX2X0,
int layout, int nStaves, float staveSize, double staveTiltAngle, int modulesPerStave)
int layout, int nStaves, float staveSize, double staveTiltAngle, int modulesPerStave, float sensorThickness)
: mLayerName(layerName),
mInnerRadius(rInn),
mOuterRadius(rOut),
mZLength(zLength),
mZOffset(zOffset),
mSensorThickness(sensorThickness),
mX2X0(layerX2X0),
mLayout(layout),
mStaves(nStaves, staveSize),
mModulesPerStave(modulesPerStave),
mTiltAngle(staveTiltAngle)
{
const float Si_X0 = 9.5f;
const float Si_X0 = 9.5f; // cm, radiation length of silicon
mChipThickness = mX2X0 * Si_X0;
std::string name = "";
switch (layout) {
Expand Down Expand Up @@ -76,6 +77,12 @@ Layer::Layer(std::string layerName, float rInn, float rOut, float zLength, float
if ((mTiltAngle < 0.0 || mTiltAngle > 90.0) && (layout == kBarrelSegmented || layout == kDiskSegmented)) {
LOG(fatal) << "Invalid configuration: tilt angle " << mTiltAngle << " is too large, it must be between 0 and 90 degrees";
}
if (mSensorThickness < 0.0f || mSensorThickness > mChipThickness) {
LOG(fatal) << "Invalid configuration: sensor thickness " << mSensorThickness << " cm is out of range (0, " << mChipThickness << ") cm";
}
if (sensorThickness > 0.0f && (layout == kBarrel || layout == kDisk)) {
LOG(fatal) << "Invalid configuration: sensor thickness " << mSensorThickness << " cm is set for non-segmented layout, it should be 0";
}

LOGP(info, "TOF: Creating {} layer: rInner: {} (cm) rOuter: {} (cm) zLength: {} (cm) zOffset: {} x2X0: {}", name.c_str(), mInnerRadius, mOuterRadius, mZLength, mZOffset, mX2X0);
}
Expand Down Expand Up @@ -193,7 +200,7 @@ void ITOFLayer::createLayer(TGeoVolume* motherVolume)
const int sensorsPerChipX = 2; // we assume that each chip is divided in 2 sensors along the x direction
const int sensorsPerChipZ = 2; // we assume that each chip is divided in 2 sensors along the z direction
const double sensorSizeX = chipSizeX / sensorsPerChipX; // cm
const double sensorSizeY = chipSizeY; // cm
const double sensorSizeY = mSensorThickness; // cm
const double sensorSizeZ = chipSizeZ / sensorsPerChipZ; // cm
TGeoBBox* sensor = new TGeoBBox(sensorSizeX * 0.5, sensorSizeY * 0.5, sensorSizeZ * 0.5);
TGeoVolume* sensVol = new TGeoVolume(sensName, sensor, medSi);
Expand Down Expand Up @@ -327,7 +334,7 @@ void OTOFLayer::createLayer(TGeoVolume* motherVolume)
const int sensorsPerChipX = 2; // we assume that each chip is divided in 2 sensors along the x direction
const int sensorsPerChipZ = 2; // we assume that each chip is divided in 2 sensors along the z direction
const double sensorSizeX = chipSizeX / sensorsPerChipX; // cm
const double sensorSizeY = chipSizeY; // cm
const double sensorSizeY = mSensorThickness; // cm
const double sensorSizeZ = chipSizeZ / sensorsPerChipZ; // cm
TGeoBBox* sensor = new TGeoBBox(sensorSizeX * 0.5, sensorSizeY * 0.5, sensorSizeZ * 0.5);
TGeoVolume* sensVol = new TGeoVolume(sensName, sensor, medSi);
Expand Down
Loading