Skip to content

Commit c6f8660

Browse files
authored
Update ALICE3 tracker segmentation + chip indexing scheme (#14776)
1 parent 564803b commit c6f8660

File tree

12 files changed

+872
-222
lines changed

12 files changed

+872
-222
lines changed

Detectors/Upgrades/ALICE3/TRK/base/include/TRKBase/GeometryTGeo.h

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,13 @@ class GeometryTGeo : public o2::detectors::DetMatrixCache
4848
static const char* getTRKPetalDiskPattern() { return sPetalDiskName.c_str(); }
4949
static const char* getTRKPetalLayerPattern() { return sPetalLayerName.c_str(); }
5050
static const char* getTRKStavePattern() { return sStaveName.c_str(); }
51+
static const char* getTRKHalfStavePattern() { return sHalfStaveName.c_str(); }
52+
static const char* getTRKModulePattern() { return sModuleName.c_str(); }
5153
static const char* getTRKChipPattern() { return sChipName.c_str(); }
5254
static const char* getTRKSensorPattern() { return sSensorName.c_str(); }
55+
static const char* getTRKDeadzonePattern() { return sDeadzoneName.c_str(); }
56+
static const char* getTRKMetalStackPattern() { return sMetalStackName.c_str(); }
57+
5358
static const char* getTRKWrapVolPattern() { return sWrapperVolumeName.c_str(); }
5459

5560
int getNumberOfChips() const { return mSize; }
@@ -63,6 +68,8 @@ class GeometryTGeo : public o2::detectors::DetMatrixCache
6368
int extractNumberOfChipsPerPetalVD() const;
6469
int extractNumberOfStavesMLOT(int lay) const;
6570
int extractNumberOfHalfStavesMLOT(int lay) const;
71+
int extractNumberOfModulesMLOT(int lay) const;
72+
int extractNumberOfChipsMLOT(int lay) const;
6673

6774
/// Extract number following the prefix in the name string
6875
int extractVolumeCopy(const char* name, const char* prefix) const;
@@ -75,44 +82,52 @@ class GeometryTGeo : public o2::detectors::DetMatrixCache
7582
void setOwner(bool v) { mOwner = v; }
7683

7784
void Print(Option_t* opt = "") const;
78-
void PrintChipID(int index, int subDetID, int petalcase, int disk, int lay, int stave, int halfstave) const;
85+
void PrintChipID(int index, int subDetID, int petalcase, int disk, int lay, int stave, int halfstave, int mod, int chip) const;
7986

80-
int getLayer(int index) const;
81-
int getStave(int index) const;
82-
int getHalfStave(int index) const;
8387
int getSubDetID(int index) const;
8488
int getPetalCase(int index) const;
8589
int getDisk(int index) const;
90+
int getLayer(int index) const;
91+
int getStave(int index) const;
92+
int getHalfStave(int index) const;
93+
int getModule(int index) const;
94+
int getChip(int index) const;
8695

87-
/// This routine computes the chip index number from the subDetID, petal, disk, layer, stave /// TODO: retrieve also from chip when chips will be available
96+
/// This routine computes the chip index number from the subDetID, petal, disk, layer, stave, half stave, module, chip
8897
/// \param int subDetID The subdetector ID, 0 for VD, 1 for MLOT
8998
/// \param int petalcase The petal case number for VD, from 0 to 3
9099
/// \param int disk The disk number for VD, from 0 to 5
91100
/// \param int lay The layer number. Starting from 0 both for VD and MLOT
92101
/// \param int stave The stave number for MLOT. Starting from 0
93102
/// \param int halfstave The half stave number for MLOT. Can be 0 or 1
94-
int getChipIndex(int subDetID, int petalcase, int disk, int lay, int stave, int halfstave) const;
103+
/// \param int module The module number for MLOT, from 0 to 10 (or 20)
104+
/// \param int chip The chip number for MLOT, from 0 to 8
105+
unsigned short getChipIndex(int subDetID, int petalcase, int disk, int lay, int stave, int halfstave, int mod, int chip) const;
95106

96-
/// This routine computes the chip index number from the subDetID, volume, layer, stave /// TODO: retrieve also from chip when chips will be available
107+
/// This routine computes the chip index number from the subDetID, volume, layer, stave, half stave, module, chip
97108
/// \param int subDetID The subdetector ID, 0 for VD, 1 for MLOT
98109
/// \param int volume is needed only with the current configuration for VD where each single element is a volume. // TODO: when the geometry naming scheme will be changed, change this method
99110
/// \param int lay The layer number for the MLOT. In the current configuration for VD this is not needed. // TODO: when the geometry naming scheme will be changed, change this method
100111
/// \param int stave The stave number in each layer for MLOT. Starting from 0.
101112
/// \param int halfstave The half stave number for MLOT. Can be 0 or 1
102-
int getChipIndex(int subDetID, int volume, int lay, int stave, int halfstave) const;
113+
/// \param int module The module number for MLOT, from 0 to 10 (or 20)
114+
/// \param int chip The chip number for MLOT, from 0 to 8
115+
unsigned short getChipIndex(int subDetID, int volume, int lay, int stave, int halfstave, int mod, int chip) const;
103116

104-
/// This routine computes subDetID, petal, disk, layer, stave given the chip index number /// TODO: copute also from chip when chips will be available
117+
/// This routine computes subDetID, petal, disk, layer, stave, half stave, module, chip, given the chip index number
105118
/// \param int index The chip index number, starting from 0
106119
/// \param int subDetID The subdetector ID, 0 for VD, 1 for MLOT
107120
/// \param int petalcase The petal case number for VD, from 0 to 3
108121
/// \param int disk The disk number for VD, from 0 to 5
109122
/// \param int lay The layer number. Starting from 0 both for VD and MLOT
110123
/// \param int stave The stave number for MLOT. Starting from 0
111124
/// \param int halfstave The half stave number for MLOT. Can be 0 or 1
112-
bool getChipID(int index, int& subDetID, int& petalcase, int& disk, int& lay, int& stave, int& halfstave) const;
125+
/// \param int module The module number for MLOT, from 0 to 10 (or 20)
126+
/// \param int chip The chip number for MLOT, from 0 to 8
127+
bool getChipID(int index, int& subDetID, int& petalcase, int& disk, int& lay, int& stave, int& halfstave, int& mod, int& chip) const;
113128

114-
int getLastChipIndex(int lay) const { return mLastChipIndex[lay]; }
115-
int getFirstChipIndex(int lay, int petalcase, int subDetID) const
129+
unsigned short getLastChipIndex(int lay) const { return mLastChipIndex[lay]; }
130+
unsigned short getFirstChipIndex(int lay, int petalcase, int subDetID) const
116131
{
117132
/// Get the first chip index of the active petal (VD) or layer (MLOT)
118133
if (subDetID == 0) { // VD
@@ -138,7 +153,8 @@ class GeometryTGeo : public o2::detectors::DetMatrixCache
138153

139154
static const char* composeSymNameLayer(int d, int layer);
140155
static const char* composeSymNameStave(int d, int layer);
141-
static const char* composeSymNameChip(int d, int lr);
156+
static const char* composeSymNameModule(int d, int layer);
157+
static const char* composeSymNameChip(int d, int layer);
142158
static const char* composeSymNameSensor(int d, int layer);
143159

144160
protected:
@@ -151,25 +167,36 @@ class GeometryTGeo : public o2::detectors::DetMatrixCache
151167
static std::string sPetalDiskName;
152168
static std::string sPetalLayerName;
153169
static std::string sStaveName;
170+
static std::string sHalfStaveName;
171+
static std::string sModuleName;
154172
static std::string sChipName;
155173
static std::string sSensorName;
156-
static std::string sWrapperVolumeName; ///< Wrapper volume name
174+
static std::string sDeadzoneName;
175+
static std::string sMetalStackName;
176+
177+
static std::string sWrapperVolumeName; ///< Wrapper volume name, not implemented at the moment
157178

158179
Int_t mNumberOfLayersMLOT; ///< number of layers
159180
Int_t mNumberOfActivePartsVD; ///< number of layers
160181
Int_t mNumberOfLayersVD; ///< number of layers
161182
Int_t mNumberOfPetalsVD; ///< number of Petals = chip in each VD layer
162183
Int_t mNumberOfDisksVD; ///< number of Disks = 6
163-
std::vector<int> mLastChipIndex; ///< max ID of the detctor in the petal(VD) or layer(MLOT)
164-
std::vector<int> mLastChipIndexVD; ///< max ID of the detctor in the layer for the VD
165-
std::vector<int> mLastChipIndexMLOT; ///< max ID of the detctor in the layer for the MLOT
184+
std::vector<int> mNumberOfStaves; ///< Number Of Staves per layer in ML/OT
185+
std::vector<int> mNumberOfHalfStaves; ///< Number Of Half staves in each stave of the layer in ML/OT
186+
std::vector<int> mNumberOfModules; ///< Number Of Modules per stave (half stave) in ML/OT
187+
std::vector<int> mNumberOfChips; ///< number of chips per module in ML/OT
166188
std::vector<int> mNumberOfChipsPerLayerVD; ///< number of chips per layer VD ( = number of petals)
167-
std::vector<int> mNumberOfChipsPerLayerMLOT; ///< number of chips per layer MLOT ( = 1 for the moment)
189+
std::vector<int> mNumberOfChipsPerLayerMLOT; ///< number of chips per layer MLOT
168190
std::vector<int> mNumbersOfChipPerDiskVD; ///< numbersOfChipPerDiskVD
169191
std::vector<int> mNumberOfChipsPerPetalVD; ///< numbersOfChipPerPetalVD
170-
std::vector<int> mNumberOfStaves; ///< Number Of Staves per layer in ML/OT
171-
std::vector<int> mNumberOfHalfStaves; ///< Number Of Staves in each stave of the layer in ML/OT
172-
std::array<char, MAXLAYERS> mLayerToWrapper; ///< Layer to wrapper correspondence
192+
// std::vector<int> mNumberOfChipsPerStave; ///< number of chips per stave in ML/OT
193+
// std::vector<int> mNumberOfChipsPerHalfStave; ///< number of chips per half stave in ML/OT
194+
// std::vector<int> mNumberOfChipsPerModule; ///< number of chips per module in ML/OT
195+
std::vector<unsigned short> mLastChipIndex; ///< max ID of the detctor in the petal(VD) or layer(MLOT)
196+
std::vector<unsigned short> mLastChipIndexVD; ///< max ID of the detctor in the layer for the VD
197+
std::vector<unsigned short> mLastChipIndexMLOT; ///< max ID of the detctor in the layer for the MLOT
198+
199+
std::array<char, MAXLAYERS> mLayerToWrapper; ///< Layer to wrapper correspondence, not implemented yet
173200

174201
bool mOwner = true; //! is it owned by the singleton?
175202

Detectors/Upgrades/ALICE3/TRK/base/include/TRKBase/Specs.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
// Each TGeoShape has the following properties
2323
// length: dimension in z-axis
2424
// width: dimension in xy-axes
25-
// color: for visulisation
25+
// color: for visualisation
2626
namespace o2::trk::constants
2727
{
2828
// Default unit of TGeo = cm
@@ -84,13 +84,11 @@ constexpr int nRows{static_cast<int>(width / pitchX)}; //
8484
constexpr int nCols{static_cast<int>(length / pitchZ)}; // number of rows in the chip
8585
constexpr double totalThickness{silicon::thickness + metalstack::thickness}; // total thickness of the chip
8686
/// Set to 0 for the moment, to be adjusted with the actual design of the chip if needed
87-
static constexpr float PassiveEdgeReadOut = 0.f; // width of the readout edge (Passive bottom)
88-
static constexpr float PassiveEdgeTop = 0.f; // Passive area on top
89-
static constexpr float PassiveEdgeSide = 0.f; // width of Passive area on left/right of the sensor
87+
static constexpr float passiveEdgeReadOut{1.5 * mm}; // width of the readout edge
9088
} // namespace chip
9189
namespace gaps
9290
{
93-
constexpr double interChips{0.2 * mm}; // gap between the chips
91+
constexpr double interChips{50 * mu}; // gap between the chips
9492
constexpr double outerEdgeLongSide{1 * mm}; // gap between the chips and the outer edges (long side)
9593
constexpr double outerEdgeShortSide{0.1 * mm}; // gap between the chips and the outer edges (short side)
9694
} // namespace gaps

Detectors/Upgrades/ALICE3/TRK/base/include/TRKBase/TRKBaseParam.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ namespace o2
2020
namespace trk
2121
{
2222

23+
enum eOverallGeom {
24+
kDefaultRadii = 0, // After Upgrade Days March 2024
25+
kModRadii,
26+
};
27+
2328
enum eLayout {
2429
kCylinder = 0,
2530
kTurboStaves,
@@ -31,6 +36,8 @@ struct TRKBaseParam : public o2::conf::ConfigurableParamHelper<TRKBaseParam> {
3136
float serviceTubeX0 = 0.02f; // X0 Al2O3
3237
Bool_t irisOpen = false;
3338

39+
eOverallGeom overallGeom = kDefaultRadii; // Overall geometry option, to be used in Detector::buildTRKMiddleOuterLayers
40+
3441
eLayout layoutML = kCylinder; // Type of segmentation for the middle layers
3542
eLayout layoutOL = kCylinder; // Type of segmentation for the outer layers
3643

0 commit comments

Comments
 (0)