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)
90 G4bool killedParticleMassAddedToEloss = g->KilledParticlesMassAddedToEloss();
96 || g->StoreELossLinks()
97 || g->StoreELossLocal()
98 || g->StoreELossGlobal()
99 || g->StoreELossTime()
100 || g->StoreELossStepLength()
101 || g->StoreELossPreStepKineticEnergy()
102 || g->StoreELossModelID()
103 || g->StoreTrajectory()
104 || g->StoreELossPhysicsProcesses();
107 || g->StoreCollimatorInfo()
108 || g->StoreCollimatorHits()
109 || g->StoreCollimatorHitsLinks();
116 filters[
"primary_or_ion"] = primaryOrIon;
123 filters[
"primary_or_ion_aper_min_ke"] = primaryIonAperMinKE;
133 filters[
"primary_or_ion_coll_min_ke"] = primaryIonCollMinKE;
138 G4SDManager* SDMan = G4SDManager::GetSDMpointer();
179 G4VSDFilter* filterA =
nullptr;
182 {filterA =
filters[
"aper_min_ke"];}
186 {filterA =
filters[
"primary_or_ion_aper_min_ke"];}
188 {filterA =
filters[
"primary_or_ion"];}
189 else if (applyApertureImpactsKEFilter)
190 {filterA =
filters[
"primary_aper_min_ke"];}
192 {filterA =
filters[
"primary"];}
196#if G4VERSION_NUMBER > 1029
198 G4MultiSensitiveDetector* wcsd =
new G4MultiSensitiveDetector(
"world_complete");
199 SDMan->AddNewDetector(wcsd);
204 G4MultiSensitiveDetector* acsd =
new G4MultiSensitiveDetector(
"aperture_complete");
205 SDMan->AddNewDetector(acsd);
214 collimatorCompleteSD->AddSD(collimatorSD);
216 G4VSDFilter* filter =
nullptr;
219 {filter =
filters[
"coll_min_ke"];}
223 {filter =
filters[
"primary_or_ion_coll_min_ke"];}
225 {filter =
filters[
"primary_or_ion"];}
226 else if (applyCollimatorHitsKEFilter)
227 {filter =
filters[
"primary_coll_min_ke"];}
234 collimatorSD->SetFilter(filter);
235 SDMan->AddNewDetector(collimatorSD);
236 SDMan->AddNewDetector(collimatorCompleteSD);
240 thinThingSD->SetFilter(
filters[
"primary"]);
241 SDMan->AddNewDetector(thinThingSD);
246 wireCompleteSD->AddSD(thinThingSD);
250 G4bool applyOptions)
const
252 G4VSensitiveDetector* result =
nullptr;
255 case BDSSDType::samplerplane:
257 case BDSSDType::samplercylinder:
259 case BDSSDType::samplerlink:
261 case BDSSDType::terminator:
263 case BDSSDType::energydep:
271 case BDSSDType::energydepvacuum:
279 case BDSSDType::energydeptunnel:
287 case BDSSDType::energydepworld:
295 case BDSSDType::worldexit:
297 case BDSSDType::worldcomplete:
298#if G4VERSION_NUMBER > 1029
301 {result =
nullptr;
break;}
303 case BDSSDType::energydepworldcontents:
311 case BDSSDType::collimator:
312 {result = collimatorSD;
break;}
313 case BDSSDType::collimatorcomplete:
320 {result = collimatorCompleteSD;}
325 {result = collimatorCompleteSD;}
328 case BDSSDType::apertureimpacts:
336 case BDSSDType::aperturecomplete:
338#if G4VERSION_NUMBER > 1029
357 case BDSSDType::thinthing:
358 {result = thinThingSD;
break;}
359 case BDSSDType::wirecomplete:
364 ?
static_cast<G4VSensitiveDetector*
>(wireCompleteSD)
365 :
static_cast<G4VSensitiveDetector*
>(thinThingSD);
368 {result = wireCompleteSD;}
372 {result =
nullptr;
break;}
382 G4String primitivePartOnly = nameIn;
383 auto search = nameIn.rfind(
"/");
384 if (search != std::string::npos)
385 {primitivePartOnly = nameIn.substr(search+1);}
391 const std::vector<G4double>* units)
395 if (units->size() != namesIn.size())
396 {
throw BDSException(__METHOD_NAME__,
"mismatching size of names and units.");}
397 for (G4int i = 0; i < (G4int)namesIn.size(); i++)
402 for (
const auto& name : namesIn)
415 G4SDManager* SDMan = G4SDManager::GetSDMpointer();
421 for (
const auto& IDAndSet : samplerFilterIDtoPDGSetIn)
423 G4String samplerName =
"plane_with_PDG_set_" + std::to_string(IDAndSet.first);
425 extraSamplerWithFilterNamesComplete.emplace_back(samplerName);
426 auto filter =
new BDSSDFilterPDGIDSet(
"pdgid_set_number_"+std::to_string(IDAndSet.first), IDAndSet.second);
427 aSampler->SetFilter(filter);
428 extraSamplersWithFilters[(G4int)IDAndSet.first] = aSampler;
429 extraSamplerFilters[(G4int)IDAndSet.first] = filter;
430 SDMan->AddNewDetector(aSampler);
433 for (
const auto& IDAndSet : samplerFilterIDtoPDGSetIn)
435 G4String samplerName =
"cylinder_with_PDG_set_" + std::to_string(IDAndSet.first);
437 extraSamplerCylinderWithFilterNamesComplete.emplace_back(samplerName);
439 aSampler->SetFilter(extraSamplerFilters[(G4int)IDAndSet.first] );
440 extraSamplerCylindersWithFilters[(G4int)IDAndSet.first] = aSampler;
441 SDMan->AddNewDetector(aSampler);
444 for (
const auto& IDAndSet : samplerFilterIDtoPDGSetIn)
446 G4String samplerName =
"sphere_with_PDG_set_" + std::to_string(IDAndSet.first);
448 extraSamplerSphereWithFilterNamesComplete.emplace_back(samplerName);
450 aSampler->SetFilter(extraSamplerFilters[(G4int)IDAndSet.first] );
451 extraSamplerSpheresWithFilters[(G4int)IDAndSet.first] = aSampler;
452 SDMan->AddNewDetector(aSampler);
458 auto search = extraSamplersWithFilters.find(ID);
459 return search != extraSamplersWithFilters.end() ? search->second :
nullptr;
464 auto search = extraSamplerCylindersWithFilters.find(ID);
465 return search != extraSamplerCylindersWithFilters.end() ? search->second :
nullptr;
470 auto search = extraSamplerSpheresWithFilters.find(ID);
471 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)