Sensitive detector tool which manages inactive-area LAr calib SDs.
More...
#include <InactiveSDTool.h>
|
| | InactiveSDTool (const std::string &type, const std::string &name, const IInterface *parent) |
| | Constructor.
|
| StatusCode | initialize () override final |
| | Initialize the tool.
|
| StatusCode | Gather () override final |
| | Calls down to all the SDs to pack their hits into one collection.
|
| virtual StatusCode | Gather (HitCollectionMap &) override |
| StatusCode | initializeSD () override |
| | Setup an SD in the current thread.
|
| virtual StatusCode | SetupEvent () override |
| | Beginning of an athena event.
|
| virtual StatusCode | SetupEvent (HitCollectionMap &) override |
|
| LArG4CalibSD * | makeOneSD (const std::string &name, ILArCalibCalculatorSvc *calc, const std::vector< std::string > &volumes) const |
| | Helper method to create one SD.
|
| StatusCode | assignSD (std::unique_ptr< G4VSensitiveDetector > sd, const std::vector< std::string > &volumes) const |
| | Assign SD to a list of volumes.
|
| G4VSensitiveDetector * | getSD () |
| | Retrieve the current SD.
|
| void | SetSensitiveDetector (G4LogicalVolume *, G4VSensitiveDetector *) const |
| | Method stolen from G4VUserDetectorConstruction in G4 10.2.
|
|
| StatusCode | initializeCalculators () override final |
| | Initialize Calculator Services.
|
| G4VSensitiveDetector * | makeSD () const override final |
| | Create the SD wrapper for current worker thread.
|
| void | setSD (G4VSensitiveDetector *) |
| | Set the current SD.
|
|
| static bool | matchStrings (const char *first, const char *second) |
| | Match two strings with wildcard support.
|
|
| Gaudi::Property< std::vector< std::string > > | m_barPreVolumes {this, "BarrelPreVolumes"} |
| Gaudi::Property< std::vector< std::string > > | m_barVolumes {this, "BarrelVolumes"} |
| Gaudi::Property< std::vector< std::string > > | m_ECPosInVolumes {this, "ECPosInVolumes"} |
| Gaudi::Property< std::vector< std::string > > | m_ECPosOutVolumes {this, "ECPosOutVolumes"} |
| Gaudi::Property< std::vector< std::string > > | m_ECNegInVolumes {this, "ECNegInVolumes"} |
| Gaudi::Property< std::vector< std::string > > | m_ECNegOutVolumes {this, "ECNegOutVolumes"} |
| Gaudi::Property< std::vector< std::string > > | m_HECWheelVolumes {this, "HECWheelVolumes"} |
| Gaudi::Property< std::vector< std::string > > | m_fcal1Volumes {this, "FCAL1Volumes"} |
| Gaudi::Property< std::vector< std::string > > | m_fcal2Volumes {this, "FCAL2Volumes"} |
| Gaudi::Property< std::vector< std::string > > | m_fcal3Volumes {this, "FCAL3Volumes"} |
| Gaudi::Property< std::string > | m_hitCollName {this, "HitCollectionName", "LArCalibrationHitInactive"} |
| | Hit collection name.
|
| ServiceHandle< ILArCalibCalculatorSvc > | m_embpscalc |
| ServiceHandle< ILArCalibCalculatorSvc > | m_embcalc |
| ServiceHandle< ILArCalibCalculatorSvc > | m_emepiwcalc |
| ServiceHandle< ILArCalibCalculatorSvc > | m_emeniwcalc |
| ServiceHandle< ILArCalibCalculatorSvc > | m_emepowcalc |
| ServiceHandle< ILArCalibCalculatorSvc > | m_emenowcalc |
| ServiceHandle< ILArCalibCalculatorSvc > | m_heccalc |
| ServiceHandle< ILArCalibCalculatorSvc > | m_fcal1calc |
| ServiceHandle< ILArCalibCalculatorSvc > | m_fcal2calc |
| ServiceHandle< ILArCalibCalculatorSvc > | m_fcal3calc |
| G4VSensitiveDetector * | m_SD {} |
| | The sensitive detector to which this thing corresponds.
|
Sensitive detector tool which manages inactive-area LAr calib SDs.
Design is in flux.
Definition at line 24 of file InactiveSDTool.h.
◆ InactiveSDTool()
| LArG4::InactiveSDTool::InactiveSDTool |
( |
const std::string & | type, |
|
|
const std::string & | name, |
|
|
const IInterface * | parent ) |
◆ assignSD()
| StatusCode SensitiveDetectorBase::assignSD |
( |
std::unique_ptr< G4VSensitiveDetector > | sd, |
|
|
const std::vector< std::string > & | volumes ) const |
|
protectedinherited |
Assign SD to a list of volumes.
This method supports wild card matching
Definition at line 64 of file SensitiveDetectorBase.cxx.
66{
67
68 if(msgLvl(MSG::VERBOSE))
sd->SetVerboseLevel(10);
69 else if(msgLvl(MSG::DEBUG))
sd->SetVerboseLevel(5);
70
71
72
73 auto sdMgr = G4SDManager::GetSDMpointer();
74 auto sdPtr =
sd.get();
75
76 sdMgr->AddNewDetector(
sd.release());
77
78 if(!volumes.empty()) {
79 bool gotOne = false;
80 auto logicalVolumeStore = G4LogicalVolumeStore::GetInstance();
81 for(const auto& volumeName : volumes) {
82
83
84 int numFound = 0;
85
86
87 for(auto* logVol : *logicalVolumeStore) {
88
89 ATH_MSG_VERBOSE(
"Check whether "<<logVol->GetName()<<
" belongs to the set of sensitive detectors "<<volumeName);
90 if(
matchStrings( volumeName.data(), logVol->GetName() ) ){
91 ++numFound;
93 }
94
95 }
96
97 if(numFound == 0) {
99 " not found in G4LogicalVolumeStore.");
100 }
101 else {
102 ATH_MSG_VERBOSE(
"Found " << numFound <<
" copies of LV " << volumeName <<
103 "; SD " <<
sd->GetName() <<
" assigned.");
104 gotOne = true;
105 }
106
107 }
108
109
110 if(!gotOne) {
112 " and expected at least one. Size of the volume store "<<G4LogicalVolumeStore::GetInstance()->
size() );
113 return StatusCode::FAILURE;
114 }
115 }
116
117 return StatusCode::SUCCESS;
118}
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
static bool matchStrings(const char *first, const char *second)
Match two strings with wildcard support.
void SetSensitiveDetector(G4LogicalVolume *, G4VSensitiveDetector *) const
Method stolen from G4VUserDetectorConstruction in G4 10.2.
◆ Gather() [1/2]
| StatusCode LArG4::CalibSDTool::Gather |
( |
| ) |
|
|
finaloverridevirtualinherited |
Calls down to all the SDs to pack their hits into one collection.
Reimplemented from SensitiveDetectorBase.
◆ Gather() [2/2]
|
|
inlineoverridevirtualinherited |
Reimplemented in BCMSensorSDTool, BLMSensorSDTool, CSCSensitiveDetectorCosmicsTool, CSCSensitiveDetectorTool, GenericMuonSensitiveDetectorTool, MDTSensitiveDetectorCosmicsTool, MDTSensitiveDetectorTool, MicromegasSensitiveDetectorTool, PixelSensorSDTool, RPCSensitiveDetectorCosmicsTool, RPCSensitiveDetectorTool, SctSensor_CTBTool, SctSensorSDTool, sTGCSensitiveDetectorTool, TGCSensitiveDetectorCosmicsTool, TGCSensitiveDetectorTool, TileGeoG4CalibSDTool, TileGeoG4SDTool, and TRTSensitiveDetectorTool.
Definition at line 79 of file SensitiveDetectorBase.h.
79 {
81 };
virtual StatusCode Gather() override
End of an athena event.
◆ getSD()
| G4VSensitiveDetector * SensitiveDetectorBase::getSD |
( |
| ) |
|
|
protectedinherited |
Retrieve the current SD.
In AthenaMT, this means the thread-local SD. Otherwise, it is simply the single SD.
Definition at line 120 of file SensitiveDetectorBase.cxx.
121{
122#ifdef G4MULTITHREADED
123
124 const auto tid = std::this_thread::get_id();
125
126 auto sdPair = m_sdThreadMap.find(tid);
127 if(sdPair == m_sdThreadMap.end()) return nullptr;
128 return sdPair->second;
129#else
131#endif
132}
G4VSensitiveDetector * m_SD
The sensitive detector to which this thing corresponds.
◆ initialize()
| StatusCode LArG4::CalibSDTool::initialize |
( |
| ) |
|
|
finaloverrideinherited |
◆ initializeCalculators()
| StatusCode LArG4::InactiveSDTool::initializeCalculators |
( |
| ) |
|
|
finaloverrideprivatevirtual |
◆ initializeSD()
| StatusCode SensitiveDetectorBase::initializeSD |
( |
| ) |
|
|
overrideinherited |
Setup an SD in the current thread.
Separate from the AthAlgTool initialize() method because it needs to be called once per worker thread in AthenaMT. Don't confuse this with the G4 SD method Initialize which is called at the beginning of every G4 event.
Definition at line 25 of file SensitiveDetectorBase.cxx.
26{
28
29
30
33 << (
m_noVolumes?
"true" :
"false") <<
", but LogicalVolumeNames = "
35 return StatusCode::FAILURE;
36 }
37
38
40 {
42 return StatusCode::FAILURE;
43 }
44
45
46 auto sd = std::unique_ptr<G4VSensitiveDetector>(makeSD());
47 if(!sd)
48 {
50 return StatusCode::FAILURE;
51 }
53
54
56
58 return StatusCode::SUCCESS;
59}
#define ATH_CHECK
Evaluate an expression and check for errors.
StatusCode assignSD(std::unique_ptr< G4VSensitiveDetector > sd, const std::vector< std::string > &volumes) const
Assign SD to a list of volumes.
Gaudi::Property< std::vector< std::string > > m_volumeNames
All the volumes to which this SD is assigned.
Gaudi::Property< bool > m_noVolumes
This SensitiveDetector has no volumes associated with it.
G4VSensitiveDetector * getSD()
Retrieve the current SD.
void setSD(G4VSensitiveDetector *)
Set the current SD.
◆ makeOneSD()
Helper method to create one SD.
◆ makeSD()
| G4VSensitiveDetector * LArG4::InactiveSDTool::makeSD |
( |
| ) |
const |
|
finaloverrideprivate |
Create the SD wrapper for current worker thread.
◆ matchStrings()
| bool SensitiveDetectorBase::matchStrings |
( |
const char * | first, |
|
|
const char * | second ) |
|
staticprivateinherited |
Match two strings with wildcard support.
Compares two strings character by character with optional * wildcard in the first argument
Definition at line 147 of file SensitiveDetectorBase.cxx.
148{
149
150 if (*first == '\0' && *second == '\0')
151 return true;
152
153
154
155 if(*first == '*' && *(first + 1) == '*')
157
158
159 if (*first == '*' && *(first + 1) != '\0' && *second == '\0')
160 return false;
161
162
163 if (*first == *second)
165
166
167
168
169 if (*first == '*')
171 return false;
172}
◆ setSD()
| void SensitiveDetectorBase::setSD |
( |
G4VSensitiveDetector * | sd | ) |
|
|
privateinherited |
Set the current SD.
In hive, this gets assigned as the thread-local SD.
Definition at line 134 of file SensitiveDetectorBase.cxx.
135{
136#ifdef G4MULTITHREADED
137 const auto tid = std::this_thread::get_id();
138 ATH_MSG_DEBUG(
"Creating and registering SD " << sd <<
" in thread " << tid);
139 m_sdThreadMap.insert( std::make_pair(tid, sd) );
140#else
142#endif
143}
◆ SetSensitiveDetector()
| void SensitiveDetectorBase::SetSensitiveDetector |
( |
G4LogicalVolume * | logVol, |
|
|
G4VSensitiveDetector * | aSD ) const |
|
protectedinherited |
Method stolen from G4VUserDetectorConstruction in G4 10.2.
Definition at line 174 of file SensitiveDetectorBase.cxx.
176{
177
178
179
180
181 G4VSensitiveDetector* originalSD = logVol->GetSensitiveDetector();
182 if ( originalSD == nullptr )
183 {
184 logVol->SetSensitiveDetector(aSD);
185 }
186 else
187 {
188 G4MultiSensitiveDetector* msd = dynamic_cast<G4MultiSensitiveDetector*>(originalSD);
189 if ( msd != nullptr )
190 {
191 msd->AddSD(aSD);
192 }
193 else
194 {
195
196 std::stringstream
ss;
198 const G4String msdname =
"/MultiSD_" + logVol->GetName() +
ss.str();
199 msd = new G4MultiSensitiveDetector(std::move(msdname));
200
201 G4SDManager::GetSDMpointer()->AddNewDetector(msd);
202 msd->AddSD(originalSD);
203 msd->AddSD(aSD);
204 logVol->SetSensitiveDetector(msd);
205 }
206 }
207}
◆ SetupEvent() [1/2]
| virtual StatusCode SensitiveDetectorBase::SetupEvent |
( |
| ) |
|
|
inlineoverridevirtualinherited |
◆ SetupEvent() [2/2]
|
|
inlineoverridevirtualinherited |
Reimplemented in BCMSensorSDTool, BLMSensorSDTool, CSCSensitiveDetectorCosmicsTool, CSCSensitiveDetectorTool, GenericMuonSensitiveDetectorTool, MDTSensitiveDetectorCosmicsTool, MDTSensitiveDetectorTool, MicromegasSensitiveDetectorTool, PixelSensorSDTool, RPCSensitiveDetectorCosmicsTool, RPCSensitiveDetectorTool, SctSensor_CTBTool, SctSensorSDTool, sTGCSensitiveDetectorTool, TGCSensitiveDetectorCosmicsTool, TGCSensitiveDetectorTool, TileGeoG4CalibSDTool, TileGeoG4SDTool, and TRTSensitiveDetectorTool.
Definition at line 71 of file SensitiveDetectorBase.h.
71 {
73 }
virtual StatusCode SetupEvent() override
Beginning of an athena event.
◆ m_barPreVolumes
| Gaudi::Property<std::vector<std::string> > LArG4::InactiveSDTool::m_barPreVolumes {this, "BarrelPreVolumes"} |
|
private |
◆ m_barVolumes
| Gaudi::Property<std::vector<std::string> > LArG4::InactiveSDTool::m_barVolumes {this, "BarrelVolumes"} |
|
private |
◆ m_caloDmID
| const CaloDM_ID* LArG4::CalibSDTool::m_caloDmID {nullptr} |
|
protectedinherited |
◆ m_doPID
| Gaudi::Property<G4bool> LArG4::CalibSDTool::m_doPID {this, "ParticleID", false} |
|
protectedinherited |
Are we set up to run with PID hits?
Definition at line 74 of file CalibSDTool.h.
74{this, "ParticleID", false};
◆ m_ECNegInVolumes
| Gaudi::Property<std::vector<std::string> > LArG4::InactiveSDTool::m_ECNegInVolumes {this, "ECNegInVolumes"} |
|
private |
◆ m_ECNegOutVolumes
| Gaudi::Property<std::vector<std::string> > LArG4::InactiveSDTool::m_ECNegOutVolumes {this, "ECNegOutVolumes"} |
|
private |
◆ m_ECPosInVolumes
| Gaudi::Property<std::vector<std::string> > LArG4::InactiveSDTool::m_ECPosInVolumes {this, "ECPosInVolumes"} |
|
private |
◆ m_ECPosOutVolumes
| Gaudi::Property<std::vector<std::string> > LArG4::InactiveSDTool::m_ECPosOutVolumes {this, "ECPosOutVolumes"} |
|
private |
◆ m_embcalc
Initial value:{this, "EMBCalibrationCalculator"
, "BarrelCalibrationCalculator"}
Definition at line 55 of file InactiveSDTool.h.
55 {this, "EMBCalibrationCalculator"
56 , "BarrelCalibrationCalculator"};
◆ m_embpscalc
Initial value:{this, "EMBPSCalibrationCalculator"
, "BarrelPresamplerCalibrationCalculator"}
Definition at line 53 of file InactiveSDTool.h.
53 {this, "EMBPSCalibrationCalculator"
54 , "BarrelPresamplerCalibrationCalculator"};
◆ m_emeniwcalc
Initial value:{this, "EMECNegIWCalibrationCalculator"
, "EMECNegInnerWheelCalibrationCalculator"}
Definition at line 59 of file InactiveSDTool.h.
59 {this, "EMECNegIWCalibrationCalculator"
60 , "EMECNegInnerWheelCalibrationCalculator"};
◆ m_emenowcalc
Initial value:{this, "EMECNegOWCalibrationCalculator"
, "EMECNegOuterWheelCalibrationCalculator"}
Definition at line 63 of file InactiveSDTool.h.
63 {this, "EMECNegOWCalibrationCalculator"
64 , "EMECNegOuterWheelCalibrationCalculator"};
◆ m_emepiwcalc
Initial value:{this, "EMECPosIWCalibrationCalculator"
, "EMECPosInnerWheelCalibrationCalculator"}
Definition at line 57 of file InactiveSDTool.h.
57 {this, "EMECPosIWCalibrationCalculator"
58 , "EMECPosInnerWheelCalibrationCalculator"};
◆ m_emepowcalc
Initial value:{this, "EMECPosOWCalibrationCalculator"
, "EMECPosOuterWheelCalibrationCalculator"}
Definition at line 61 of file InactiveSDTool.h.
61 {this, "EMECPosOWCalibrationCalculator"
62 , "EMECPosOuterWheelCalibrationCalculator"};
◆ m_fcal1calc
Initial value:{this, "FCAL1CalibCalculator"
, "FCAL1CalibCalculator"}
Definition at line 67 of file InactiveSDTool.h.
67 {this, "FCAL1CalibCalculator"
68 , "FCAL1CalibCalculator"};
◆ m_fcal1Volumes
| Gaudi::Property<std::vector<std::string> > LArG4::InactiveSDTool::m_fcal1Volumes {this, "FCAL1Volumes"} |
|
private |
◆ m_fcal2calc
Initial value:{this, "FCAL2CalibCalculator"
, "FCAL2CalibCalculator"}
Definition at line 69 of file InactiveSDTool.h.
69 {this, "FCAL2CalibCalculator"
70 , "FCAL2CalibCalculator"};
◆ m_fcal2Volumes
| Gaudi::Property<std::vector<std::string> > LArG4::InactiveSDTool::m_fcal2Volumes {this, "FCAL2Volumes"} |
|
private |
◆ m_fcal3calc
Initial value:{this, "FCAL3CalibCalculator"
, "FCAL3CalibCalculator"}
Definition at line 71 of file InactiveSDTool.h.
71 {this, "FCAL3CalibCalculator"
72 , "FCAL3CalibCalculator"};
◆ m_fcal3Volumes
| Gaudi::Property<std::vector<std::string> > LArG4::InactiveSDTool::m_fcal3Volumes {this, "FCAL3Volumes"} |
|
private |
◆ m_heccalc
Initial value:{this, "HECWheelInactiveCalculator"
, "HECCalibrationWheelInactiveCalculator"}
Definition at line 65 of file InactiveSDTool.h.
65 {this, "HECWheelInactiveCalculator"
66 , "HECCalibrationWheelInactiveCalculator"};
◆ m_HECWheelVolumes
| Gaudi::Property<std::vector<std::string> > LArG4::InactiveSDTool::m_HECWheelVolumes {this, "HECWheelVolumes"} |
|
private |
◆ m_hitCollName
| Gaudi::Property<std::string> LArG4::InactiveSDTool::m_hitCollName {this, "HitCollectionName", "LArCalibrationHitInactive"} |
|
private |
Hit collection name.
Definition at line 51 of file InactiveSDTool.h.
51{this, "HitCollectionName", "LArCalibrationHitInactive"};
◆ m_id_helper
◆ m_larEmID
| const LArEM_ID* LArG4::CalibSDTool::m_larEmID {nullptr} |
|
protectedinherited |
◆ m_larFcalID
| const LArFCAL_ID* LArG4::CalibSDTool::m_larFcalID {nullptr} |
|
protectedinherited |
◆ m_larHecID
| const LArHEC_ID* LArG4::CalibSDTool::m_larHecID {nullptr} |
|
protectedinherited |
◆ m_noVolumes
| Gaudi::Property<bool> SensitiveDetectorBase::m_noVolumes {this, "NoVolumes", false} |
|
protectedinherited |
This SensitiveDetector has no volumes associated with it.
Definition at line 101 of file SensitiveDetectorBase.h.
101{this, "NoVolumes", false};
◆ m_outputCollectionNames
| Gaudi::Property<std::vector<std::string> > SensitiveDetectorBase::m_outputCollectionNames {this, "OutputCollectionNames", {}} |
|
protectedinherited |
Names of all output collections written out by this SD.
Definition at line 98 of file SensitiveDetectorBase.h.
98{this, "OutputCollectionNames", {}};
◆ m_SD
| G4VSensitiveDetector* SensitiveDetectorBase::m_SD {} |
|
privateinherited |
◆ m_volumeNames
| Gaudi::Property<std::vector<std::string> > SensitiveDetectorBase::m_volumeNames {this, "LogicalVolumeNames", {}} |
|
protectedinherited |
All the volumes to which this SD is assigned.
Definition at line 96 of file SensitiveDetectorBase.h.
96{this, "LogicalVolumeNames", {}};
The documentation for this class was generated from the following file: