ATLAS Offline Software
Loading...
Searching...
No Matches
TestActionVPTimerTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 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 TestActionVPTimer::volumeData atlasData = m_report.time_index.find(topPV)->second;
84 G4double DeadTime = m_report.runTime - atlasData.tTotal;
85
86 ATH_MSG_INFO("Runtime " << m_report.runTime
87 << " Dead Time " << DeadTime );
88
89 if (m_report.nev != 0){
90 ATH_MSG_INFO("******* Beginning timer dump *******" );
91
92 ATH_MSG_INFO(setw(12) << "Time" << setw(12) << "per Event" << setw(12)
93 << "per Run" << setw(6) << "Depth" << " Location/Particle" );
94 ATH_MSG_INFO(vPrFmt(m_report.runTime, m_report.nev, atlasData.tTotal, -999, " Event Average") );
95 ATH_MSG_INFO(vPrFmt(DeadTime, m_report.nev, atlasData.tTotal, -999, " Dead/Initialization") );
96
97 ATH_MSG_INFO("\n******* Data by volume/select particles *******");
98 ATH_MSG_INFO("Data printed in reverse tree order (mother following daughter)");
99
100 TreeOut(topPV, atlasData.tTotal);
101 // for (VolIt c = v_time_index.begin(); c != v_time_index.end(); c++) {
102 // TimerPrint(*c, atlasData.tTotal, c->first.size());
103 // }
104
105 ATH_MSG_INFO( "\n******* Data by particle/category *******");
106
107 ATH_MSG_INFO(vPrFmt(atlasData.tElectron, m_report.nev, atlasData.tTotal, -999, "e+/-" ) );
108 ATH_MSG_INFO(vPrFmt(atlasData.tPhoton, m_report.nev, atlasData.tTotal, -999, "gamma" ) );
109 ATH_MSG_INFO(vPrFmt(atlasData.tNeutron, m_report.nev, atlasData.tTotal, -999, "neutron") );
110 ATH_MSG_INFO(vPrFmt(atlasData.tPion, m_report.nev, atlasData.tTotal, -999, "pi+/-/0") );
111 ATH_MSG_INFO(vPrFmt(atlasData.tBaryon, m_report.nev, atlasData.tTotal, -999, "baryon" ) );
112 ATH_MSG_INFO(vPrFmt(atlasData.tLepton, m_report.nev, atlasData.tTotal, -999, "lepton" ) );
113 ATH_MSG_INFO(vPrFmt(atlasData.tMeson, m_report.nev, atlasData.tTotal, -999, "meson" ) );
114 ATH_MSG_INFO(vPrFmt(atlasData.tOther, m_report.nev, atlasData.tTotal, -999, "other" ) );
115
116 } else { ATH_MSG_WARNING("******* No events timed! *******"); }
117 } else { ATH_MSG_WARNING("******* No Timing information recorded! *******"); }
118
119 return StatusCode::SUCCESS;
120 }
121
122 //----------------------------------------------------------------------------
123 void TestActionVPTimerTool::TreeOut(const VolTree& id, const double tAtlas, int depth)
124 {
125 VolIt v = m_report.time_index.find(id);
126 if (v != m_report.time_index.end()) {
127 depth++;
128 for (VolIt c = m_report.time_index.begin(); c != m_report.time_index.end(); ++c) {
129 VolTree check = c->first;
130 check.pop_back();
131 if (id == check) TreeOut(c->first, tAtlas, depth);
132 }
133 TimerPrint(*v, tAtlas, depth);
134 }
135 }
136
137 //----------------------------------------------------------------------------
138 // Prints information about time by particle type and volume (modify to suit)
139 inline void TestActionVPTimerTool::TimerPrint(std::pair<VolTree, TestActionVPTimer::volumeData> vp,
140 const double tTotal, const int depth) const
141 {
142 G4VPhysicalVolume* pv = vp.first.back().first;
143 std::string physical = stringify(pv->GetName());
144 std::string copyNo = stringify(vp.first.back().second);
145 std::string mother = "";
146 if (vp.first.size() != 1) mother = stringify( (vp.first.end()-2)->first->GetName() );
147 ATH_MSG_INFO(vPrFmt(vp.second.tTotal, m_report.nev, tTotal, depth-1, physical+"_"+copyNo+" "+mother) );
148 ATH_MSG_INFO(vPrFmt(vp.second.tElectron, m_report.nev, tTotal, depth-1, " - electrons & positrons") );
149 ATH_MSG_INFO(vPrFmt(vp.second.tPhoton, m_report.nev, tTotal, depth-1, " - photons") );
150 ATH_MSG_INFO(vPrFmt(vp.second.tNeutron, m_report.nev, tTotal, depth-1, " - neutrons") );
151 ATH_MSG_INFO(vPrFmt(vp.second.tPion, m_report.nev, tTotal, depth-1, " - pions") );
152
153 double tOther = vp.second.tTotal - vp.second.tElectron - vp.second.tPhoton - vp.second.tNeutron - vp.second.tPion;
154 ATH_MSG_INFO(vPrFmt(tOther, m_report.nev, m_report.runTime, depth-1, " - other particles") );
155 }
156
157} // 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.