ATLAS Offline Software
Loading...
Searching...
No Matches
TestActionVPTimerTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
7#include <algorithm>
8#include <iomanip>
9#include <ios>
10
11using std::map;
12using std::max;
13using std::string;
14using std::setw;
15using std::ios;
16using std::make_pair;
17using std::pair;
18using std::find;
19using std::vector;
20
21namespace G4UA
22{
23
24 //----------------------------------------------------------------------------
25 // Formats print string for timer output
26 inline std::string vPrFmt (double time, double nEv, double tRun, int depth, const std::string& id)
27 {
28 std::string dprnt = stringify(depth);
29 if (depth == -999) dprnt = " ";
30 std::ostringstream oss;
31 oss << std::setw(12) << time << std::setw(12) << time/nEv << std::setw(12) << time/tRun
32 << std::setw(6) << dprnt << " " << id;
33 return oss.str();
34 }
35
36 typedef std::map<VolTree, TestActionVPTimer::volumeData> VolMap;
37 typedef VolMap::const_iterator VolIt;
38
39 //----------------------------------------------------------------------------
41 const std::string& name,
42 const IInterface* parent)
44 {
45 declareProperty("CaloDepth",m_config.dCALO);
46 declareProperty("BeamPipeDepth",m_config.dBeam);
47 declareProperty("InDetDepth",m_config.dIDET);
48 declareProperty("MuonDepth",m_config.dMUON);
49 declareProperty("DetailDepth",m_config.dDetail);
50 }
51
52 //----------------------------------------------------------------------------
53 std::unique_ptr<TestActionVPTimer>
55 {
56 ATH_MSG_DEBUG("Constructing a TestActionVPTimer");
57 auto action = std::make_unique<TestActionVPTimer>(m_config);
58 actionList.runActions.push_back( action.get() );
59 actionList.eventActions.push_back( action.get() );
60 actionList.steppingActions.push_back( action.get() );
61 return action;
62 }
63
64 //----------------------------------------------------------------------------
66 {
67 // We shouldn't need this. End-run actions should be called by Geant4.
68 // I'll leave this here, commented out for now, for reference.
69 //for(auto& tidAction : m_actions) {
70 // ((G4UserRunAction*)tidAction.second)->EndOfRunAction(0);
71 //}
72
73 // Accumulate results across threads
76
77 if(m_report.time_index.size()){
78
79 VolTree topPV; // vector< pair<physvol*,int> >
80 // time_index is map<VolTree, TestActionVPTimer::volumeData>
81
82 topPV.push_back(m_report.time_index.begin()->first.front());
83 auto it = m_report.time_index.find(topPV);
84 if (it == m_report.time_index.end()){
85 ATH_MSG_WARNING("topPV not found.");
86 return StatusCode::FAILURE;
87 }
88 TestActionVPTimer::volumeData atlasData =it->second;
89 G4double DeadTime = m_report.runTime - atlasData.tTotal;
90
91 ATH_MSG_INFO("Runtime " << m_report.runTime
92 << " Dead Time " << DeadTime );
93
94 if (m_report.nev != 0){
95 ATH_MSG_INFO("******* Beginning timer dump *******" );
96
97 ATH_MSG_INFO(setw(12) << "Time" << setw(12) << "per Event" << setw(12)
98 << "per Run" << setw(6) << "Depth" << " Location/Particle" );
99 ATH_MSG_INFO(vPrFmt(m_report.runTime, m_report.nev, atlasData.tTotal, -999, " Event Average") );
100 ATH_MSG_INFO(vPrFmt(DeadTime, m_report.nev, atlasData.tTotal, -999, " Dead/Initialization") );
101
102 ATH_MSG_INFO("\n******* Data by volume/select particles *******");
103 ATH_MSG_INFO("Data printed in reverse tree order (mother following daughter)");
104
105 TreeOut(topPV, atlasData.tTotal);
106 // for (VolIt c = v_time_index.begin(); c != v_time_index.end(); c++) {
107 // TimerPrint(*c, atlasData.tTotal, c->first.size());
108 // }
109
110 ATH_MSG_INFO( "\n******* Data by particle/category *******");
111
112 ATH_MSG_INFO(vPrFmt(atlasData.tElectron, m_report.nev, atlasData.tTotal, -999, "e+/-" ) );
113 ATH_MSG_INFO(vPrFmt(atlasData.tPhoton, m_report.nev, atlasData.tTotal, -999, "gamma" ) );
114 ATH_MSG_INFO(vPrFmt(atlasData.tNeutron, m_report.nev, atlasData.tTotal, -999, "neutron") );
115 ATH_MSG_INFO(vPrFmt(atlasData.tPion, m_report.nev, atlasData.tTotal, -999, "pi+/-/0") );
116 ATH_MSG_INFO(vPrFmt(atlasData.tBaryon, m_report.nev, atlasData.tTotal, -999, "baryon" ) );
117 ATH_MSG_INFO(vPrFmt(atlasData.tLepton, m_report.nev, atlasData.tTotal, -999, "lepton" ) );
118 ATH_MSG_INFO(vPrFmt(atlasData.tMeson, m_report.nev, atlasData.tTotal, -999, "meson" ) );
119 ATH_MSG_INFO(vPrFmt(atlasData.tOther, m_report.nev, atlasData.tTotal, -999, "other" ) );
120
121 } else { ATH_MSG_WARNING("******* No events timed! *******"); }
122 } else { ATH_MSG_WARNING("******* No Timing information recorded! *******"); }
123
124 return StatusCode::SUCCESS;
125 }
126
127 //----------------------------------------------------------------------------
128 void TestActionVPTimerTool::TreeOut(const VolTree& id, const double tAtlas, int depth)
129 {
130 VolIt v = m_report.time_index.find(id);
131 if (v != m_report.time_index.end()) {
132 depth++;
133 for (VolIt c = m_report.time_index.begin(); c != m_report.time_index.end(); ++c) {
134 VolTree check = c->first;
135 check.pop_back();
136 if (id == check) TreeOut(c->first, tAtlas, depth);
137 }
138 TimerPrint(*v, tAtlas, depth);
139 }
140 }
141
142 //----------------------------------------------------------------------------
143 // Prints information about time by particle type and volume (modify to suit)
144 inline void TestActionVPTimerTool::TimerPrint(std::pair<VolTree, TestActionVPTimer::volumeData> vp,
145 const double tTotal, const int depth) const
146 {
147 G4VPhysicalVolume* pv = vp.first.back().first;
148 std::string physical = stringify(pv->GetName());
149 std::string copyNo = stringify(vp.first.back().second);
150 std::string mother = "";
151 if (vp.first.size() != 1) mother = stringify( (vp.first.end()-2)->first->GetName() );
152 ATH_MSG_INFO(vPrFmt(vp.second.tTotal, m_report.nev, tTotal, depth-1, physical+"_"+copyNo+" "+mother) );
153 ATH_MSG_INFO(vPrFmt(vp.second.tElectron, m_report.nev, tTotal, depth-1, " - electrons & positrons") );
154 ATH_MSG_INFO(vPrFmt(vp.second.tPhoton, m_report.nev, tTotal, depth-1, " - photons") );
155 ATH_MSG_INFO(vPrFmt(vp.second.tNeutron, m_report.nev, tTotal, depth-1, " - neutrons") );
156 ATH_MSG_INFO(vPrFmt(vp.second.tPion, m_report.nev, tTotal, depth-1, " - pions") );
157
158 double tOther = vp.second.tTotal - vp.second.tElectron - vp.second.tPhoton - vp.second.tNeutron - vp.second.tPion;
159 ATH_MSG_INFO(vPrFmt(tOther, m_report.nev, m_report.runTime, depth-1, " - other particles") );
160 }
161
162} // namespace G4UA
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
std::vector< VolID > VolTree
std::string stringify(T obj)
TestActionVPTimer::Report m_report
holds data to be reported at end of run
void TimerPrint(std::pair< VolTree, TestActionVPTimer::volumeData >, const double tTotal, const int depth=0) const
virtual std::unique_ptr< TestActionVPTimer > makeAndFillAction(G4AtlasUserActions &) override final
Create action for this thread.
void TreeOut(const VolTree &, const double tAtlas, int depth=0)
TestActionVPTimer::Config m_config
holds the runtime configuration
TestActionVPTimerTool(const std::string &type, const std::string &name, const IInterface *parent)
Standard constructor.
virtual StatusCode finalize() override
Triggers report merging from threads.
const Report & getReport() const
ThreadSpecificUserAction< TestActionVPTimer > m_actions
UserActionToolBase(const std::string &type, const std::string &name, const IInterface *parent)
std::string depth
tag string for intendation
Definition fastadd.cxx:46
std::map< VolTree, TestActionVPTimer::volumeData > VolMap
std::string vPrFmt(double time, double nEv, double tRun, int depth, const std::string &id)
VolMap::const_iterator VolIt
Struct for passing around user actions.
std::vector< G4UserSteppingAction * > steppingActions
std::vector< G4UserEventAction * > eventActions
std::vector< G4UserRunAction * > runActions
double tMeson
Time spent on all mesons in volume.
double tBaryon
Time spent on other baryons in volume.
double tPhoton
Time spent on photons in volume.
double tTotal
Overloaded += operator.
double tPion
Time spent on pions in volume.
double tNeutron
Time spent on neutrons in volume.
double tOther
Time spent on all other particles in volume (mostly nuclei)
double tLepton
Time spent on other leptons in volume.
double tElectron
Time spent on e objects in volume.