Skip to content

Commit efec0e6

Browse files
committed
new version
1 parent 363e55e commit efec0e6

6 files changed

Lines changed: 146 additions & 64 deletions

File tree

DataFormats/Detectors/Upgrades/ALICE3/FD3/include/DataFormatsFD3/CalibParam.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "CommonUtils/ConfigurableParamHelper.h"
1616
#include "FD3Base/Constants.h"
17+
#include "FD3Base/FD3BaseParam.h"
1718

1819
#include <array>
1920

@@ -23,7 +24,7 @@ namespace fd3
2324
{
2425

2526
struct CalibParam : o2::conf::ConfigurableParamHelper<CalibParam> {
26-
static constexpr auto Nchannels = o2::fd3::Constants::nsect * (o2::fd3::Constants::nringsA + o2::fd3::Constants::nringsC);
27+
static constexpr int Nchannels = 2 * Constants::nsect * (Constants::nrings + Constants::nrings_extra);
2728
// Logic for obtaining bad channels and for making decision concerning slot finalization
2829
std::size_t mMinEntriesThreshold = 500; // Min number of entries
2930
std::size_t mMaxEntriesThreshold = 1000; // Max number of entries

Detectors/Upgrades/ALICE3/FD3/base/include/FD3Base/Constants.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ namespace fd3
2323
{
2424
struct Constants {
2525
static constexpr unsigned int nsect = 8;
26-
static constexpr unsigned int nringsA = 5;
27-
static constexpr unsigned int nringsC = 6;
26+
static constexpr unsigned int nrings = 5;
27+
static constexpr unsigned int nrings_extra = 5;
2828

2929
static constexpr float etaMax = 7.0f;
3030
static constexpr float etaMin = 4.0f;
31-
32-
static constexpr unsigned int nringsA_withMG = 3;
33-
static constexpr float etaMinA_withMG = 5.0f;
31+
32+
static constexpr float etaMax_extra = 4.0f;
33+
static constexpr float etaMin_extra = 2.0f;
3434
};
3535

3636
} // namespace fd3

Detectors/Upgrades/ALICE3/FD3/base/include/FD3Base/FD3BaseParam.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,16 @@ namespace fd3
2222
{
2323
struct FD3BaseParam : public o2::conf::ConfigurableParamHelper<FD3BaseParam> {
2424

25-
float zmodA = 1700.0f;
26-
float zmodC = -1850.0f;
25+
float zmodAC = 1500.0f;
26+
float zmodAC_extra = 400.0f;
27+
2728
float dzscint = 4.0f;
2829

29-
bool withMG = false; // modified geometry with 3 rings on A side
30+
bool modules_extra = false; // switch for modules at z = +-4 m
3031

3132
bool plateBehindA = false;
3233
bool fullContainer = false;
34+
3335
float dzplate = 1.0f; // Aluminium plate width
3436

3537
O2ParamDef(FD3BaseParam, "FD3Base");

Detectors/Upgrades/ALICE3/FD3/simulation/include/FD3Simulation/Detector.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,20 @@ class Detector : public o2::base::DetImpl<Detector>
9999
TGeoVolumeAssembly* buildModuleA();
100100
TGeoVolumeAssembly* buildModuleC();
101101

102+
TGeoVolumeAssembly* buildModuleA_extra();
103+
TGeoVolumeAssembly* buildModuleC_extra();
104+
102105
float ringSize(float zmod, float eta);
103106

104-
unsigned int mNumberOfRingsA, mNumberOfRingsC, mNumberOfSectors;
107+
bool mExtra;
108+
unsigned int mNumberOfRings, mNumberOfRings_extra, mNumberOfSectors;
105109
float mDzScint, mDzPlate;
106110

107-
std::vector<float> mRingSizesA = {}, mRingSizesC = {};
111+
std::vector<float> mRingSizes = {}, mRingSizes_extra = {};
108112

109-
float mEtaMaxA, mEtaMaxC, mEtaMinA, mEtaMinC;
110-
float mZA, mZC;
113+
float mEtaMax, mEtaMin;
114+
float mEtaMax_extra, mEtaMin_extra;
115+
float mZAC, mZAC_extra;
111116

112117
bool mPlateBehindA, mFullContainer;
113118

Detectors/Upgrades/ALICE3/FD3/simulation/include/FD3Simulation/DigitizationConstants.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ namespace o2
2020
namespace fd3
2121
{
2222
struct DigitizationConstants {
23-
static constexpr int NCELLSA = Constants::nringsA * Constants::nsect; // number of scintillator cells side A
24-
static constexpr int NCELLSC = Constants::nringsC * Constants::nsect; // number of scintillator cells side C
23+
static constexpr int NCELLSA = 2 * Constants::nrings * Constants::nsect; // number of scintillator cells side A
24+
static constexpr int NCELLSC = 2 * Constants::nrings * Constants::nsect; // number of scintillator cells side C
2525
static constexpr int NCELLSTOT = NCELLSA + NCELLSC; // total number of scintillator cells
26+
static constexpr int NCELLSA_extra = 2 * Constants::nrings_extra * Constants::nsect; // number of scintillator cells side A
27+
static constexpr int NCELLSC_extra = 2 * Constants::nrings_extra * Constants::nsect; // number of scintillator cells side C
28+
static constexpr int NCELLSTOT_extra = NCELLSTOT + NCELLSA_extra + NCELLSC_extra; // total number of scintillator cells
2629
static constexpr float INV_CHARGE_PER_ADC = 1. / 0.6e-12; // charge conversion
2730
static constexpr float TIME_PER_TDCCHANNEL = 0.01302; // time conversion from TDC channels to ns
2831
static constexpr float INV_TIME_PER_TDCCHANNEL = 1. / TIME_PER_TDCCHANNEL; // time conversion from ns to TDC channels

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

Lines changed: 120 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -56,44 +56,40 @@ Detector::Detector(bool active)
5656
mGeometryTGeo(nullptr),
5757
mTrackData()
5858
{
59-
mNumberOfRingsC = Constants::nringsC;
59+
mNumberOfRings = Constants::nrings;
60+
mNumberOfRings_extra = Constants::nrings_extra;
6061
mNumberOfSectors = Constants::nsect;
6162

62-
mEtaMinA = Constants::etaMin;
63-
mEtaMaxA = Constants::etaMax;
64-
mEtaMinC = -Constants::etaMax;
65-
mEtaMaxC = -Constants::etaMin;
63+
mEtaMin = Constants::etaMin;
64+
mEtaMax = Constants::etaMax;
65+
mEtaMin_extra = Constants::etaMax_extra;
66+
mEtaMax_extra = Constants::etaMin_extra;
6667

6768
auto& baseParam = FD3BaseParam::Instance();
6869

69-
if (baseParam.withMG) {
70-
mNumberOfRingsA = Constants::nringsA_withMG;
71-
mEtaMinA = Constants::etaMinA_withMG;
72-
} else {
73-
mNumberOfRingsA = Constants::nringsA;
74-
mEtaMinA = Constants::etaMin;
75-
}
70+
mExtra = baseParam.modules_extra;
7671

7772
mDzScint = baseParam.dzscint / 2;
7873
mDzPlate = baseParam.dzplate;
7974

8075
mPlateBehindA = baseParam.plateBehindA;
8176
mFullContainer = baseParam.fullContainer;
8277

83-
mZA = baseParam.zmodA;
84-
mZC = baseParam.zmodC;
78+
mZAC = baseParam.zmodAC;
79+
mZAC_extra = baseParam.zmodAC_extra;
8580

86-
for (int i = 0; i <= mNumberOfRingsA + 1; i++) {
87-
float eta = mEtaMaxA - i * (mEtaMaxA - mEtaMinA) / mNumberOfRingsA;
88-
float r = ringSize(mZA, eta);
89-
mRingSizesA.emplace_back(r);
81+
for (int i = 0; i <= mNumberOfRings + 1; i++) {
82+
float eta = mEtaMax - i * (mEtaMax - mEtaMin) / mNumberOfRings;
83+
float r = ringSize(mZAC, eta);
84+
mRingSizes.emplace_back(r);
9085
}
9186

92-
for (int i = 0; i <= mNumberOfRingsC + 1; i++) {
93-
float eta = mEtaMinC + i * (mEtaMaxC - mEtaMinC) / mNumberOfRingsC;
94-
float r = ringSize(mZC, eta);
95-
mRingSizesC.emplace_back(r);
87+
for (int i = 0; i <= mNumberOfRings_extra + 1; i++) {
88+
float eta = mEtaMax - i * (mEtaMax_extra - mEtaMin_extra) / mNumberOfRings_extra;
89+
float r = ringSize(mZAC_extra, eta);
90+
mRingSizes_extra.emplace_back(r);
9691
}
92+
9793
}
9894

9995
Detector::Detector(const Detector& rhs)
@@ -202,12 +198,6 @@ o2::fd3::Hit* Detector::addHit(int trackId, unsigned int detId,
202198
return &(mHits->back());
203199
}
204200

205-
void Detector::ConstructGeometry()
206-
{
207-
createMaterials();
208-
buildModules();
209-
}
210-
211201
void Detector::EndOfEvent()
212202
{
213203
Reset();
@@ -231,6 +221,12 @@ void Detector::Reset()
231221
}
232222
}
233223

224+
void Detector::ConstructGeometry()
225+
{
226+
createMaterials();
227+
buildModules();
228+
}
229+
234230
void Detector::createMaterials()
235231
{
236232
float density, as[11], zs[11], ws[11];
@@ -285,8 +281,16 @@ void Detector::buildModules()
285281
TGeoVolumeAssembly* vFD3A = buildModuleA();
286282
TGeoVolumeAssembly* vFD3C = buildModuleC();
287283

288-
vCave->AddNode(vFD3A, 1, new TGeoTranslation(0., 0., mZA));
289-
vCave->AddNode(vFD3C, 2, new TGeoTranslation(0., 0., mZC));
284+
vCave->AddNode(vFD3A, 1, new TGeoTranslation(0., 0., mZAC));
285+
vCave->AddNode(vFD3C, 2, new TGeoTranslation(0., 0., -mZAC));
286+
287+
if (mExtra) {
288+
TGeoVolumeAssembly* vFD3A_extra = buildModuleA_extra();
289+
TGeoVolumeAssembly* vFD3C_extra = buildModuleC_extra();
290+
vCave->AddNode(vFD3A_extra, 1, new TGeoTranslation(0., 0., mZAC_extra));
291+
vCave->AddNode(vFD3C_extra, 2, new TGeoTranslation(0., 0., -mZAC_extra));
292+
293+
}
290294
}
291295

292296
TGeoVolumeAssembly* Detector::buildModuleA()
@@ -297,11 +301,11 @@ TGeoVolumeAssembly* Detector::buildModuleA()
297301

298302
float dphiDeg = 360. / mNumberOfSectors;
299303

300-
for (int ir = 0; ir < mNumberOfRingsA; ir++) {
304+
for (int ir = 0; ir < mNumberOfRings; ir++) {
301305
std::string rName = "fd3_ring" + std::to_string(ir + 1);
302306
TGeoVolumeAssembly* ring = new TGeoVolumeAssembly(rName.c_str());
303-
float rmin = mRingSizesA[ir];
304-
float rmax = mRingSizesA[ir + 1];
307+
float rmin = mRingSizes[ir];
308+
float rmax = mRingSizes[ir + 1];
305309
LOG(info) << "ring" << ir << ": from " << rmin << " to " << rmax;
306310
for (int ic = 0; ic < mNumberOfSectors; ic++) {
307311
int cellId = ic + mNumberOfSectors * ir;
@@ -324,7 +328,7 @@ TGeoVolumeAssembly* Detector::buildModuleA()
324328
if (mPlateBehindA || mFullContainer) {
325329
LOG(info) << "adding container on A side";
326330
auto pmed = (TGeoMedium*)gGeoManager->GetMedium("FD3_Aluminium");
327-
auto pvol = new TGeoTube("pvol_fd3a", mRingSizesA[0], mRingSizesA[mNumberOfRingsA], mDzPlate);
331+
auto pvol = new TGeoTube("pvol_fd3a", mRingSizes[0], mRingSizes[mNumberOfRings], mDzPlate);
328332
auto pnod1 = new TGeoVolume("pnod1_FD3A", pvol, pmed);
329333
double dpz = 2. + mDzPlate / 2;
330334
mod->AddNode(pnod1, 1, new TGeoTranslation(0, 0, dpz));
@@ -345,14 +349,14 @@ TGeoVolumeAssembly* Detector::buildModuleC()
345349

346350
float dphiDeg = 360. / mNumberOfSectors;
347351

348-
for (int ir = 0; ir < mNumberOfRingsC; ir++) {
349-
std::string rName = "fd3_ring" + std::to_string(ir + 1 + mNumberOfRingsA);
352+
for (int ir = 0; ir < mNumberOfRings; ir++) {
353+
std::string rName = "fd3_ring" + std::to_string(ir + 1 + mNumberOfRings);
350354
TGeoVolumeAssembly* ring = new TGeoVolumeAssembly(rName.c_str());
351-
float rmin = mRingSizesC[ir];
352-
float rmax = mRingSizesC[ir + 1];
353-
LOG(info) << "ring" << ir + mNumberOfRingsA << ": from " << rmin << " to " << rmax;
355+
float rmin = mRingSizes[ir];
356+
float rmax = mRingSizes[ir + 1];
357+
LOG(info) << "ring" << ir + mNumberOfRings << ": from " << rmin << " to " << rmax;
354358
for (int ic = 0; ic < mNumberOfSectors; ic++) {
355-
int cellId = ic + mNumberOfSectors * (ir + mNumberOfRingsA);
359+
int cellId = ic + mNumberOfSectors * (ir + mNumberOfRings);
356360
std::string nodeName = "fd3_node" + std::to_string(cellId);
357361
float phimin = dphiDeg * ic;
358362
float phimax = dphiDeg * (ic + 1);
@@ -372,7 +376,7 @@ TGeoVolumeAssembly* Detector::buildModuleC()
372376
if (mFullContainer) {
373377
LOG(info) << "adding container on C side";
374378
auto pmed = (TGeoMedium*)gGeoManager->GetMedium("FD3_Aluminium");
375-
auto pvol = new TGeoTube("pvol_fd3c", mRingSizesC[0], mRingSizesC[mNumberOfRingsC], mDzPlate);
379+
auto pvol = new TGeoTube("pvol_fd3c", mRingSizes[0], mRingSizes[mNumberOfRings], mDzPlate);
376380
auto pnod1 = new TGeoVolume("pnod1_FD3C", pvol, pmed);
377381
auto pnod2 = new TGeoVolume("pnod2_FD3C", pvol, pmed);
378382
double dpz = mDzScint / 2 + mDzPlate / 2;
@@ -384,25 +388,92 @@ TGeoVolumeAssembly* Detector::buildModuleC()
384388
return mod;
385389
}
386390

391+
TGeoVolumeAssembly* Detector::buildModuleA_extra()
392+
{
393+
TGeoVolumeAssembly* mod = new TGeoVolumeAssembly("FD3A_extra");
394+
395+
const TGeoMedium* medium = gGeoManager->GetMedium("FD3_Scintillator");
396+
397+
float dphiDeg = 360. / mNumberOfSectors;
398+
399+
for (int ir = 0; ir < mNumberOfRings_extra; ir++) {
400+
std::string rName = "fd3_ring" + std::to_string(ir + 1 + 2 * mNumberOfRings);
401+
TGeoVolumeAssembly* ring = new TGeoVolumeAssembly(rName.c_str());
402+
float rmin = mRingSizes_extra[ir];
403+
float rmax = mRingSizes_extra[ir + 1];
404+
LOG(info) << "ring" << ir << ": from " << rmin << " to " << rmax;
405+
for (int ic = 0; ic < mNumberOfSectors; ic++) {
406+
int cellId = ic + mNumberOfSectors * (ir + 2 * mNumberOfRings);
407+
std::string nodeName = "fd3_node" + std::to_string(cellId);
408+
float phimin = dphiDeg * ic;
409+
float phimax = dphiDeg * (ic + 1);
410+
auto tbs = new TGeoTubeSeg("tbs", rmin, rmax, mDzScint, phimin, phimax);
411+
auto nod = new TGeoVolume(nodeName.c_str(), tbs, medium);
412+
if ((ir + ic) % 2 == 0) {
413+
nod->SetLineColor(kRed);
414+
} else {
415+
nod->SetLineColor(kRed - 7);
416+
}
417+
ring->AddNode(nod, cellId);
418+
}
419+
mod->AddNode(ring, ir + 1);
420+
}
421+
422+
return mod;
423+
}
424+
425+
TGeoVolumeAssembly* Detector::buildModuleC_extra()
426+
{
427+
TGeoVolumeAssembly* mod = new TGeoVolumeAssembly("FD3C_extra");
428+
429+
const TGeoMedium* medium = gGeoManager->GetMedium("FD3_Scintillator");
430+
431+
float dphiDeg = 360. / mNumberOfSectors;
432+
433+
for (int ir = 0; ir < mNumberOfRings_extra; ir++) {
434+
std::string rName = "fd3_ring" + std::to_string(ir + 1 + 2 * mNumberOfRings + mNumberOfRings_extra);
435+
TGeoVolumeAssembly* ring = new TGeoVolumeAssembly(rName.c_str());
436+
float rmin = mRingSizes_extra[ir];
437+
float rmax = mRingSizes_extra[ir + 1];
438+
LOG(info) << "ring" << ir + mNumberOfRings_extra << ": from " << rmin << " to " << rmax;
439+
for (int ic = 0; ic < mNumberOfSectors; ic++) {
440+
int cellId = ic + mNumberOfSectors * (ir + 2* mNumberOfRings + mNumberOfRings_extra);
441+
std::string nodeName = "fd3_node" + std::to_string(cellId);
442+
float phimin = dphiDeg * ic;
443+
float phimax = dphiDeg * (ic + 1);
444+
auto tbs = new TGeoTubeSeg("tbs", rmin, rmax, mDzScint, phimin, phimax);
445+
auto nod = new TGeoVolume(nodeName.c_str(), tbs, medium);
446+
if ((ir + ic) % 2 == 0) {
447+
nod->SetLineColor(kBlue);
448+
} else {
449+
nod->SetLineColor(kBlue - 7);
450+
}
451+
ring->AddNode(nod, cellId);
452+
}
453+
mod->AddNode(ring, ir + 1);
454+
}
455+
456+
return mod;
457+
}
458+
387459
void Detector::defineSensitiveVolumes()
388460
{
389461
LOG(info) << "Adding FD3 Sentitive Volumes";
390462

391463
TGeoVolume* v;
392-
TString volumeName;
393-
394-
int nCellsA = mNumberOfRingsA * mNumberOfSectors;
395-
int nCellsC = mNumberOfRingsC * mNumberOfSectors;
396464

397-
LOG(info) << "number of A rings = " << mNumberOfRingsA << " number of cells = " << nCellsA;
398-
LOG(info) << "number of C rings = " << mNumberOfRingsC << " number of cells = " << nCellsC;
465+
int nCells = 2 * mNumberOfRings * mNumberOfSectors;
466+
if (mExtra) {
467+
int nCells = nCells + 2 * mNumberOfRings_extra * mNumberOfSectors;
468+
}
399469

400-
for (int iv = 0; iv < nCellsA + nCellsC; iv++) {
401-
volumeName = "fd3_node" + std::to_string(iv);
470+
for (int iv = 0; iv < nCells; iv++) {
471+
TString volumeName = "fd3_node" + std::to_string(iv);
402472
v = gGeoManager->GetVolume(volumeName);
403473
LOG(info) << "Adding sensitive volume => " << v->GetName();
404474
AddSensitiveVolume(v);
405475
}
476+
406477
}
407478

408479
float Detector::ringSize(float z, float eta)

0 commit comments

Comments
 (0)