diff --git a/Simulation/DetSimCore/CMakeLists.txt b/Simulation/DetSimCore/CMakeLists.txt index f8a022fa826b818cc054422fb7cf3b173b2da574..5ed403b8494031f622966b2fe4e142840397a04d 100644 --- a/Simulation/DetSimCore/CMakeLists.txt +++ b/Simulation/DetSimCore/CMakeLists.txt @@ -11,6 +11,7 @@ include(${Geant4_USE_FILE}) set(DetSimCore_srcs src/DetSimAlg.cpp src/DetectorConstruction.cpp + src/PrimaryGeneratorAction.cpp ) gaudi_add_module(DetSimCore ${DetSimCore_srcs} diff --git a/Simulation/DetSimCore/src/DetSimAlg.cpp b/Simulation/DetSimCore/src/DetSimAlg.cpp index d7b29b326381f1421eb108eb15c3021b448cdff4..a5b44538fa527f742dd8864a23defde67e71d319 100644 --- a/Simulation/DetSimCore/src/DetSimAlg.cpp +++ b/Simulation/DetSimCore/src/DetSimAlg.cpp @@ -6,6 +6,7 @@ #include "G4PhysListFactory.hh" +#include "PrimaryGeneratorAction.h" DECLARE_COMPONENT(DetSimAlg) @@ -33,8 +34,9 @@ DetSimAlg::initialize() { return StatusCode::FAILURE; } + // Detector Construction runmgr->SetUserInitialization(new DetectorConstruction()); - + // Physics List G4VUserPhysicsList *physicsList = nullptr; if (m_physics_lists_name.value() == "CEPC") { @@ -44,8 +46,8 @@ DetSimAlg::initialize() { } assert(physicsList); runmgr->SetUserInitialization(physicsList); - - runmgr->SetUserAction((G4VUserPrimaryGeneratorAction*)0); + // Primary Generator Action + runmgr->SetUserAction(new PrimaryGeneratorAction()); // after set up the user initialization and user actions, start the initialization. m_detsimsvc->initializeRM(); diff --git a/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp b/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6454963b6dd2b9214b9d07c89c462023d2c8c0b1 --- /dev/null +++ b/Simulation/DetSimCore/src/PrimaryGeneratorAction.cpp @@ -0,0 +1,42 @@ +#include "PrimaryGeneratorAction.h" + +#include "G4Event.hh" +#include "G4ParticleTable.hh" +#include "G4IonTable.hh" +#include "G4ParticleDefinition.hh" + + +PrimaryGeneratorAction::PrimaryGeneratorAction() { + +} + +PrimaryGeneratorAction::~PrimaryGeneratorAction() { + +} + +void +PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { + // Generate Vertex (G4PrimaryVertex) and Particle (G4PrimaryParticle). + + // Following is an example: + double x = 0.0; + double y = 0.0; + double z = 0.0; + double t = 0.0; + G4PrimaryVertex* g4vtx = new G4PrimaryVertex(x, y, z, t); + + + G4int pdgcode = 22; + // check the pdgid + G4ParticleTable* particletbl = G4ParticleTable::GetParticleTable(); + G4ParticleDefinition* particle_def = particletbl->FindParticle(pdgcode); + + double px = 0.0; + double py = 0.0; + double pz = 0.0; + G4PrimaryParticle* g4prim=new G4PrimaryParticle(particle_def, px, py, pz); + g4vtx->SetPrimary(g4prim); + + anEvent->AddPrimaryVertex(g4vtx); +} + diff --git a/Simulation/DetSimCore/src/PrimaryGeneratorAction.h b/Simulation/DetSimCore/src/PrimaryGeneratorAction.h new file mode 100644 index 0000000000000000000000000000000000000000..fa34d7a421b4d7579c8b6606eda9b4523ade6cba --- /dev/null +++ b/Simulation/DetSimCore/src/PrimaryGeneratorAction.h @@ -0,0 +1,18 @@ +#ifndef PrimaryGeneratorAction_h +#define PrimaryGeneratorAction_h + +#include "G4VUserPrimaryGeneratorAction.hh" + +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +{ +public: + PrimaryGeneratorAction(); + ~PrimaryGeneratorAction(); + +public: + void GeneratePrimaries(G4Event* anEvent); + +}; + +#endif +