#include "EmitterPrimary.hh" #include "G4Box.hh" #include "G4LogicalVolume.hh" #include "G4LogicalVolumeStore.hh" #include "G4ParticleDefinition.hh" #include "G4ParticleGun.hh" #include "G4ParticleTable.hh" #include "G4RunManager.hh" #include "G4SystemOfUnits.hh" #include "Randomize.hh" EmitterPrimary::EmitterPrimary() : G4VUserPrimaryGeneratorAction(), fParticleGun(nullptr) { // Creiamo il ParticleGun impostandolo per sparare 1 particella alla volta G4int n_particle = 1; fParticleGun = new G4ParticleGun(n_particle); // Otteniamo la tabella delle particelle di Geant4 G4ParticleTable *particleTable = G4ParticleTable::GetParticleTable(); // Cerchiamo il muone negativo (usa "mu+" per l'antimuone) G4String particleName = "mu-"; G4ParticleDefinition *particle = particleTable->FindParticle(particleName); // Configuriamo le proprietà iniziali della particella fParticleGun->SetParticleDefinition(particle); // Impostiamo la direzione della quantità di moto (es. lungo l'asse Z) fParticleGun->SetParticleMomentumDirection(G4ThreeVector(0., 0., -1.)); // Impostiamo l'energia cinetica a 1 GeV fParticleGun->SetParticleEnergy(1.0 * GeV); // Impostiamo la posizione di partenza (origine) fParticleGun->SetParticlePosition(G4ThreeVector(0., 0., 10. * m)); } EmitterPrimary::~EmitterPrimary() { // Importante: liberare la memoria delete fParticleGun; } void EmitterPrimary::GeneratePrimaries(G4Event *anEvent) { // Questo metodo viene invocato all'inizio di ogni evento. // Qui potresti anche aggiungere una randomizzazione della posizione o // dell'energia. fParticleGun->GeneratePrimaryVertex(anEvent); }