SLIC  6.1.1
Simulation for the Linear Collider (SLIC) - Geant4 simulation application
PluginManager.cc
Go to the documentation of this file.
1 #include "PluginManager.hh"
2 
3 namespace slic {
4 
7 }
8 
9 void PluginManager::beginRun(const G4Run* run) {
10  for (PluginVec::iterator it = plugins_.begin(); it != plugins_.end(); it++) {
11  if ((*it)->hasRunAction()) {
12  (*it)->beginRun(run);
13  }
14  }
15 }
16 
17 void PluginManager::endRun(const G4Run* run) {
18  for (PluginVec::iterator it = plugins_.begin(); it != plugins_.end(); it++) {
19  if ((*it)->hasRunAction()) {
20  (*it)->endRun(run);
21  }
22  }
23 }
24 
25 void PluginManager::stepping(const G4Step* step) {
26  for (PluginVec::iterator it = plugins_.begin(); it != plugins_.end(); it++) {
27  if ((*it)->hasSteppingAction()) {
28  (*it)->stepping(step);
29  }
30  }
31 }
32 
33 void PluginManager::preTracking(const G4Track* track) {
34  for (PluginVec::iterator it = plugins_.begin(); it != plugins_.end(); it++) {
35  if ((*it)->hasTrackingAction()) {
36  (*it)->preTracking(track);
37  }
38  }
39 }
40 
41 void PluginManager::postTracking(const G4Track* track) {
42  for (PluginVec::iterator it = plugins_.begin(); it != plugins_.end(); it++) {
43  if ((*it)->hasTrackingAction()) {
44  (*it)->postTracking(track);
45  }
46  }
47 }
48 
49 void PluginManager::beginEvent(const G4Event* event) {
50  for (PluginVec::iterator it = plugins_.begin(); it != plugins_.end(); it++) {
51  if ((*it)->hasEventAction()) {
52  (*it)->beginEvent(event);
53  }
54  }
55 }
56 
57 void PluginManager::endEvent(const G4Event* event) {
58  for (PluginVec::iterator it = plugins_.begin(); it != plugins_.end(); it++) {
59  if ((*it)->hasEventAction()) {
60  (*it)->endEvent(event);
61  }
62  }
63 }
64 
65 void PluginManager::generatePrimary(G4Event* event) {
66  for (PluginVec::iterator it = plugins_.begin(); it != plugins_.end(); it++) {
67  if ((*it)->hasPrimaryGeneratorAction()) {
68  (*it)->generatePrimary(event);
69  }
70  }
71 }
72 
73 G4ClassificationOfNewTrack PluginManager::stackingClassifyNewTrack(const G4Track* track) {
74 
75  // Default value of a track is fUrgent.
76  G4ClassificationOfNewTrack currentTrackClass = G4ClassificationOfNewTrack::fUrgent;
77 
78  for (PluginVec::iterator it = plugins_.begin(); it != plugins_.end(); it++) {
79  if ((*it)->hasStackingAction()) {
80 
81  // Get proposed new track classification from this plugin.
82  G4ClassificationOfNewTrack newTrackClass = (*it)->stackingClassifyNewTrack(track, currentTrackClass);
83 
84  // Only set the current classification if the plugin changed it.
85  if (newTrackClass != currentTrackClass) {
86 
87  // Set the track classification from this plugin.
88  currentTrackClass = newTrackClass;
89  }
90  }
91  }
92 
93  // Return the current track classification.
94  return currentTrackClass;
95 }
96 
98  for (PluginVec::iterator it = plugins_.begin(); it != plugins_.end(); it++) {
99  if ((*it)->hasEventAction()) {
100  (*it)->stackingNewStage();
101  }
102  }
103 }
104 
106  for (PluginVec::iterator it = plugins_.begin(); it != plugins_.end(); it++) {
107  if ((*it)->hasStackingAction()) {
108  (*it)->stackingPrepareNewEvent();
109  }
110  }
111 }
112 
113 UserActionPlugin* PluginManager::findPlugin(const std::string& pluginName) {
114  UserActionPlugin* foundPlugin = nullptr;
115  for (PluginVec::iterator iPlugin = plugins_.begin(); iPlugin != plugins_.end(); iPlugin++) {
116  if ((*iPlugin)->getName() == pluginName) {
117  foundPlugin = *iPlugin;
118  break;
119  }
120  }
121  return foundPlugin;
122 }
123 
124 void PluginManager::create(const std::string& pluginName, const std::string& libName) {
125  if (findPlugin(pluginName) == nullptr) {
126  UserActionPlugin* plugin = pluginLoader_.create(pluginName, libName);
127  registerPlugin(plugin);
128  } else {
129  std::cerr << "[ PluginManager ] - Plugin " << pluginName << " already exists." << std::endl;
130  throw new std::runtime_error("Plugin already loaded.");
131  }
132 }
133 
134 void PluginManager::destroy(const std::string& pluginName) {
135  UserActionPlugin* plugin = findPlugin(pluginName);
136  if (plugin != nullptr) {
137  destroy(plugin);
138  }
139 }
140 
142  if (plugin != nullptr) {
143  deregisterPlugin(plugin);
144  pluginLoader_.destroy(plugin);
145  }
146 }
147 
148 std::ostream& PluginManager::print(std::ostream& os) {
149  for (PluginVec::iterator iPlugin = plugins_.begin(); iPlugin != plugins_.end(); iPlugin++) {
150  os << (*iPlugin)->getName() << std::endl;
151  }
152  return os;
153 }
154 
156  plugins_.push_back(plugin);
157 }
158 
160  std::vector<UserActionPlugin*>::iterator pos = std::find(plugins_.begin(), plugins_.end(), plugin);
161  if (pos != plugins_.end()) {
162  plugins_.erase(pos);
163  }
164 }
165 
167  for (unsigned iPlugin = 0; iPlugin < plugins_.size(); iPlugin++) {
168  destroy(plugins_[iPlugin]);
169  }
170  plugins_.clear();
171 }
172 
173 } // namespace sim
UserActionPlugin * create(std::string pluginName, std::string libName)
Definition: PluginLoader.cc:7
void destroy(UserActionPlugin *plugin)
Definition: PluginLoader.cc:53
std::ostream & print(std::ostream &os)
void destroy(const std::string &pluginName)
G4ClassificationOfNewTrack stackingClassifyNewTrack(const G4Track *aTrack)
Return a track classification from the user plugins that have stacking actions. Activate the track cl...
void registerPlugin(UserActionPlugin *plugin)
void create(const std::string &pluginName, const std::string &libName)
PluginLoader pluginLoader_
void generatePrimary(G4Event *anEvent)
void beginEvent(const G4Event *anEvent)
void endEvent(const G4Event *anEvent)
void endRun(const G4Run *aRun)
void deregisterPlugin(UserActionPlugin *plugin)
void stepping(const G4Step *aStep)
void preTracking(const G4Track *aTrack)
UserActionPlugin * findPlugin(const std::string &pluginName)
void postTracking(const G4Track *aTrack)
void beginRun(const G4Run *aRun)
Definition: PluginManager.cc:9
virtual ~PluginManager()
Definition: PluginManager.cc:5
User simulation plugin.
@ endl
Definition: LogStream.hh:26