ATLAS Offline Software
Loading...
Searching...
No Matches
LArG4::H62004CalibSDTool Class Reference

Tool base class for LAr H6 2004 calibration SD tools. More...

#include <H62004CalibSDTool.h>

Inheritance diagram for LArG4::H62004CalibSDTool:
Collaboration diagram for LArG4::H62004CalibSDTool:

Public Member Functions

 H62004CalibSDTool (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

Protected Member Functions

LArG4CalibSDmakeOneSD (const std::string &name, ILArCalibCalculatorSvc *calc, const std::vector< std::string > &volumes) const
 Override helper method to create one SD.
virtual StatusCode initializeCalculators ()
 Initialize Calculator Services.
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.

Protected Attributes

Gaudi::Property< std::vector< std::string > > m_volumeNames {this, "LogicalVolumeNames", {}}
 All the volumes to which this SD is assigned.
Gaudi::Property< std::vector< std::string > > m_outputCollectionNames {this, "OutputCollectionNames", {}}
 Names of all output collections written out by this SD.
Gaudi::Property< bool > m_noVolumes {this, "NoVolumes", false}
 This SensitiveDetector has no volumes associated with it.
configuration properties
Gaudi::Property< G4bool > m_doPID {this, "ParticleID", false}
 Are we set up to run with PID hits?
Calo identifier helpers
const LArEM_IDm_larEmID {nullptr}
const LArFCAL_IDm_larFcalID {nullptr}
const LArHEC_IDm_larHecID {nullptr}
const CaloDM_IDm_caloDmID {nullptr}
const AtlasDetectorIDm_id_helper {nullptr}

Private Member Functions

void setSD (G4VSensitiveDetector *)
 Set the current SD.

Static Private Member Functions

static bool matchStrings (const char *first, const char *second)
 Match two strings with wildcard support.

Private Attributes

G4VSensitiveDetector * m_SD {}
 The sensitive detector to which this thing corresponds.

Detailed Description

Tool base class for LAr H6 2004 calibration SD tools.

This tool overrides the SD creation from CalibSDTool to create the custom LArG4H62004CalibSD objects.

See LArG4::CalibSDTool documentation for more details.

Author
Steve Farrell Steve.nosp@m.n.Fa.nosp@m.rrell.nosp@m.@cer.nosp@m.n.ch

Definition at line 24 of file H62004CalibSDTool.h.

Constructor & Destructor Documentation

◆ H62004CalibSDTool()

LArG4::H62004CalibSDTool::H62004CalibSDTool ( const std::string & type,
const std::string & name,
const IInterface * parent )

Constructor.

Member Function Documentation

◆ 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 // Propagate verbosity setting to the SD
68 if(msgLvl(MSG::VERBOSE)) sd->SetVerboseLevel(10);
69 else if(msgLvl(MSG::DEBUG)) sd->SetVerboseLevel(5);
70
71 // Add the sensitive detector to the SD manager in G4 for SDs,
72 // even if it has no volumes associated to it.
73 auto sdMgr = G4SDManager::GetSDMpointer();
74 auto sdPtr = sd.get();
75 // SDManager is now the SD owner
76 //for later use
77 auto sdName = sd->GetName();
78 sdMgr->AddNewDetector(sd.release());
79
80 if(!volumes.empty()) {
81 bool gotOne = false;
82 auto logicalVolumeStore = G4LogicalVolumeStore::GetInstance();
83 for(const auto& volumeName : volumes) {
84 // Keep track of how many volumes we find with this name string.
85 // We allow for multiple matches.
86 int numFound = 0;
87
88 // Find volumes with this name
89 for(auto* logVol : *logicalVolumeStore) {
90
91 ATH_MSG_VERBOSE("Check whether "<<logVol->GetName()<<" belongs to the set of sensitive detectors "<<volumeName);
92 if( matchStrings( volumeName.data(), logVol->GetName() ) ){
93 ++numFound;
94 SetSensitiveDetector(logVol, sdPtr);
95 }
96
97 }
98 // Warn if no volumes were found
99 if(numFound == 0) {
100 ATH_MSG_WARNING("Volume " << volumeName <<
101 " not found in G4LogicalVolumeStore.");
102 }
103 else {
104 ATH_MSG_VERBOSE("Found " << numFound << " copies of LV " << volumeName <<
105 "; SD " << sdName << " assigned.");
106 gotOne = true;
107 }
108
109 }
110
111 // Abort if we have failed to assign any volume
112 if(!gotOne) {
113 ATH_MSG_ERROR( "Failed to assign *any* volume to SD " << name() <<
114 " and expected at least one. Size of the volume store "<<G4LogicalVolumeStore::GetInstance()->size() );
115 return StatusCode::FAILURE;
116 }
117 }
118
119 return StatusCode::SUCCESS;
120}
#define ATH_MSG_ERROR(x)
#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]

◆ 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 122 of file SensitiveDetectorBase.cxx.

123{
124#ifdef G4MULTITHREADED
125 // Get current thread-ID
126 const auto tid = std::this_thread::get_id();
127 // Retrieve it from the SD map
128 auto sdPair = m_sdThreadMap.find(tid);
129 if(sdPair == m_sdThreadMap.end()) return nullptr;
130 return sdPair->second;
131#else
132 return m_SD;
133#endif
134}
G4VSensitiveDetector * m_SD
The sensitive detector to which this thing corresponds.

◆ initialize()

StatusCode LArG4::CalibSDTool::initialize ( )
finaloverrideinherited

Initialize the tool.

◆ initializeCalculators()

virtual StatusCode LArG4::CalibSDTool::initializeCalculators ( )
inlineprotectedvirtualinherited

Initialize Calculator Services.

Reimplemented in LArG4::ActiveSDTool, LArG4::DeadSDTool, LArG4::H62004ActiveSDTool, LArG4::H62004DeadSDTool, LArG4::H62004InactiveSDTool, and LArG4::InactiveSDTool.

Definition at line 61 of file CalibSDTool.h.

61{ return StatusCode::SUCCESS; }

◆ 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{
27 ATH_MSG_VERBOSE( name() << "::initializeSD()" );
28
29 // Sanity check for volume configuration problems.
30 // It would be better to have a more robust solution for this.
31 if(m_volumeNames.empty() != m_noVolumes) {
32 ATH_MSG_ERROR("Initializing SD from " << name() << ", NoVolumes = "
33 << (m_noVolumes? "true" : "false") << ", but LogicalVolumeNames = "
34 << m_volumeNames.value());
35 return StatusCode::FAILURE;
36 }
37
38 // Make sure SD isn't already registered
39 if(getSD())
40 {
41 ATH_MSG_ERROR("Trying to create a SD which already exists!");
42 return StatusCode::FAILURE;
43 }
44
45 // Make the SD stored by this tool
46 auto sd = std::unique_ptr<G4VSensitiveDetector>(makeSD());
47 if(!sd)
48 {
49 ATH_MSG_ERROR("Failed to create SD!");
50 return StatusCode::FAILURE;
51 }
52 setSD(sd.get());
53
54 // Assign the SD to our list of volumes
55 ATH_CHECK( assignSD( std::move(sd), m_volumeNames.value() ) );
56
57 ATH_MSG_DEBUG( "Initialized and added SD " << name() );
58 return StatusCode::SUCCESS;
59}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
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()

LArG4CalibSD * LArG4::H62004CalibSDTool::makeOneSD ( const std::string & name,
ILArCalibCalculatorSvc * calc,
const std::vector< std::string > & volumes ) const
protected

Override helper method to create one SD.

◆ 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 149 of file SensitiveDetectorBase.cxx.

150{
151 // If we reach at the end of both strings, we are done
152 if (*first == '\0' && *second == '\0')
153 return true;
154
155 // If there are consecutive '*' present in the first string
156 // advance to the next character
157 if(*first == '*' && *(first + 1) == '*')
158 return matchStrings(first + 1, second);
159
160 // Make sure that the characters after '*' are present in second string.
161 if (*first == '*' && *(first + 1) != '\0' && *second == '\0')
162 return false;
163
164 // If the current characters of both strings match
165 if (*first == *second)
166 return matchStrings(first + 1, second + 1);
167
168 // If there is *, then there are two possibilities
169 // a) We consider current character of second string
170 // b) We ignore current character of second string.
171 if (*first == '*')
172 return matchStrings(first + 1, second) || matchStrings(first, second + 1);
173 return false;
174}

◆ setSD()

void SensitiveDetectorBase::setSD ( G4VSensitiveDetector * sd)
privateinherited

Set the current SD.

In hive, this gets assigned as the thread-local SD.

Definition at line 136 of file SensitiveDetectorBase.cxx.

137{
138#ifdef G4MULTITHREADED
139 const auto tid = std::this_thread::get_id();
140 ATH_MSG_DEBUG("Creating and registering SD " << sd << " in thread " << tid);
141 m_sdThreadMap.insert( std::make_pair(tid, sd) );
142#else
143 m_SD = sd;
144#endif
145}

◆ SetSensitiveDetector()

void SensitiveDetectorBase::SetSensitiveDetector ( G4LogicalVolume * logVol,
G4VSensitiveDetector * aSD ) const
protectedinherited

Method stolen from G4VUserDetectorConstruction in G4 10.2.

Definition at line 176 of file SensitiveDetectorBase.cxx.

178{
179 // New Logic: allow for "multiple" SDs being attached to a single LV.
180 // To do that we use a special proxy SD called G4MultiSensitiveDetector
181
182 // Get existing SD if already set and check if it is of the special type
183 G4VSensitiveDetector* originalSD = logVol->GetSensitiveDetector();
184 if ( originalSD == nullptr )
185 {
186 logVol->SetSensitiveDetector(aSD);
187 }
188 else
189 {
190 G4MultiSensitiveDetector* msd = dynamic_cast<G4MultiSensitiveDetector*>(originalSD);
191 if ( msd != nullptr )
192 {
193 msd->AddSD(aSD);
194 }
195 else
196 {
197 // Construct a unique name using the volume address
198 std::stringstream ss;
200 const G4String msdname = "/MultiSD_" + logVol->GetName() + ss.str();
201 msd = new G4MultiSensitiveDetector(std::move(msdname));
202 // We need to register the proxy to have correct handling of IDs
203 G4SDManager::GetSDMpointer()->AddNewDetector(msd);
204 msd->AddSD(originalSD);
205 msd->AddSD(aSD);
206 logVol->SetSensitiveDetector(msd);
207 }
208 }
209}
static Double_t ss

◆ SetupEvent() [1/2]

virtual StatusCode SensitiveDetectorBase::SetupEvent ( )
inlineoverridevirtualinherited

Beginning of an athena event.

This is where collection initialization should happen. If we are using a WriteHandle, then this could be empty.

Reimplemented in AFP_SensitiveDetectorTool, AFP_SiDSensitiveDetectorTool, AFP_TDSensitiveDetectorTool, ALFA_SensitiveDetectorTool, CaloCellContainerSDTool, and MuonWallSDTool.

Definition at line 70 of file SensitiveDetectorBase.h.

70{ return StatusCode::SUCCESS; }

◆ SetupEvent() [2/2]

Member Data Documentation

◆ m_caloDmID

const CaloDM_ID* LArG4::CalibSDTool::m_caloDmID {nullptr}
protectedinherited

Definition at line 83 of file CalibSDTool.h.

83{nullptr};

◆ 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_id_helper

const AtlasDetectorID* LArG4::CalibSDTool::m_id_helper {nullptr}
protectedinherited

Definition at line 84 of file CalibSDTool.h.

84{nullptr};

◆ m_larEmID

const LArEM_ID* LArG4::CalibSDTool::m_larEmID {nullptr}
protectedinherited

Definition at line 80 of file CalibSDTool.h.

80{nullptr};

◆ m_larFcalID

const LArFCAL_ID* LArG4::CalibSDTool::m_larFcalID {nullptr}
protectedinherited

Definition at line 81 of file CalibSDTool.h.

81{nullptr};

◆ m_larHecID

const LArHEC_ID* LArG4::CalibSDTool::m_larHecID {nullptr}
protectedinherited

Definition at line 82 of file CalibSDTool.h.

82{nullptr};

◆ 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

The sensitive detector to which this thing corresponds.

Definition at line 125 of file SensitiveDetectorBase.h.

125{};

◆ 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: