20#include "BDSException.hh"
21#include "BDSScorerFactory.hh"
22#include "BDSScorerInfo.hh"
23#include "BDSPSCellFluxScaledPerParticle3D.hh"
24#include "BDSPSPopulationScaled.hh"
25#include "BDSPSBLMEnergyDeposit.hh"
26#include "BDSPSCellFluxScaled3D.hh"
27#include "BDSSDFilterAnd.hh"
28#include "BDSSDFilterLogicalVolume.hh"
29#include "BDSSDFilterMaterial.hh"
30#include "BDSSDFilterPrimary.hh"
31#include "BDSSDFilterTime.hh"
32#include "BDSScorerType.hh"
33#include "BDSUtilities.hh"
35#include "G4PSCellCharge.hh"
36#include "G4PSCellCharge3D.hh"
37#include "G4PSCellFlux.hh"
38#include "G4PSCellFlux3D.hh"
39#include "BDSPSCellFlux4D.hh"
40#include "G4PSDoseDeposit.hh"
41#include "G4PSDoseDeposit3D.hh"
42#include "G4PSEnergyDeposit.hh"
43#include "G4PSEnergyDeposit3D.hh"
44#include "G4PSPopulation.hh"
45#include "G4PSPopulation3D.hh"
46#include "G4SDParticleWithEnergyFilter.hh"
49#include "G4VPrimitiveScorer.hh"
51BDSScorerFactory::BDSScorerFactory()
57 G4LogicalVolume* worldLV)
64 {primitiveScorer->SetFilter(filter);}
66 return primitiveScorer;
73 G4VPrimitiveScorer* result =
nullptr;
76 case BDSScorerType::cellcharge:
77 {result =
new G4PSCellCharge(info.
name);
break;}
78 case BDSScorerType::cellcharge3d:
79 {result =
new G4PSCellCharge3D(info.
name);
break;}
80 case BDSScorerType::depositeddose:
81 {result =
new G4PSDoseDeposit(info.
name);
break;}
82 case BDSScorerType::depositeddose3d:
83 {result =
new G4PSDoseDeposit3D(info.
name);
break;}
84 case BDSScorerType::depositedenergy:
85 {result =
new G4PSEnergyDeposit(info.
name,
"GeV");
break;}
86 case BDSScorerType::depositedenergyblm:
88 case BDSScorerType::depositedenergy3d:
89 {result =
new G4PSEnergyDeposit3D(info.
name,
"GeV");
break;}
90 case BDSScorerType::population:
92 G4PSPopulation* scorer =
new G4PSPopulation(info.
name);
93 scorer->Weighted(
true);
97 case BDSScorerType::population3d:
99 G4PSPopulation3D* scorer =
new G4PSPopulation3D(info.
name);
100 scorer->Weighted(
true);
104 case BDSScorerType::populationscaled:
106 case BDSScorerType::cellflux:
108 G4PSCellFlux* scorer =
new G4PSCellFlux(info.
name,
"percm2");
109 scorer->Weighted(
true);
113 case BDSScorerType::cellflux3d:
115 G4PSCellFlux3D* scorer =
new G4PSCellFlux3D(info.
name,
"percm2");
116 scorer->Weighted(
true);
120 case BDSScorerType::cellflux4d:
123 scorer->Weighted(
true);
127 case BDSScorerType::cellfluxscaledperparticle3d:
129 case BDSScorerType::cellfluxscaled3d:
131 case BDSScorerType::cellfluxscaled:
132 case BDSScorerType::cellfluxscaledperparticle:
144 {*unit = result->GetUnitValue();}
150 G4LogicalVolume* worldLV)
const
156 G4String particleName = info->
particle->GetParticleName();
157 auto pwkef =
new G4SDParticleWithEnergyFilter(
"particle_filter",
158 info->minimumKineticEnergy,
159 info->maximumKineticEnergy);
160 pwkef->add(particleName);
170 if (!(info->materialsToInclude.empty()))
173 info->materialsToInclude,
189 if (info->primariesOnly)
196 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())