ATLAS Offline Software
StoppedParticleAction.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
8 
9 #include "G4Step.hh"
10 #include "G4Track.hh"
11 #include "G4DynamicParticle.hh"
12 #include "G4ParticleDefinition.hh"
13 #include "G4Material.hh"
14 #include "G4Element.hh"
15 #include "G4SDManager.hh"
16 #include "G4VSensitiveDetector.hh"
17 #include "G4VProcess.hh"
18 #include "G4ProcessType.hh"
19 
20 #include <cmath>
21 
22 #include "GaudiKernel/Bootstrap.h"
23 #include "GaudiKernel/ISvcLocator.h"
24 #include "GaudiKernel/IMessageSvc.h"
25 
26 
27 namespace G4UA
28 {
29 
30  //---------------------------------------------------------------------------
31  bool StoppedParticleAction::isSUSYParticle(const int id) const
32  {
33  if (id==1000021 || id==1000005 || id==1000006 || id==1000512 || id==1000522 || id==1000991 || id==1000993 ||
34  id==1000612 || id==1000622 || id==1000632 || id==1000642 || id==1000652 || id==1005211 ||
35  id==1006113 || id==1006211 || id==1006213 || id==1006223 || id==1006311 ||
36  id==1006313 || id==1006321 || id==1006323 || id==1006333 ||
37  id==1009111 || id==1009113 || id==1009211 || id==1009213 || id==1009311 ||
38  id==1009313 || id==1009321 || id==1009323 || id==1009223 || id==1009333 ||
39  id==1092112 || id==1091114 || id==1092114 || id==1092212 || id==1092214 || id==1092224 ||
40  id==1093114 || id==1093122 || id==1093214 || id==1093224 || id==1093314 || id==1093324 || id==1093334)
41  return true;
42  return false;
43  }
44 
45  //---------------------------------------------------------------------------
47  : AthMessaging(Gaudi::svcLocator()->service< IMessageSvc >( "MessageSvc"),
48  "StoppedParticleAction"),
49  m_fsSD(0), m_init(false)
50  {}
51 
52  //---------------------------------------------------------------------------
54  {
55 
56  // Trigger if the energy is below our threshold or if the R-hadron is decaying
57  int id = std::abs(aStep->GetTrack()->GetDynamicParticle()->GetDefinition()->GetPDGEncoding());
58 
59  // Special treatment for SUSY particles and R-hadrons
60  if (id>=1000000 && id<=1100000 &&
61  isSUSYParticle(id)){
62 
63  G4Material * mat = aStep->GetTrack()->GetMaterial();
64  double minA=1500000.;
65  for (unsigned int i=0;i<mat->GetNumberOfElements();++i){
66  if (mat->GetElement(i) &&
67  minA>mat->GetElement(i)->GetN()){
68  minA=mat->GetElement(i)->GetN();
69  }
70  }
71 
72  // Stopping condition
73  if (aStep->GetPostStepPoint()->GetVelocity()>0.15*std::pow(minA,-2./3.)*CLHEP::c_light && // Stopping condition or...
74  ( !aStep->GetPostStepPoint()->GetProcessDefinedStep() || // null pointer?
75  aStep->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessType()!=fDecay) ) // Decaying particle (does not fire for hadronic interactions)
76  return;
77 
78  if (!m_init){
79  m_init = true;
80 
81  G4SDManager * g4sdm = G4SDManager::GetSDMpointer();
82  if (!g4sdm) {
83  ATH_MSG_ERROR( "StoppedParticleFastSim could not get sensitive detector catalog." );
84  } else {
85  G4VSensitiveDetector * g4sd = g4sdm->FindSensitiveDetector("ToolSvc.SensitiveDetectorMasterTool.TrackFastSimSD");
86  if (!g4sd) {
87  ATH_MSG_ERROR( "StoppedParticleFastSim could not get ToolSvc.SensitiveDetectorMasterTool.TrackFastSimSD sensitive detector." );
88  } else {
89  m_fsSD = dynamic_cast<TrackFastSimSD*>(g4sd);
90  if (!m_fsSD) {
91  ATH_MSG_ERROR( "StoppedParticleFastSim could not cast the SD." );
92  }
93  } // found the SD
94  } // got the catalog
95  }
96 
97  if (m_fsSD) {
98  m_fsSD->WriteTrack( aStep->GetTrack() , false , true );
99  }
100  }
101 
102  aStep->GetTrack()->SetTrackStatus(fStopAndKill);
103  const G4TrackVector *tv = aStep->GetSecondary();
104  for (unsigned int i=0;i<tv->size();i++){
105  (*tv)[i]->SetTrackStatus(fStopAndKill);
106  }
107  }
108 
109 } // namespace G4UA
G4UA::StoppedParticleAction::StoppedParticleAction
StoppedParticleAction()
Definition: StoppedParticleAction.cxx:46
TrackFastSimSD
Definition: TrackFastSimSD.h:24
G4UA
for nSW
Definition: CalibrationDefaultProcessing.h:19
TrackFastSimSD.h
mat
GeoMaterial * mat
Definition: LArDetectorConstructionTBEC.cxx:53
G4UA::StoppedParticleAction::isSUSYParticle
bool isSUSYParticle(const int) const
Definition: StoppedParticleAction.cxx:31
conifer::pow
constexpr int pow(int x)
Definition: conifer.h:20
G4UA::StoppedParticleAction::m_init
bool m_init
Definition: StoppedParticleAction.h:27
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
StoppedParticleAction.h
lumiFormat.i
int i
Definition: lumiFormat.py:92
AthMessaging
Class to provide easy MsgStream access and capabilities.
Definition: AthMessaging.h:55
G4UA::StoppedParticleAction::m_fsSD
TrackFastSimSD * m_fsSD
Definition: StoppedParticleAction.h:26
python.PhysicalConstants.c_light
float c_light
Definition: PhysicalConstants.py:63
TrackFastSimSD::WriteTrack
void WriteTrack(const G4Track *, const bool, const bool)
Definition: TrackFastSimSD.cxx:97
Gaudi
=============================================================================
Definition: CaloGPUClusterAndCellDataMonitorOptions.h:273
G4UA::StoppedParticleAction::UserSteppingAction
virtual void UserSteppingAction(const G4Step *) override
Definition: StoppedParticleAction.cxx:53