ATLAS Offline Software
LooperKiller.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "LooperKiller.h"
6 #include <iostream>
7 #include "G4RunManagerKernel.hh"
8 #include "G4TransportationManager.hh"
9 #include "G4Navigator.hh"
10 #include "G4PropagatorInField.hh"
11 #include "G4TrackingManager.hh"
12 #include "G4SteppingManager.hh"
13 #include "G4StackManager.hh"
14 #include "G4EventManager.hh"
15 #include "G4Event.hh"
16 #include "StoreGate/WriteHandle.h"
17 #include "StoreGate/StoreGateSvc.h"
18 
19 // For setting an error state in event info
20 #include "EventInfo/EventInfo.h"
21 
22 #include "GaudiKernel/Bootstrap.h"
23 #include "GaudiKernel/ISvcLocator.h"
24 #include "GaudiKernel/IMessageSvc.h"
25 
26 namespace G4UA
27 {
28 
29  //---------------------------------------------------------------------------
31  : AthMessaging(Gaudi::svcLocator()->service<IMessageSvc>("MessageSvc"),
32  "LooperKiller"),
33  m_evtStore("StoreGateSvc/StoreGateSvc", "LooperKiller"),
34  m_detStore("StoreGateSvc/DetectorStore", "LooperKiller"),
35  m_config(config), m_report(), m_count_steps(0)
36  {
37  }
38 
39  //---------------------------------------------------------------------------
40  void LooperKiller::UserSteppingAction(const G4Step* aStep)
41  {
42 
43  if (aStep->GetTrack()->GetCurrentStepNumber() < m_config.MaxSteps) {
44  if (m_count_steps==0) return;
45  // Track recovered...
46  ATH_MSG_WARNING("Track finished on its own. Congrats. Moving on with the event.");
47  m_count_steps = 0;
48  G4TransportationManager *tm = G4TransportationManager::GetTransportationManager();
49  tm->GetNavigatorForTracking()->SetVerboseLevel(0);
50  tm->GetPropagatorInField()->SetVerboseLevel(0);
51  G4RunManagerKernel *rmk = G4RunManagerKernel::GetRunManagerKernel();
52  rmk->GetTrackingManager()->SetVerboseLevel(0);
53  rmk->GetTrackingManager()->GetSteppingManager()->SetVerboseLevel(0);
54  rmk->GetStackManager()->SetVerboseLevel(0);
55  return;
56  } else if (aStep->GetTrack()->GetCurrentStepNumber() == m_config.MaxSteps) {
57  ATH_MSG_WARNING("LooperKiller triggered!! Hold on to your hats!!!!!!!!" );
58  }
59 
60  G4TransportationManager *tm = G4TransportationManager::GetTransportationManager();
61  tm->GetNavigatorForTracking()->SetVerboseLevel(m_config.VerboseLevel);
62  tm->GetPropagatorInField()->SetVerboseLevel(m_config.VerboseLevel);
63 
64  G4RunManagerKernel *rmk = G4RunManagerKernel::GetRunManagerKernel();
65  rmk->GetTrackingManager()->SetVerboseLevel(m_config.VerboseLevel);
66  rmk->GetTrackingManager()->GetSteppingManager()->SetVerboseLevel(m_config.VerboseLevel);
67  rmk->GetStackManager()->SetVerboseLevel(m_config.VerboseLevel);
68 
69  m_count_steps++;
70 
72  m_count_steps = 0;
74  aStep->GetTrack()->SetTrackStatus(fStopAndKill);
75  tm->GetNavigatorForTracking()->SetVerboseLevel(0);
76  tm->GetPropagatorInField()->SetVerboseLevel(0);
77  rmk->GetTrackingManager()->SetVerboseLevel(0);
78  rmk->GetTrackingManager()->GetSteppingManager()->SetVerboseLevel(0);
79  rmk->GetStackManager()->SetVerboseLevel(0);
80 
81  // Bail out...
82  if (m_config.AbortEvent){
83  rmk->GetEventManager()->AbortCurrentEvent();
84  rmk->GetEventManager()->GetNonconstCurrentEvent()->SetEventAborted();
85  }
86  if (m_config.SetError){
87 
88  // Set error state in eventInfo
89  SG::WriteHandle<EventInfo> eic("McEventInfo");
90  if (! eic.isValid()){
91  ATH_MSG_WARNING( "Failed to retrieve EventInfo" );
92  } else {
94  ATH_MSG_WARNING( "Set error state in event info!" );
95  }
96 
97  } // End of set error
98  } // End of handling end of error time
99  }
100 
101 } // namespace G4UA
EventInfo::Error
@ Error
Definition: EventInfo/EventInfo/EventInfo.h:60
G4UA::LooperKiller::Config
Definition: LooperKiller.h:28
G4UA
for nSW
Definition: CalibrationDefaultProcessing.h:19
G4UA::LooperKiller::m_count_steps
int m_count_steps
Definition: LooperKiller.h:62
G4UA::LooperKiller::Config::AbortEvent
bool AbortEvent
Definition: LooperKiller.h:32
config
Definition: PhysicsAnalysis/AnalysisCommon/AssociationUtils/python/config.py:1
EventInfo::setErrorState
bool setErrorState(EventFlagSubDet subDet, EventFlagErrorState errorState)
Set error state flag for a particular sub detector.
Definition: EventInfo.cxx:168
WriteHandle.h
Handle class for recording to StoreGate.
G4UA::LooperKiller::Report::killed_tracks
long killed_tracks
Definition: LooperKiller.h:38
G4UA::LooperKiller::UserSteppingAction
virtual void UserSteppingAction(const G4Step *) override
Definition: LooperKiller.cxx:40
EventInfo::Core
@ Core
Definition: EventInfo/EventInfo/EventInfo.h:54
G4UA::LooperKiller::Config::PrintSteps
int PrintSteps
Definition: LooperKiller.h:30
AthMessaging
Class to provide easy MsgStream access and capabilities.
Definition: AthMessaging.h:55
G4UA::LooperKiller::m_config
Config m_config
My configuration options.
Definition: LooperKiller.h:60
G4UA::LooperKiller::LooperKiller
LooperKiller(const Config &config)
Definition: LooperKiller.cxx:30
G4UA::LooperKiller::m_report
Report m_report
Definition: LooperKiller.h:61
G4UA::LooperKiller::Config::VerboseLevel
int VerboseLevel
Definition: LooperKiller.h:31
SG::WriteHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
Gaudi
=============================================================================
Definition: CaloGPUClusterAndCellDataMonitorOptions.h:273
G4UA::LooperKiller::Config::SetError
bool SetError
Definition: LooperKiller.h:33
LooperKiller.h
StoreGateSvc.h
G4UA::LooperKiller::Config::MaxSteps
int MaxSteps
Definition: LooperKiller.h:29