Skip to content

Commit 3b1de27

Browse files
maciaccoalibuild
andauthored
[ALICE3] TF3: geometry update steered by the final definition of the chip size and module architecture (#15998)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent 0beb284 commit 3b1de27

9 files changed

Lines changed: 431 additions & 191 deletions

File tree

‎Detectors/Upgrades/ALICE3/IOTOF/base/include/IOTOFBase/IOTOFBaseParam.h‎

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ namespace iotof
2121
{
2222

2323
struct ChipSpecifics {
24-
int NCols = 129;
25-
int NRows = 271;
24+
int NCols = 120;
25+
int NRows = 240;
2626
float PitchCol = 250.00e-4;
2727
float PitchRow = 100.00e-4;
28-
float PassiveEdgeReadOut = 0.;
28+
float PassiveEdgeReadOut = 0.2;
2929
float PassiveEdgeTop = 0.;
3030
float PassiveEdgeSide = 0.;
3131
float PixelPassiveEdgeX = 0.;
@@ -49,12 +49,25 @@ struct IOTOFBaseParam : public o2::conf::ConfigurableParamHelper<IOTOFBaseParam>
4949
bool enableOuterTOF = true; // Enable Outer TOF layer
5050
bool enableForwardTOF = false; // Enable Forward TOF layer
5151
bool enableBackwardTOF = false; // Enable Backward TOF layer
52+
bool itofTurbo = true; // Segmented ITOF turbo or staggered
5253
std::string detectorPattern = ""; // Layouts of the detector
5354
bool segmentedInnerTOF = true; // If the inner TOF layer is segmented
5455
bool segmentedOuterTOF = true; // If the outer TOF layer is segmented
5556
float x2x0 = 0.02f; // thickness expressed in radiation length, for all layers for the moment
5657
float sensorThickness = 0.0050f; // thickness of the sensor in cm, for all layers for the moment, the default is set to 50 microns
5758

59+
// ITOF segmentation parameters
60+
float itofRadius = 21.38f; // ITOF radius (cm)
61+
float itofLength = 126.82f; // ITOF length (cm)
62+
int itofNStaves = 28; // ITOF number of staves
63+
float itofStaveTilt = 6.63; // ITOF stave tilt angle (deg)
64+
65+
// OTOF segmentation parameters
66+
float otofRadius = 92.f; // OTOF radius (cm)
67+
float otofLength = 688.54f; // OTOF length (cm)
68+
int otofNStaves = 62; // OTOF number of staves
69+
float otofStaveTilt = 5; // OTOF stave tilt angle (deg)
70+
5871
O2ParamDef(IOTOFBaseParam, "IOTOFBase");
5972
};
6073

‎Detectors/Upgrades/ALICE3/IOTOF/macros/CheckDigitsIOTOF.C‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -240,21 +240,21 @@ void CheckDigitsIOTOF(std::string digifile = "tf3digits.root", std::string hitfi
240240
auto canvXY = new TCanvas("canvXY", "", 1600, 800);
241241
canvXY->Divide(2, 1);
242242
canvXY->cd(1);
243-
nt->Draw("y:x>>h_y_vs_x_IOTOF(1000, -100, 100, 1000, -100, 100)", "id >= 0 && id < 55488", "colz");
243+
nt->Draw("y:x>>h_y_vs_x_IOTOF(1000, -100, 100, 1000, -100, 100)", "id >= 0 && id < 58896", "colz");
244244
canvXY->cd(2);
245-
nt->Draw("y:z>>h_y_vs_z_IOTOF(1000, -400, 400, 1000, -100, 100)", "id >= 0 && id < 55488", "colz");
245+
nt->Draw("y:z>>h_y_vs_z_IOTOF(1000, -400, 400, 1000, -100, 100)", "id >= 0 && id < 58896", "colz");
246246
canvXY->SaveAs("tf3digits_y_vs_x_vs_z.pdf");
247247

248248
// z distributions
249249
auto canvZ = new TCanvas("canvZ", "", 800, 800);
250250
canvZ->cd();
251-
nt->Draw("z>>h_z_IOTOF(500, -70, 70)", "id >= 0 && id < 55488 ");
251+
nt->Draw("z>>h_z_IOTOF(500, -70, 70)", "id >= 0 && id < 58896 ");
252252
canvZ->SaveAs("tf3digits_z.pdf");
253253

254254
// dz distributions (difference between local position of digits and hits in x and z)
255255
auto canvdZ = new TCanvas("canvdZ", "", 800, 800);
256256
canvdZ->cd();
257-
nt->Draw("dz>>h_dz_ML(500, -0.05, 0.05)", "id >= 0 && id < 55488 ");
257+
nt->Draw("dz>>h_dz_ML(500, -0.05, 0.05)", "id >= 0 && id < 58896 ");
258258
canvdZ->SaveAs("tf3digits_dz.pdf");
259259
canvdZ->SaveAs("tf3digits_dz.root");
260260

@@ -264,13 +264,13 @@ void CheckDigitsIOTOF(std::string digifile = "tf3digits.root", std::string hitfi
264264
auto canvdXdZ = new TCanvas("canvdXdZ", "", 1600, 800);
265265
canvdXdZ->Divide(2, 1);
266266
canvdXdZ->cd(1);
267-
nt->Draw(Form("dx:dz>>h_dx_vs_dz_ITOF(600, -%f, %f, 600, -%f, %f)", canvaEdgeRow, canvaEdgeCol, canvaEdgeRow, canvaEdgeCol), "id >= 0 && id < 1920", "colz");
267+
nt->Draw(Form("dx:dz>>h_dx_vs_dz_ITOF(600, -%f, %f, 600, -%f, %f)", canvaEdgeRow, canvaEdgeCol, canvaEdgeRow, canvaEdgeCol), "id >= 0 && id < 2352", "colz");
268268
addTLines(chipInfo.PitchRow, chipInfo.PitchCol);
269269
auto h = (TH2F*)gPad->GetPrimitive("h_dx_vs_dz_ITOF");
270270
Info("ITOF", "RMS(dx)=%.1f mu", h->GetRMS(2) * 1e4);
271271
Info("ITOF", "RMS(dz)=%.1f mu", h->GetRMS(1) * 1e4);
272272
canvdXdZ->cd(2);
273-
nt->Draw(Form("dx:dz>>h_dx_vs_dz_OTOF(600, -%f, %f, 600, -%f, %f)", canvaEdgeRow, canvaEdgeCol, canvaEdgeRow, canvaEdgeCol), "id >= 1920 && id < 55488", "colz");
273+
nt->Draw(Form("dx:dz>>h_dx_vs_dz_OTOF(600, -%f, %f, 600, -%f, %f)", canvaEdgeRow, canvaEdgeCol, canvaEdgeRow, canvaEdgeCol), "id >= 2352 && id < 58896", "colz");
274274
addTLines(chipInfo.PitchRow, chipInfo.PitchCol);
275275
h = (TH2F*)gPad->GetPrimitive("h_dx_vs_dz_OTOF");
276276
Info("OTOF", "RMS(dx)=%.1f mu", h->GetRMS(2) * 1e4);
@@ -283,13 +283,13 @@ void CheckDigitsIOTOF(std::string digifile = "tf3digits.root", std::string hitfi
283283
canvdXdZHit->Divide(2, 1);
284284
canvdXdZHit->cd(1);
285285
LOG(info) << "dxH, dzH";
286-
nt2->Draw(Form("dxH:dzH>>h_dxH_vs_dzH_ITOF(300, -%f, %f, 300, -%f, %f)", canvaEdgeRow, canvaEdgeCol, canvaEdgeRow, canvaEdgeCol), "id >= 0 && id < 1920", "colz");
286+
nt2->Draw(Form("dxH:dzH>>h_dxH_vs_dzH_ITOF(300, -%f, %f, 300, -%f, %f)", canvaEdgeRow, canvaEdgeCol, canvaEdgeRow, canvaEdgeCol), "id >= 0 && id < 2352", "colz");
287287
addTLines(chipInfo.PitchRow, chipInfo.PitchCol);
288288
h = (TH2F*)gPad->GetPrimitive("h_dxH_vs_dzH_ITOF");
289289
Info("ITOF", "RMS(dxH)=%.1f mu", h->GetRMS(2) * 1e4);
290290
Info("ITOF", "RMS(dzH)=%.1f mu", h->GetRMS(1) * 1e4);
291291
canvdXdZHit->cd(2);
292-
nt2->Draw(Form("dxH:dzH>>h_dxH_vs_dzH_OTOF(300, -%f, %f, 300, -%f, %f)", canvaEdgeRow, canvaEdgeCol, canvaEdgeRow, canvaEdgeCol), "id >= 1920 && id < 55488", "colz");
292+
nt2->Draw(Form("dxH:dzH>>h_dxH_vs_dzH_OTOF(300, -%f, %f, 300, -%f, %f)", canvaEdgeRow, canvaEdgeCol, canvaEdgeRow, canvaEdgeCol), "id >= 2352 && id < 58896", "colz");
293293
addTLines(chipInfo.PitchRow, chipInfo.PitchCol);
294294
h = (TH2F*)gPad->GetPrimitive("h_dxH_vs_dzH_OTOF");
295295
Info("OTOF", "RMS(dxH)=%.1f mu", h->GetRMS(2) * 1e4);

‎Detectors/Upgrades/ALICE3/IOTOF/simulation/CMakeLists.txt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
o2_add_library(IOTOFSimulation
1313
SOURCES src/Layer.cxx
14+
src/TF3Chip.cxx
1415
src/Chip.cxx
1516
src/Detector.cxx
1617
src/Digitizer.cxx
@@ -23,6 +24,7 @@ o2_add_library(IOTOFSimulation
2324
o2_target_root_dictionary(IOTOFSimulation
2425
HEADERS include/IOTOFSimulation/Detector.h
2526
include/IOTOFSimulation/Chip.h
27+
include/IOTOFSimulation/TF3Chip.h
2628
include/IOTOFSimulation/Layer.h
2729
include/IOTOFSimulation/Digitizer.h
2830
include/IOTOFSimulation/DPLDigitizerParam.h

‎Detectors/Upgrades/ALICE3/IOTOF/simulation/include/IOTOFSimulation/Layer.h‎

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,15 @@ class Layer
3434
auto getZLength() const { return mZLength; }
3535
auto getZOffset() const { return mZOffset; }
3636
auto getx2X0() const { return mX2X0; }
37-
auto getChipThickness() const { return mChipThickness; }
37+
auto getChipThickness() const { return mLayerThickness; }
3838
auto getName() const { return mLayerName; }
3939
auto getLayout() const { return mLayout; }
4040
auto getSegments() const { return mStaves; }
4141
static constexpr int kBarrel = 0;
4242
static constexpr int kDisk = 1;
4343
static constexpr int kBarrelSegmented = 2;
4444
static constexpr int kDiskSegmented = 3;
45+
static constexpr int kBarrelStaggered = 4;
4546

4647
virtual void createLayer(TGeoVolume* motherVolume) {};
4748

@@ -52,13 +53,19 @@ class Layer
5253
float mZLength;
5354
float mZOffset{0.f}; // Of use when fwd layers
5455
float mX2X0;
55-
float mChipThickness; // Thickness of the chip in cm, derived from mX2X0 and the radiation length of silicon
56+
float mLayerThickness; // Thickness of the layer in cm, derived from mX2X0 and the radiation length of silicon
5657
float mSensorThickness; // Thickness of the sensor in cm, to be subtracted from the chip thickness to get the total module thickness
5758
int mLayout{kBarrel}; // Identifier of the type of layer layout (barrel, disk, barrel segmented, disk segmented)
5859
// 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)
5960
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
6061
int mModulesPerStave{0}; // Number of modules along a stave
6162
double mTiltAngle{0.0}; // Tilt angle in degrees to be applied as a rotation around the local center of the stave
63+
64+
static const int sChipsPerRow; // number of chips per row in module
65+
static const int sChipsPerCol; // number of chips per col in module
66+
static const double sChipGap; // gap between chips in module
67+
static const double sModuleGap; // gap between modules in stave
68+
static const double sChipThickness; // full thickness of the chip
6269
};
6370

6471
class ITOFLayer : public Layer
@@ -67,6 +74,10 @@ class ITOFLayer : public Layer
6774
using Layer::Layer;
6875
virtual void createLayer(TGeoVolume* motherVolume) override;
6976
static std::vector<std::string> mRegister;
77+
78+
static const double sStaggerRadialShift;
79+
80+
private:
7081
};
7182

7283
class OTOFLayer : public Layer
@@ -75,6 +86,9 @@ class OTOFLayer : public Layer
7586
using Layer::Layer;
7687
virtual void createLayer(TGeoVolume* motherVolume) override;
7788
static std::vector<std::string> mRegister;
89+
90+
static const double sSubStavesDistanceY;
91+
static const double sSubStavesOverlapX;
7892
};
7993

8094
class FTOFLayer : public Layer
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
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+
12+
#ifndef ALICEO2_IOTOF_TF3CHIP_H_
13+
#define ALICEO2_IOTOF_TF3CHIP_H_
14+
15+
#include <TGeoManager.h> // for gGeoManager
16+
#include "Rtypes.h" // for Int_t, Double_t, Bool_t, UInt_t, etc
17+
18+
class TGeoVolume;
19+
class TGeoManager;
20+
21+
namespace o2
22+
{
23+
24+
namespace iotof
25+
{
26+
27+
/// TF3Chip class creates a TGeoVolume representing the TF3 Chip
28+
29+
class TF3Chip
30+
{
31+
public:
32+
TF3Chip() = default;
33+
~TF3Chip() = default;
34+
35+
/// Creates the TF3Chip
36+
/// Returns the chip as a TGeoVolume
37+
/// \param yc Y chip half lengths
38+
/// \param ys sensor half thickness
39+
/// \param chipName sensName default volume names
40+
/// \param dummy if true creates a dummy air volume (for material budget studies)
41+
/// \param mgr The GeoManager (used only to get the proper material)
42+
static TGeoVolume* createChip(Double_t yc, Double_t ys,
43+
char const* chipName = "TF3Chip", char const* sensName = "TF3Sensor",
44+
Bool_t dummy = kFALSE, const TGeoManager* mgr = gGeoManager);
45+
46+
static void createMaterials(Int_t id, Int_t fieldType, Float_t maxField);
47+
48+
static const double getChipSizeX() { return sChipSizeX; };
49+
static const double getChipSizeY() { return sChipSizeZ; };
50+
51+
static const double sChipSizeX;
52+
static const double sChipSizeZ;
53+
54+
ClassDefNV(TF3Chip, 0); // TF3Chip geometry
55+
};
56+
57+
} // namespace iotof
58+
} // namespace o2
59+
60+
#endif

‎Detectors/Upgrades/ALICE3/IOTOF/simulation/src/Detector.cxx‎

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,9 @@ void Detector::configLayers(bool itof, bool otof, bool ftof, bool btof, std::str
6161
const float x2x0, const float sensorThickness)
6262
{
6363

64-
std::pair<float, float> dInnerTof = {21.f, 129.f}; // Radius and length
65-
std::pair<float, float> dOuterTof = {92.f, 680.f}; // Radius and length
64+
auto& iotofPars = IOTOFBaseParam::Instance();
65+
std::pair<float, float> dInnerTof = {iotofPars.itofRadius, iotofPars.itofLength}; // Radius and length
66+
std::pair<float, float> dOuterTof = {iotofPars.otofRadius, iotofPars.otofLength}; // Radius and length
6667
std::pair<float, float> radiusRangeDiskTof = {15.f, 100.f};
6768
float zForwardTof = 370.f;
6869
LOG(info) << "Configuring IOTOF layers with '" << pattern << "' pattern";
@@ -121,22 +122,23 @@ void Detector::configLayers(bool itof, bool otof, bool ftof, bool btof, std::str
121122
} else {
122123
LOG(fatal) << "IOTOF layer pattern " << pattern << " not recognized, exiting";
123124
}
125+
124126
if (itof) { // iTOF
125127
const std::string name = GeometryTGeo::getITOFLayerPattern();
126-
const int nStaves = itofSegmented ? 24 : 0; // number of staves in segmented case
127-
const double staveWidth = itofSegmented ? 5.42 : 0.0; // cm
128-
const double staveTiltAngle = itofSegmented ? 3.0 : 0.0; // degrees
129-
const int modulesPerStave = itofSegmented ? 10 : 0; // number of modules per stave in segmented case
128+
const int nStaves = itofSegmented ? iotofPars.itofNStaves : 0; // number of staves in segmented case
129+
const double staveWidth = itofSegmented ? 5.42 : 0.0; // cm
130+
const double staveTiltAngle = itofSegmented ? iotofPars.itofStaveTilt : 0.0; // degrees
131+
const int modulesPerStave = itofSegmented ? 7 : 0; // number of modules per stave in segmented case
130132
mITOFLayer = ITOFLayer(name,
131-
dInnerTof.first, 0.f, dInnerTof.second, 0.f, x2x0, itofSegmented ? ITOFLayer::kBarrelSegmented : ITOFLayer::kBarrel,
133+
dInnerTof.first, 0.f, dInnerTof.second, 0.f, x2x0, itofSegmented ? (iotofPars.itofTurbo ? ITOFLayer::kBarrelSegmented : ITOFLayer::kBarrelStaggered) : ITOFLayer::kBarrel,
132134
nStaves, staveWidth, staveTiltAngle, modulesPerStave, itofSegmented ? sensorThickness : 0.0f);
133135
}
134136
if (otof) { // oTOF
135137
const std::string name = GeometryTGeo::getOTOFLayerPattern();
136-
const int nStaves = otofSegmented ? 62 : 0; // number of staves in segmented case
137-
const double staveWidth = otofSegmented ? 9.74 : 0.0; // cm
138-
const double staveTiltAngle = otofSegmented ? 5.0 : 0.0; // degrees
139-
const int modulesPerStave = otofSegmented ? 54 : 0; // number of modules per stave in segmented case
138+
const int nStaves = otofSegmented ? iotofPars.otofNStaves : 0; // number of staves in segmented case
139+
const double staveWidth = otofSegmented ? 9.74 : 0.0; // cm
140+
const double staveTiltAngle = otofSegmented ? iotofPars.otofStaveTilt : 0.0; // degrees
141+
const int modulesPerStave = otofSegmented ? 38 : 0; // number of modules per stave in segmented case
140142
mOTOFLayer = OTOFLayer(name,
141143
dOuterTof.first, 0.f, dOuterTof.second, 0.f, x2x0, otofSegmented ? OTOFLayer::kBarrelSegmented : OTOFLayer::kBarrel,
142144
nStaves, staveWidth, staveTiltAngle, modulesPerStave, otofSegmented ? sensorThickness : 0.0f);

‎Detectors/Upgrades/ALICE3/IOTOF/simulation/src/IOTOFSimulationLinkDef.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#pragma link off all classes;
1616
#pragma link off all functions;
1717

18+
#pragma link C++ class o2::iotof::TF3Chip + ;
1819
#pragma link C++ class o2::iotof::Layer + ;
1920
#pragma link C++ class o2::iotof::ITOFLayer + ;
2021
#pragma link C++ class o2::iotof::OTOFLayer + ;

0 commit comments

Comments
 (0)