Skip to content

Commit a1c3a5a

Browse files
committed
Update indexing scheme - fix bug
1 parent e829a3f commit a1c3a5a

File tree

3 files changed

+123
-36
lines changed

3 files changed

+123
-36
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,14 @@ class GeometryTGeo : public o2::detectors::DetMatrixCache
8383

8484
int getSubDetID(int index) const;
8585
int getPetalCase(int index) const;
86+
int getDisk(int index) const;
8687
int getLayer(int index) const;
8788
int getStave(int index) const;
8889
int getHalfStave(int index) const;
89-
int getDisk(int index) const;
9090
int getModule(int index) const;
9191
int getChip(int index) const;
9292

93-
/// This routine computes the chip index number from the subDetID, petal, disk, layer, stave /// TODO: retrieve also from chip when chips will be available
93+
/// This routine computes the chip index number from the subDetID, petal, disk, layer, stave, half stave, module, chip
9494
/// \param int subDetID The subdetector ID, 0 for VD, 1 for MLOT
9595
/// \param int petalcase The petal case number for VD, from 0 to 3
9696
/// \param int disk The disk number for VD, from 0 to 5
@@ -101,7 +101,7 @@ class GeometryTGeo : public o2::detectors::DetMatrixCache
101101
/// \param int chip The chip number for MLOT, from 0 to 8
102102
int getChipIndex(int subDetID, int petalcase, int disk, int lay, int stave, int halfstave, int mod, int chip) const;
103103

104-
/// This routine computes the chip index number from the subDetID, volume, layer, stave /// TODO: retrieve also from chip when chips will be available
104+
/// This routine computes the chip index number from the subDetID, volume, layer, stave, half stave, module, chip
105105
/// \param int subDetID The subdetector ID, 0 for VD, 1 for MLOT
106106
/// \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
107107
/// \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
@@ -111,7 +111,7 @@ class GeometryTGeo : public o2::detectors::DetMatrixCache
111111
/// \param int chip The chip number for MLOT, from 0 to 8
112112
int getChipIndex(int subDetID, int volume, int lay, int stave, int halfstave, int mod, int chip) const;
113113

114-
/// This routine computes subDetID, petal, disk, layer, stave given the chip index number /// TODO: copute also from chip when chips will be available
114+
/// This routine computes subDetID, petal, disk, layer, stave, half stave, module, chip, given the chip index number
115115
/// \param int index The chip index number, starting from 0
116116
/// \param int subDetID The subdetector ID, 0 for VD, 1 for MLOT
117117
/// \param int petalcase The petal case number for VD, from 0 to 3

Detectors/Upgrades/ALICE3/TRK/base/src/GeometryTGeo.cxx

Lines changed: 119 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,22 @@ int GeometryTGeo::getPetalCase(int index) const
148148
return petalcase;
149149
}
150150

151+
//__________________________________________________________________________
152+
int GeometryTGeo::getDisk(int index) const
153+
{
154+
int subDetID = getSubDetID(index);
155+
int petalcase = getPetalCase(index);
156+
157+
if (subDetID == 0) { /// VD
158+
if (index % mNumberOfChipsPerPetalVD[petalcase] < mNumberOfLayersVD) {
159+
return -1; /// layers
160+
}
161+
return (index % mNumberOfChipsPerPetalVD[petalcase]) - mNumberOfLayersVD;
162+
}
163+
164+
return -1; /// not found or ML/OT
165+
}
166+
151167
//__________________________________________________________________________
152168
int GeometryTGeo::getLayer(int index) const
153169
{
@@ -180,9 +196,23 @@ int GeometryTGeo::getStave(int index) const
180196
} else if (subDetID == 1) { /// MLOT
181197
int lay = getLayer(index);
182198
index -= getFirstChipIndex(lay, petalcase, subDetID); // get the index of the sensing element in the layer
183-
return index / mNumberOfHalfStaves[lay];
199+
200+
const int Nhs = mNumberOfHalfStaves[lay];
201+
const int Nmod = mNumberOfModules[lay];
202+
const int Nchip = mNumberOfChips[lay];
203+
204+
if (Nhs == 2) {
205+
int chipsPerModule = Nchip;
206+
int chipsPerHalfStave = Nmod * chipsPerModule;
207+
int chipsPerStave = Nhs * chipsPerHalfStave;
208+
return index / chipsPerStave;
209+
} else if (Nhs == 1) {
210+
int chipsPerModule = Nchip;
211+
int chipsPerStave = Nmod * chipsPerModule;
212+
return index / chipsPerStave;
213+
}
184214
}
185-
return -1; /// not found
215+
return -1;
186216
}
187217

188218
//__________________________________________________________________________
@@ -191,48 +221,85 @@ int GeometryTGeo::getHalfStave(int index) const
191221
int subDetID = getSubDetID(index);
192222
int lay = getLayer(index);
193223
int petalcase = getPetalCase(index);
194-
int stave = getStave(index);
195224

196225
if (subDetID == 0) { /// VD
197226
return -1;
198227
} else if (subDetID == 1) { /// MLOT
199228
int lay = getLayer(index);
200229
index -= getFirstChipIndex(lay, petalcase, subDetID); // get the index of the sensing element in the layer
201-
return index % 2; /// 0 = half stave left, 1 = half stave right, as geometry is filled /// TODO: generalize once chips will be in place. Can it be working also with chips?
230+
231+
const int Nhs = mNumberOfHalfStaves[lay];
232+
const int Nmod = mNumberOfModules[lay];
233+
const int Nchip = mNumberOfChips[lay];
234+
235+
int chipsPerModule = Nchip;
236+
int chipsPerHalfStave = Nmod * chipsPerModule;
237+
int chipsPerStave = Nhs * chipsPerHalfStave;
238+
239+
int rem = index % chipsPerStave;
240+
return rem / chipsPerHalfStave; // 0 = left, 1 = right
202241
}
203-
return -1; /// not found
242+
return -1;
204243
}
205244

206245
//__________________________________________________________________________
207-
int GeometryTGeo::getDisk(int index) const
246+
int GeometryTGeo::getModule(int index) const
208247
{
209248
int subDetID = getSubDetID(index);
249+
int lay = getLayer(index);
210250
int petalcase = getPetalCase(index);
211251

212252
if (subDetID == 0) { /// VD
213-
if (index % mNumberOfChipsPerPetalVD[petalcase] < mNumberOfLayersVD) {
214-
return -1; /// layers
253+
return -1;
254+
} else if (subDetID == 1) { /// MLOT
255+
int lay = getLayer(index);
256+
index -= getFirstChipIndex(lay, petalcase, subDetID); // get the index of the sensing element in the layer
257+
258+
const int Nhs = mNumberOfHalfStaves[lay];
259+
const int Nmod = mNumberOfModules[lay];
260+
const int Nchip = mNumberOfChips[lay];
261+
262+
if (Nhs == 2) {
263+
int chipsPerModule = Nchip;
264+
int chipsPerHalfStave = Nmod * chipsPerModule;
265+
int rem = index % (Nhs * chipsPerHalfStave);
266+
rem = rem % chipsPerHalfStave;
267+
return rem / chipsPerModule;
268+
} else if (Nhs == 1) {
269+
int chipsPerModule = Nchip;
270+
int rem = index % (Nmod * chipsPerModule);
271+
return rem / chipsPerModule;
215272
}
216-
return (index % mNumberOfChipsPerPetalVD[petalcase]) - mNumberOfLayersVD;
217273
}
218-
219-
return -1; /// not found or ML/OT
274+
return -1;
220275
}
221276

222277
//__________________________________________________________________________
223-
int GeometryTGeo::getModule(int index) const
278+
int GeometryTGeo::getChip(int index) const
224279
{
225280
int subDetID = getSubDetID(index);
281+
int lay = getLayer(index);
282+
int petalcase = getPetalCase(index);
226283

227-
return -1; /// not implemented yet
228-
}
284+
if (subDetID == 0) { /// VD
285+
return -1;
286+
} else if (subDetID == 1) { /// MLOT
287+
int lay = getLayer(index);
288+
index -= getFirstChipIndex(lay, petalcase, subDetID); // get the index of the sensing element in the layer
229289

230-
//__________________________________________________________________________
231-
int GeometryTGeo::getChip(int index) const
232-
{
233-
int subDetID = getSubDetID(index);
290+
const int Nhs = mNumberOfHalfStaves[lay];
291+
const int Nmod = mNumberOfModules[lay];
292+
const int Nchip = mNumberOfChips[lay];
234293

235-
return -1; /// not implemented yet
294+
if (Nhs == 2) {
295+
int chipsPerModule = Nchip;
296+
return index % chipsPerModule;
297+
} else if (Nhs == 1) {
298+
int chipsPerModule = Nchip;
299+
return index % chipsPerModule;
300+
}
301+
}
302+
return -1;
236303
}
237304

238305
//__________________________________________________________________________
@@ -244,11 +311,20 @@ int GeometryTGeo::getChipIndex(int subDetID, int petalcase, int disk, int lay, i
244311
} else { // layer
245312
return getFirstChipIndex(lay, petalcase, subDetID) + lay;
246313
}
247-
} else if (subDetID == 1) { // MLOT
248-
if (mNumberOfHalfStaves[lay] == 2) { // staggered geometry
249-
return getFirstChipIndex(lay, petalcase, subDetID) + stave * mNumberOfHalfStaves[lay] + halfstave * mNumberOfModules[lay] + mod * mNumberOfChips[lay] + chip;
250-
} else if (mNumberOfHalfStaves[lay] == 1) { // turbo geometry
251-
return getFirstChipIndex(lay, petalcase, subDetID) + stave * mNumberOfModules[lay] + mod * mNumberOfChips[lay] + chip;
314+
} else if (subDetID == 1) { // MLOT
315+
const int Nhs = mNumberOfHalfStaves[lay]; // 1 or 2
316+
const int Nmod = mNumberOfModules[lay]; // module per half-stave (per stave if Nhs==1)
317+
const int Nchip = mNumberOfChips[lay]; // chips per module
318+
319+
if (Nhs == 2) { // staggered geometry: layer -> stave -> halfstave -> mod -> chip
320+
int chipsPerModule = Nchip;
321+
int chipsPerHalfStave = Nmod * chipsPerModule;
322+
int chipsPerStave = Nhs * chipsPerHalfStave;
323+
return getFirstChipIndex(lay, petalcase, subDetID) + stave * chipsPerStave + halfstave * chipsPerHalfStave + mod * chipsPerModule + chip;
324+
} else if (Nhs == 1) { // turbo geometry: layer -> stave -> mod -> chip (no halfstave)
325+
int chipsPerModule = Nchip;
326+
int chipsPerStave = Nmod * chipsPerModule;
327+
return getFirstChipIndex(lay, petalcase, subDetID) + stave * chipsPerStave + mod * chipsPerModule + chip;
252328
}
253329
}
254330
return -1; // not found
@@ -260,11 +336,20 @@ int GeometryTGeo::getChipIndex(int subDetID, int volume, int lay, int stave, int
260336
if (subDetID == 0) { // VD
261337
return volume; /// In the current configuration for VD, each volume is the sensor element = chip. // TODO: when the geometry naming scheme will be changed, change this method
262338

263-
} else if (subDetID == 1) { // MLOT
264-
if (mNumberOfHalfStaves[lay] == 2) { // staggered geometry
265-
return getFirstChipIndex(lay, -1, subDetID) + stave * mNumberOfHalfStaves[lay] + halfstave * mNumberOfModules[lay] + mod * mNumberOfChips[lay] + chip;
266-
} else if (mNumberOfHalfStaves[lay] == 1) { // turbo geometry
267-
return getFirstChipIndex(lay, -1, subDetID) + stave * mNumberOfModules[lay] + mod * mNumberOfChips[lay] + chip;
339+
} else if (subDetID == 1) { // MLOT
340+
const int Nhs = mNumberOfHalfStaves[lay]; // 1 or 2
341+
const int Nmod = mNumberOfModules[lay]; // module per half-stave (per stave if Nhs==1)
342+
const int Nchip = mNumberOfChips[lay]; // chips per module
343+
344+
if (Nhs == 2) { // staggered geometry: layer -> stave -> halfstave -> mod -> chip
345+
int chipsPerModule = Nchip;
346+
int chipsPerHalfStave = Nmod * chipsPerModule;
347+
int chipsPerStave = Nhs * chipsPerHalfStave;
348+
return getFirstChipIndex(lay, -1, subDetID) + stave * chipsPerStave + halfstave * chipsPerHalfStave + mod * chipsPerModule + chip;
349+
} else if (Nhs == 1) { // turbo geometry: layer -> stave -> mod -> chip (no halfstave)
350+
int chipsPerModule = Nchip;
351+
int chipsPerStave = Nmod * chipsPerModule;
352+
return getFirstChipIndex(lay, -1, subDetID) + stave * chipsPerStave + mod * chipsPerModule + chip;
268353
}
269354
}
270355
return -1; // not found
@@ -278,6 +363,11 @@ bool GeometryTGeo::getChipID(int index, int& subDetID, int& petalcase, int& disk
278363
disk = getDisk(index);
279364
lay = getLayer(index);
280365
stave = getStave(index);
366+
if (mNumberOfHalfStaves[lay] == 2) {
367+
halfstave = getHalfStave(index);
368+
} else {
369+
halfstave = 0; // if not staggered geometry, return 0
370+
}
281371
halfstave = getHalfStave(index);
282372
mod = getModule(index);
283373
chip = getChip(index);

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,6 @@ void Detector::configDefault()
104104
mLayers.clear();
105105

106106
LOGP(warning, "Loading Scoping Document configuration for ALICE3 TRK");
107-
// mLayers.emplace_back(0, GeometryTGeo::getTRKLayerPattern() + std::to_string(0), 0.5f, 4, 100.e-4);
108-
// mLayers.emplace_back(1, GeometryTGeo::getTRKLayerPattern() + std::to_string(1), 1.2f, 4, 100.e-4);
109-
// mLayers.emplace_back(2, GeometryTGeo::getTRKLayerPattern() + std::to_string(2), 2.5f, 4, 100.e-4);
110107
mLayers.emplace_back(0, GeometryTGeo::getTRKLayerPattern() + std::to_string(0), 3.78f, 10, 100.e-3);
111108
mLayers.emplace_back(1, GeometryTGeo::getTRKLayerPattern() + std::to_string(1), 7.f, 10, 100.e-3);
112109
mLayers.emplace_back(2, GeometryTGeo::getTRKLayerPattern() + std::to_string(2), 12.f, 10, 100.e-3);

0 commit comments

Comments
 (0)