ATLAS Offline Software
Loading...
Searching...
No Matches
NeutronFastSim.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
7
8#include "G4Event.hh"
9#include "G4Neutron.hh"
10#include "G4SDManager.hh"
11#include "G4VSensitiveDetector.hh"
12#include "G4EventManager.hh"
14
16
17NeutronFastSim::NeutronFastSim(const std::string& name, G4Region* region, const std::string& fsSDname, const double etaCut, const double timeCut)
18 : G4VFastSimulationModel(name, region)
19 , m_Energy(5)
20 , m_fsSD(0)
21 , m_init(false)
22 , m_fsSDname(fsSDname)
23 , m_etaCut(etaCut)
24 , m_timeCut(timeCut)
25{
26}
27
28G4bool NeutronFastSim::IsApplicable(const G4ParticleDefinition&)
29{
30 if (!m_init){
31 m_init = true;
32
33 G4SDManager *sdm = G4SDManager::GetSDMpointer();
34 G4VSensitiveDetector * vsd = sdm->FindSensitiveDetector( m_fsSDname );
35 if (!vsd) {
36 G4cout << "NeutronFastSim::IsApplicable WARNING Could not get TrackFastSimSD sensitive detector. If you are not writing track records this is expected." << G4endl;
37 } else {
38 m_fsSD = dynamic_cast<TrackFastSimSD*>(vsd);
39 if (!m_fsSD) {
40 G4cout << "NeutronFastSim::IsApplicable WARNING Could not cast the SD. If you are not writing track records this is expected." << G4endl;
41 }
42 } // found the SD
43 } // End of lazy init
44 return true;
45}
46
47G4bool NeutronFastSim::ModelTrigger(const G4FastTrack& fastTrack)
48{
49 // Trigger if the neutron energy is below our threshold or if the time is over 150 ns
50 if (fastTrack.GetPrimaryTrack()->GetDefinition() == G4Neutron::NeutronDefinition() ){
51 return (m_Energy<0?true:fastTrack.GetPrimaryTrack()->GetKineticEnergy()<m_Energy) || fastTrack.GetPrimaryTrack()->GetGlobalTime()>m_timeCut;
52 }
53
54 // Not a neutron... Pick it up if the primary had eta>6.0
55 AtlasG4EventUserInfo *atlasG4EvtUserInfo=static_cast<AtlasG4EventUserInfo*>(G4EventManager::GetEventManager()->GetConstCurrentEvent()->GetUserInformation());
56 HepMC::ConstGenParticlePtr primaryGenParticle = atlasG4EvtUserInfo->GetCurrentPrimaryGenParticle();
57 if (std::abs(primaryGenParticle->momentum().eta())>m_etaCut && !HepMC::is_simulation_particle(primaryGenParticle)){
58 return true;
59 } else {
60 return false;
61 }
62}
63
64void NeutronFastSim::DoIt(const G4FastTrack& fastTrack, G4FastStep& fastStep)
65{
66 if (m_fsSD) m_fsSD->WriteTrack( fastTrack.GetPrimaryTrack() , false , false );
67 fastStep.KillPrimaryTrack();
68}
This class is attached to G4Event objects as UserInformation.
HepMC::ConstGenParticlePtr GetCurrentPrimaryGenParticle() const
return a pointer to the HepMC::GenParticle used to create the current G4PrimaryParticle.
virtual G4bool ModelTrigger(const G4FastTrack &) override final
std::string m_fsSDname
void DoIt(const G4FastTrack &, G4FastStep &) override final
TrackFastSimSD * m_fsSD
G4bool IsApplicable(const G4ParticleDefinition &) override final
NeutronFastSim(const std::string &name, G4Region *region, const std::string &fsSDname, const double etaCut, const double timeCut)
bool is_simulation_particle(const T &p)
Method to establish if a particle (or barcode) was created during the simulation (TODO update to be s...
const GenParticle * ConstGenParticlePtr
Definition GenParticle.h:38