1515#include " Framework/Logger.h"
1616
1717#include < TGeoTube.h>
18+ #include < TGeoBBox.h>
1819#include < TGeoVolume.h>
1920
21+ #include < TMath.h>
22+
2023namespace o2
2124{
2225namespace trk
2326{
2427TRKLayer::TRKLayer (int layerNumber, std::string layerName, float rInn, float rOut, float zLength, float layerX2X0)
25- : mLayerNumber (layerNumber), mLayerName (layerName), mInnerRadius (rInn), mOuterRadius (rOut), mZ (zLength), mX2X0 (layerX2X0)
28+ : mLayerNumber (layerNumber), mLayerName (layerName), mInnerRadius (rInn), mOuterRadius (rOut), mZ (zLength), mX2X0 (layerX2X0), mModuleWidth ( 4.54 ), mLayout ( kCylinder )
2629{
2730 float Si_X0 = 9 .5f ;
2831 mChipThickness = mX2X0 * Si_X0;
2932 LOGP (info, " Creating layer: id: {} rInner: {} rOuter: {} zLength: {} x2X0: {}" , mLayerNumber , mInnerRadius , mOuterRadius , mZ , mX2X0 );
3033}
3134
3235TRKLayer::TRKLayer (int layerNumber, std::string layerName, float rInn, float zLength, float thick)
33- : mLayerNumber (layerNumber), mLayerName (layerName), mInnerRadius (rInn), mZ (zLength), mChipThickness (thick)
36+ : mLayerNumber (layerNumber), mLayerName (layerName), mInnerRadius (rInn), mZ (zLength), mChipThickness (thick), mModuleWidth ( 4.54 ), mLayout ( kCylinder )
3437{
3538 float Si_X0 = 9 .5f ;
3639 mOuterRadius = rInn + thick;
@@ -40,29 +43,84 @@ TRKLayer::TRKLayer(int layerNumber, std::string layerName, float rInn, float zLe
4043
4144void TRKLayer::createLayer (TGeoVolume* motherVolume)
4245{
43- std::string chipName = o2::trk::GeometryTGeo::getTRKChipPattern () + std::to_string (mLayerNumber ),
46+ TGeoMedium* medSi = gGeoManager ->GetMedium (" TRK_SILICON$" );
47+ TGeoMedium* medAir = gGeoManager ->GetMedium (" TRK_AIR$" );
48+
49+ std::string staveName = o2::trk::GeometryTGeo::getTRKStavePattern () + std::to_string (mLayerNumber ),
50+ chipName = o2::trk::GeometryTGeo::getTRKChipPattern () + std::to_string (mLayerNumber ),
4451 sensName = Form (" %s%d" , GeometryTGeo::getTRKSensorPattern (), mLayerNumber );
4552
46- TGeoTube* sensor = new TGeoTube (mInnerRadius , mInnerRadius + mChipThickness , mZ / 2 );
47- TGeoTube* chip = new TGeoTube (mInnerRadius , mInnerRadius + mChipThickness , mZ / 2 );
4853 TGeoTube* layer = new TGeoTube (mInnerRadius , mInnerRadius + mChipThickness , mZ / 2 );
4954
50- TGeoMedium* medSi = gGeoManager ->GetMedium (" TRK_SILICON$" );
51- TGeoMedium* medAir = gGeoManager ->GetMedium (" TRK_AIR$" );
52-
53- TGeoVolume* sensVol = new TGeoVolume (sensName.c_str (), sensor, medSi);
54- sensVol->SetLineColor (kYellow );
55- TGeoVolume* chipVol = new TGeoVolume (chipName.c_str (), chip, medSi);
56- chipVol->SetLineColor (kYellow );
5755 TGeoVolume* layerVol = new TGeoVolume (mLayerName .c_str (), layer, medAir);
5856 layerVol->SetLineColor (kYellow );
5957
60- LOGP (info, " Inserting {} in {} " , sensVol->GetName (), chipVol->GetName ());
61- chipVol->AddNode (sensVol, 1 , nullptr );
58+ if (mLayout == eLayout::kCylinder ) {
59+ TGeoTube* stave = new TGeoTube (mInnerRadius , mInnerRadius + mChipThickness , mZ / 2 );
60+ TGeoTube* chip = new TGeoTube (mInnerRadius , mInnerRadius + mChipThickness , mZ / 2 );
61+ TGeoTube* sensor = new TGeoTube (mInnerRadius , mInnerRadius + mChipThickness , mZ / 2 );
62+
63+ TGeoVolume* sensVol = new TGeoVolume (sensName.c_str (), sensor, medSi);
64+ sensVol->SetLineColor (kYellow );
65+ TGeoVolume* chipVol = new TGeoVolume (chipName.c_str (), chip, medSi);
66+ chipVol->SetLineColor (kYellow );
67+ TGeoVolume* staveVol = new TGeoVolume (staveName.c_str (), stave, medSi);
68+ staveVol->SetLineColor (kYellow );
69+
70+ LOGP (info, " Inserting {} in {} " , sensVol->GetName (), chipVol->GetName ());
71+ chipVol->AddNode (sensVol, 1 , nullptr );
72+
73+ LOGP (info, " Inserting {} in {} " , chipVol->GetName (), staveVol->GetName ());
74+ staveVol->AddNode (chipVol, 1 , nullptr );
75+
76+ LOGP (info, " Inserting {} in {} " , staveVol->GetName (), layerVol->GetName ());
77+ layerVol->AddNode (staveVol, 1 , nullptr );
78+ } else if (mLayout == eLayout::kTurboStaves ) {
79+ // Compute the number of staves
80+ double width = mModuleWidth * 2 ; // Each stave has two modules (based on the LOI design)
81+ int nStaves = (int )std::ceil (mInnerRadius * 2 * TMath::Pi () / width);
82+ nStaves += nStaves % 2 ; // Require an even number of staves
83+
84+ // Compute the size of the overlap region
85+ double theta = 2 * TMath::Pi () / nStaves;
86+ double theta1 = std::atan (width / 2 / mInnerRadius );
87+ double st = std::sin (theta);
88+ double ct = std::cos (theta);
89+ double theta2 = std::atan ((mInnerRadius * st - width / 2 * ct) / (mInnerRadius * ct + width / 2 * st));
90+ double overlap = (theta1 - theta2) * mInnerRadius ;
91+ LOGP (info, " Creating a layer with {} staves and {} mm overlap" , nStaves, overlap * 10 );
92+
93+ for (int iStave = 0 ; iStave < nStaves; iStave++) {
94+ TGeoBBox* sensor = new TGeoBBox (width / 2 , mChipThickness / 2 , mZ / 2 );
95+ TGeoBBox* chip = new TGeoBBox (width / 2 , mChipThickness / 2 , mZ / 2 );
96+ TGeoBBox* stave = new TGeoBBox (width / 2 , mChipThickness / 2 , mZ / 2 );
97+
98+ TGeoVolume* sensVol = new TGeoVolume (sensName.c_str (), sensor, medSi);
99+ sensVol->SetLineColor (kYellow );
100+ TGeoVolume* chipVol = new TGeoVolume (chipName.c_str (), chip, medSi);
101+ chipVol->SetLineColor (kYellow );
102+ TGeoVolume* staveVol = new TGeoVolume (staveName.c_str (), stave, medSi);
103+ staveVol->SetLineColor (kYellow );
104+
105+ // Put the staves in the correct position and orientation
106+ TGeoCombiTrans* trans = new TGeoCombiTrans ();
107+ double theta = 360 . * iStave / nStaves;
108+ TGeoRotation* rot = new TGeoRotation (" rot" , theta + 90 + 2 , 0 , 0 );
109+ trans->SetRotation (rot);
110+ trans->SetTranslation (mInnerRadius * std::cos (2 . * TMath::Pi () * iStave / nStaves), mInnerRadius * std::sin (2 * TMath::Pi () * iStave / nStaves), 0 );
111+
112+ LOGP (info, " Inserting {} in {} " , sensVol->GetName (), chipVol->GetName ());
113+ chipVol->AddNode (sensVol, 1 , nullptr );
62114
63- LOGP (info, " Inserting {} in {} " , chipVol->GetName (), layerVol ->GetName ());
64- layerVol ->AddNode (chipVol, 1 , nullptr );
115+ LOGP (info, " Inserting {} in {} " , chipVol->GetName (), staveVol ->GetName ());
116+ staveVol ->AddNode (chipVol, 1 , nullptr );
65117
118+ LOGP (info, " Inserting {} in {} " , staveVol->GetName (), layerVol->GetName ());
119+ layerVol->AddNode (staveVol, iStave, trans);
120+ }
121+ } else {
122+ LOGP (fatal, " Layout not implemented" );
123+ }
66124 LOGP (info, " Inserting {} in {} " , layerVol->GetName (), motherVolume->GetName ());
67125 motherVolume->AddNode (layerVol, 1 , nullptr );
68126}
0 commit comments