Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
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// $Id$
28//
29//
30// Scene data John Allison 19th July 1996.
31
32#include "G4Scene.hh"
33
34#include "G4Vector3D.hh"
36#include "G4VisAttributes.hh"
39
41 fName (name),
42 fRefreshAtEndOfEvent(true),
43 fRefreshAtEndOfRun(true),
44 fMaxNumberOfKeptEvents(0)
45{} // Note all other data members have default initial values.
46
48
50 std::vector<Model>::const_iterator i;
51 for (i = fRunDurationModelList.begin ();
52 i != fRunDurationModelList.end (); ++i) {
53 if (pModel -> GetGlobalDescription () ==
54 i->fpModel->GetGlobalDescription ()) break;
55 }
56 if (i != fRunDurationModelList.end ()) {
57 if (warn) {
58 G4cout << "G4Scene::AddRunDurationModel: model \""
59 << pModel -> GetGlobalDescription ()
60 << "\"\n is already in the run-duration list of scene \""
61 << fName
62 << "\"."
63 << G4endl;
64 }
65 return false;
66 }
67 fRunDurationModelList.push_back (Model(pModel));
69 return true;
70}
71
73{
74 G4BoundingSphereScene boundingSphereScene;
75
76 for (size_t i = 0; i < fRunDurationModelList.size(); i++) {
77 if (fRunDurationModelList[i].fActive) {
78 G4VModel* model = fRunDurationModelList[i].fpModel;
79 if (model -> Validate()) { // Validates and also recomputes extent.
80 const G4VisExtent& thisExtent = model -> GetExtent ();
81 G4double thisRadius = thisExtent.GetExtentRadius ();
82 if (thisRadius > 0.) {
83 G4Point3D thisCentre = thisExtent.GetExtentCentre ();
84 thisCentre.transform (model -> GetTransformation ());
85 boundingSphereScene.AccrueBoundingSphere (thisCentre, thisRadius);
86 }
87 } else {
89 ed << "Invalid model \"" << model->GetGlobalDescription()
90 << "\".\n Not included in extent calculation.";
92 ("G4Scene::CalculateExtent",
93 "visman0201", JustWarning, ed);
94 }
95 }
96 }
97
98 for (size_t i = 0; i < fEndOfEventModelList.size(); i++) {
99 if (fEndOfEventModelList[i].fActive) {
100 G4VModel* model = fEndOfEventModelList[i].fpModel;
101 if (model -> Validate()) { // Validates and also recomputes extent.
102 const G4VisExtent& thisExtent = model -> GetExtent ();
103 G4double thisRadius = thisExtent.GetExtentRadius ();
104 if (thisRadius > 0.) {
105 G4Point3D thisCentre = thisExtent.GetExtentCentre ();
106 thisCentre.transform (model -> GetTransformation ());
107 boundingSphereScene.AccrueBoundingSphere (thisCentre, thisRadius);
108 }
109 } else {
111 ed << "Invalid model \"" << model->GetGlobalDescription()
112 << "\".\n Not included in extent calculation.";
114 ("G4Scene::CalculateExtent",
115 "visman0201", JustWarning, ed);
116 }
117 }
118 }
119
120 for (size_t i = 0; i < fEndOfRunModelList.size(); i++) {
121 if (fEndOfRunModelList[i].fActive) {
122 G4VModel* model = fEndOfRunModelList[i].fpModel;
123 if (model -> Validate()) { // Validates and also recomputes extent.
124 const G4VisExtent& thisExtent = model -> GetExtent ();
125 G4double thisRadius = thisExtent.GetExtentRadius ();
126 if (thisRadius > 0.) {
127 G4Point3D thisCentre = thisExtent.GetExtentCentre ();
128 thisCentre.transform (model -> GetTransformation ());
129 boundingSphereScene.AccrueBoundingSphere (thisCentre, thisRadius);
130 }
131 } else {
133 ed << "Invalid model \"" << model->GetGlobalDescription()
134 << "\".\n Not included in extent calculation.";
136 ("G4Scene::CalculateExtent",
137 "visman0201", JustWarning, ed);
138 }
139 }
140 }
141
142 fExtent = boundingSphereScene.GetBoundingSphereExtent ();
143 fStandardTargetPoint = fExtent.GetExtentCentre ();
144 if (fExtent.GetExtentRadius() <= 0.) {
146 ("G4Scene::CalculateExtent",
147 "visman0202", JustWarning,
148 "Scene has no extent. Please activate or add something."
149 "\nThe camera needs to have something to point at!"
150 "\n\"/vis/scene/list\" to see list of models.");
151 }
152}
153
155 G4bool successful = true;
156 if (IsEmpty ()) {
157 successful = false;
158 G4VPhysicalVolume* pWorld =
160 -> GetNavigatorForTracking () -> GetWorldVolume ();
161 if (pWorld) {
162 const G4VisAttributes* pVisAttribs =
163 pWorld -> GetLogicalVolume () -> GetVisAttributes ();
164 if (!pVisAttribs || pVisAttribs -> IsVisible ()) {
165 if (warn) {
166 G4cout <<
167 "Your \"world\" has no vis attributes or is marked as visible."
168 "\n For a better view of the contents, mark the world as"
169 " invisible, e.g.,"
170 "\n myWorldLogicalVol ->"
171 " SetVisAttributes (G4VisAttributes::Invisible);"
172 << G4endl;
173 }
174 }
175 successful = AddRunDurationModel (new G4PhysicalVolumeModel (pWorld));
176 // Note: default depth and no modeling parameters.
177 if (successful) {
178 if (warn) {
179 G4cout <<
180 "G4Scene::AddWorldIfEmpty: The scene was empty of run-duration models."
181 "\n \"world\" has been added.";
182 G4cout << G4endl;
183 }
184 }
185 }
186 }
187 return successful;
188}
189
191 G4int i, nModels = fEndOfEventModelList.size ();
192 for (i = 0; i < nModels; i++) {
193 if (pModel -> GetGlobalDescription () ==
194 fEndOfEventModelList[i].fpModel -> GetGlobalDescription ()) break;
195 }
196 if (i < nModels) {
197 if (warn) {
198 G4cout << "G4Scene::AddEndOfEventModel: a model \""
199 << pModel -> GetGlobalDescription ()
200 << "\"\n is already in the end-of-event list of scene \""
201 << fName << "\"."
202 << G4endl;
203 }
204 return false;
205 }
206 fEndOfEventModelList.push_back (Model(pModel));
207 return true;
208}
209
211 G4int i, nModels = fEndOfRunModelList.size ();
212 for (i = 0; i < nModels; i++) {
213 if (pModel -> GetGlobalDescription () ==
214 fEndOfRunModelList[i].fpModel -> GetGlobalDescription ()) break;
215 }
216 if (i < nModels) {
217 if (warn) {
218 G4cout << "G4Scene::AddEndOfRunModel: a model \""
219 << pModel -> GetGlobalDescription ()
220 << "\"\n is already in the end-of-run list of scene \""
221 << fName << "\"."
222 << G4endl;
223 }
224 return false;
225 }
226 fEndOfRunModelList.push_back (pModel);
227 return true;
228}
229
230std::ostream& operator << (std::ostream& os, const G4Scene& scene) {
231
232 size_t i;
233
234 os << "Scene data:";
235
236 os << "\n Run-duration model list:";
237 for (i = 0; i < scene.fRunDurationModelList.size (); i++) {
238 if (scene.fRunDurationModelList[i].fActive) os << "\n Active: ";
239 else os << "\n Inactive: ";
240 os << *(scene.fRunDurationModelList[i].fpModel);
241 }
242
243 os << "\n End-of-event model list:";
244 for (i = 0; i < scene.fEndOfEventModelList.size (); i++) {
245 if (scene.fEndOfEventModelList[i].fActive) os << "\n Active: ";
246 else os << "\n Inactive: ";
247 os << *(scene.fEndOfEventModelList[i].fpModel);
248 }
249
250 os << "\n End-of-run model list:";
251 for (i = 0; i < scene.fEndOfRunModelList.size (); i++) {
252 if (scene.fEndOfRunModelList[i].fActive) os << "\n Active: ";
253 else os << "\n Inactive: ";
254 os << *(scene.fEndOfRunModelList[i].fpModel);
255 }
256
257 os << "\n Extent or bounding box: " << scene.fExtent;
258
259 os << "\n Standard target point: " << scene.fStandardTargetPoint;
260
261 os << "\n End of event action set to \"";
262 if (scene.fRefreshAtEndOfEvent) os << "refresh\"";
263 else {
264 os << "accumulate (maximum number of kept events: ";
265 if (scene.fMaxNumberOfKeptEvents >= 0) os << scene.fMaxNumberOfKeptEvents;
266 else os << "unlimited";
267 os << ")";
268 }
269
270 os << "\n End of run action set to \"";
271 if (scene.fRefreshAtEndOfRun) os << "refresh";
272 else os << "accumulate";
273 os << "\"";
274
275 return os;
276}
277
279 if (
280 (fRunDurationModelList.size () !=
281 scene.fRunDurationModelList.size ()) ||
282 (fEndOfEventModelList.size () !=
283 scene.fEndOfEventModelList.size ()) ||
284 (fEndOfRunModelList.size () !=
285 scene.fEndOfRunModelList.size ()) ||
286 (fExtent != scene.fExtent) ||
287 !(fStandardTargetPoint == scene.fStandardTargetPoint) ||
288 fRefreshAtEndOfEvent != scene.fRefreshAtEndOfEvent ||
289 fRefreshAtEndOfRun != scene.fRefreshAtEndOfRun ||
290 fMaxNumberOfKeptEvents != scene.fMaxNumberOfKeptEvents
291 ) return true;
292
293 /* A complete comparison should, perhaps, include a comparison of
294 individual models, but it is not easy to implement operator!= for
295 all models. Also, it would be unfeasible to ask users to
296 implement opeerator!= if we ever get round to allowing
297 user-defined models. Moreover, there is no editing of G4Scene
298 objects, apart from changing fRefreshAtEndOfEvent, etc; as far as
299 models are concerned, all you can ever do is add them, so a test
300 on size (above) is enough.
301
302 for (size_t i = 0; i < fRunDurationModelList.size (); i++) {
303 if (fRunDurationModelList[i] != scene.fRunDurationModelList[i])
304 return true;
305 }
306
307 for (size_t i = 0; i < fEndOfEventModelList.size (); i++) {
308 if (fEndOfEventModelList[i] != scene.fEndOfEventModelList[i])
309 return true;
310 }
311
312 for (size_t i = 0; i < fEndOfRunModelList.size (); i++) {
313 if (fEndOfRunModelList[i] != scene.fEndOfRunModelList[i])
314 return true;
315 }
316 */
317
318 return false;
319}
@ JustWarning
std::ostream & operator<<(std::ostream &os, const G4Scene &scene)
Definition: G4Scene.cc:230
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
void AccrueBoundingSphere(const G4Point3D &centre, G4double radius)
G4VisExtent GetBoundingSphereExtent()
void CalculateExtent()
Definition: G4Scene.cc:72
G4bool AddRunDurationModel(G4VModel *, G4bool warn=false)
Definition: G4Scene.cc:49
G4bool AddWorldIfEmpty(G4bool warn=false)
Definition: G4Scene.cc:154
const G4VisExtent & GetExtent() const
G4bool operator!=(const G4Scene &) const
Definition: G4Scene.cc:278
G4bool AddEndOfRunModel(G4VModel *, G4bool warn=false)
Definition: G4Scene.cc:210
G4Scene(const G4String &name="scene-with-unspecified-name")
Definition: G4Scene.cc:40
~G4Scene()
Definition: G4Scene.cc:47
G4bool AddEndOfEventModel(G4VModel *, G4bool warn=false)
Definition: G4Scene.cc:190
G4bool IsEmpty() const
static G4TransportationManager * GetTransportationManager()
const G4String & GetGlobalDescription() const
G4double GetExtentRadius() const
Definition: G4VisExtent.cc:73
const G4Point3D & GetExtentCentre() const
Definition: G4VisExtent.cc:63
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76