source: trunk/source/visualization/management/src/G4VisManager.cc@ 1092

Last change on this file since 1092 was 1050, checked in by garnier, 17 years ago

update pas dans CVS

  • Property svn:mime-type set to text/cpp
File size: 53.7 KB
Line 
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// $Id: G4VisManager.cc,v 1.118 2009/03/09 12:42:00 allison Exp $
27// GEANT4 tag $Name: $
28//
29//
30// GEANT4 Visualization Manager - John Allison 02/Jan/1996.
31
32#include "G4VisManager.hh"
33
34#include "G4VisCommands.hh"
35#include "G4VisCommandsCompound.hh"
36#include "G4VisCommandsGeometry.hh"
37#include "G4VisCommandsGeometrySet.hh"
38#include "G4VisCommandsScene.hh"
39#include "G4VisCommandsSceneAdd.hh"
40#include "G4VisCommandsSceneHandler.hh"
41#include "G4VisCommandsViewer.hh"
42#include "G4VisCommandsViewerSet.hh"
43#include "G4UImanager.hh"
44#include "G4VisStateDependent.hh"
45#include "G4UIdirectory.hh"
46#include "G4VisFeaturesOfFukuiRenderer.hh"
47#include "G4VisFeaturesOfDAWNFILE.hh"
48#include "G4VisFeaturesOfOpenGL.hh"
49#include "G4VisFeaturesOfOpenInventor.hh"
50#include "G4VGraphicsSystem.hh"
51#include "G4VSceneHandler.hh"
52#include "G4VViewer.hh"
53#include "G4VPhysicalVolume.hh"
54#include "G4LogicalVolume.hh"
55#include "G4VSolid.hh"
56#include "G4Vector3D.hh"
57#include "G4Point3D.hh"
58#include "G4RotationMatrix.hh"
59#include "G4Polyline.hh"
60#include "G4Polyhedron.hh"
61#include "G4NURBS.hh"
62#include "G4NullModel.hh"
63#include "G4ModelingParameters.hh"
64#include "G4TransportationManager.hh"
65#include "G4VisCommandModelCreate.hh"
66#include "G4VisCommandsListManager.hh"
67#include "G4VisModelManager.hh"
68#include "G4VModelFactory.hh"
69#include "G4VisFilterManager.hh"
70#include "G4VTrajectoryModel.hh"
71#include "G4TrajectoryDrawByCharge.hh"
72#include "Randomize.hh"
73#include "G4RunManager.hh"
74#include "G4EventManager.hh"
75#include "G4Run.hh"
76#include "G4Event.hh"
77#include <sstream>
78
79G4VisManager* G4VisManager::fpInstance = 0;
80
81G4VisManager::G4VisManager ():
82 fVerbose (1),
83 fInitialised (false),
84 fpUserVisAction (0),
85 fpGraphicsSystem (0),
86 fpScene (0),
87 fpSceneHandler (0),
88 fpViewer (0),
89 fVerbosity (all),//warnings),
90 fpStateDependent (0),
91 fEventRefreshing (false),
92 fTransientsDrawnThisRun (false),
93 fTransientsDrawnThisEvent (false),
94 fEventKeepingSuspended (false),
95 fKeptLastEvent (false),
96 fpRequestedEvent (0),
97 fAbortReviewKeptEvents (false)
98 // All other objects use default constructors.
99{
100 fpTrajDrawModelMgr = new G4VisModelManager<G4VTrajectoryModel>("/vis/modeling/trajectories");
101 fpTrajFilterMgr = new G4VisFilterManager<G4VTrajectory>("/vis/filtering/trajectories");
102 fpHitFilterMgr = new G4VisFilterManager<G4VHit>("/vis/filtering/hits");
103
104 VerbosityGuidanceStrings.push_back
105 ("Simple graded message scheme - digit or string (1st character defines):");
106 VerbosityGuidanceStrings.push_back
107 (" 0) quiet, // Nothing is printed.");
108 VerbosityGuidanceStrings.push_back
109 (" 1) startup, // Startup and endup messages are printed...");
110 VerbosityGuidanceStrings.push_back
111 (" 2) errors, // ...and errors...");
112 VerbosityGuidanceStrings.push_back
113 (" 3) warnings, // ...and warnings...");
114 VerbosityGuidanceStrings.push_back
115 (" 4) confirmations, // ...and confirming messages...");
116 VerbosityGuidanceStrings.push_back
117 (" 5) parameters, // ...and parameters of scenes and views...");
118 VerbosityGuidanceStrings.push_back
119 (" 6) all // ...and everything available.");
120
121 if (fpInstance) {
122 G4Exception
123 ("G4VisManager: attempt to Construct more than one VisManager.");
124 }
125 else {
126
127 fpInstance = this;
128 SetConcreteInstance(this);
129
130 fpStateDependent = new G4VisStateDependent (this);
131 // No need to delete this; G4StateManager does this.
132
133 if (fVerbosity >= startup) {
134 G4cout << "Visualization Manager instantiating..." << G4endl;
135 }
136
137 // Note: The specific graphics systems must be instantiated in a
138 // higher level library to avoid circular dependencies. Also,
139 // some specifically need additional external libararies that the
140 // user must supply. Therefore we ask the user to implement
141 // RegisterGraphicsSystems() and RegisterModelFactories()
142 // in a subclass. We have to wait for the subclass to instantiate
143 // so RegisterGraphicsSystems() cannot be called from this
144 // constructor; it is called from Initialise(). So we ask the
145 // user:
146 // (a) to write a subclass and implement RegisterGraphicsSystems()
147 // and RegisterModelFactories(). See
148 // visualization/include/G4VisExecutive.hh/icc as an example.
149 // (b) instantiate the subclass.
150 // (c) invoke the Initialise() method of the subclass.
151 // For example:
152 // ...
153 // #ifdef G4VIS_USE
154 // // Instantiate and initialise Visualization Manager.
155 // G4VisManager* visManager = new G4VisExecutive;
156 // visManager -> SetVerboseLevel (Verbose);
157 // visManager -> Initialise ();
158 // #endif
159 // // (Don't forget to delete visManager;)
160 // ...
161
162 // Make top level command directory...
163 G4UIcommand* directory;
164 directory = new G4UIdirectory ("/vis/");
165 directory -> SetGuidance ("Visualization commands.");
166 fDirectoryList.push_back (directory);
167
168 // Instantiate top level basic commands
169 G4VVisCommand::SetVisManager (this); // Sets shared pointer
170 RegisterMessenger(new G4VisCommandVerbose);
171 RegisterMessenger(new G4VisCommandInitialize);
172 }
173}
174
175G4VisManager::~G4VisManager () {
176 fpInstance = 0;
177 size_t i;
178 for (i = 0; i < fSceneList.size (); ++i) {
179 delete fSceneList[i];
180 }
181 for (i = 0; i < fAvailableSceneHandlers.size (); ++i) {
182 delete fAvailableSceneHandlers[i];
183 }
184 for (i = 0; i < fAvailableGraphicsSystems.size (); ++i) {
185 delete fAvailableGraphicsSystems[i];
186 }
187 if (fVerbosity >= startup) {
188 G4cout << "Graphics systems deleted." << G4endl;
189 G4cout << "Visualization Manager deleting..." << G4endl;
190 }
191 for (i = 0; i < fMessengerList.size (); ++i) {
192 delete fMessengerList[i];
193 }
194 for (i = 0; i < fDirectoryList.size (); ++i) {
195 delete fDirectoryList[i];
196 }
197
198 delete fpTrajDrawModelMgr;
199 delete fpTrajFilterMgr;
200 delete fpHitFilterMgr;
201}
202
203G4VisManager* G4VisManager::GetInstance () {
204 if (!fpInstance) {
205 G4Exception
206 ("G4VisManager::GetInstance: VisManager not yet instantiated!");
207 }
208 return fpInstance;
209}
210
211void G4VisManager::Initialise () {
212
213 if (fInitialised && fVerbosity >= warnings) {
214 G4cout << "WARNING: G4VisManager::Initialise: already initialised."
215 << G4endl;
216 return;
217 }
218
219 if (fVerbosity >= startup) {
220 G4cout << "Visualization Manager initialising..." << G4endl;
221 }
222
223 if (fVerbosity >= parameters) {
224 G4cout <<
225 "\nYou have instantiated your own Visualization Manager, inheriting"
226 "\n G4VisManager and implementing RegisterGraphicsSystems(), in which"
227 "\n you should, normally, instantiate drivers which do not need"
228 "\n external packages or libraries, and, optionally, drivers under"
229 "\n control of environment variables."
230 "\n Also you should implement RegisterModelFactories()."
231 "\n See visualization/include/G4VisExecutive.hh/icc, for example."
232 "\n In your main() you will have something like:"
233 "\n #ifdef G4VIS_USE"
234 "\n G4VisManager* visManager = new G4VisExecutive;"
235 "\n visManager -> SetVerboseLevel (Verbose);"
236 "\n visManager -> Initialize ();"
237 "\n #endif"
238 "\n (Don't forget to delete visManager;)"
239 "\n"
240 << G4endl;
241 }
242
243 if (fVerbosity >= startup) {
244 G4cout << "Registering graphics systems..." << G4endl;
245 }
246
247 RegisterGraphicsSystems ();
248
249 if (fVerbosity >= startup) {
250 G4cout <<
251 "\nYou have successfully registered the following graphics systems."
252 << G4endl;
253 PrintAvailableGraphicsSystems ();
254 G4cout << G4endl;
255 }
256
257 // Make command directories for commands instantiated in the
258 // modeling subcategory...
259 G4UIcommand* directory;
260 directory = new G4UIdirectory ("/vis/modeling/");
261 directory -> SetGuidance ("Modeling commands.");
262 fDirectoryList.push_back (directory);
263 directory = new G4UIdirectory ("/vis/modeling/trajectories/");
264 directory -> SetGuidance ("Trajectory model commands.");
265 fDirectoryList.push_back (directory);
266 directory = new G4UIdirectory ("/vis/modeling/trajectories/create/");
267 directory -> SetGuidance ("Create trajectory models and messengers.");
268 fDirectoryList.push_back (directory);
269
270 // Filtering command directory
271 directory = new G4UIdirectory ("/vis/filtering/");
272 directory -> SetGuidance ("Filtering commands.");
273 fDirectoryList.push_back (directory);
274 directory = new G4UIdirectory ("/vis/filtering/trajectories/");
275 directory -> SetGuidance ("Trajectory filtering commands.");
276 fDirectoryList.push_back (directory);
277 directory = new G4UIdirectory ("/vis/filtering/trajectories/create/");
278 directory -> SetGuidance ("Create trajectory filters and messengers.");
279 fDirectoryList.push_back (directory);
280 directory = new G4UIdirectory ("/vis/filtering/hits/");
281 directory -> SetGuidance ("Hit filtering commands.");
282 fDirectoryList.push_back (directory);
283 directory = new G4UIdirectory ("/vis/filtering/hits/create/");
284 directory -> SetGuidance ("Create hit filters and messengers.");
285 fDirectoryList.push_back (directory);
286
287 RegisterMessengers ();
288
289 if (fVerbosity >= startup) {
290 G4cout << "Registering model factories..." << G4endl;
291 }
292
293 RegisterModelFactories();
294
295 if (fVerbosity >= startup) {
296 G4cout <<
297 "\nYou have successfully registered the following model factories."
298 << G4endl;
299 PrintAvailableModels (fVerbosity);
300 G4cout << G4endl;
301 }
302
303 fInitialised = true;
304}
305
306void G4VisManager::Enable() {
307 if (IsValidView ()) {
308 if (fVerbosity >= confirmations) {
309 G4cout << "G4VisManager::Enable: visualization enabled." << G4endl;
310 }
311 }
312 else {
313 if (fVerbosity >= warnings) {
314 G4cout <<
315 "G4VisManager::Enable: WARNING: visualization remains disabled for"
316 "\n above reasons. Rectifying with valid vis commands will"
317 "\n automatically enable."
318 << G4endl;
319 }
320 }
321}
322
323void G4VisManager::Disable() {
324 SetConcreteInstance(0);
325 if (fVerbosity >= confirmations) {
326 G4cout <<
327 "G4VisManager::Disable: visualization disabled."
328 "\n The pointer returned by GetConcreteInstance will be zero."
329 "\n Note that it will become enabled after some valid vis commands."
330 << G4endl;
331 }
332}
333
334const G4GraphicsSystemList& G4VisManager::GetAvailableGraphicsSystems () {
335 G4int nSystems = fAvailableGraphicsSystems.size ();
336 if (nSystems == 0) {
337 if (fVerbosity >= warnings) {
338 G4cout << "G4VisManager::GetAvailableGraphicsSystems: WARNING: no"
339 "\n graphics system available!"
340 "\n 1) Did you have environment variables G4VIS_BUILD_xxxx_DRIVER set"
341 "\n when you compiled/built the visualization code?"
342 "\n 2) Did you instantiate your own Visualization Manager and forget"
343 "\n to implement RegisterGraphicsSystems correctly?"
344 "\n 3) You can register your own graphics system, e.g.,"
345 "\n visManager->RegisterGraphicsSystem(new MyGraphicsSystem);)"
346 "\n after instantiating your vis manager and before"
347 "\n visManager->Initialize()."
348 << G4endl;
349 }
350 }
351 return fAvailableGraphicsSystems;
352}
353
354G4bool G4VisManager::RegisterGraphicsSystem (G4VGraphicsSystem* pSystem) {
355 G4bool happy = true;
356 if (pSystem) {
357 fAvailableGraphicsSystems.push_back (pSystem);
358 if (fVerbosity >= confirmations) {
359 G4cout << "G4VisManager::RegisterGraphicsSystem: "
360 << pSystem -> GetName ();
361 if (pSystem -> GetNickname () != "") {
362 G4cout << " (" << pSystem -> GetNickname () << ")";
363 }
364 G4cout << " registered." << G4endl;
365 }
366 }
367 else {
368 if (fVerbosity >= errors) {
369 G4cout << "G4VisManager::RegisterGraphicsSystem: null pointer!"
370 << G4endl;
371 }
372 happy=false;
373 }
374 return happy;
375}
376
377const G4VTrajectoryModel*
378G4VisManager::CurrentTrajDrawModel() const
379{
380 assert (0 != fpTrajDrawModelMgr);
381
382 const G4VTrajectoryModel* model = fpTrajDrawModelMgr->Current();
383
384 if (0 == model) {
385 // No model was registered with the trajectory model manager.
386 // Use G4TrajectoryDrawByCharge as a default.
387 fpTrajDrawModelMgr->Register(new G4TrajectoryDrawByCharge("AutoGenerated"));
388
389 if (fVerbosity >= warnings) {
390 G4cout<<"G4VisManager: Using G4TrajectoryDrawByCharge as default trajectory model."<<G4endl;
391 G4cout<<"See commands in /vis/modeling/trajectories/ for other options."<<G4endl;
392 }
393 }
394
395 model = fpTrajDrawModelMgr->Current();
396 assert (0 != model); // Should definitely exist now
397
398 return model;
399}
400
401void G4VisManager::RegisterModel(G4VTrajectoryModel* model)
402{
403 fpTrajDrawModelMgr->Register(model);
404}
405
406void
407G4VisManager::RegisterModelFactory(G4TrajDrawModelFactory* factory)
408{
409 fpTrajDrawModelMgr->Register(factory);
410}
411
412void G4VisManager::RegisterModel(G4VFilter<G4VTrajectory>* model)
413{
414 fpTrajFilterMgr->Register(model);
415}
416
417void
418G4VisManager::RegisterModelFactory(G4TrajFilterFactory* factory)
419{
420 fpTrajFilterMgr->Register(factory);
421}
422
423void G4VisManager::RegisterModel(G4VFilter<G4VHit>* model)
424{
425 fpHitFilterMgr->Register(model);
426}
427
428void
429G4VisManager::RegisterModelFactory(G4HitFilterFactory* factory)
430{
431 fpHitFilterMgr->Register(factory);
432}
433
434void G4VisManager::SelectTrajectoryModel(const G4String& model)
435{
436 fpTrajDrawModelMgr->SetCurrent(model);
437}
438
439void G4VisManager::Draw (const G4Circle& circle,
440 const G4Transform3D& objectTransform) {
441 if (IsValidView ()) {
442 ClearTransientStoreIfMarked();
443 fpSceneHandler -> BeginPrimitives (objectTransform);
444 fpSceneHandler -> AddPrimitive (circle);
445 fpSceneHandler -> EndPrimitives ();
446 }
447}
448
449void G4VisManager::Draw (const G4NURBS& nurbs,
450 const G4Transform3D& objectTransform) {
451 if (IsValidView ()) {
452 ClearTransientStoreIfMarked();
453 fpSceneHandler -> BeginPrimitives (objectTransform);
454 fpSceneHandler -> AddPrimitive (nurbs);
455 fpSceneHandler -> EndPrimitives ();
456 }
457}
458
459void G4VisManager::Draw (const G4Polyhedron& polyhedron,
460 const G4Transform3D& objectTransform) {
461 if (IsValidView ()) {
462 ClearTransientStoreIfMarked();
463 fpSceneHandler -> BeginPrimitives (objectTransform);
464 fpSceneHandler -> AddPrimitive (polyhedron);
465 fpSceneHandler -> EndPrimitives ();
466 }
467}
468
469void G4VisManager::Draw (const G4Polyline& line,
470 const G4Transform3D& objectTransform) {
471 if (IsValidView ()) {
472 ClearTransientStoreIfMarked();
473 fpSceneHandler -> BeginPrimitives (objectTransform);
474 fpSceneHandler -> AddPrimitive (line);
475 fpSceneHandler -> EndPrimitives ();
476 }
477}
478
479void G4VisManager::Draw (const G4Polymarker& polymarker,
480 const G4Transform3D& objectTransform) {
481 if (IsValidView ()) {
482 ClearTransientStoreIfMarked();
483 fpSceneHandler -> BeginPrimitives (objectTransform);
484 fpSceneHandler -> AddPrimitive (polymarker);
485 fpSceneHandler -> EndPrimitives ();
486 }
487}
488
489void G4VisManager::Draw (const G4Scale& scale,
490 const G4Transform3D& objectTransform) {
491 if (IsValidView ()) {
492 ClearTransientStoreIfMarked();
493 fpSceneHandler -> BeginPrimitives (objectTransform);
494 fpSceneHandler -> AddPrimitive (scale);
495 fpSceneHandler -> EndPrimitives ();
496 }
497}
498
499void G4VisManager::Draw (const G4Square& square,
500 const G4Transform3D& objectTransform) {
501 if (IsValidView ()) {
502 ClearTransientStoreIfMarked();
503 fpSceneHandler -> BeginPrimitives (objectTransform);
504 fpSceneHandler -> AddPrimitive (square);
505 fpSceneHandler -> EndPrimitives ();
506 }
507}
508
509void G4VisManager::Draw (const G4Text& text,
510 const G4Transform3D& objectTransform) {
511 if (IsValidView ()) {
512 ClearTransientStoreIfMarked();
513 fpSceneHandler -> BeginPrimitives (objectTransform);
514 fpSceneHandler -> AddPrimitive (text);
515 fpSceneHandler -> EndPrimitives ();
516 }
517}
518
519void G4VisManager::Draw2D (const G4Circle& circle,
520 const G4Transform3D& objectTransform)
521{
522 if (IsValidView()) {
523 ClearTransientStoreIfMarked();
524 fpSceneHandler -> BeginPrimitives2D(objectTransform);
525 fpSceneHandler -> AddPrimitive(circle);
526 fpSceneHandler -> EndPrimitives2D();
527 }
528}
529
530void G4VisManager::Draw2D (const G4NURBS& nurbs,
531 const G4Transform3D& objectTransform)
532{
533 if (IsValidView()) {
534 ClearTransientStoreIfMarked();
535 fpSceneHandler -> BeginPrimitives2D(objectTransform);
536 fpSceneHandler -> AddPrimitive(nurbs);
537 fpSceneHandler -> EndPrimitives2D();
538 }
539}
540
541void G4VisManager::Draw2D (const G4Polyhedron& polyhedron,
542 const G4Transform3D& objectTransform)
543{
544 if (IsValidView()) {
545 ClearTransientStoreIfMarked();
546 fpSceneHandler -> BeginPrimitives2D(objectTransform);
547 fpSceneHandler -> AddPrimitive(polyhedron);
548 fpSceneHandler -> EndPrimitives2D();
549 }
550}
551
552void G4VisManager::Draw2D (const G4Polyline& line,
553 const G4Transform3D& objectTransform)
554{
555 if (IsValidView()) {
556 ClearTransientStoreIfMarked();
557 fpSceneHandler -> BeginPrimitives2D(objectTransform);
558 fpSceneHandler -> AddPrimitive(line);
559 fpSceneHandler -> EndPrimitives2D();
560 }
561}
562
563void G4VisManager::Draw2D (const G4Polymarker& polymarker,
564 const G4Transform3D& objectTransform)
565{
566 if (IsValidView()) {
567 ClearTransientStoreIfMarked();
568 fpSceneHandler -> BeginPrimitives2D(objectTransform);
569 fpSceneHandler -> AddPrimitive(polymarker);
570 fpSceneHandler -> EndPrimitives2D();
571 }
572}
573
574void G4VisManager::Draw2D (const G4Square& square,
575 const G4Transform3D& objectTransform)
576{
577 if (IsValidView()) {
578 ClearTransientStoreIfMarked();
579 fpSceneHandler -> BeginPrimitives2D(objectTransform);
580 fpSceneHandler -> AddPrimitive(square);
581 fpSceneHandler -> EndPrimitives2D();
582 }
583}
584
585void G4VisManager::Draw2D (const G4Text& text,
586 const G4Transform3D& objectTransform)
587{
588 if (IsValidView()) {
589 ClearTransientStoreIfMarked();
590 fpSceneHandler -> BeginPrimitives2D(objectTransform);
591 fpSceneHandler -> AddPrimitive(text);
592 fpSceneHandler -> EndPrimitives2D();
593 }
594}
595
596void G4VisManager::Draw (const G4VHit& hit) {
597 if (IsValidView ()) {
598 ClearTransientStoreIfMarked();
599 fpSceneHandler -> AddCompound (hit);
600 }
601}
602
603void G4VisManager::Draw (const G4VTrajectory& traj,
604 G4int i_mode) {
605 if (IsValidView ()) {
606 ClearTransientStoreIfMarked();
607 fpSceneHandler -> SetModel (&dummyTrajectoriesModel);
608 dummyTrajectoriesModel.SetDrawingMode(i_mode);
609 fpSceneHandler -> AddCompound (traj);
610 }
611}
612
613void G4VisManager::Draw (const G4LogicalVolume& logicalVol,
614 const G4VisAttributes& attribs,
615 const G4Transform3D& objectTransform) {
616 // Find corresponding solid.
617 G4VSolid* pSol = logicalVol.GetSolid ();
618 Draw (*pSol, attribs, objectTransform);
619}
620
621void G4VisManager::Draw (const G4VSolid& solid,
622 const G4VisAttributes& attribs,
623 const G4Transform3D& objectTransform) {
624 if (IsValidView ()) {
625 ClearTransientStoreIfMarked();
626 fpSceneHandler -> PreAddSolid (objectTransform, attribs);
627 solid.DescribeYourselfTo (*fpSceneHandler);
628 fpSceneHandler -> PostAddSolid ();
629 }
630}
631
632void G4VisManager::Draw (const G4VPhysicalVolume& physicalVol,
633 const G4VisAttributes& attribs,
634 const G4Transform3D& objectTransform) {
635 // Find corresponding logical volume and solid.
636 G4LogicalVolume* pLV = physicalVol.GetLogicalVolume ();
637 G4VSolid* pSol = pLV -> GetSolid ();
638 Draw (*pSol, attribs, objectTransform);
639}
640
641void G4VisManager::CreateSceneHandler (G4String name) {
642 if (!fInitialised) Initialise ();
643 if (fpGraphicsSystem) {
644 G4VSceneHandler* pSceneHandler =
645 fpGraphicsSystem -> CreateSceneHandler (name);
646 if (pSceneHandler) {
647 fAvailableSceneHandlers.push_back (pSceneHandler);
648 fpSceneHandler = pSceneHandler; // Make current.
649 }
650 else {
651 if(fVerbosity >= errors) {
652 G4cout << "ERROR in G4VisManager::CreateSceneHandler during "
653 << fpGraphicsSystem -> GetName ()
654 << " scene creation.\n No action taken."
655 << G4endl;
656 }
657 }
658 }
659 else PrintInvalidPointers ();
660}
661
662void G4VisManager::CreateViewer (G4String name,G4String XGeometry) {
663
664 if (!fInitialised) Initialise ();
665
666 if (fpSceneHandler) {
667 G4VViewer* p = fpGraphicsSystem -> CreateViewer (*fpSceneHandler, name);
668
669 // Viewer is created, now we can set geometry parameters
670 // Before 12/2008, it was done in G4VViewer.cc but it did not have to be there!
671
672 G4ViewParameters vp = p->GetViewParameters();
673 vp.SetXGeometryString(XGeometry);
674 p->SetViewParameters(vp); //parse string and store parameters
675
676 if (!p) {
677 if (fVerbosity >= errors) {
678 G4cout << "ERROR in G4VisManager::CreateViewer during "
679 << fpGraphicsSystem -> GetName ()
680 << " viewer creation.\n No action taken."
681 << G4endl;
682 }
683 } else {
684 p -> Initialise ();
685 if (p -> GetViewId() < 0) {
686 if (fVerbosity >= errors) {
687 G4cout << "ERROR in G4VisManager::CreateViewer during "
688 << fpGraphicsSystem -> GetName ()
689 << " viewer initialisation.\n No action taken."
690 << G4endl;
691 }
692 } else {
693 fpViewer = p; // Make current.
694 fpSceneHandler -> AddViewerToList (fpViewer);
695 fpSceneHandler -> SetCurrentViewer (fpViewer);
696
697 if (fVerbosity >= confirmations) {
698 G4cout << "G4VisManager::CreateViewer: new viewer created."
699 << G4endl;
700 }
701
702 const G4ViewParameters& vp = fpViewer->GetViewParameters();
703 if (fVerbosity >= parameters) {
704 G4cout << " view parameters are:\n " << vp << G4endl;
705 }
706
707 if (vp.IsCulling () && vp.IsCullingInvisible ()) {
708 static G4bool warned = false;
709 if (fVerbosity >= confirmations) {
710 if (!warned) {
711 G4cout <<
712 "NOTE: objects with visibility flag set to \"false\""
713 " will not be drawn!"
714 "\n \"/vis/viewer/set/culling global false\" to Draw such objects."
715 "\n Also see other \"/vis/viewer/set\" commands."
716 << G4endl;
717 warned = true;
718 }
719 }
720 }
721 if (vp.IsCullingCovered ()) {
722 static G4bool warned = false;
723 if (fVerbosity >= warnings) {
724 if (!warned) {
725 G4cout <<
726 "WARNING: covered objects in solid mode will not be rendered!"
727 "\n \"/vis/viewer/set/culling coveredDaughters false\" to reverse this."
728 "\n Also see other \"/vis/viewer/set\" commands."
729 << G4endl;
730 warned = true;
731 }
732 }
733 }
734 }
735 }
736 }
737 else PrintInvalidPointers ();
738}
739
740void G4VisManager::GeometryHasChanged () {
741 if (fVerbosity >= confirmations) {
742 G4cout << "G4VisManager::GeometryHasChanged() called." << G4endl;
743 }
744
745 // Change the world...
746 G4VPhysicalVolume* pWorld =
747 G4TransportationManager::GetTransportationManager ()
748 -> GetNavigatorForTracking () -> GetWorldVolume ();
749 if (!pWorld) {
750 if (fVerbosity >= warnings) {
751 G4cout << "WARNING: There is no world volume!" << G4endl;
752 }
753 }
754
755 // Check scenes.
756 G4SceneList& sceneList = fSceneList;
757 G4int iScene, nScenes = sceneList.size ();
758 for (iScene = 0; iScene < nScenes; iScene++) {
759 G4Scene* pScene = sceneList [iScene];
760 std::vector<G4VModel*>& modelList = pScene -> SetRunDurationModelList ();
761
762 if (modelList.size ()) {
763 G4bool modelInvalid;
764 do { // Remove, if required, one at a time.
765 modelInvalid = false;
766 std::vector<G4VModel*>::iterator iterModel;
767 for (iterModel = modelList.begin();
768 iterModel != modelList.end();
769 ++iterModel) {
770 modelInvalid = !((*iterModel) -> Validate (fVerbosity >= warnings));
771 if (modelInvalid) {
772 // Model invalid - remove and break.
773 if (fVerbosity >= warnings) {
774 G4cout << "WARNING: Model \""
775 << (*iterModel) -> GetGlobalDescription ()
776 <<
777 "\" is no longer valid - being removed\n from scene \""
778 << pScene -> GetName () << "\""
779 << G4endl;
780 }
781 modelList.erase (iterModel);
782 break;
783 }
784 }
785 } while (modelInvalid);
786
787 if (modelList.size () == 0) {
788 if (fVerbosity >= warnings) {
789 G4cout << "WARNING: No models left in this scene \""
790 << pScene -> GetName ()
791 << "\"."
792 << G4endl;
793 }
794 }
795 else {
796 pScene->CalculateExtent();
797 G4UImanager::GetUIpointer () ->
798 ApplyCommand (G4String("/vis/scene/notifyHandlers " + pScene->GetName()));
799 }
800 }
801 }
802
803 // Check the manager's current scene...
804 if (fpScene && fpScene -> GetRunDurationModelList ().size () == 0) {
805 if (fVerbosity >= warnings) {
806 G4cout << "WARNING: The current scene \""
807 << fpScene -> GetName ()
808 << "\" has no models."
809 << G4endl;
810 }
811 }
812
813}
814void G4VisManager::NotifyHandlers () {
815
816#ifdef G4DEBUG_VIS_MANAGEMENT
817 printf("G4VisManager::NotifyHandlers \n");
818#endif
819 if (fVerbosity >= confirmations) {
820 G4cout << "G4VisManager::NotifyHandler() called." << G4endl;
821 }
822
823 // Check scenes.
824 G4SceneList& sceneList = fSceneList;
825 G4int iScene, nScenes = sceneList.size ();
826 for (iScene = 0; iScene < nScenes; iScene++) {
827 G4Scene* pScene = sceneList [iScene];
828 std::vector<G4VModel*>& modelList = pScene -> SetRunDurationModelList ();
829
830 if (modelList.size ()) {
831 pScene->CalculateExtent();
832 G4UImanager::GetUIpointer () ->
833 ApplyCommand (G4String("/vis/scene/notifyHandlers " + pScene->GetName()));
834 }
835 }
836
837 // Check the manager's current scene...
838 if (fpScene && fpScene -> GetRunDurationModelList ().size () == 0) {
839 if (fVerbosity >= warnings) {
840 G4cout << "WARNING: The current scene \""
841 << fpScene -> GetName ()
842 << "\" has no models."
843 << G4endl;
844 }
845 }
846
847#ifdef G4DEBUG_VIS_MANAGEMENT
848 printf("G4VisManager::NotifyHandlers END\n");
849#endif
850}
851
852G4bool G4VisManager::FilterTrajectory(const G4VTrajectory& trajectory)
853{
854 return fpTrajFilterMgr->Accept(trajectory);
855}
856
857G4bool G4VisManager::FilterHit(const G4VHit& hit)
858{
859 return fpHitFilterMgr->Accept(hit);
860}
861
862void G4VisManager::DispatchToModel(const G4VTrajectory& trajectory, G4int i_mode)
863{
864 G4bool visible(true);
865
866 // See if trajectory passes filter
867 G4bool passed = FilterTrajectory(trajectory);
868
869 if (!passed) {
870 // Draw invisible trajectory if trajectory failed filter and
871 // are filtering in soft mode
872 if (fpTrajFilterMgr->GetMode() == FilterMode::Soft) visible = false;
873 else {return;}
874 }
875
876 // Go on to draw trajectory
877 assert (0 != fpTrajDrawModelMgr);
878
879 const G4VTrajectoryModel* model = CurrentTrajDrawModel();
880
881 assert (0 != model); // Should exist
882
883 model->Draw(trajectory, i_mode, visible);
884}
885
886void G4VisManager::SetUserAction
887(G4VUserVisAction* pVisAction,
888 const G4VisExtent& extent) {
889 fpUserVisAction = pVisAction;
890 fUserVisActionExtent = extent;
891 if (extent.GetExtentRadius() <= 0.) {
892 if (fVerbosity >= warnings) {
893 G4cout <<
894 "WARNING: No extent set for user vis action. (You may"
895 "\n set it later when adding with /vis/scene/add/userAction.)"
896 << G4endl;
897 }
898 }
899}
900
901void G4VisManager::SetCurrentScene (G4Scene* pScene) {
902 if (pScene != fpScene) {
903 // A change of scene. Therefore reset transients drawn flags. All
904 // memory of previous transient proceessing thereby erased...
905 ResetTransientsDrawnFlags();
906 }
907 fpScene = pScene;
908}
909
910void G4VisManager::SetCurrentGraphicsSystem (G4VGraphicsSystem* pSystem) {
911 fpGraphicsSystem = pSystem;
912 if (fVerbosity >= confirmations) {
913 G4cout << "G4VisManager::SetCurrentGraphicsSystem: system now "
914 << pSystem -> GetName () << G4endl;
915 }
916 // If current scene handler is of same graphics system, leave unchanged.
917 // Else find the most recent scene handler of same graphics system.
918 // Or clear pointers.
919 if (!(fpSceneHandler && fpSceneHandler -> GetGraphicsSystem () == pSystem)) {
920 const G4SceneHandlerList& sceneHandlerList = fAvailableSceneHandlers;
921 G4int nSH = sceneHandlerList.size (); // No. of scene handlers.
922 G4int iSH;
923 for (iSH = nSH - 1; iSH >= 0; iSH--) {
924 if (sceneHandlerList [iSH] -> GetGraphicsSystem () == pSystem) break;
925 }
926 if (iSH >= 0) {
927 fpSceneHandler = sceneHandlerList [iSH];
928 if (fVerbosity >= confirmations) {
929 G4cout << " Scene Handler now "
930 << fpSceneHandler -> GetName () << G4endl;
931 }
932 if (fpScene != fpSceneHandler -> GetScene ()) {
933 fpScene = fpSceneHandler -> GetScene ();
934 if (fVerbosity >= confirmations) {
935 G4cout << " Scene now \""
936 << fpScene -> GetName () << "\"" << G4endl;
937 }
938 }
939 const G4ViewerList& viewerList = fpSceneHandler -> GetViewerList ();
940 if (viewerList.size ()) {
941 fpViewer = viewerList [0];
942 if (fVerbosity >= confirmations) {
943 G4cout << " Viewer now " << fpViewer -> GetName () << G4endl;
944 }
945 }
946 else {
947 fpViewer = 0;
948 }
949 }
950 else {
951 fpSceneHandler = 0;
952 fpViewer = 0;
953 }
954 }
955}
956
957void G4VisManager::SetCurrentSceneHandler (G4VSceneHandler* pSceneHandler) {
958 fpSceneHandler = pSceneHandler;
959 if (fVerbosity >= confirmations) {
960 G4cout << "G4VisManager::SetCurrentSceneHandler: scene handler now \""
961 << pSceneHandler -> GetName () << "\"" << G4endl;
962 }
963 if (fpScene != fpSceneHandler -> GetScene ()) {
964 fpScene = fpSceneHandler -> GetScene ();
965 if (fVerbosity >= confirmations) {
966 G4cout << " Scene now \""
967 << fpScene -> GetName () << "\"" << G4endl;
968 }
969 }
970 if (fpGraphicsSystem != pSceneHandler -> GetGraphicsSystem ()) {
971 fpGraphicsSystem = pSceneHandler -> GetGraphicsSystem ();
972 if (fVerbosity >= confirmations) {
973 G4cout << " Graphics system now \""
974 << fpGraphicsSystem -> GetName () << "\"" << G4endl;
975 }
976 }
977 const G4ViewerList& viewerList = fpSceneHandler -> GetViewerList ();
978 G4int nViewers = viewerList.size ();
979 if (nViewers) {
980 G4int iViewer;
981 for (iViewer = 0; iViewer < nViewers; iViewer++) {
982 if (fpViewer == viewerList [iViewer]) break;
983 }
984 if (iViewer >= nViewers) {
985 fpViewer = viewerList [0];
986 if (fVerbosity >= confirmations) {
987 G4cout << " Viewer now \"" << fpViewer -> GetName () << "\""
988 << G4endl;
989 }
990 }
991 IsValidView (); // Checks.
992 }
993 else {
994 fpViewer = 0;
995 if (fVerbosity >= warnings) {
996 G4cout <<
997 "WARNING: No viewers for this scene handler - please create one."
998 << G4endl;
999 }
1000 }
1001}
1002
1003void G4VisManager::SetCurrentViewer (G4VViewer* pViewer) {
1004 fpViewer = pViewer;
1005 if (fVerbosity >= confirmations) {
1006 G4cout << "G4VisManager::SetCurrentViewer: viewer now "
1007 << pViewer -> GetName ()
1008 << G4endl;
1009 }
1010 fpSceneHandler = fpViewer -> GetSceneHandler ();
1011 fpSceneHandler -> SetCurrentViewer (pViewer);
1012 fpScene = fpSceneHandler -> GetScene ();
1013 fpGraphicsSystem = fpSceneHandler -> GetGraphicsSystem ();
1014 IsValidView (); // Checks.
1015}
1016
1017void G4VisManager::RegisterMessengers () {
1018
1019 // Instantiate individual messengers/commands (often - but not
1020 // always - one command per messenger).
1021
1022 G4UIcommand* directory;
1023
1024 // Top level commands...
1025 RegisterMessenger(new G4VisCommandAbortReviewKeptEvents);
1026 RegisterMessenger(new G4VisCommandEnable);
1027 RegisterMessenger(new G4VisCommandList);
1028 RegisterMessenger(new G4VisCommandReviewKeptEvents);
1029
1030 // Compound commands...
1031 RegisterMessenger(new G4VisCommandDrawTree);
1032 RegisterMessenger(new G4VisCommandDrawView);
1033 RegisterMessenger(new G4VisCommandDrawVolume);
1034 RegisterMessenger(new G4VisCommandOpen);
1035 RegisterMessenger(new G4VisCommandSpecify);
1036
1037 directory = new G4UIdirectory ("/vis/geometry/");
1038 directory -> SetGuidance("Operations on vis attributes of Geant4 geometry.");
1039 fDirectoryList.push_back (directory);
1040 RegisterMessenger(new G4VisCommandGeometryList);
1041 RegisterMessenger(new G4VisCommandGeometryRestore);
1042
1043 directory = new G4UIdirectory ("/vis/geometry/set/");
1044 directory -> SetGuidance("Set vis attributes of Geant4 geometry.");
1045 fDirectoryList.push_back (directory);
1046 RegisterMessenger(new G4VisCommandGeometrySetColour);
1047 RegisterMessenger(new G4VisCommandGeometrySetDaughtersInvisible);
1048 RegisterMessenger(new G4VisCommandGeometrySetLineStyle);
1049 RegisterMessenger(new G4VisCommandGeometrySetLineWidth);
1050 RegisterMessenger(new G4VisCommandGeometrySetForceAuxEdgeVisible);
1051 RegisterMessenger(new G4VisCommandGeometrySetForceLineSegmentsPerCircle);
1052 RegisterMessenger(new G4VisCommandGeometrySetForceSolid);
1053 RegisterMessenger(new G4VisCommandGeometrySetForceWireframe);
1054 RegisterMessenger(new G4VisCommandGeometrySetVisibility);
1055
1056 directory = new G4UIdirectory ("/vis/scene/");
1057 directory -> SetGuidance ("Operations on Geant4 scenes.");
1058 fDirectoryList.push_back (directory);
1059 RegisterMessenger(new G4VisCommandSceneCreate);
1060 RegisterMessenger(new G4VisCommandSceneEndOfEventAction);
1061 RegisterMessenger(new G4VisCommandSceneEndOfRunAction);
1062 RegisterMessenger(new G4VisCommandSceneList);
1063 RegisterMessenger(new G4VisCommandSceneNotifyHandlers);
1064 RegisterMessenger(new G4VisCommandSceneSelect);
1065
1066 directory = new G4UIdirectory ("/vis/scene/add/");
1067 directory -> SetGuidance ("Add model to current scene.");
1068 fDirectoryList.push_back (directory);
1069 RegisterMessenger(new G4VisCommandSceneAddAxes);
1070 RegisterMessenger(new G4VisCommandSceneAddEventID);
1071 RegisterMessenger(new G4VisCommandSceneAddGhosts);
1072 RegisterMessenger(new G4VisCommandSceneAddHits);
1073 RegisterMessenger(new G4VisCommandSceneAddLogicalVolume);
1074 RegisterMessenger(new G4VisCommandSceneAddLogo);
1075 RegisterMessenger(new G4VisCommandSceneAddScale);
1076 RegisterMessenger(new G4VisCommandSceneAddText);
1077 RegisterMessenger(new G4VisCommandSceneAddTrajectories);
1078 RegisterMessenger(new G4VisCommandSceneAddUserAction);
1079 RegisterMessenger(new G4VisCommandSceneAddVolume);
1080
1081 directory = new G4UIdirectory ("/vis/sceneHandler/");
1082 directory -> SetGuidance ("Operations on Geant4 scene handlers.");
1083 fDirectoryList.push_back (directory);
1084 RegisterMessenger(new G4VisCommandSceneHandlerAttach);
1085 RegisterMessenger(new G4VisCommandSceneHandlerCreate);
1086 RegisterMessenger(new G4VisCommandSceneHandlerList);
1087 RegisterMessenger(new G4VisCommandSceneHandlerSelect);
1088
1089 directory = new G4UIdirectory ("/vis/viewer/");
1090 directory -> SetGuidance ("Operations on Geant4 viewers.");
1091 fDirectoryList.push_back (directory);
1092 RegisterMessenger(new G4VisCommandViewerAddCutawayPlane);
1093 RegisterMessenger(new G4VisCommandViewerChangeCutawayPlane);
1094 RegisterMessenger(new G4VisCommandViewerClear);
1095 RegisterMessenger(new G4VisCommandViewerClearCutawayPlanes);
1096 RegisterMessenger(new G4VisCommandViewerClearTransients);
1097 RegisterMessenger(new G4VisCommandViewerClone);
1098 RegisterMessenger(new G4VisCommandViewerCreate);
1099 RegisterMessenger(new G4VisCommandViewerDolly);
1100 RegisterMessenger(new G4VisCommandViewerFlush);
1101 RegisterMessenger(new G4VisCommandViewerList);
1102 RegisterMessenger(new G4VisCommandViewerPan);
1103 RegisterMessenger(new G4VisCommandViewerRebuild);
1104 RegisterMessenger(new G4VisCommandViewerRefresh);
1105 RegisterMessenger(new G4VisCommandViewerReset);
1106 RegisterMessenger(new G4VisCommandViewerScale);
1107 RegisterMessenger(new G4VisCommandViewerSelect);
1108 RegisterMessenger(new G4VisCommandViewerUpdate);
1109 RegisterMessenger(new G4VisCommandViewerZoom);
1110
1111 directory = new G4UIdirectory ("/vis/viewer/set/");
1112 directory -> SetGuidance ("Set view parameters of current viewer.");
1113 fDirectoryList.push_back (directory);
1114 RegisterMessenger(new G4VisCommandsViewerSet);
1115
1116 // List manager commands
1117 RegisterMessenger(new G4VisCommandListManagerList< G4VisModelManager<G4VTrajectoryModel> >
1118 (fpTrajDrawModelMgr, fpTrajDrawModelMgr->Placement()));
1119 RegisterMessenger(new G4VisCommandListManagerSelect< G4VisModelManager<G4VTrajectoryModel> >
1120 (fpTrajDrawModelMgr, fpTrajDrawModelMgr->Placement()));
1121
1122 // Trajectory filter manager commands
1123 RegisterMessenger(new G4VisCommandListManagerList< G4VisFilterManager<G4VTrajectory> >
1124 (fpTrajFilterMgr, fpTrajFilterMgr->Placement()));
1125 RegisterMessenger(new G4VisCommandManagerMode< G4VisFilterManager<G4VTrajectory> >
1126 (fpTrajFilterMgr, fpTrajFilterMgr->Placement()));
1127
1128 // Hit filter manager commands
1129 RegisterMessenger(new G4VisCommandListManagerList< G4VisFilterManager<G4VHit> >
1130 (fpHitFilterMgr, fpHitFilterMgr->Placement()));
1131 RegisterMessenger(new G4VisCommandManagerMode< G4VisFilterManager<G4VHit> >
1132 (fpHitFilterMgr, fpHitFilterMgr->Placement()));
1133}
1134
1135void G4VisManager::PrintAvailableGraphicsSystems () const {
1136 G4int nSystems = fAvailableGraphicsSystems.size ();
1137 G4cout << "Current available graphics systems are:";
1138 if (nSystems) {
1139 for (int i = 0; i < nSystems; i++) {
1140 const G4VGraphicsSystem* pSystem = fAvailableGraphicsSystems [i];
1141 G4cout << "\n " << pSystem -> GetName ();
1142 if (pSystem -> GetNickname () != "") {
1143 G4cout << " (" << pSystem -> GetNickname () << ")";
1144 }
1145 }
1146 }
1147 else {
1148 G4cout << "\n NONE!!! None registered - yet! Mmmmm!";
1149 }
1150 G4cout << G4endl;
1151}
1152
1153void G4VisManager::PrintAvailableModels (Verbosity verbosity) const
1154{
1155 {
1156 //fpTrajDrawModelMgr->Print(G4cout);
1157 G4cout << "Registered model factories:" << G4endl;
1158 const std::vector<G4VModelFactory<G4VTrajectoryModel>*>& factoryList =
1159 fpTrajDrawModelMgr->FactoryList();
1160 if (factoryList.empty()) G4cout << " None" << G4endl;
1161 else {
1162 std::vector<G4VModelFactory<G4VTrajectoryModel>*>::const_iterator i;
1163 for (i = factoryList.begin(); i != factoryList.end(); ++i)
1164 (*i)->Print(G4cout);
1165 }
1166 const G4VisListManager<G4VTrajectoryModel>* listManager =
1167 fpTrajDrawModelMgr->ListManager();
1168 const std::map<G4String, G4VTrajectoryModel*>& modelMap =
1169 listManager->Map();
1170 if (!modelMap.empty()) {
1171 G4cout << "\nRegistered models:" << G4endl;
1172 std::map<G4String, G4VTrajectoryModel*>::const_iterator i;
1173 for (i = modelMap.begin(); i != modelMap.end(); ++i) {
1174 G4cout << " " << i->second->Name();
1175 if (i->second == listManager->Current()) G4cout << " (Current)";
1176 G4cout << G4endl;
1177 if (verbosity >= parameters) i->second->Print(G4cout);
1178 }
1179 }
1180 }
1181
1182 G4cout << G4endl;
1183
1184 {
1185 //fpTrajFilterMgr->Print(G4cout);
1186 G4cout << "Registered filter factories:" << G4endl;
1187 const std::vector<G4VModelFactory<G4VFilter<G4VTrajectory> >*>&
1188 factoryList = fpTrajFilterMgr->FactoryList();
1189 if (factoryList.empty()) G4cout << " None" << G4endl;
1190 else {
1191 std::vector<G4VModelFactory<G4VFilter<G4VTrajectory> >*>::const_iterator i;
1192 for (i = factoryList.begin(); i != factoryList.end(); ++i)
1193 (*i)->Print(G4cout);
1194 }
1195 const std::vector<G4VFilter<G4VTrajectory>*>&
1196 filterList = fpTrajFilterMgr->FilterList();
1197 if (!filterList.empty()) {
1198 G4cout << "\nRegistered filters:" << G4endl;
1199 std::vector<G4VFilter<G4VTrajectory>*>::const_iterator i;
1200 for (i = filterList.begin(); i != filterList.end(); ++i) {
1201 G4cout << " " << (*i)->GetName() << G4endl;
1202 if (verbosity >= parameters) (*i)->PrintAll(G4cout);
1203 }
1204 }
1205 }
1206}
1207
1208void G4VisManager::PrintInvalidPointers () const {
1209 if (fVerbosity >= errors) {
1210 G4cout << "ERROR: G4VisManager::PrintInvalidPointers:";
1211 if (!fpGraphicsSystem) {
1212 G4cout << "\n null graphics system pointer.";
1213 }
1214 else {
1215 G4cout << "\n Graphics system is " << fpGraphicsSystem -> GetName ()
1216 << " but:";
1217 if (!fpScene)
1218 G4cout <<
1219 "\n Null scene pointer. Use \"/vis/drawVolume\" or"
1220 " \"/vis/scene/create\".";
1221 if (!fpSceneHandler)
1222 G4cout <<
1223 "\n Null scene handler pointer. Use \"/vis/open\" or"
1224 " \"/vis/sceneHandler/create\".";
1225 if (!fpViewer )
1226 G4cout <<
1227 "\n Null viewer pointer. Use \"/vis/viewer/create\".";
1228 }
1229 G4cout << G4endl;
1230 }
1231}
1232
1233void G4VisManager::BeginOfRun ()
1234{
1235 //G4cout << "G4VisManager::BeginOfRun" << G4endl;
1236 fKeptLastEvent = false;
1237 fEventKeepingSuspended = false;
1238 fTransientsDrawnThisRun = false;
1239 if (fpSceneHandler) fpSceneHandler->SetTransientsDrawnThisRun(false);
1240}
1241
1242void G4VisManager::BeginOfEvent ()
1243{
1244 //G4cout << "G4VisManager::BeginOfEvent" << G4endl;
1245 fTransientsDrawnThisEvent = false;
1246 if (fpSceneHandler) fpSceneHandler->SetTransientsDrawnThisEvent(false);
1247}
1248
1249void G4VisManager::EndOfEvent ()
1250{
1251 printf("G4VisManager::EndOfEvent \n");
1252
1253 //G4cout << "G4VisManager::EndOfEvent" << G4endl;
1254
1255 // Don't call IsValidView unless there is a scene handler. This
1256 // avoids WARNING message at end of event and run when the user has
1257 // not instantiated a scene handler, e.g., in batch mode.
1258 G4bool valid = GetConcreteInstance() && fpSceneHandler && IsValidView();
1259 if (!valid) return;
1260
1261 G4RunManager* runManager = G4RunManager::GetRunManager();
1262 const G4Run* currentRun = runManager->GetCurrentRun();
1263
1264 G4EventManager* eventManager = G4EventManager::GetEventManager();
1265 const G4Event* currentEvent = eventManager->GetConstCurrentEvent();
1266 if (!currentEvent) return;
1267
1268 // FIXME : OK
1269 printf("G4VisManager::EndOfEvent 0\n");
1270 ClearTransientStoreIfMarked();
1271 printf("G4VisManager::EndOfEvent 1\n");
1272 // FIXME : OK
1273 fpSceneHandler->DrawEvent(currentEvent);
1274
1275 G4int nEventsToBeProcessed = 0;
1276 G4int nKeptEvents = 0;
1277 G4int eventID = -2; // (If no run manager, triggers ShowView as normal.)
1278 printf("G4VisManager::EndOfEvent 2\n");
1279 if (currentRun) {
1280 printf("G4VisManager::EndOfEvent currentRun?\n");
1281 nEventsToBeProcessed = currentRun->GetNumberOfEventToBeProcessed();
1282 eventID = currentEvent->GetEventID();
1283 const std::vector<const G4Event*>* events =
1284 currentRun->GetEventVector();
1285 if (events) nKeptEvents = events->size();
1286 }
1287
1288 if (fpScene->GetRefreshAtEndOfEvent()) {
1289 printf("G4VisManager::EndOfEvent GetRefreshAtEndOfEvent()\n");
1290
1291 // Unless last event (in which case wait end of run)...
1292 if (eventID < nEventsToBeProcessed - 1) {
1293 printf("G4VisManager::EndOfEvent 3 \n");
1294 fpViewer->ShowView();
1295 fpSceneHandler->SetMarkForClearingTransientStore(true);
1296 } else { // Last event...
1297 printf("G4VisManager::EndOfEvent 4 \n");
1298 // Keep, but only if user has not kept any...
1299 if (!nKeptEvents) {
1300 eventManager->KeepTheCurrentEvent();
1301 fKeptLastEvent = true;
1302 }
1303 }
1304
1305 } else { // Accumulating events...
1306 printf("G4VisManager::EndOfEvent NOT GetRefreshAtEndOfEvent()\n");
1307
1308 G4int maxNumberOfKeptEvents = fpScene->GetMaxNumberOfKeptEvents();
1309 if (maxNumberOfKeptEvents > 0 && nKeptEvents >= maxNumberOfKeptEvents) {
1310 printf("G4VisManager::EndOfEvent 5 \n");
1311 fEventKeepingSuspended = true;
1312 static G4bool warned = false;
1313 if (!warned) {
1314 printf("G4VisManager::EndOfEvent 6 \n");
1315 if (fVerbosity >= warnings) {
1316 printf("G4VisManager::EndOfEvent 7 \n");
1317 G4cout <<
1318 "WARNING: G4VisManager::EndOfEvent: Event keeping suspended."
1319 "\n The number of events exceeds the maximum that may be kept, "
1320 << maxNumberOfKeptEvents << '.'
1321 << G4endl;
1322 }
1323 warned = true;
1324 }
1325 } else if (maxNumberOfKeptEvents != 0) {
1326 printf("G4VisManager::EndOfEvent 8 \n");
1327 eventManager->KeepTheCurrentEvent();
1328 }
1329 }
1330 printf("G4VisManager::EndOfEvent 9 \n");
1331}
1332
1333void G4VisManager::EndOfRun ()
1334{
1335 //G4cout << "G4VisManager::EndOfRun" << G4endl;
1336 printf("G4VisManager::EndOfRun 1\n");
1337 // Don't call IsValidView unless there is a scene handler. This
1338 // avoids WARNING message at end of event and run when the user has
1339 // not instantiated a scene handler, e.g., in batch mode.
1340 G4bool valid = GetConcreteInstance() && fpSceneHandler && IsValidView();
1341 printf("G4VisManager::EndOfRun 2\n");
1342 if (valid) {
1343 printf("G4VisManager::EndOfRun 3\n");
1344 if (!fpSceneHandler->GetMarkForClearingTransientStore()) {
1345 printf("G4VisManager::EndOfRun 4\n");
1346 if (fpScene->GetRefreshAtEndOfRun()) {
1347 printf("G4VisManager::EndOfRun 5\n");
1348 fpViewer->ShowView();
1349 printf("G4VisManager::EndOfRun 6\n");
1350 fpSceneHandler->SetMarkForClearingTransientStore(true);
1351 printf("G4VisManager::EndOfRun 7\n");
1352 }
1353 }
1354
1355 printf("G4VisManager::EndOfRun 8\n");
1356 if (fEventKeepingSuspended && fVerbosity >= warnings) {
1357 G4cout <<
1358 "WARNING: G4VisManager::EndOfRun: Event keeping was suspended."
1359 "\n The number of events in the run exceeded the maximum to be kept, "
1360 << fpScene->GetMaxNumberOfKeptEvents() << '.' <<
1361 "\n The number of events to be kept can be changed with"
1362 "\n \"/vis/scene/endOfEventAction accumulate <N>\", where N is the"
1363 "\n maximum number you wish to allow. N < 0 means \"unlimited\"."
1364 << G4endl;
1365 }
1366 }
1367 fEventRefreshing = false;
1368
1369 printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
1370 G4RunManager* runManager = G4RunManager::GetRunManager();
1371 const G4Run* currentRun = runManager->GetCurrentRun();
1372
1373 G4int nKeptEvents = 0;
1374 const std::vector<const G4Event*>* events =
1375 currentRun? currentRun->GetEventVector(): 0;
1376 if (events) nKeptEvents = events->size();
1377
1378 if (nKeptEvents && !fKeptLastEvent) {
1379 if (!valid && fVerbosity >= warnings) G4cout << "WARNING: ";
1380 if (fVerbosity >= warnings) {
1381 G4cout << nKeptEvents;
1382 if (nKeptEvents == 1) G4cout << " event has";
1383 else G4cout << " events have";
1384 G4cout << " been kept for refreshing and/or reviewing." << G4endl;
1385 }
1386 static G4bool warned = false;
1387 if (!valid && fVerbosity >= warnings && !warned) {
1388 G4cout <<
1389 " Only useful if before starting the run:"
1390 "\n a) trajectories are stored (\"/vis/scene/add/trajectories [smooth|rich]\"), or"
1391 "\n b) the Draw method of any hits is implemented."
1392 "\n To view trajectories and hits:"
1393 "\n open a viewer, draw a volume, \"/vis/scene/add/trajectories\""
1394 "\n \"/vis/scene/add/hits\" and, possibly, \"/vis/viewer/flush\"."
1395 "\n To see all events: \"/vis/scene/endOfEventAction accumulate\"."
1396 "\n To see events individually: \"/vis/reviewKeptEvents\"."
1397 << G4endl;
1398 warned = true;
1399 }
1400 }
1401}
1402
1403void G4VisManager::ClearTransientStoreIfMarked(){
1404 // Assumes valid view.
1405 if (fpSceneHandler->GetMarkForClearingTransientStore()) {
1406 fpSceneHandler->SetMarkForClearingTransientStore(false);
1407 fpSceneHandler->ClearTransientStore();
1408 }
1409 // Record if transients drawn. These local flags are only set
1410 // *after* ClearTransientStore. In the code in G4VSceneHandler
1411 // triggered by ClearTransientStore, use these flags so that
1412 // event refreshing is not done too early.
1413 fTransientsDrawnThisEvent = fpSceneHandler->GetTransientsDrawnThisEvent();
1414 fTransientsDrawnThisRun = fpSceneHandler->GetTransientsDrawnThisRun();
1415}
1416
1417void G4VisManager::ResetTransientsDrawnFlags()
1418{
1419 fTransientsDrawnThisRun = false;
1420 fTransientsDrawnThisEvent = false;
1421 G4SceneHandlerListConstIterator i;
1422 for (i = fAvailableSceneHandlers.begin();
1423 i != fAvailableSceneHandlers.end(); ++i) {
1424 (*i)->SetTransientsDrawnThisEvent(false);
1425 (*i)->SetTransientsDrawnThisRun(false);
1426 }
1427}
1428
1429G4String G4VisManager::ViewerShortName (const G4String& viewerName) const {
1430 G4String viewerShortName (viewerName);
1431 viewerShortName = viewerShortName (0, viewerShortName.find (' '));
1432 return viewerShortName.strip ();
1433}
1434
1435G4VViewer* G4VisManager::GetViewer (const G4String& viewerName) const {
1436 G4String viewerShortName = ViewerShortName (viewerName);
1437 size_t nHandlers = fAvailableSceneHandlers.size ();
1438 size_t iHandler, iViewer;
1439 G4VViewer* viewer = 0;
1440 G4bool found = false;
1441 for (iHandler = 0; iHandler < nHandlers; iHandler++) {
1442 G4VSceneHandler* sceneHandler = fAvailableSceneHandlers [iHandler];
1443 const G4ViewerList& viewerList = sceneHandler -> GetViewerList ();
1444 for (iViewer = 0; iViewer < viewerList.size (); iViewer++) {
1445 viewer = viewerList [iViewer];
1446 if (viewerShortName == viewer -> GetShortName ()) {
1447 found = true;
1448 break;
1449 }
1450 }
1451 if (found) break;
1452 }
1453 if (found) return viewer;
1454 else return 0;
1455}
1456
1457std::vector<G4String> G4VisManager::VerbosityGuidanceStrings;
1458
1459G4String G4VisManager::VerbosityString(Verbosity verbosity) {
1460 G4String s;
1461 switch (verbosity) {
1462 case quiet: s = "quiet (0)"; break;
1463 case startup: s = "startup (1)"; break;
1464 case errors: s = "errors (2)"; break;
1465 case warnings: s = "warnings (3)"; break;
1466 case confirmations: s = "confirmations (4)"; break;
1467 case parameters: s = "parameters (5)"; break;
1468 case all: s = "all (6)"; break;
1469 }
1470 return s;
1471}
1472
1473G4VisManager::Verbosity
1474G4VisManager::GetVerbosityValue(const G4String& verbosityString) {
1475 G4String s(verbosityString); s.toLower();
1476 Verbosity verbosity;
1477 if (s(0) == 'q') verbosity = quiet;
1478 else if (s(0) == 's') verbosity = startup;
1479 else if (s(0) == 'e') verbosity = errors;
1480 else if (s(0) == 'w') verbosity = warnings;
1481 else if (s(0) == 'c') verbosity = confirmations;
1482 else if (s(0) == 'p') verbosity = parameters;
1483 else if (s(0) == 'a') verbosity = all;
1484 else {
1485 G4int intVerbosity;
1486 std::istringstream is(s);
1487 is >> intVerbosity;
1488 if (!is) {
1489 G4cout << "ERROR: G4VisManager::GetVerbosityValue: invalid verbosity \""
1490 << verbosityString << "\"";
1491 for (size_t i = 0; i < VerbosityGuidanceStrings.size(); ++i) {
1492 G4cout << '\n' << VerbosityGuidanceStrings[i];
1493 }
1494 verbosity = warnings;
1495 G4cout << "\n Returning " << VerbosityString(verbosity)
1496 << G4endl;
1497 }
1498 else {
1499 verbosity = GetVerbosityValue(intVerbosity);
1500 }
1501 }
1502 return verbosity;
1503}
1504
1505G4VisManager::Verbosity G4VisManager::GetVerbosityValue(G4int intVerbosity) {
1506 Verbosity verbosity;
1507 if (intVerbosity < quiet) verbosity = quiet;
1508 else if (intVerbosity > all) verbosity = all;
1509 else verbosity = Verbosity(intVerbosity);
1510 return verbosity;
1511}
1512
1513void G4VisManager::SetVerboseLevel (G4int intVerbosity) {
1514 fVerbosity = GetVerbosityValue(intVerbosity);
1515}
1516
1517void G4VisManager::SetVerboseLevel (const G4String& verbosityString) {
1518 fVerbosity = GetVerbosityValue(verbosityString);
1519}
1520
1521G4bool G4VisManager::IsValidView () {
1522
1523 if (!fInitialised) Initialise ();
1524
1525 static G4bool noGSPrinting = true;
1526 if (!fpGraphicsSystem) {
1527 // Limit printing - we do not want printing if the user simply does
1528 // not want to use graphics, e.g., in batch mode.
1529 if (noGSPrinting) {
1530 noGSPrinting = false;
1531 if (fVerbosity >= warnings) {
1532 G4cout <<
1533 "WARNING: G4VisManager::IsValidView(): Attempt to draw when no graphics system"
1534 "\n has been instantiated. Use \"/vis/open\" or \"/vis/sceneHandler/create\"."
1535 "\n Alternatively, to avoid this message, suppress instantiation of vis"
1536 "\n manager (G4VisExecutive), possibly by setting G4VIS_NONE, and ensure"
1537 "\n drawing code is executed only if G4VVisManager::GetConcreteInstance()"
1538 "\n is non-zero."
1539 << G4endl;
1540 }
1541 }
1542 return false;
1543 }
1544
1545 if ((!fpScene) || (!fpSceneHandler) || (!fpViewer)) {
1546 if (fVerbosity >= errors) {
1547 G4cout <<
1548 "ERROR: G4VisManager::IsValidView(): Current view is not valid."
1549 << G4endl;
1550 PrintInvalidPointers ();
1551 }
1552 return false;
1553 }
1554
1555 if (fpScene != fpSceneHandler -> GetScene ()) {
1556 if (fVerbosity >= errors) {
1557 G4cout << "ERROR: G4VisManager::IsValidView ():";
1558 if (fpSceneHandler -> GetScene ()) {
1559 G4cout <<
1560 "\n The current scene \""
1561 << fpScene -> GetName ()
1562 << "\" is not handled by"
1563 "\n the current scene handler \""
1564 << fpSceneHandler -> GetName ()
1565 << "\""
1566 "\n (it currently handles scene \""
1567 << fpSceneHandler -> GetScene () -> GetName ()
1568 << "\")."
1569 "\n Either:"
1570 "\n (a) attach it to the scene handler with"
1571 "\n /vis/sceneHandler/attach "
1572 << fpScene -> GetName ()
1573 << ", or"
1574 "\n (b) create a new scene handler with "
1575 "\n /vis/sceneHandler/create <graphics-system>,"
1576 "\n in which case it should pick up the the new scene."
1577 << G4endl;
1578 }
1579 else {
1580 G4cout << "\n Scene handler \""
1581 << fpSceneHandler -> GetName ()
1582 << "\" has null scene pointer."
1583 "\n Attach a scene with /vis/sceneHandler/attach [<scene-name>]"
1584 << G4endl;
1585 }
1586 }
1587 return false;
1588 }
1589
1590 const G4ViewerList& viewerList = fpSceneHandler -> GetViewerList ();
1591 if (viewerList.size () == 0) {
1592 if (fVerbosity >= errors) {
1593 G4cout <<
1594 "ERROR: G4VisManager::IsValidView (): the current scene handler\n \""
1595 << fpSceneHandler -> GetName ()
1596 << "\" has no viewers. Do /vis/viewer/create."
1597 << G4endl;
1598 }
1599 return false;
1600 }
1601
1602 G4bool isValid = true;
1603 if (fpScene -> IsEmpty ()) { // Add world by default if possible...
1604 G4bool warn(fVerbosity >= warnings);
1605 G4bool successful = fpScene -> AddWorldIfEmpty (warn);
1606 if (!successful || fpScene -> IsEmpty ()) { // If still empty...
1607 if (fVerbosity >= errors) {
1608 G4cout << "ERROR: G4VisManager::IsViewValid ():";
1609 G4cout <<
1610 "\n Attempt at some drawing operation when scene is empty."
1611 "\n Maybe the geometry has not yet been defined."
1612 " Try /run/initialize."
1613 << G4endl;
1614 }
1615 isValid = false;
1616 }
1617 else {
1618 G4UImanager::GetUIpointer()->ApplyCommand ("/vis/scene/notifyHandlers");
1619 if (fVerbosity >= warnings) {
1620 G4cout <<
1621 "WARNING: G4VisManager: the scene was empty, \"world\" has been"
1622 "\n added and the scene handlers notified.";
1623 G4cout << G4endl;
1624 }
1625 }
1626 }
1627 if (isValid) SetConcreteInstance(this);
1628 return isValid;
1629}
1630
1631void
1632G4VisManager::RegisterModelFactories()
1633{
1634 if (fVerbosity >= warnings) {
1635 G4cout<<"G4VisManager: No model factories registered with G4VisManager."<<G4endl;
1636 G4cout<<"G4VisManager::RegisterModelFactories() should be overridden in derived"<<G4endl;
1637 G4cout<<"class. See G4VisExecutive for an example."<<G4endl;
1638 }
1639}
Note: See TracBrowser for help on using the repository browser.