ATLAS Offline Software
Classes | Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
G4UA::AthenaStackingAction Class Reference

Standard ATLAS stacking action functionality. Mostly taken from the old AthenaStackingAction implementation, but adapted for the new user action design for multi-threading. More...

#include <AthenaStackingAction.h>

Inheritance diagram for G4UA::AthenaStackingAction:
Collaboration diagram for G4UA::AthenaStackingAction:

Classes

struct  Config
 Configuration option struct for AthenaStackingAction. More...
 

Public Member Functions

 AthenaStackingAction (const Config &config)
 Constructor with configuration. More...
 
virtual G4ClassificationOfNewTrack ClassifyNewTrack (const G4Track *track) override
 Classify a new track. More...
 

Protected Member Functions

bool isNeutrino (const G4Track *) const
 Identify track as a neutrino. More...
 
bool isGamma (const G4Track *) const
 Identify track as a photon. More...
 
bool isNeutron (const G4Track *) const
 Identify track as a neutron. More...
 
PrimaryParticleInformationgetPrimaryParticleInformation (const G4Track *track) const
 obtain the PrimaryParticleInformation from the current G4Track More...
 

Protected Attributes

Config m_config
 Configuration options. More...
 
double m_oneOverWeightNeutron
 
double m_oneOverWeightPhoton
 

Detailed Description

Standard ATLAS stacking action functionality. Mostly taken from the old AthenaStackingAction implementation, but adapted for the new user action design for multi-threading.

Author
Steve Farrell Steve.nosp@m.n.Fa.nosp@m.rrell.nosp@m.@cer.nosp@m.n.ch

Definition at line 22 of file AthenaStackingAction.h.

Constructor & Destructor Documentation

◆ AthenaStackingAction()

G4UA::AthenaStackingAction::AthenaStackingAction ( const Config config)

Constructor with configuration.

Definition at line 41 of file AthenaStackingAction.cxx.

41  :
45  {
46  // calculate this division only once
47  if (m_config.applyNRR)
49 
50  // calculate this division only once
51  if (m_config.applyPRR)
53  }

Member Function Documentation

◆ ClassifyNewTrack()

G4ClassificationOfNewTrack G4UA::AthenaStackingAction::ClassifyNewTrack ( const G4Track *  track)
overridevirtual

Classify a new track.

Result can be fUrgent, fWaiting, fPostpone, or fKill.

Pass ownership to track. The G4VUserTrackInformation* fpUserInformation member variable set by this method is mutable. G4Tracks are thread-local.

Pass ownership to track. The G4VUserTrackInformation* fpUserInformation member variable set by this method is mutable. G4Tracks are thread-local.

Reimplemented in G4UA::AthenaDebugStackingAction.

Definition at line 59 of file AthenaStackingAction.cxx.

60  {
61  // Kill neutrinos if enabled
63  return fKill;
64  }
65 
66  // Kill super-low-E photons
67  const double safeCut = 0.00005;
68  double totalE = track->GetTotalEnergy();
69  if(isGamma(track) && totalE < safeCut) {
70  return fKill;
71  }
72 
73  // TODO: Why is this here? Can I remove it?
74  G4Event* ev = G4EventManager::GetEventManager()->GetNonconstCurrentEvent();
75  AtlasG4EventUserInfo* atlasG4EvtUserInfo __attribute__ ((unused)) =
76  static_cast<AtlasG4EventUserInfo*> (ev->GetUserInformation());
77 
78  // Neutron Russian Roulette
79  if (m_config.applyNRR && isNeutron(track) &&
80  track->GetWeight() < m_config.russianRouletteNeutronWeight && // do not re-Roulette particles
81  track->GetKineticEnergy() < m_config.russianRouletteNeutronThreshold) {
82  // shoot random number
83  if ( CLHEP::RandFlat::shoot() > m_oneOverWeightNeutron ) {
84  // Kill (w-1)/w neutrons
85  return fKill;
86  }
87  // TODO There may be another way to set the weights via
88  // another G4 interface avoiding the const_cast, but the
89  // changes are more major and will need more careful validation.
90  G4Track* mutableTrack ATLAS_THREAD_SAFE = const_cast<G4Track*> (track);
91  // Weight the rest 1/w neutrons with a weight of w
92  mutableTrack->SetWeight(m_config.russianRouletteNeutronWeight);
93  }
94 
95  // Photon Russian Roulette
96  if (m_config.applyPRR && isGamma(track) && track->GetOriginTouchable() &&
97  track->GetOriginTouchable()->GetVolume()->GetName().substr(0, 3) == "LAr" && // only for photons created in LAr
98  track->GetWeight() < m_config.russianRoulettePhotonWeight && // do not re-Roulette particles
99  track->GetKineticEnergy() < m_config.russianRoulettePhotonThreshold) {
100  // shoot random number
101  if ( CLHEP::RandFlat::shoot() > m_oneOverWeightPhoton ) {
102  // Kill (w-1)/w photons
103  return fKill;
104  }
105  // TODO There may be another way to set the weights via
106  // another G4 interface avoiding the const_cast, but the
107  // changes are more major and will need more careful validation.
108  G4Track* mutableTrack ATLAS_THREAD_SAFE = const_cast<G4Track*> (track);
109  // Weight the rest 1/w neutrons with a weight of w
110  mutableTrack->SetWeight(m_config.russianRoulettePhotonWeight);
111  }
112 
113  // Handle primary particles
114  if(track->GetParentID() == 0) { // Condition for Primaries
115  // Extract the PrimaryParticleInformation
117  // Fill some information for this track
118  if(primaryPartInfo) {
119  if (!m_config.isISFJob) {
120  // don't do anything
121  auto part = primaryPartInfo->GetHepMCParticle();
122  if (part) {
123  // OK, we got back to HepMC
124  std::unique_ptr<TrackInformation> ti = std::make_unique<TrackInformation>(part);
125  ti->SetRegenerationNr(0);
127  // regNr=0 and classify=Primary are default values anyway
131  track->SetUserInformation(ti.release());
132  }
133  // TODO What does this condition mean?
134  else if(primaryPartInfo->GetParticleUniqueID() >= 0 && primaryPartInfo->GetParticleBarcode() >= 0) {
135  // PrimaryParticleInformation should at least provide a barcode
136  std::unique_ptr<TrackBarcodeInfo> bi = std::make_unique<TrackBarcodeInfo>(primaryPartInfo->GetParticleUniqueID(), primaryPartInfo->GetParticleBarcode());
140  track->SetUserInformation(bi.release());
141  }
142  } // no ISFParticle attached
143  } // has PrimaryParticleInformation
144  }
145  // Secondary track; decide whether to save or kill
146  else if( isGamma(track) &&
148  totalE < m_config.photonEnergyCut )
149  {
150  return fKill;
151  }
152  return fUrgent;
153  }

◆ getPrimaryParticleInformation()

PrimaryParticleInformation * G4UA::AthenaStackingAction::getPrimaryParticleInformation ( const G4Track *  track) const
protected

obtain the PrimaryParticleInformation from the current G4Track

Definition at line 155 of file AthenaStackingAction.cxx.

156  {
157  const G4DynamicParticle* dp = track->GetDynamicParticle();
158  if(dp) {
159  const G4PrimaryParticle* pp = nullptr;
160  pp = dp->GetPrimaryParticle();
161  if(pp) {
162  // Extract the PrimaryParticleInformation
163  return dynamic_cast<PrimaryParticleInformation*>
164  ( pp->GetUserInformation() );
165  }
166  }
167  return nullptr;
168  }

◆ isGamma()

bool G4UA::AthenaStackingAction::isGamma ( const G4Track *  track) const
protected

Identify track as a photon.

Definition at line 185 of file AthenaStackingAction.cxx.

186  {
187  return track->GetParticleDefinition() == G4Gamma::Gamma();
188  }

◆ isNeutrino()

bool G4UA::AthenaStackingAction::isNeutrino ( const G4Track *  track) const
protected

Identify track as a neutrino.

It might be useful to move this kind of functionality into some standalong helper function(s).

Definition at line 173 of file AthenaStackingAction.cxx.

174  {
175  auto particleDef = track->GetParticleDefinition();
176  return (particleDef == G4NeutrinoE::NeutrinoEDefinition() ||
177  particleDef == G4AntiNeutrinoE::AntiNeutrinoEDefinition() ||
178  particleDef == G4NeutrinoMu::NeutrinoMuDefinition() ||
179  particleDef == G4AntiNeutrinoMu::AntiNeutrinoMuDefinition() ||
180  particleDef == G4NeutrinoTau::NeutrinoTauDefinition() ||
181  particleDef == G4AntiNeutrinoTau::AntiNeutrinoTauDefinition());
182  }

◆ isNeutron()

bool G4UA::AthenaStackingAction::isNeutron ( const G4Track *  track) const
protected

Identify track as a neutron.

Definition at line 191 of file AthenaStackingAction.cxx.

192  {
193  return track->GetParticleDefinition() == G4Neutron::Neutron();
194  }

Member Data Documentation

◆ m_config

Config G4UA::AthenaStackingAction::m_config
protected

Configuration options.

Definition at line 61 of file AthenaStackingAction.h.

◆ m_oneOverWeightNeutron

double G4UA::AthenaStackingAction::m_oneOverWeightNeutron
protected

Definition at line 78 of file AthenaStackingAction.h.

◆ m_oneOverWeightPhoton

double G4UA::AthenaStackingAction::m_oneOverWeightPhoton
protected

Definition at line 81 of file AthenaStackingAction.h.


The documentation for this class was generated from the following files:
LArG4FSStartPointFilter.part
part
Definition: LArG4FSStartPointFilter.py:21
G4UA::AthenaStackingAction::m_config
Config m_config
Configuration options.
Definition: AthenaStackingAction.h:61
G4UA::AthenaStackingAction::Config::isISFJob
bool isISFJob
Is this an ISF job.
Definition: AthenaStackingAction.h:47
TileDCSDataPlotter.dp
dp
Definition: TileDCSDataPlotter.py:840
G4UA::AthenaStackingAction::Config::photonEnergyCut
double photonEnergyCut
Photon energy cut.
Definition: AthenaStackingAction.h:33
AtlasG4EventUserInfo
This class is attached to G4Event objects as UserInformation. It holds a pointer to the HepMC::GenEve...
Definition: AtlasG4EventUserInfo.h:21
VP1PartSpect::Neutron
@ Neutron
Definition: VP1PartSpectFlags.h:25
G4UA::AthenaStackingAction::Config::russianRouletteNeutronThreshold
double russianRouletteNeutronThreshold
Energy threshold for the Neutron Russian Roulette.
Definition: AthenaStackingAction.h:37
G4UA::AthenaStackingAction::m_oneOverWeightNeutron
double m_oneOverWeightNeutron
Definition: AthenaStackingAction.h:78
G4UA::AthenaStackingAction::Config::russianRoulettePhotonThreshold
double russianRoulettePhotonThreshold
Energy threshold for the Photon Russian Roulette.
Definition: AthenaStackingAction.h:43
VP1PartSpect::Gamma
@ Gamma
Definition: VP1PartSpectFlags.h:22
G4UA::AthenaStackingAction::isNeutron
bool isNeutron(const G4Track *) const
Identify track as a neutron.
Definition: AthenaStackingAction.cxx:191
G4UA::AthenaStackingAction::Config::killAllNeutrinos
bool killAllNeutrinos
Flag to toggle killing neutrinos at tracking stage.
Definition: AthenaStackingAction.h:31
config
Definition: PhysicsAnalysis/AnalysisCommon/AssociationUtils/python/config.py:1
PrimaryParticleInformation::GetParticleBarcode
int GetParticleBarcode() const
Definition: PrimaryParticleInformation.cxx:18
G4UA::AthenaStackingAction::Config::applyPRR
bool applyPRR
Apply the Photon Russian Roulette.
Definition: AthenaStackingAction.h:41
G4UA::AthenaStackingAction::isGamma
bool isGamma(const G4Track *) const
Identify track as a photon.
Definition: AthenaStackingAction.cxx:185
G4UA::AthenaStackingAction::Config::russianRoulettePhotonWeight
double russianRoulettePhotonWeight
Weight for the Photon Russian Roulette.
Definition: AthenaStackingAction.h:45
ev
int ev
Definition: globals.cxx:25
VTrackInformation::Primary
@ Primary
Definition: VTrackInformation.h:32
VTrackInformation::SetClassification
void SetClassification(TrackClassification tc)
update the classification of the currently tracked particle, usually called when a new G4Track is cre...
Definition: VTrackInformation.h:45
TrackInformation::SetRegenerationNr
void SetRegenerationNr(int i)
update the number of times the particle represented by the G4Track has undergone a non-destructive in...
Definition: TrackInformation.h:96
G4UA::AthenaStackingAction::getPrimaryParticleInformation
PrimaryParticleInformation * getPrimaryParticleInformation(const G4Track *track) const
obtain the PrimaryParticleInformation from the current G4Track
Definition: AthenaStackingAction.cxx:155
PrimaryParticleInformation::GetHepMCParticle
HepMC::ConstGenParticlePtr GetHepMCParticle() const
return a pointer to the GenParticle used to create the G4PrimaryParticle
Definition: PrimaryParticleInformation.h:47
PrimaryParticleInformation
This class is attached to G4PrimaryParticle objects as UserInformation. The member variable m_thePart...
Definition: PrimaryParticleInformation.h:39
unused
void unused(Args &&...)
Definition: VP1ExpertSettings.cxx:39
__attribute__
__attribute__((always_inline)) inline uint16_t TileCalibDrawerBase
Definition: TileCalibDrawerBase.h:190
G4UA::AthenaStackingAction::m_oneOverWeightPhoton
double m_oneOverWeightPhoton
Definition: AthenaStackingAction.h:81
G4UA::AthenaStackingAction::Config::russianRouletteNeutronWeight
double russianRouletteNeutronWeight
Weight for the Neutron Russian Roulette.
Definition: AthenaStackingAction.h:39
G4UA::AthenaStackingAction::isNeutrino
bool isNeutrino(const G4Track *) const
Identify track as a neutrino.
Definition: AthenaStackingAction.cxx:173
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
PrimaryParticleInformation::GetParticleUniqueID
int GetParticleUniqueID() const
Definition: PrimaryParticleInformation.cxx:28
G4UA::AthenaStackingAction::Config::applyNRR
bool applyNRR
Apply the Neutron Russian Roulette.
Definition: AthenaStackingAction.h:35