Project
Loading...
Searching...
No Matches
TRKLayer.cxx
Go to the documentation of this file.
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
13
14#include "Framework/Logger.h"
15
17#include "TRKBase/Specs.h"
18#include <TGeoBBox.h>
19#include <TGeoTube.h>
20#include <TGeoVolume.h>
21#include <TMath.h>
22
23#include <cassert>
24#include <cmath>
25#include <string>
26#include <utility>
27
28namespace o2
29{
30namespace trk
31{
32TRKCylindricalLayer::TRKCylindricalLayer(int layerNumber, std::string layerName, float rInn, float length, float thickOrX2X0, MatBudgetParamMode mode)
33 : mLayerNumber(layerNumber), mLayerName(layerName), mInnerRadius(rInn), mLength(length)
34{
36 mChipThickness = thickOrX2X0;
37 mX2X0 = thickOrX2X0 / Si_X0;
38 mOuterRadius = rInn + thickOrX2X0;
39 } else if (mode == MatBudgetParamMode::X2X0) {
40 mX2X0 = thickOrX2X0;
41 mChipThickness = thickOrX2X0 * Si_X0;
42 mOuterRadius = rInn + thickOrX2X0 * Si_X0;
43 }
44
45 LOGP(info, "Creating layer: id: {} rInner: {} rOuter: {} zLength: {} x2X0: {}", mLayerNumber, mInnerRadius, mOuterRadius, mLength, mX2X0);
46}
47
49{
50 TGeoMedium* medSi = gGeoManager->GetMedium("TRK_SILICON$");
52 TGeoShape* sensor = new TGeoTube(mInnerRadius, mInnerRadius + sSensorThickness, mLength / 2);
53 TGeoVolume* sensVol = new TGeoVolume(sensName.c_str(), sensor, medSi);
54 sensVol->SetLineColor(kYellow);
55
56 return sensVol;
57};
58
60{
61 TGeoMedium* medSi = gGeoManager->GetMedium("TRK_SILICON$");
63 TGeoShape* metalStack = new TGeoTube(mInnerRadius + sSensorThickness, mInnerRadius + mChipThickness, mLength / 2);
64 TGeoVolume* metalVol = new TGeoVolume(metalName.c_str(), metalStack, medSi);
65 metalVol->SetLineColor(kGray);
66
67 return metalVol;
68};
69
70void TRKCylindricalLayer::createLayer(TGeoVolume* motherVolume)
71{
72 TGeoMedium* medAir = gGeoManager->GetMedium("TRK_AIR$");
73 TGeoTube* layer = new TGeoTube(mInnerRadius, mInnerRadius + mChipThickness, mLength / 2);
74 TGeoVolume* layerVol = new TGeoVolume(mLayerName.c_str(), layer, medAir);
75 layerVol->SetLineColor(kYellow);
76
77 TGeoVolume* sensVol = createSensor();
78 LOGP(debug, "Inserting {} in {} ", sensVol->GetName(), layerVol->GetName());
79 layerVol->AddNode(sensVol, 1, nullptr);
80
81 TGeoVolume* metalVol = createMetalStack();
82 LOGP(debug, "Inserting {} in {} ", metalVol->GetName(), layerVol->GetName());
83 layerVol->AddNode(metalVol, 1, nullptr);
84
85 LOGP(debug, "Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
86 motherVolume->AddNode(layerVol, 1, nullptr);
87}
88
90
91TRKSegmentedLayer::TRKSegmentedLayer(int layerNumber, std::string layerName, float rInn, float tiltAngle, int numberOfStaves, int numberOfModules, float thickOrX2X0, MatBudgetParamMode mode)
92 : TRKCylindricalLayer(layerNumber, layerName, rInn, numberOfModules * sModuleLength, thickOrX2X0, mode), mTiltAngle(tiltAngle), mNumberOfStaves(numberOfStaves), mNumberOfModules(numberOfModules)
93{
94 assert(numberOfStaves % 2 == 0 && "Error: numberOfStaves must be even!");
95}
96
98{
99 TGeoMedium* medSi = gGeoManager->GetMedium("TRK_SILICON$");
101 TGeoShape* sensor = new TGeoBBox((sChipWidth - sDeadzoneWidth) / 2, sSensorThickness / 2, sChipLength / 2);
102 TGeoVolume* sensVol = new TGeoVolume(sensName.c_str(), sensor, medSi);
103 sensVol->SetLineColor(kYellow);
104
105 return sensVol;
106}
107
109{
110 TGeoMedium* medSi = gGeoManager->GetMedium("TRK_SILICON$");
112 TGeoShape* deadzone = new TGeoBBox(sDeadzoneWidth / 2, sSensorThickness / 2, sChipLength / 2);
113 TGeoVolume* deadVol = new TGeoVolume(deadName.c_str(), deadzone, medSi);
114 deadVol->SetLineColor(kGray);
115
116 return deadVol;
117}
118
120{
121 TGeoMedium* medSi = gGeoManager->GetMedium("TRK_SILICON$");
123 TGeoShape* metalStack = new TGeoBBox(sChipWidth / 2, (mChipThickness - sSensorThickness) / 2, sChipLength / 2);
124 TGeoVolume* metalVol = new TGeoVolume(metalName.c_str(), metalStack, medSi);
125 metalVol->SetLineColor(kGray);
126
127 return metalVol;
128}
129
131{
132 TGeoMedium* medSi = gGeoManager->GetMedium("TRK_SILICON$");
134 TGeoShape* chip = new TGeoBBox(sChipWidth / 2, mChipThickness / 2, sChipLength / 2);
135 TGeoVolume* chipVol = new TGeoVolume(chipName.c_str(), chip, medSi);
136 chipVol->SetLineColor(kYellow);
137
138 TGeoVolume* sensVol = createSensor();
139 TGeoCombiTrans* transSens = new TGeoCombiTrans();
140
141 TGeoVolume* deadVol = createDeadzone();
142 TGeoCombiTrans* transDead = new TGeoCombiTrans();
143
144 TGeoVolume* metalVol = createMetalStack();
145 TGeoCombiTrans* transMetal = new TGeoCombiTrans();
146
147 if (!mIsFlipped) {
148 transSens->SetTranslation(-sDeadzoneWidth / 2, (mChipThickness - sSensorThickness) / 2, 0);
149 transDead->SetTranslation((sChipWidth - sDeadzoneWidth) / 2, (mChipThickness - sSensorThickness) / 2, 0);
150 transMetal->SetTranslation(0, -sSensorThickness / 2, 0);
151 } else {
152 transSens->SetTranslation(-sDeadzoneWidth / 2, -(mChipThickness - sSensorThickness) / 2, 0);
153 transDead->SetTranslation((sChipWidth - sDeadzoneWidth) / 2, -(mChipThickness - sSensorThickness) / 2, 0);
154 transMetal->SetTranslation(0, sSensorThickness / 2, 0);
155 }
156
157 LOGP(debug, "Inserting {} in {} ", sensVol->GetName(), chipVol->GetName());
158 chipVol->AddNode(sensVol, 1, transSens);
159
160 LOGP(debug, "Inserting {} in {} ", deadVol->GetName(), chipVol->GetName());
161 chipVol->AddNode(deadVol, 1, transDead);
162
163 LOGP(debug, "Inserting {} in {} ", metalVol->GetName(), chipVol->GetName());
164 chipVol->AddNode(metalVol, 1, transMetal);
165
166 return chipVol;
167}
168
170{
171 TGeoMedium* medSi = gGeoManager->GetMedium("TRK_SILICON$");
173 TGeoShape* module = new TGeoBBox(sModuleWidth / 2, mChipThickness / 2, sModuleLength / 2);
174 TGeoVolume* moduleVol = new TGeoVolume(moduleName.c_str(), module, medSi);
175 moduleVol->SetLineColor(kYellow);
176
177 for (int iChip = 0; iChip < sHalfNumberOfChips; iChip++) {
178 TGeoVolume* chipVolLeft = createChip();
181 TGeoCombiTrans* transLeft = new TGeoCombiTrans();
182 transLeft->SetTranslation(xLeft, 0, zLeft);
183 TGeoRotation* rot = new TGeoRotation();
184 rot->RotateY(180);
185 transLeft->SetRotation(rot);
186 LOGP(debug, "Inserting {} in {} ", chipVolLeft->GetName(), moduleVol->GetName());
187 moduleVol->AddNode(chipVolLeft, iChip * 2, transLeft);
188
189 TGeoVolume* chipVolRight = createChip();
192 TGeoCombiTrans* transRight = new TGeoCombiTrans();
193 transRight->SetTranslation(xRight, 0, zRight);
194 LOGP(debug, "Inserting {} in {} ", chipVolRight->GetName(), moduleVol->GetName());
195 moduleVol->AddNode(chipVolRight, iChip * 2 + 1, transRight);
196 }
197
198 return moduleVol;
199}
200
201std::pair<float, float> TRKSegmentedLayer::getBoundingRadii(double staveWidth) const
202{
203 const float avgRadius = 0.5 * (mInnerRadius + mOuterRadius);
204 const float staveSizeX = staveWidth;
205 const float staveSizeY = mOuterRadius - mInnerRadius;
206
207 /*const float deltaForTilt = 0.5 * (std::sin(TMath::DegToRad() * mTiltAngle) * staveSizeX + std::cos(TMath::DegToRad() * mTiltAngle) * staveSizeY);
208
209 float radiusMin = std::sqrt(avgRadius * avgRadius + 0.25 * staveSizeX * staveSizeX + 0.25 * staveSizeY * staveSizeY - avgRadius * 2. * deltaForTilt);
210 float radiusMax = std::sqrt(avgRadius * avgRadius + 0.25 * staveSizeX * staveSizeX + 0.25 * staveSizeY * staveSizeY + avgRadius * 2. * deltaForTilt);*/
211
212 const double alpha = TMath::DegToRad() * std::abs(mTiltAngle);
213
214 // The maximum distance from the center is always the outer top corner
215 double u_max = avgRadius * std::sin(alpha) + staveSizeX / 2.0;
216 double v_max = avgRadius * std::cos(alpha) + staveSizeY / 2.0;
217 double radiusMax = std::sqrt(u_max * u_max + v_max * v_max);
218
219 // The perpendicular distance from the center to the line where the inner face lies
220 double perpDistance = avgRadius * std::cos(alpha) - staveSizeY / 2.0;
221
222 // The projection of the center along the width of the stave
223 double projDistance = avgRadius * std::sin(alpha);
224
225 double radiusMin;
226 if (projDistance <= staveSizeX / 2.0) {
227 // The center projects directly inside the flat face.
228 // The closest point is on the face itself, not on the corner
229 radiusMin = perpDistance;
230 } else {
231 // The center projects outside the face. The closest point is the inner corner
232 double u_min = projDistance - staveSizeX / 2.0;
233 radiusMin = std::sqrt(u_min * u_min + perpDistance * perpDistance);
234 }
235
236 // Add a 0.5 mm safety margin to prevent false-positive overlaps in ROOT's geometry checker caused by floating-point inaccuracies
237 const float precisionMargin = 0.05f;
238
239 return {radiusMin - precisionMargin, radiusMax + precisionMargin};
240}
241
243
244TRKMLLayer::TRKMLLayer(int layerNumber, std::string layerName, float rInn, float staggerOffset, float tiltAngle, int numberOfStaves, int numberOfModules, float thickOrX2X0, MatBudgetParamMode mode)
245 : TRKSegmentedLayer(layerNumber, layerName, rInn, tiltAngle, numberOfStaves, numberOfModules, thickOrX2X0, mode), mStaggerOffset(staggerOffset)
246{
247 if (mLayerNumber == sFlippedLayerNumber) {
248 mOuterRadius = rInn;
250 mIsFlipped = true;
251 mStaggerOffset = -staggerOffset;
252 LOGP(info, "Layer {} is flipped: sensor and metal stack positions are switched", mLayerNumber);
253 }
254}
255
257{
258 TGeoMedium* medAir = gGeoManager->GetMedium("TRK_AIR$");
260 TGeoShape* stave = new TGeoBBox(sStaveWidth / 2, mChipThickness / 2, mLength / 2);
261 TGeoVolume* staveVol = new TGeoVolume(staveName.c_str(), stave, medAir);
262 staveVol->SetLineColor(kYellow);
263
264 for (int iModule = 0; iModule < mNumberOfModules; iModule++) {
265 TGeoVolume* moduleVol = createModule();
266 double zPos = -0.5 * mNumberOfModules * sModuleLength + (iModule + 0.5) * sModuleLength;
267 TGeoCombiTrans* trans = new TGeoCombiTrans();
268 trans->SetTranslation(0, 0, zPos);
269 LOGP(debug, "Inserting {} in {} ", moduleVol->GetName(), staveVol->GetName());
270 staveVol->AddNode(moduleVol, iModule, trans);
271 }
272
273 return staveVol;
274}
275
276void TRKMLLayer::createLayer(TGeoVolume* motherVolume)
277{
278 // Retrieve exact bounding boundaries and create the logical container volume
279 auto [rMin, rMax] = getBoundingRadii(sStaveWidth);
280
281 TGeoMedium* medAir = gGeoManager->GetMedium("TRK_AIR$");
282 // TGeoTube* layer = new TGeoTube(mInnerRadius - 0.333 * sLogicalVolumeThickness, mInnerRadius + 0.667 * sLogicalVolumeThickness, mLength / 2);
283 TGeoTube* layer = new TGeoTube(rMin, rMax, mLength / 2);
284 TGeoVolume* layerVol = new TGeoVolume(mLayerName.c_str(), layer, medAir);
285 layerVol->SetLineColor(kYellow);
286
287 // Compute the number of staves
288 // int nStaves = (int)std::ceil(mInnerRadius * 2 * TMath::Pi() / sStaveWidth);
289 // nStaves += nStaves % 2; // Require an even number of staves
290
291 // Nominal average radii used as placement barycenters for the staves
292 const double avgRadiusInner = 0.5 * (mInnerRadius + mOuterRadius);
293 const double avgRadiusOuter = avgRadiusInner + mStaggerOffset;
294
295 // Compute the size of the overlap region
296 double theta = 2. * TMath::Pi() / mNumberOfStaves;
297 double theta1 = std::atan(sStaveWidth / 2 / mInnerRadius);
298 double st = std::sin(theta);
299 double ct = std::cos(theta);
300 double theta2 = std::atan((mInnerRadius * st - sStaveWidth / 2 * ct) / (mInnerRadius * ct + sStaveWidth / 2 * st));
301 double overlap = (theta1 - theta2) * mInnerRadius;
302 LOGP(info, "Creating a layer with {} staves and {} mm overlap", mNumberOfStaves, overlap * 10);
303
304 for (int iStave = 0; iStave < mNumberOfStaves; iStave++) {
305 TGeoVolume* staveVol = createStave();
306 TGeoCombiTrans* trans = new TGeoCombiTrans();
307 // If the number of staves is a multiple of 4, rotate by half a stave to avoid having the first one exactly on the x
308 double phi = (mNumberOfStaves % 4 == 0) ? theta * (iStave + 0.5) : theta * iStave;
309 double phiDeg = phi * TMath::RadToDeg();
310 TGeoRotation* rot = new TGeoRotation("rot", phiDeg + 90 + mTiltAngle, 0, 0);
311 trans->SetRotation(rot);
312 // float trueRadius = (mLayerNumber == 3 || mLayerNumber == 4) ? (iStave % 2 == 0 ? mInnerRadius : mInnerRadius + mStaggerOffset) : mInnerRadius;
313 float trueRadius = (mLayerNumber == 3 || mLayerNumber == 4) ? (iStave % 2 == 0 ? avgRadiusInner : avgRadiusOuter) : avgRadiusInner;
314 trans->SetTranslation(trueRadius * std::cos(phi), trueRadius * std::sin(phi), 0);
315 LOGP(debug, "Inserting {} in {} ", staveVol->GetName(), layerVol->GetName());
316 layerVol->AddNode(staveVol, iStave, trans);
317 }
318
319 LOGP(debug, "Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
320 motherVolume->AddNode(layerVol, 1, nullptr);
321}
322
323std::pair<float, float> TRKMLLayer::getBoundingRadii(double staveWidth) const
324{
325 // Get the baseline RMin from the base class
326 auto [defaultRadiusMin, defaultRadiusMax] = TRKSegmentedLayer::getBoundingRadii(staveWidth);
327
328 // If we are not in the staggered layers, return the baseline values
329 if (mLayerNumber != 3 && mLayerNumber != 4) {
330 return {defaultRadiusMin, defaultRadiusMax};
331 }
332
333 /*// For staggered layers, we must recalculate RMax based on the outer shifted row
334 const float avgRadiusInner = 0.5 * (mInnerRadius + mOuterRadius);
335 const float avgRadiusOuter = avgRadiusInner + mStaggerOffset;
336
337 const float staveSizeX = staveWidth;
338 const float staveSizeY = mOuterRadius - mInnerRadius;
339
340 const float deltaForTiltOuter = 0.5 * (std::sin(TMath::DegToRad() * mTiltAngle) * staveSizeX + std::cos(TMath::DegToRad() * mTiltAngle) * staveSizeY);
341
342 const float radiusMax = std::sqrt(avgRadiusOuter * avgRadiusOuter + 0.25 * staveSizeX * staveSizeX + 0.25 * staveSizeY * staveSizeY + avgRadiusOuter * 2. * deltaForTiltOuter);*/
343
344 const float avgRadiusInner = 0.5 * (mInnerRadius + mOuterRadius);
345 const float avgRadiusStaggered = avgRadiusInner + mStaggerOffset;
346
347 const float staveSizeX = staveWidth;
348 const float staveSizeY = mOuterRadius - mInnerRadius;
349 const float alpha = TMath::DegToRad() * std::abs(mTiltAngle);
350
351 const float precisionMargin = 0.05f;
352
353 // If the layer is NOT flipped (e.g., Layer 4), the stagger goes outwards
354 // Therefore, we must recalculate only the maximum radius based on the outer shifted row
355 if (!mIsFlipped) {
356 float u_max = avgRadiusStaggered * std::sin(alpha) + staveSizeX / 2.0;
357 float v_max = avgRadiusStaggered * std::cos(alpha) + staveSizeY / 2.0;
358 float radiusMax = std::sqrt(u_max * u_max + v_max * v_max);
359
360 return {defaultRadiusMin, radiusMax + precisionMargin};
361 }
362 // If the layer IS flipped (e.g., Layer 3), the stagger goes inwards
363 // Therefore, we must recalculate only the minimum radius based on the inner shifted row
364 else {
365 double perpDistance = avgRadiusStaggered * std::cos(alpha) - staveSizeY / 2.0;
366 double projDistance = avgRadiusStaggered * std::sin(alpha);
367 double newRadiusMin;
368
369 if (projDistance <= staveSizeX / 2.0) {
370 newRadiusMin = perpDistance;
371 } else {
372 double u_min = projDistance - staveSizeX / 2.0;
373 newRadiusMin = std::sqrt(u_min * u_min + perpDistance * perpDistance);
374 }
375
376 return {newRadiusMin - precisionMargin, defaultRadiusMax};
377 }
378}
379
381
382TRKOTLayer::TRKOTLayer(int layerNumber, std::string layerName, float rInn, float tiltAngle, int numberOfStaves, int numberOfModules, float thickOrX2X0, MatBudgetParamMode mode)
383 : TRKSegmentedLayer(layerNumber, layerName, rInn, tiltAngle, numberOfStaves, numberOfModules, thickOrX2X0, mode)
384{
385}
386
388{
389 TGeoMedium* medSi = gGeoManager->GetMedium("TRK_SILICON$");
391 TGeoShape* halfStave = new TGeoBBox(sHalfStaveWidth / 2, mChipThickness / 2, mLength / 2);
392 TGeoVolume* halfStaveVol = new TGeoVolume(halfStaveName.c_str(), halfStave, medSi);
393 halfStaveVol->SetLineColor(kYellow);
394
395 for (int iModule = 0; iModule < mNumberOfModules; iModule++) {
396 TGeoVolume* moduleVol = createModule();
397 double zPos = -0.5 * mNumberOfModules * sModuleLength + (iModule + 0.5) * sModuleLength;
398 TGeoCombiTrans* trans = new TGeoCombiTrans();
399 trans->SetTranslation(0, 0, zPos);
400 LOGP(debug, "Inserting {} in {} ", moduleVol->GetName(), halfStaveVol->GetName());
401 halfStaveVol->AddNode(moduleVol, iModule, trans);
402 }
403
404 return halfStaveVol;
405}
406
408{
410 TGeoVolume* staveVol = new TGeoVolumeAssembly(staveName.c_str());
411
412 TGeoVolume* halfStaveVolLeft = createHalfStave();
413 TGeoCombiTrans* transLeft = new TGeoCombiTrans();
414 transLeft->SetTranslation(-(sHalfStaveWidth - sInStaveOverlap) / 2, 0, 0);
415 LOGP(debug, "Inserting {} in {} ", halfStaveVolLeft->GetName(), staveVol->GetName());
416 staveVol->AddNode(halfStaveVolLeft, 0, transLeft);
417
418 TGeoVolume* halfStaveVolRight = createHalfStave();
419 TGeoCombiTrans* transRight = new TGeoCombiTrans();
420 transRight->SetTranslation((sHalfStaveWidth - sInStaveOverlap) / 2, 0.2, 0);
421 LOGP(debug, "Inserting {} in {} ", halfStaveVolRight->GetName(), staveVol->GetName());
422 staveVol->AddNode(halfStaveVolRight, 1, transRight);
423
424 return staveVol;
425}
426
427void TRKOTLayer::createLayer(TGeoVolume* motherVolume)
428{
429 // Retrieve exact bounding boundaries automatically inherited from TRKSegmentedLayer
430 auto [rMin, rMax] = getBoundingRadii(sStaveWidth);
431
432 TGeoMedium* medAir = gGeoManager->GetMedium("TRK_AIR$");
433 // TGeoTube* layer = new TGeoTube(mInnerRadius - 0.333 * sLogicalVolumeThickness, mInnerRadius + 0.667 * sLogicalVolumeThickness, mLength / 2);
434 TGeoTube* layer = new TGeoTube(rMin, rMax, mLength / 2);
435 TGeoVolume* layerVol = new TGeoVolume(mLayerName.c_str(), layer, medAir);
436 layerVol->SetLineColor(kYellow);
437
438 // Compute the number of staves
439 int nStaves = (int)std::ceil(mInnerRadius * 2 * TMath::Pi() / sStaveWidth);
440 nStaves += nStaves % 2; // Require an even number of staves
441
442 // Nominal average radius used as the placement barycenter for all staves
443 const double avgRadius = 0.5 * (mInnerRadius + mOuterRadius);
444
445 // Compute the size of the overlap region
446 double theta = 2. * TMath::Pi() / nStaves;
447 double theta1 = std::atan(sStaveWidth / 2 / mInnerRadius);
448 double st = std::sin(theta);
449 double ct = std::cos(theta);
450 double theta2 = std::atan((mInnerRadius * st - sStaveWidth / 2 * ct) / (mInnerRadius * ct + sStaveWidth / 2 * st));
451 double overlap = (theta1 - theta2) * mInnerRadius;
452 LOGP(info, "Creating a layer with {} staves and {} mm overlap", nStaves, overlap * 10);
453
454 for (int iStave = 0; iStave < nStaves; iStave++) {
455 TGeoVolume* staveVol = createStave();
456 TGeoCombiTrans* trans = new TGeoCombiTrans();
457 double phi = theta * iStave;
458 double phiDeg = phi * TMath::RadToDeg();
459 TGeoRotation* rot = new TGeoRotation("rot", phiDeg + 90 + mTiltAngle, 0, 0);
460 trans->SetRotation(rot);
461 // trans->SetTranslation(mInnerRadius * std::cos(phi), mInnerRadius * std::sin(phi), 0);
462 trans->SetTranslation(avgRadius * std::cos(phi), avgRadius * std::sin(phi), 0);
463 LOGP(debug, "Inserting {} in {} ", staveVol->GetName(), layerVol->GetName());
464 layerVol->AddNode(staveVol, iStave, trans);
465 }
466
467 LOGP(debug, "Inserting {} in {} ", layerVol->GetName(), motherVolume->GetName());
468 motherVolume->AddNode(layerVol, 1, nullptr);
469}
470
471std::pair<float, float> TRKOTLayer::getBoundingRadii(double staveWidth) const
472{
473 auto [radiusMin, radiusMax] = TRKSegmentedLayer::getBoundingRadii(staveWidth);
474
475 return {radiusMin - 0.201f, radiusMax};
476}
477// ClassImp(TRKLayer);
478
479} // namespace trk
480} // namespace o2
std::ostringstream debug
specs of the ALICE3 TRK
benchmark::State & st
static const char * getTRKStavePattern()
static const char * getTRKChipPattern()
static const char * getTRKSensorPattern()
static const char * getTRKDeadzonePattern()
static const char * getTRKHalfStavePattern()
static const char * getTRKMetalStackPattern()
static const char * getTRKModulePattern()
static constexpr float Si_X0
Definition TRKLayer.h:65
virtual void createLayer(TGeoVolume *motherVolume)
Definition TRKLayer.cxx:70
virtual TGeoVolume * createSensor()
Definition TRKLayer.cxx:48
virtual TGeoVolume * createMetalStack()
Definition TRKLayer.cxx:59
static constexpr double sSensorThickness
Definition TRKLayer.h:63
void createLayer(TGeoVolume *motherVolume) override
Definition TRKLayer.cxx:276
TGeoVolume * createStave() override
Definition TRKLayer.cxx:256
TGeoVolume * createHalfStave()
Definition TRKLayer.cxx:387
void createLayer(TGeoVolume *motherVolume) override
Definition TRKLayer.cxx:427
TGeoVolume * createStave() override
Definition TRKLayer.cxx:407
static constexpr double sChipWidth
Definition TRKLayer.h:92
TGeoVolume * createMetalStack() override
Definition TRKLayer.cxx:119
static constexpr int sHalfNumberOfChips
Definition TRKLayer.h:97
TGeoVolume * createSensor() override
Definition TRKLayer.cxx:97
TGeoVolume * createModule()
Definition TRKLayer.cxx:169
static constexpr double sChipLength
Definition TRKLayer.h:93
TGeoVolume * createChip()
Definition TRKLayer.cxx:130
static constexpr double sDeadzoneWidth
Definition TRKLayer.h:94
static constexpr double sModuleLength
Definition TRKLayer.h:95
static constexpr double sModuleWidth
Definition TRKLayer.h:96
TGeoVolume * createDeadzone()
Definition TRKLayer.cxx:108
virtual std::pair< float, float > getBoundingRadii(double staveWidth) const
Definition TRKLayer.cxx:201
GLfloat GLfloat GLfloat alpha
Definition glcorearb.h:279
GLenum mode
Definition glcorearb.h:266
GLuint GLsizei GLsizei * length
Definition glcorearb.h:790
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
constexpr double outerEdgeLongSide
Definition Specs.h:92
constexpr double outerEdgeShortSide
Definition Specs.h:93
MatBudgetParamMode
Definition TRKLayer.h:28
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::string to_string(gsl::span< T, Size > span)
Definition common.h:52