geant events for multiple scattering
This commit is contained in:
@@ -54,10 +54,27 @@ private:
|
||||
class SceneImpl *m_Owner;
|
||||
};
|
||||
|
||||
static void CheckGeant4Environment() {
|
||||
static bool checked = false;
|
||||
if (checked) return;
|
||||
checked = true;
|
||||
if (!std::getenv("G4ENSDFSTATEDATA")) {
|
||||
std::cerr << "********************************************************" << std::endl;
|
||||
std::cerr << " WARNING: Geant4 environment variables are not set!" << std::endl;
|
||||
std::cerr << " Please activate the environment before running:" << std::endl;
|
||||
std::cerr << " micromamba activate mutom" << std::endl;
|
||||
std::cerr << "********************************************************" << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
class SceneImpl {
|
||||
public:
|
||||
// constructor //
|
||||
SceneImpl() : m_RunManager(G4RunManagerFactory::CreateRunManager()) {}
|
||||
SceneImpl() : m_RunManager(G4RunManagerFactory::CreateRunManager(G4RunManagerType::Serial)),
|
||||
m_Emitter(nullptr),
|
||||
m_Output(nullptr) {
|
||||
m_RunManager->SetUserInitialization(new PhysicsList);
|
||||
}
|
||||
|
||||
// destructor //
|
||||
~SceneImpl() {
|
||||
@@ -68,8 +85,8 @@ public:
|
||||
void Initialize() {
|
||||
// Set mandatory initialization classes for Geant4
|
||||
m_RunManager->SetUserInitialization(new SceneDetectorConstruction(this));
|
||||
m_RunManager->SetUserInitialization(new PhysicsList);
|
||||
m_RunManager->SetUserInitialization(new ActionInitialization);
|
||||
m_RunManager->SetUserInitialization(
|
||||
new ActionInitialization(m_Emitter, m_Output));
|
||||
|
||||
// Initialize Geant4
|
||||
m_RunManager->Initialize();
|
||||
@@ -79,6 +96,8 @@ public:
|
||||
Vector<Solid *> m_Solids;
|
||||
Solid *m_World = nullptr;
|
||||
G4RunManager *m_RunManager;
|
||||
EmitterPrimary *m_Emitter;
|
||||
Vector<GeantEvent> *m_Output;
|
||||
};
|
||||
|
||||
SceneDetectorConstruction::SceneDetectorConstruction(SceneImpl *owner)
|
||||
@@ -91,10 +110,10 @@ G4VPhysicalVolume *SceneDetectorConstruction::Construct() {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Scene::Scene() : d(new SceneImpl()) {}
|
||||
Scene::Scene() {
|
||||
CheckGeant4Environment();
|
||||
d = new SceneImpl();
|
||||
}
|
||||
Scene::~Scene() { delete d; }
|
||||
|
||||
void Scene::AddSolid(Solid *solid, Solid *parent) {
|
||||
@@ -143,9 +162,26 @@ void Scene::ConstructWorldBox(const ContainerBox *box, const char *material) {
|
||||
d->m_World->SetTransform(transform);
|
||||
}
|
||||
|
||||
void Scene::SetEmitter(EmitterPrimary *emitter) {
|
||||
d->m_Emitter = emitter;
|
||||
}
|
||||
|
||||
void Scene::Initialize() {
|
||||
d->Initialize();
|
||||
}
|
||||
|
||||
void Scene::RunSimulation(int nEvents, Vector<GeantEvent> &results) {
|
||||
d->m_Output = &results;
|
||||
|
||||
// Re-initialize ActionInitialization with the output buffer
|
||||
// (ActionInitialization was already set during Initialize, but we need
|
||||
// to ensure the output pointer is current)
|
||||
d->m_RunManager->SetUserInitialization(
|
||||
new ActionInitialization(d->m_Emitter, &results));
|
||||
|
||||
d->m_RunManager->BeamOn(nEvents);
|
||||
}
|
||||
|
||||
} // namespace Geant
|
||||
} // namespace uLib
|
||||
|
||||
|
||||
Reference in New Issue
Block a user