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

Last change on this file since 1242 was 1242, checked in by garnier, 14 years ago

bugged version

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