Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4Scene.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27//
28//
29// Scene data John Allison 19th July 1996.
30
31#include "G4Scene.hh"
32
33#include "G4Vector3D.hh"
35#include "G4VisAttributes.hh"
38
39#include <set>
40
41#define G4warn G4cout
42
44 fName (name),
45 fRefreshAtEndOfEvent(true),
46 fRefreshAtEndOfRun(true),
47 fMaxNumberOfKeptEvents(100)
48{} // Note all other data members have default initial values.
49
51
52namespace {
53 void PrintInvalidModel(const G4VModel* model)
54 {
56 ed << "Invalid model \"" << model->GetGlobalDescription()
57 << "\".\n Not included in extent calculation.";
59 ("G4Scene::CalculateExtent",
60 "visman0201", JustWarning, ed);
61 }
62}
63
65{
66 G4BoundingExtentScene boundingExtentScene;
67
68 for (size_t i = 0; i < fRunDurationModelList.size(); i++) {
69 if (fRunDurationModelList[i].fActive) {
70 G4VModel* model = fRunDurationModelList[i].fpModel;
71 if (model -> Validate()) {
72 const G4VisExtent& thisExtent = model -> GetExtent ();
73 if (thisExtent != G4VisExtent::GetNullExtent()) {
74 boundingExtentScene.AccrueBoundingExtent(thisExtent);
75 }
76 } else {
77 PrintInvalidModel(model);
78 }
79 }
80 }
81
82 for (size_t i = 0; i < fEndOfEventModelList.size(); i++) {
83 if (fEndOfEventModelList[i].fActive) {
84 G4VModel* model = fEndOfEventModelList[i].fpModel;
85 if (model -> Validate()) {
86 const G4VisExtent& thisExtent = model -> GetExtent ();
87 if (thisExtent != G4VisExtent::GetNullExtent()) {
88 boundingExtentScene.AccrueBoundingExtent(thisExtent);
89 }
90 } else {
91 PrintInvalidModel(model);
92 }
93 }
94 }
95
96 for (size_t i = 0; i < fEndOfRunModelList.size(); i++) {
97 if (fEndOfRunModelList[i].fActive) {
98 G4VModel* model = fEndOfRunModelList[i].fpModel;
99 if (model -> Validate()) {
100 const G4VisExtent& thisExtent = model -> GetExtent ();
101 if (thisExtent != G4VisExtent::GetNullExtent()) {
102 boundingExtentScene.AccrueBoundingExtent(thisExtent);
103 }
104 } else {
105 PrintInvalidModel(model);
106 }
107 }
108 }
109
110 fExtent = boundingExtentScene.GetBoundingExtent ();
111 fStandardTargetPoint = fExtent.GetExtentCentre ();
112 if (fExtent.GetExtentRadius() <= 0.) {
114 ("G4Scene::CalculateExtent",
115 "visman0202", JustWarning,
116 "Scene has no extent. Please activate or add something."
117 "\nThe camera needs to have something to point at!"
118 "\nAdd a volume. (You may need \"/run/initialize\".)"
119 "\nOr use \"/vis/scene/add/extent\"."
120 "\n\"/vis/scene/list\" to see list of models.");
121 }
122}
123
125 G4bool successful = true;
126 if (IsEmpty ()) {
127 successful = false;
128 G4VPhysicalVolume* pWorld =
130 -> GetNavigatorForTracking () -> GetWorldVolume ();
131 if (pWorld) {
132 const G4VisAttributes* pVisAttribs =
133 pWorld -> GetLogicalVolume () -> GetVisAttributes ();
134 if (!pVisAttribs || pVisAttribs -> IsVisible ()) {
135 if (warn) {
136 G4warn <<
137 "Your \"world\" has no vis attributes or is marked as visible."
138 "\n For a better view of the contents, mark the world as"
139 " invisible, e.g.,"
140 "\n myWorldLogicalVol ->"
141 " SetVisAttributes (G4VisAttributes::GetInvisible());"
142 << G4endl;
143 }
144 }
145 successful = AddRunDurationModel (new G4PhysicalVolumeModel (pWorld));
146 // Note: default depth and no modeling parameters.
147 if (successful) {
148 if (warn) {
149 G4warn <<
150 "G4Scene::AddWorldIfEmpty: The scene had no extent."
151 "\n \"world\" has been added.";
152 G4warn << G4endl;
153 }
154 }
155 }
156 }
157 return successful;
158}
159
161{
162 std::vector<Model>::const_iterator i;
163 for (i = fRunDurationModelList.begin ();
164 i != fRunDurationModelList.end (); ++i) {
165 if (pModel -> GetGlobalDescription () ==
166 i->fpModel->GetGlobalDescription ()) break;
167 }
168 if (i != fRunDurationModelList.end ()) {
169 if (warn) {
170 G4warn << "G4Scene::AddRunDurationModel: model \""
171 << pModel -> GetGlobalDescription ()
172 << "\"\n is already in the run-duration list of scene \""
173 << fName
174 << "\"."
175 << G4endl;
176 }
177 return false;
178 }
179 fRunDurationModelList.push_back (Model(pModel));
181 return true;
182}
183
185 std::size_t i, nModels = fEndOfEventModelList.size ();
186 for (i = 0; i < nModels; ++i) {
187 if (pModel -> GetGlobalDescription () ==
188 fEndOfEventModelList[i].fpModel -> GetGlobalDescription ()) break;
189 }
190 if (i < nModels) {
191 if (warn) {
192 G4warn << "G4Scene::AddEndOfEventModel: a model \""
193 << pModel -> GetGlobalDescription ()
194 << "\"\n is already in the end-of-event list of scene \""
195 << fName << "\"."
196 << G4endl;
197 }
198 return false;
199 }
200 fEndOfEventModelList.push_back (Model(pModel));
202 return true;
203}
204
206 std::size_t i, nModels = fEndOfRunModelList.size ();
207 for (i = 0; i < nModels; ++i) {
208 if (pModel -> GetGlobalDescription () ==
209 fEndOfRunModelList[i].fpModel -> GetGlobalDescription ()) break;
210 }
211 if (i < nModels) {
212 if (warn) {
213 G4warn << "G4Scene::AddEndOfRunModel: a model \""
214 << pModel -> GetGlobalDescription ()
215 << "\"\n is already in the end-of-run list of scene \""
216 << fName << "\"."
217 << G4endl;
218 }
219 return false;
220 }
221 fEndOfRunModelList.push_back (pModel);
223 return true;
224}
225
226std::ostream& operator << (std::ostream& os, const G4Scene& scene) {
227
228 size_t i;
229
230 os << "Scene data:";
231
232 os << "\n Run-duration model list:";
233 if (scene.fRunDurationModelList.size () == 0) {
234 os << " none";
235 }
236 for (i = 0; i < scene.fRunDurationModelList.size (); i++) {
237 if (scene.fRunDurationModelList[i].fActive) os << "\n Active: ";
238 else os << "\n Inactive: ";
239 os << *(scene.fRunDurationModelList[i].fpModel);
240 }
241
242 os << "\n End-of-event model list:";
243 if (scene.fEndOfEventModelList.size () == 0) {
244 os << " none";
245 }
246 for (i = 0; i < scene.fEndOfEventModelList.size (); i++) {
247 if (scene.fEndOfEventModelList[i].fActive) os << "\n Active: ";
248 else os << "\n Inactive: ";
249 os << *(scene.fEndOfEventModelList[i].fpModel);
250 }
251
252 os << "\n End-of-run model list:";
253 if (scene.fEndOfRunModelList.size () == 0) {
254 os << " none";
255 }
256 for (i = 0; i < scene.fEndOfRunModelList.size (); i++) {
257 if (scene.fEndOfRunModelList[i].fActive) os << "\n Active: ";
258 else os << "\n Inactive: ";
259 os << *(scene.fEndOfRunModelList[i].fpModel);
260 }
261
262 os << "\n Overall extent or bounding box: " << scene.fExtent;
263
264 os << "\n Standard target point: " << scene.fStandardTargetPoint;
265
266 os << "\n End of event action set to \"";
267 if (scene.fRefreshAtEndOfEvent) os << "refresh\"";
268 else {
269 os << "accumulate (maximum number of kept events: ";
270 if (scene.fMaxNumberOfKeptEvents >= 0) os << scene.fMaxNumberOfKeptEvents;
271 else os << "unlimited";
272 os << ")";
273 }
274
275 os << "\n End of run action set to \"";
276 if (scene.fRefreshAtEndOfRun) os << "refresh";
277 else os << "accumulate";
278 os << "\"";
279
280 return os;
281}
282
284 if (
285 (fRunDurationModelList.size () !=
286 scene.fRunDurationModelList.size ()) ||
287 (fEndOfEventModelList.size () !=
288 scene.fEndOfEventModelList.size ()) ||
289 (fEndOfRunModelList.size () !=
290 scene.fEndOfRunModelList.size ()) ||
291 (fExtent != scene.fExtent) ||
292 !(fStandardTargetPoint == scene.fStandardTargetPoint) ||
293 fRefreshAtEndOfEvent != scene.fRefreshAtEndOfEvent ||
294 fRefreshAtEndOfRun != scene.fRefreshAtEndOfRun ||
295 fMaxNumberOfKeptEvents != scene.fMaxNumberOfKeptEvents
296 ) return true;
297
298 /* A complete comparison should, perhaps, include a comparison of
299 individual models, but it is not easy to implement operator!= for
300 all models. Also, it would be unfeasible to ask users to
301 implement opeerator!= if we ever get round to allowing
302 user-defined models. Moreover, there is no editing of G4Scene
303 objects, apart from changing fRefreshAtEndOfEvent, etc; as far as
304 models are concerned, all you can ever do is add them, so a test
305 on size (above) is enough.
306
307 for (size_t i = 0; i < fRunDurationModelList.size (); i++) {
308 if (fRunDurationModelList[i] != scene.fRunDurationModelList[i])
309 return true;
310 }
311
312 for (size_t i = 0; i < fEndOfEventModelList.size (); i++) {
313 if (fEndOfEventModelList[i] != scene.fEndOfEventModelList[i])
314 return true;
315 }
316
317 for (size_t i = 0; i < fEndOfRunModelList.size (); i++) {
318 if (fEndOfRunModelList[i] != scene.fEndOfRunModelList[i])
319 return true;
320 }
321 */
322
323 return false;
324}
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
std::ostream & operator<<(std::ostream &os, const G4Scene &scene)
Definition: G4Scene.cc:226
#define G4warn
Definition: G4Scene.cc:41
bool G4bool
Definition: G4Types.hh:86
#define G4endl
Definition: G4ios.hh:57
void AccrueBoundingExtent(const G4VisExtent &)
const G4VisExtent & GetBoundingExtent() const
void CalculateExtent()
Definition: G4Scene.cc:64
G4bool AddRunDurationModel(G4VModel *, G4bool warn=false)
Definition: G4Scene.cc:160
G4bool AddWorldIfEmpty(G4bool warn=false)
Definition: G4Scene.cc:124
const G4VisExtent & GetExtent() const
G4bool operator!=(const G4Scene &) const
Definition: G4Scene.cc:283
G4bool AddEndOfRunModel(G4VModel *, G4bool warn=false)
Definition: G4Scene.cc:205
G4Scene(const G4String &name="scene-with-unspecified-name")
Definition: G4Scene.cc:43
~G4Scene()
Definition: G4Scene.cc:50
G4bool AddEndOfEventModel(G4VModel *, G4bool warn=false)
Definition: G4Scene.cc:184
G4bool IsEmpty() const
static G4TransportationManager * GetTransportationManager()
const G4String & GetGlobalDescription() const
static const G4VisExtent & GetNullExtent()
Definition: G4VisExtent.cc:60
G4double GetExtentRadius() const
Definition: G4VisExtent.cc:75
const G4Point3D & GetExtentCentre() const
Definition: G4VisExtent.cc:65