19#include "BDSAcceleratorModel.hh"
21#include "BDSException.hh"
22#include "BDSGlobalConstants.hh"
23#include "BDSLinkDetectorConstruction.hh"
24#include "BDSParallelWorldCurvilinear.hh"
25#include "BDSParallelWorldCurvilinearBridge.hh"
26#include "BDSParallelWorldImportance.hh"
27#include "BDSParallelWorldInfo.hh"
28#include "BDSParallelWorldPlacementFields.hh"
29#include "BDSParallelWorldSampler.hh"
30#include "BDSParallelWorldUtilities.hh"
31#include "BDSParser.hh"
32#include "BDSSamplerType.hh"
33#include "BDSUtilities.hh"
35#include "parser/element.h"
36#include "parser/fastlist.h"
37#include "parser/placement.h"
39#include "G4GeometrySampler.hh"
40#include "G4ImportanceBiasing.hh"
42#include "G4ParallelWorldPhysics.hh"
43#include "G4VModularPhysicsList.hh"
44#include "G4VUserDetectorConstruction.hh"
45#include "G4VUserParallelWorld.hh"
54 std::vector<BDSParallelWorldInfo> worlds;
57 for (
const auto& pl : placements)
59 if (!pl.sequence.empty())
61 G4bool samplerWorldRequired =
false;
65 if (sType != BDSSamplerType::none)
67 samplerWorldRequired =
true;
72 worlds.push_back(info);
79 G4bool buildSamplerWorld,
80 G4bool buildPlacementFieldsWorld)
86 std::vector<G4VUserParallelWorld*> worldsRequiringPhysics;
89 if (buildSamplerWorld)
92 massWorld->RegisterParallelWorld(samplerWorld);
96 G4int samplerWorldID = massWorld->GetNumberOfParallelWorld() - 1;
97 massWorldBDS->SetSamplerWorldID(samplerWorldID);
99 acceleratorModel->RegisterParallelWorld(samplerWorld);
100 worldsRequiringPhysics.push_back(
dynamic_cast<G4VUserParallelWorld*
>(samplerWorld));
105 massWorld->RegisterParallelWorld(curvilinearWorld);
106 massWorld->RegisterParallelWorld(curvilinearBridgeWorld);
109 acceleratorModel->RegisterParallelWorld(curvilinearWorld);
110 acceleratorModel->RegisterParallelWorld(curvilinearBridgeWorld);
115 for (
const auto& info : worldInfos)
117 if (info.curvilinearWorld)
121 massWorld->RegisterParallelWorld(cLWorld);
122 massWorld->RegisterParallelWorld(cLBridgeWorld);
123 acceleratorModel->RegisterParallelWorld(cLWorld);
124 acceleratorModel->RegisterParallelWorld(cLBridgeWorld);
126 if (info.samplerWorld)
129 acceleratorModel->RegisterParallelWorld(sWorld);
130 worldsRequiringPhysics.push_back(
dynamic_cast<G4VUserParallelWorld*
>(sWorld));
131 massWorld->RegisterParallelWorld(sWorld);
141 importanceWorldGeometryFile,
142 importanceVolumeMapFile);
143 acceleratorModel->RegisterParallelWorld(importanceWorld);
144 massWorld->RegisterParallelWorld(importanceWorld);
145 worldsRequiringPhysics.push_back(
dynamic_cast<G4VUserParallelWorld*
>(importanceWorld));
149 if (buildPlacementFieldsWorld)
152 acceleratorModel->RegisterParallelWorld(placementFieldsPW);
153 massWorld->RegisterParallelWorld(placementFieldsPW);
156 return worldsRequiringPhysics;
161 std::vector<G4ParallelWorldPhysics*> result;
162 for (
auto world : worlds)
163 {result.push_back(
new G4ParallelWorldPhysics(world->GetName()));}
168 G4VModularPhysicsList* physicsList)
170 for (
auto process : processes)
171 {physicsList->RegisterPhysics(process);}
181 {
throw BDSException(__METHOD_NAME__,
"Importance sampling world not found.");}
185 G4VModularPhysicsList* physList)
190 G4GeometrySampler* pgs =
new G4GeometrySampler(importanceWorld->
GetWorldVolume(),
"neutron");
191 pgs->SetParallel(
true);
192 physList->RegisterPhysics(
new G4ImportanceBiasing(pgs,importanceWorld->GetName()));
198 G4String importanceWorldName =
"importanceWorld_main";
199 G4VUserParallelWorld* importanceWorld =
nullptr;
200 for (
auto world : worlds)
202 if (std::strcmp(world->GetName(),importanceWorldName) == 0)
203 {importanceWorld = world;
break;}
A holder class for all representations of the accelerator model created in BDSIM.
General exception with possible name of object and message.
static BDSGlobalConstants * Instance()
Access method.
Construction of the geometry in the case of a link model.
A parallel world for bridiging curvilinear volumes.
A parallel world for curvilinear coordinates.
Class that constructs a parallel importance world.
void AddIStore()
Create IStore for all importance sampling geometry cells.
G4VPhysicalVolume * GetWorldVolume()
World volume getter required in parallel world utilities.
A simple class to hold what parallel geometry is required for each sequence.
A parallel world for placement field transform shapes.
A parallel world for sampler planes.
static BDSParser * Instance()
Access method.
std::vector< GMAD::Placement > GetPlacements() const
Return the parser list of that object.
std::vector< G4ParallelWorldPhysics * > ConstructParallelWorldPhysics(const std::vector< G4VUserParallelWorld * > &worlds)
Construct the parallel physics process for each sampler world.
void RegisterSamplerPhysics(const std::vector< G4ParallelWorldPhysics * > &processes, G4VModularPhysicsList *physicsList)
Register each parallel physics process to the main physics list.
std::vector< BDSParallelWorldInfo > NumberOfExtraWorldsRequired()
void RegisterImportanceBiasing(const std::vector< G4VUserParallelWorld * > &worlds, G4VModularPhysicsList *physicsList)
Create importance geometry sampler and register importance biasing with physics list.
std::vector< G4VUserParallelWorld * > ConstructAndRegisterParallelWorlds(G4VUserDetectorConstruction *massWorld, G4bool buildSamplerWorld, G4bool buildPlacementFieldsWorld)
BDSParallelWorldImportance * GetImportanceSamplingWorld(const std::vector< G4VUserParallelWorld * > &worlds)
Get importance sampling world from list of all parallel worlds.
void AddIStore(const std::vector< G4VUserParallelWorld * > &worlds)
Get store, and prepare importance sampling for importance geometry sampler.