Skip to content

Commit aafbebf

Browse files
authored
[ALICE 3] TRK: Fix sensitive volumes definition for FT3 (#15397)
* Fix sensitive volumes name for FT3 * Removed unused variables
1 parent b9e3cd3 commit aafbebf

2 files changed

Lines changed: 81 additions & 67 deletions

File tree

Detectors/Upgrades/ALICE3/FT3/simulation/include/FT3Simulation/Detector.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,20 @@
1515
#ifndef ALICEO2_FT3_DETECTOR_H_
1616
#define ALICEO2_FT3_DETECTOR_H_
1717

18-
#include <vector> // for vector
19-
#include "DetectorsBase/GeometryManager.h" // for getSensID
18+
#include "Rtypes.h" // for Int_t, Double_t, Float_t, Bool_t, etc
19+
2020
#include "DetectorsBase/Detector.h" // for Detector
21+
#include "DetectorsBase/GeometryManager.h" // for getSensID
2122
#include "DetectorsCommonDataFormats/DetID.h" // for Detector
2223
#include "ITSMFTSimulation/Hit.h" // for Hit
23-
#include "Rtypes.h" // for Int_t, Double_t, Float_t, Bool_t, etc
24-
#include "TArrayD.h" // for TArrayD
25-
#include "TGeoManager.h" // for gGeoManager, TGeoManager (ptr only)
26-
#include "TLorentzVector.h" // for TLorentzVector
27-
#include "TVector3.h" // for TVector3
24+
25+
#include "TArrayD.h" // for TArrayD
26+
#include "TGeoManager.h" // for gGeoManager, TGeoManager (ptr only)
27+
#include "TLorentzVector.h" // for TLorentzVector
28+
#include "TVector3.h" // for TVector3
29+
30+
#include <unordered_map>
31+
#include <vector>
2832

2933
class FairVolume;
3034
class TGeoVolume;
@@ -111,8 +115,8 @@ class Detector : public o2::base::DetImpl<Detector>
111115
void buildFT3ScopingV3();
112116

113117
protected:
114-
std::vector<Int_t> mLayerID;
115118
std::array<std::vector<TString>, 2> mLayerName; // Two sets of layer names, one per direction (forward/backward)
119+
std::unordered_map<int, int> mActiveSensorMap;
116120

117121
private:
118122
/// this is transient data about track passing the sensor
@@ -145,7 +149,7 @@ class Detector : public o2::base::DetImpl<Detector>
145149

146150
template <typename Det>
147151
friend class o2::base::DetImpl;
148-
ClassDefOverride(Detector, 1);
152+
ClassDefOverride(Detector, 2);
149153
};
150154

151155
} // namespace o2::ft3

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

Lines changed: 68 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,34 @@
1212
/// \file Detector.cxx
1313
/// \brief Implementation of the Detector class
1414

15-
#include "ITSMFTSimulation/Hit.h"
16-
#include "FT3Base/GeometryTGeo.h"
1715
#include "FT3Simulation/Detector.h"
18-
#include "FT3Simulation/FT3Layer.h"
19-
#include "FT3Base/FT3BaseParam.h"
2016

2117
#include "DetectorsBase/Stack.h"
18+
#include "ITSMFTSimulation/Hit.h"
2219
#include "SimulationDataFormat/TrackReference.h"
2320

21+
#include "FT3Base/FT3BaseParam.h"
22+
#include "FT3Base/GeometryTGeo.h"
23+
#include "FT3Simulation/FT3Layer.h"
24+
2425
// FairRoot includes
25-
#include "FairDetector.h" // for FairDetector
26-
#include <fairlogger/Logger.h> // for LOG, LOG_IF
27-
#include "FairRootManager.h" // for FairRootManager
28-
#include "FairRun.h" // for FairRun
29-
#include "FairRuntimeDb.h" // for FairRuntimeDb
30-
#include "FairVolume.h" // for FairVolume
26+
#include "FairDetector.h" // for FairDetector
27+
#include "FairRootManager.h" // for FairRootManager
3128
#include "FairRootManager.h"
29+
#include "FairRun.h" // for FairRun
30+
#include "FairRuntimeDb.h" // for FairRuntimeDb
31+
#include "FairVolume.h" // for FairVolume
3232

3333
#include "TGeoManager.h" // for TGeoManager, gGeoManager
34-
#include "TGeoTube.h" // for TGeoTube
3534
#include "TGeoPcon.h" // for TGeoPcon
35+
#include "TGeoTube.h" // for TGeoTube
3636
#include "TGeoVolume.h" // for TGeoVolume, TGeoVolumeAssembly
3737
#include "TString.h" // for TString, operator+
3838
#include "TVirtualMC.h" // for gMC, TVirtualMC
3939
#include "TVirtualMCStack.h" // for TVirtualMCStack
4040

41+
#include <fairlogger/Logger.h> // for LOG, LOG_IF
42+
4143
#include <cstdio> // for NULL, snprintf
4244

4345
#define MAX_SENSORS 2000
@@ -75,7 +77,6 @@ void Detector::buildBasicFT3(const FT3BaseParam& param)
7577
const auto Layerx2X0 = param.Layerx2X0;
7678
mLayerName[IdxBackwardDisks].resize(numberOfLayers);
7779
mLayerName[IdxForwardDisks].resize(numberOfLayers);
78-
mLayerID.clear();
7980

8081
for (int direction : {IdxBackwardDisks, IdxForwardDisks}) {
8182
for (int layerNumber = 0; layerNumber < numberOfLayers; layerNumber++) {
@@ -117,7 +118,6 @@ void Detector::buildFT3V1()
117118

118119
mLayerName[IdxBackwardDisks].resize(numberOfLayers);
119120
mLayerName[IdxForwardDisks].resize(numberOfLayers);
120-
mLayerID.clear();
121121

122122
for (auto direction : {IdxBackwardDisks, IdxForwardDisks}) {
123123
for (int layerNumber = 0; layerNumber < numberOfLayers; layerNumber++) {
@@ -165,7 +165,6 @@ void Detector::buildFT3V3b()
165165

166166
mLayerName[IdxBackwardDisks].resize(numberOfLayers);
167167
mLayerName[IdxForwardDisks].resize(numberOfLayers);
168-
mLayerID.clear();
169168

170169
for (auto direction : {IdxBackwardDisks, IdxForwardDisks}) {
171170
for (int layerNumber = 0; layerNumber < numberOfLayers; layerNumber++) {
@@ -224,7 +223,6 @@ void Detector::buildFT3NewVacuumVessel()
224223

225224
mLayerName[IdxBackwardDisks].resize(numberOfLayers);
226225
mLayerName[IdxForwardDisks].resize(numberOfLayers);
227-
mLayerID.clear();
228226

229227
for (auto direction : {IdxBackwardDisks, IdxForwardDisks}) {
230228
for (int layerNumber = 0; layerNumber < numberOfLayers; layerNumber++) {
@@ -280,8 +278,6 @@ void Detector::buildFT3ScopingV3()
280278
LayerConfig{220., 20.0, 68.f, layersx2X0}};
281279
const std::array<bool, numberOfLayers> enabled{true, true, true, true, true, true}; // To enable or disable layers for debug purpose
282280

283-
mLayerID.clear();
284-
285281
for (int direction : {IdxBackwardDisks, IdxForwardDisks}) {
286282
mLayerName[direction].clear();
287283
const std::array<LayerConfig, numberOfLayers>& layerConfig = (direction == IdxBackwardDisks) ? layersConfigCSide : layersConfigASide;
@@ -330,7 +326,6 @@ void Detector::buildFT3Scoping()
330326

331327
mLayerName[IdxBackwardDisks].resize(numberOfLayers);
332328
mLayerName[IdxForwardDisks].resize(numberOfLayers);
333-
mLayerID.clear();
334329

335330
for (auto direction : {IdxBackwardDisks, IdxForwardDisks}) {
336331
for (int layerNumber = 0; layerNumber < numberOfLayers; layerNumber++) {
@@ -367,8 +362,8 @@ Detector::Detector(const Detector& rhs)
367362
/// Container for data points
368363
mHits(o2::utils::createSimVector<o2::itsmft::Hit>())
369364
{
370-
mLayerID = rhs.mLayerID;
371365
mLayerName = rhs.mLayerName;
366+
mActiveSensorMap = rhs.mActiveSensorMap;
372367
}
373368

374369
//_________________________________________________________________________________________________
@@ -399,8 +394,8 @@ Detector& Detector::operator=(const Detector& rhs)
399394
// base class assignment
400395
base::Detector::operator=(rhs);
401396

402-
mLayerID = rhs.mLayerID;
403397
mLayerName = rhs.mLayerName;
398+
mActiveSensorMap = rhs.mActiveSensorMap;
404399
mLayers = rhs.mLayers;
405400
mTrackData = rhs.mTrackData;
406401

@@ -427,11 +422,15 @@ bool Detector::ProcessHits(FairVolume* vol)
427422
return kFALSE;
428423
}
429424

430-
int lay = 0, volID = vol->getMCid();
431-
while ((lay <= mLayerID.size()) && (volID != mLayerID[lay])) {
432-
++lay;
425+
int volID = vol->getMCid();
426+
427+
auto it = mActiveSensorMap.find(volID);
428+
if (it == mActiveSensorMap.end()) {
429+
return kFALSE; // Not a sensitive volume
433430
}
434431

432+
int lay = it->second;
433+
435434
auto stack = (o2::data::Stack*)fMC->GetStack();
436435

437436
bool startHit = false, stopHit = false;
@@ -605,58 +604,69 @@ void Detector::createGeometry()
605604
A3IPvac->AddNode(volIFT3, 2, new TGeoTranslation(0., 0., 0.));
606605
vALIC->AddNode(volFT3, 2, new TGeoTranslation(0., 30., 0.));
607606
}
608-
609-
for (auto direction : {IdxBackwardDisks, IdxForwardDisks}) {
610-
std::string directionString = direction ? "Forward" : "Backward";
611-
LOG(info) << " Registering FT3 " << directionString << " LayerIDs for " << mLayers[direction].size() << " layers:";
612-
for (int iLayer = 0; iLayer < mLayers[direction].size(); iLayer++) {
613-
auto layerID = gMC ? TVirtualMC::GetMC()->VolId(Form("%s_%d_%d", GeometryTGeo::getFT3SensorPattern(), direction, iLayer)) : 0;
614-
mLayerID.push_back(layerID);
615-
LOG(info) << " " << directionString << " layer " << iLayer << " LayerID " << layerID;
616-
}
617-
}
618607
}
619608

620609
//_________________________________________________________________________________________________
621610
void Detector::defineSensitiveVolumes()
622611
{
623612
TGeoManager* geoManager = gGeoManager;
624-
TGeoVolume* v;
625613

626-
TString volumeName;
627-
LOG(info) << "Adding FT3 Sensitive Volumes";
614+
// Get the flat list of ALL volumes present in the geometry
615+
TObjArray* allVolumes = geoManager->GetListOfVolumes();
616+
int nVolumes = allVolumes->GetEntriesFast();
617+
618+
LOG(info) << "Adding FT3 Sensitive Volumes by iterating over all geometry volumes...";
628619

629620
for (int direction : {IdxBackwardDisks, IdxForwardDisks}) {
630621
for (int iLayer = 0; iLayer < getNumberOfLayers(); iLayer++) {
631-
LOG(info) << "Adding FT3 Sensitive Volume for direction " << direction << " layer " << iLayer << "/" << getNumberOfLayers();
632-
volumeName = o2::ft3::GeometryTGeo::getFT3SensorPattern() + std::to_string(iLayer);
633622
int iSens = 0;
634-
/*if (mLayers[direction][iLayer].getIsInMiddleLayer()) { // ML disks
635-
const std::string sensorName = Form("%s_%d_%d", GeometryTGeo::getFT3SensorPattern(), direction, iLayer);
636-
v = geoManager->GetVolume(sensorName.c_str());
637-
if (!v) {
638-
geoManager->GetListOfVolumes()->ls();
639-
LOG(fatal) << "Could not find volume " << sensorName << " for direction " << direction << " layer " << iLayer;
623+
624+
// Build the "signatures" (prefixes) of the names for the various layouts for this specific layer and direction:
625+
626+
// 1. Trapezoidal/Cylindrical (format: FT3Sensor_<dir>_<layer>)
627+
std::string sig1 = Form("%s_%d_%d", GeometryTGeo::getFT3SensorPattern(), direction, iLayer);
628+
629+
// 2. Segmented front/back (format: FT3Sensor_front_<layer>_<dir>_...)
630+
std::string sig2 = "FT3Sensor_front_" + std::to_string(iLayer) + "_" + std::to_string(direction);
631+
std::string sig3 = "FT3Sensor_back_" + std::to_string(iLayer) + "_" + std::to_string(direction);
632+
633+
// 3. SegmentedStave (format: FT3Sensor_<layer>_<dir>_...)
634+
// Add the trailing underscore to avoid confusing it with sig1
635+
std::string sig4 = "FT3Sensor_" + std::to_string(iLayer) + "_" + std::to_string(direction) + "_";
636+
637+
// Iterate over all existing volumes to find matches
638+
for (int i = 0; i < nVolumes; ++i) {
639+
TGeoVolume* v = (TGeoVolume*)allVolumes->At(i);
640+
std::string vName = v->GetName();
641+
642+
// Explicitly exclude the inactive silicon regions created in FT3Module
643+
if (vName.find("Inactive") != std::string::npos || vName.find("inactive") != std::string::npos) {
644+
continue;
640645
}
641-
AddSensitiveVolume(v);
642-
iSens++;
643-
} else { // OT disks*/
644-
for (int sensor_count = 0; sensor_count < MAX_SENSORS; ++sensor_count) {
645-
std::string sensor_name_front = "FT3Sensor_front_" + std::to_string(iLayer) + "_" + std::to_string(direction) + "_" + std::to_string(sensor_count);
646-
std::string sensor_name_back = "FT3Sensor_back_" + std::to_string(iLayer) + "_" + std::to_string(direction) + "_" + std::to_string(sensor_count);
647-
v = geoManager->GetVolume(sensor_name_front.c_str());
648-
if (v) {
649-
AddSensitiveVolume(v);
650-
iSens++;
646+
647+
// Check if the volume name matches one of our active sensors
648+
bool isMatch = false;
649+
if (vName == sig1) {
650+
isMatch = true; // Exact match for Trapezoidal/Cylindrical layouts
651+
} else if (vName.find(sig2) == 0 || vName.find(sig3) == 0 || vName.find(sig4) == 0) {
652+
isMatch = true; // Prefix match for Segmented and SegmentedStave layouts
651653
}
652-
v = geoManager->GetVolume(sensor_name_back.c_str());
653-
if (v) {
654+
655+
if (isMatch) {
654656
AddSensitiveVolume(v);
657+
int volID = gMC ? TVirtualMC::GetMC()->VolId(vName.c_str()) : 0;
658+
if (volID > 0) {
659+
mActiveSensorMap[volID] = iLayer;
660+
}
655661
iSens++;
656662
}
657663
}
658-
//}
659-
LOG(info) << iSens << " sensitive volumes added";
664+
665+
if (iSens == 0) {
666+
LOG(error) << "NO sensitive volume found for direction " << direction << ", layer " << iLayer;
667+
} else {
668+
LOG(info) << iSens << " sensitive volume(s) added for direction " << direction << " layer " << iLayer;
669+
}
660670
}
661671
}
662672
}

0 commit comments

Comments
 (0)