20#include "BDSException.hh"
21#include "BDSGlobalConstants.hh"
22#include "BDSMultiSensitiveDetectorOrdered.hh"
23#include "BDSSensitiveDetector.hh"
24#include "BDSSDApertureImpacts.hh"
25#include "BDSSDCollimator.hh"
26#include "BDSSDEnergyDeposition.hh"
27#include "BDSSDEnergyDepositionGlobal.hh"
28#include "BDSSDFilterIon.hh"
29#include "BDSSDFilterOr.hh"
30#include "BDSSDFilterPDGIDSet.hh"
31#include "BDSSDFilterPrimary.hh"
32#include "BDSSDManager.hh"
33#include "BDSSDSampler.hh"
34#include "BDSSDSamplerCylinder.hh"
35#include "BDSSDSamplerSphere.hh"
36#include "BDSSDSamplerLink.hh"
37#include "BDSSDThinThing.hh"
38#include "BDSSDType.hh"
39#include "BDSSDTerminator.hh"
40#include "BDSSDVolumeExit.hh"
42#include "G4SDKineticEnergyFilter.hh"
43#include "G4SDManager.hh"
44#include "G4Version.hh"
46#if G4VERSION_NUMBER > 1029
47#include "G4MultiSensitiveDetector.hh"
65BDSSDManager::~BDSSDManager()
72 for (
auto& kv : extraSamplerFilters)
89 G4bool killedParticleMassAddedToEloss = g->KilledParticlesMassAddedToEloss();
95 || g->StoreELossLinks()
96 || g->StoreELossLocal()
97 || g->StoreELossGlobal()
98 || g->StoreELossTime()
99 || g->StoreELossStepLength()
100 || g->StoreELossPreStepKineticEnergy()
101 || g->StoreELossModelID()
102 || g->StoreTrajectory()
103 || g->StoreELossPhysicsProcesses();
106 || g->StoreCollimatorInfo()
107 || g->StoreCollimatorHits()
108 || g->StoreCollimatorHitsLinks();
115 filters[
"primary_or_ion"] = primaryOrIon;
122 filters[
"primary_or_ion_aper_min_ke"] = primaryIonAperMinKE;
132 filters[
"primary_or_ion_coll_min_ke"] = primaryIonCollMinKE;
137 G4SDManager* SDMan = G4SDManager::GetSDMpointer();
178 G4VSDFilter* filterA =
nullptr;
181 {filterA =
filters[
"aper_min_ke"];}
185 {filterA =
filters[
"primary_or_ion_aper_min_ke"];}
187 {filterA =
filters[
"primary_or_ion"];}
188 else if (applyApertureImpactsKEFilter)
189 {filterA =
filters[
"primary_aper_min_ke"];}
191 {filterA =
filters[
"primary"];}
195#if G4VERSION_NUMBER > 1029
197 G4MultiSensitiveDetector* wcsd =
new G4MultiSensitiveDetector(
"world_complete");
198 SDMan->AddNewDetector(wcsd);
203 G4MultiSensitiveDetector* acsd =
new G4MultiSensitiveDetector(
"aperture_complete");
204 SDMan->AddNewDetector(acsd);
213 collimatorCompleteSD->AddSD(collimatorSD);
215 G4VSDFilter* filter =
nullptr;
218 {filter =
filters[
"coll_min_ke"];}
222 {filter =
filters[
"primary_or_ion_coll_min_ke"];}
224 {filter =
filters[
"primary_or_ion"];}
225 else if (applyCollimatorHitsKEFilter)
226 {filter =
filters[
"primary_coll_min_ke"];}
233 collimatorSD->SetFilter(filter);
234 SDMan->AddNewDetector(collimatorSD);
235 SDMan->AddNewDetector(collimatorCompleteSD);
239 thinThingSD->SetFilter(
filters[
"primary"]);
240 SDMan->AddNewDetector(thinThingSD);
245 wireCompleteSD->AddSD(thinThingSD);
249 G4bool applyOptions)
const
251 G4VSensitiveDetector* result =
nullptr;
254 case BDSSDType::samplerplane:
256 case BDSSDType::samplercylinder:
258 case BDSSDType::samplerlink:
260 case BDSSDType::terminator:
262 case BDSSDType::energydep:
270 case BDSSDType::energydepvacuum:
278 case BDSSDType::energydeptunnel:
286 case BDSSDType::energydepworld:
294 case BDSSDType::worldexit:
296 case BDSSDType::worldcomplete:
297#if G4VERSION_NUMBER > 1029
300 {result =
nullptr;
break;}
302 case BDSSDType::energydepworldcontents:
310 case BDSSDType::collimator:
311 {result = collimatorSD;
break;}
312 case BDSSDType::collimatorcomplete:
319 {result = collimatorCompleteSD;}
324 {result = collimatorCompleteSD;}
327 case BDSSDType::apertureimpacts:
335 case BDSSDType::aperturecomplete:
337#if G4VERSION_NUMBER > 1029
356 case BDSSDType::thinthing:
357 {result = thinThingSD;
break;}
358 case BDSSDType::wirecomplete:
363 ?
static_cast<G4VSensitiveDetector*
>(wireCompleteSD)
364 :
static_cast<G4VSensitiveDetector*
>(thinThingSD);
367 {result = wireCompleteSD;}
371 {result =
nullptr;
break;}
381 G4String primitivePartOnly = nameIn;
382 auto search = nameIn.rfind(
"/");
383 if (search != std::string::npos)
384 {primitivePartOnly = nameIn.substr(search+1);}
390 const std::vector<G4double>* units)
394 if (units->size() != namesIn.size())
395 {
throw BDSException(__METHOD_NAME__,
"mismatching size of names and units.");}
396 for (G4int i = 0; i < (G4int)namesIn.size(); i++)
401 for (
const auto& name : namesIn)
414 G4SDManager* SDMan = G4SDManager::GetSDMpointer();
420 for (
const auto& IDAndSet : samplerFilterIDtoPDGSetIn)
422 G4String samplerName =
"plane_with_PDG_set_" + std::to_string(IDAndSet.first);
424 extraSamplerWithFilterNamesComplete.emplace_back(samplerName);
425 auto filter =
new BDSSDFilterPDGIDSet(
"pdgid_set_number_"+std::to_string(IDAndSet.first), IDAndSet.second);
426 aSampler->SetFilter(filter);
427 extraSamplersWithFilters[(G4int)IDAndSet.first] = aSampler;
428 extraSamplerFilters[(G4int)IDAndSet.first] = filter;
429 SDMan->AddNewDetector(aSampler);
432 for (
const auto& IDAndSet : samplerFilterIDtoPDGSetIn)
434 G4String samplerName =
"cylinder_with_PDG_set_" + std::to_string(IDAndSet.first);
436 extraSamplerCylinderWithFilterNamesComplete.emplace_back(samplerName);
438 aSampler->SetFilter(extraSamplerFilters[(G4int)IDAndSet.first] );
439 extraSamplerCylindersWithFilters[(G4int)IDAndSet.first] = aSampler;
440 SDMan->AddNewDetector(aSampler);
443 for (
const auto& IDAndSet : samplerFilterIDtoPDGSetIn)
445 G4String samplerName =
"sphere_with_PDG_set_" + std::to_string(IDAndSet.first);
447 extraSamplerSphereWithFilterNamesComplete.emplace_back(samplerName);
449 aSampler->SetFilter(extraSamplerFilters[(G4int)IDAndSet.first] );
450 extraSamplerSpheresWithFilters[(G4int)IDAndSet.first] = aSampler;
451 SDMan->AddNewDetector(aSampler);
457 auto search = extraSamplersWithFilters.find(ID);
458 return search != extraSamplersWithFilters.end() ? search->second :
nullptr;
463 auto search = extraSamplerCylindersWithFilters.find(ID);
464 return search != extraSamplerCylindersWithFilters.end() ? search->second :
nullptr;
469 auto search = extraSamplerSpheresWithFilters.find(ID);
470 return search != extraSamplerSpheresWithFilters.end() ? search->second :
nullptr;
General exception with possible name of object and message.
A class that holds global options and constants.
static BDSGlobalConstants * Instance()
Access method.
BDS::TrajectoryOptions StoreTrajectoryOptions() const
options that require some implementation.
G4bool UseImportanceSampling() const
Is importance sampling being used.
Registry / map of components for tracker linkage.
Modified G4MultiSensitiveDetector that retains order and passes hits in sequence.
Generates BDSHitsEnergyDepositions from step information - uses curvilinear coords.
The sensitive detector class that provides sensitivity to collimators instances.
Generates BDSHitsEnergyDepositionGlobal from step information.
Generates BDSHitsEnergyDepositions from step information - uses curvilinear coords.
Filter that applies OR to a vector of filters.
void RegisterFilter(G4VSDFilter *filterIn)
Register the filter.
Filter for a set of PDG IDs (ints).
Filter for only primary particles.
A singleton class that holds all required sensitive detector class instances.
G4double collimatorHitsMinimumKE
Cache of global constant option.
BDSSDManager()
Private default constructor for singleton.
BDSSDSamplerSphere * samplerSphere
SD instance.
G4bool storeCollimatorHitsAll
Cache of global constant option.
std::map< G4String, G4VSDFilter * > filters
Map of all filters used. This class owns a single instance of each.
BDSSDTerminator * terminator
SD instance.
BDSSDSamplerCylinder * SamplerCylinderWithFilter(G4int ID) const
Access the relevant SD for a given particle filter set ID. It will return nullptr if the ID is invali...
G4bool generateCollimatorHits
Cache of global constant option.
BDSSDVolumeExit * worldExit
SD instance.
G4bool generateELossVacuumHits
Cache of global constant option.
BDSSDEnergyDepositionGlobal * energyDepositionWorldContents
SD instance.
void RegisterPrimitiveScorerName(const G4String &nameIn, G4double unit=1.0)
BDSSDApertureImpacts * apertureImpacts
SD instance.
void ConstructSamplerSDsForParticleSets(const std::map< int, std::set< int > > &samplerFilterIDtoPDGSetIn)
G4bool generateELossWorldContents
Cache of global constant option.
G4bool generateELossTunnelHits
Cache of global constant option.
BDSSDSamplerLink * samplerLink
SD instance.
G4bool storeELossWorld
Cache of global constant option.
BDSSDSamplerSphere * SamplerSphereWithFilter(G4int ID) const
Access the relevant SD for a given particle filter set ID. It will return nullptr if the ID is invali...
BDSSDEnergyDeposition * energyDeposition
SD instance.
void RegisterPrimitiveScorerNames(const std::vector< G4String > &namesIn, const std::vector< G4double > *units=nullptr)
Loop over a vector and apply above single name function.
G4VSensitiveDetector * worldCompleteSD
SD instance.
G4bool storeApertureImpactsIons
Cache of global constant option.
G4VSensitiveDetector * apertureCompleteSD
SD instance.
G4bool storeApertureImpactsAll
Cache of global constant option.
BDSSDEnergyDeposition * energyDepositionTunnel
SD instance.
BDSSDSampler * samplerPlane
SD instance.
G4bool generateELossHits
Cache of global constant option.
G4VSensitiveDetector * SensitiveDetector(const BDSSDType sdType, G4bool applyOptions=false) const
BDSSDSamplerCylinder * samplerCylinder
SD instance.
std::map< G4String, G4double > primitiveScorerNameToUnit
Map of primitive scorer names to units.
BDSSDSampler * SamplerPlaneWithFilter(G4int ID) const
Access the relevant SD for a given particle filter set ID. It will return nullptr if the ID is invali...
G4bool generateApertureImpacts
Cache of global constant option.
G4bool storeCollimatorHitsIons
Cache of global constant option.
BDSSDEnergyDeposition * energyDepositionFull
SD instance.
G4double apertureImpactsMinimumKE
Cache of global constant option.
std::vector< G4String > primitiveScorerNamesComplete
Vector of complete (including mesh name) primitive scorer names.
G4bool storeELossExtras
Cache of global constant option.
std::vector< G4String > primitiveScorerNames
Just the primitive scorer part of the name.
void SetLinkRegistry(BDSLinkRegistry *registry)
If samplerLink member exists, set the registry to look up links for that SD.
BDSSDEnergyDepositionGlobal * energyDepositionWorld
SD instance.
BDSSDEnergyDeposition * energyDepositionVacuum
SD instance.
The sensitive detector class that provides sensitivity to BDSSamplerCylinder instances.
The sensitive detector class that provides sensitivity to BDSSamplerLink instances.
void SetLinkRegistry(BDSLinkRegistry *registryIn)
Update cached pointer of link registry.
The sensitive detector class that provides sensitivity to BDSSamplerSphere instances.
The sensitive detector class that provides sensitivity to BDSSampler instances.
Sensitivity that measures primary particle turns for terminator.
The sensitive detector class that provides sensitivity to record thin thing hits.
Generates BDSHitEnergyDepositionGlobals if a particle is leaving a volume.
Improve type-safety of native enum data type in C++.
type underlying() const
return underlying value (can be used in switch statement)