#include #include class Detector : public G4VUserDetectorConstruction { private: G4String fInput; public: Detector(const char* file="geom.tg") : G4VUserDetectorConstruction(), fInput(file) {}; G4VPhysicalVolume* Construct() { G4tgbVolumeMgr::GetInstance()->AddTextFile(fInput); return G4tgbVolumeMgr::GetInstance()->ReadAndConstructDetector(); } }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include #include #include // choose analysis technology according to file extension using G4AnalysisManager = G4GenericAnalysisManager; class RunAction : public G4UserRunAction { public: RunAction() : G4UserRunAction() { G4AnalysisManager::Instance(); } ~RunAction() { delete G4AnalysisManager::Instance(); } void BeginOfRunAction(const G4Run*) { G4AnalysisManager::Instance()->OpenFile(); } void EndOfRunAction(const G4Run*) { G4AnalysisManager::Instance()->Write(); G4AnalysisManager::Instance()->CloseFile(); } }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include #include /** * Call Geant4 General Particle Source to generate particles. */ class Generator : public G4VUserPrimaryGeneratorAction { private: G4GeneralParticleSource* fSource; public: Generator() : G4VUserPrimaryGeneratorAction(), fSource(0) { fSource = new G4GeneralParticleSource; } virtual ~Generator() { delete fSource; } virtual void GeneratePrimaries(G4Event* evt) { fSource->GeneratePrimaryVertex(evt); } ///< add sources to an event }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include #include "G4VUserActionInitialization.hh" class Action : public G4VUserActionInitialization { public: G4TScoreHistFiller* filler; Action() : G4VUserActionInitialization() { filler = new G4TScoreHistFiller; } ~Action() { delete filler; } void BuildForMaster() const { SetUserAction(new RunAction); } void Build() const { SetUserAction(new RunAction); SetUserAction(new Generator); } }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include #include #include #include #include #include #include int main(int argc, char** argv) { // https://gitlab.cern.ch/geant4/geant4/-/tree/master/source/tasking auto *run = G4RunManagerFactory::CreateRunManager(); G4ScoringManager::GetScoringManager(); // activate macro commands for scoring G4PhysListFactory physics; run->SetUserInitialization(physics.ReferencePhysList()); Detector* detector; if (argc>1) detector = new Detector(argv[1]); else detector = new Detector(); run->SetUserInitialization(detector); run->SetUserInitialization(new Action); G4VisManager* vis = new G4VisExecutive("quiet"); vis->Initialize(); if (argc<3) { // interactive mode G4UIExecutive ui(argc, argv); ui.SessionStart(); } else { // batch mode G4String cmd = "/control/execute "; G4UImanager::GetUIpointer()->ApplyCommand(cmd+argv[2]); } delete vis; // G4GeometryManager::GetInstance()->OpenGeometry(); }