19#include "BDSException.hh"
20#include "BDSScorerFactory.hh"
21#include "BDSScorerInfo.hh"
22#include "BDSPSCellFluxScaledPerParticle3D.hh"
23#include "BDSPSPopulationScaled.hh"
24#include "BDSPSBLMEnergyDeposit.hh"
25#include "BDSPSCellFluxScaled3D.hh"
26#include "BDSSDFilterAnd.hh"
27#include "BDSSDFilterLogicalVolume.hh"
28#include "BDSSDFilterMaterial.hh"
29#include "BDSSDFilterPrimary.hh"
30#include "BDSSDFilterTime.hh"
31#include "BDSScorerType.hh"
32#include "BDSUtilities.hh"
34#include "G4PSCellCharge.hh"
35#include "G4PSCellCharge3D.hh"
36#include "G4PSCellFlux.hh"
37#include "G4PSCellFlux3D.hh"
38#include "BDSPSCellFlux4D.hh"
39#include "G4PSDoseDeposit.hh"
40#include "G4PSDoseDeposit3D.hh"
41#include "G4PSEnergyDeposit.hh"
42#include "G4PSEnergyDeposit3D.hh"
43#include "G4PSPopulation.hh"
44#include "G4PSPopulation3D.hh"
45#include "G4SDParticleWithEnergyFilter.hh"
48#include "G4VPrimitiveScorer.hh"
50BDSScorerFactory::BDSScorerFactory()
56 G4LogicalVolume* worldLV)
63 {primitiveScorer->SetFilter(filter);}
65 return primitiveScorer;
72 G4VPrimitiveScorer* result =
nullptr;
75 case BDSScorerType::cellcharge:
76 {result =
new G4PSCellCharge(info.
name);
break;}
77 case BDSScorerType::cellcharge3d:
78 {result =
new G4PSCellCharge3D(info.
name);
break;}
79 case BDSScorerType::depositeddose:
80 {result =
new G4PSDoseDeposit(info.
name);
break;}
81 case BDSScorerType::depositeddose3d:
82 {result =
new G4PSDoseDeposit3D(info.
name);
break;}
83 case BDSScorerType::depositedenergy:
84 {result =
new G4PSEnergyDeposit(info.
name,
"GeV");
break;}
85 case BDSScorerType::depositedenergyblm:
87 case BDSScorerType::depositedenergy3d:
88 {result =
new G4PSEnergyDeposit3D(info.
name,
"GeV");
break;}
89 case BDSScorerType::population:
91 G4PSPopulation* scorer =
new G4PSPopulation(info.
name);
92 scorer->Weighted(
true);
96 case BDSScorerType::population3d:
98 G4PSPopulation3D* scorer =
new G4PSPopulation3D(info.
name);
99 scorer->Weighted(
true);
103 case BDSScorerType::populationscaled:
105 case BDSScorerType::cellflux:
107 G4PSCellFlux* scorer =
new G4PSCellFlux(info.
name,
"percm2");
108 scorer->Weighted(
true);
112 case BDSScorerType::cellflux3d:
114 G4PSCellFlux3D* scorer =
new G4PSCellFlux3D(info.
name,
"percm2");
115 scorer->Weighted(
true);
119 case BDSScorerType::cellflux4d:
122 scorer->Weighted(
true);
126 case BDSScorerType::cellfluxscaledperparticle3d:
128 case BDSScorerType::cellfluxscaled3d:
130 case BDSScorerType::cellfluxscaled:
131 case BDSScorerType::cellfluxscaledperparticle:
143 {*unit = result->GetUnitValue();}
149 G4LogicalVolume* worldLV)
const
155 G4String particleName = info->
particle->GetParticleName();
156 auto pwkef =
new G4SDParticleWithEnergyFilter(
"particle_filter",
157 info->minimumKineticEnergy,
158 info->maximumKineticEnergy);
159 pwkef->add(particleName);
169 if (!(info->materialsToInclude.empty()))
172 info->materialsToInclude,
188 if (info->primariesOnly)
195 if (result->
size() == 0)
General exception with possible name of object and message.
Mapping from axis indices to 1D index.
Primitive scorer for energy deposition in BLMs.
Primitive scorer for cell flux in a 4D mesh.
Primitive scorer for cell flux in a 3D mesh with a conversion factor.
Primitive scorer for a 3D mesh with a conversion factor.
Primitive scorer for population in a volume with a conversion factor based on angle and kinetic energ...
Filter that applies AND to a vector of filters.
void RegisterFilter(G4VSDFilter *filterIn)
Register the filter.
size_t size() const
Accessor.
SD filter for a particular volume.
SD filter for a particular volume.
Filter for only primary particles.
Filter for time value for a sensitive detector.
BDSSDFilterAnd * CreateFilter(const G4String &name, const BDSScorerInfo *info, G4LogicalVolume *worldLV=nullptr) const
Create a combined filter with AND logic for the scorer.
G4VPrimitiveScorer * CreateScorer(const BDSScorerInfo *info, const BDSHistBinMapper *mapper, G4double *unit=nullptr, G4LogicalVolume *worldLV=nullptr)
Main function to create a scorer.
G4VPrimitiveScorer * GetAppropriateScorer(const BDSScorerInfo &info, const BDSHistBinMapper *mapper, G4double *unit=nullptr)
Construct the primitive scorer required.
Recipe class for scorer. Checks values.
BDSScorerType scorerType
Scorer type.
G4bool worldVolumeOnly
Which materials to exclude for scoring.
std::vector< G4Material * > materialsToExclude
Which materials to include for scoring.
G4String name
Scorer name.
G4String filename
Name of the conversion factor file.
G4String pathname
Path of the conversion factor file (for ambient dose)
G4ParticleDefinition * particle
Particle filter.
type underlying() const
return underlying value (can be used in switch statement)
G4bool IsFinite(G4double value, G4double tolerance=std::numeric_limits< double >::epsilon())