Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/management/src/G4VisManager.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /visualization/management/src/G4VisManager.cc (Version 11.3.0) and /visualization/management/src/G4VisManager.cc (Version 3.1)


                                                   >>   1 // This code implementation is the intellectual property of
                                                   >>   2 // the GEANT4 collaboration.
  1 //                                                  3 //
  2 // ******************************************* <<   4 // By copying, distributing or modifying the Program (or any work
  3 // * License and Disclaimer                    <<   5 // based on the Program) you indicate your acceptance of this statement,
  4 // *                                           <<   6 // and all its terms.
  5 // * The  Geant4 software  is  copyright of th << 
  6 // * the Geant4 Collaboration.  It is provided << 
  7 // * conditions of the Geant4 Software License << 
  8 // * LICENSE and available at  http://cern.ch/ << 
  9 // * include a list of copyright holders.      << 
 10 // *                                           << 
 11 // * Neither the authors of this software syst << 
 12 // * institutes,nor the agencies providing fin << 
 13 // * work  make  any representation or  warran << 
 14 // * regarding  this  software system or assum << 
 15 // * use.  Please see the license in the file  << 
 16 // * for the full disclaimer and the limitatio << 
 17 // *                                           << 
 18 // * This  code  implementation is the result  << 
 19 // * technical work of the GEANT4 collaboratio << 
 20 // * By using,  copying,  modifying or  distri << 
 21 // * any work based  on the software)  you  ag << 
 22 // * use  in  resulting  scientific  publicati << 
 23 // * acceptance of all terms of the Geant4 Sof << 
 24 // ******************************************* << 
 25 //                                                  7 //
                                                   >>   8 // $Id: G4VisManager.cc,v 1.21 2001/02/23 15:43:32 johna Exp $
                                                   >>   9 // GEANT4 tag $Name: geant4-03-01 $
 26 //                                                 10 //
 27 //                                                 11 // 
 28 // GEANT4 Visualization Manager - John Allison     12 // GEANT4 Visualization Manager - John Allison 02/Jan/1996.
 29 // Michael Kelsey  31 Jan 2019 -- Add new comm << 
 30                                                    13 
 31 #include "G4VisManager.hh"                         14 #include "G4VisManager.hh"
 32                                                    15 
 33 #include "G4VisCommands.hh"                    << 
 34 #include "G4VisCommandsCompound.hh"            << 
 35 #include "G4VisCommandsGeometry.hh"            << 
 36 #include "G4VisCommandsGeometrySet.hh"         << 
 37 #include "G4VisCommandsMultithreading.hh"      << 
 38 #include "G4VisCommandsSet.hh"                 << 
 39 #include "G4VisCommandsScene.hh"               << 
 40 #include "G4VisCommandsSceneAdd.hh"            << 
 41 #include "G4VisCommandsPlotter.hh"             << 
 42 #include "G4VisCommandsSceneHandler.hh"        << 
 43 #include "G4VisCommandsTouchable.hh"           << 
 44 #include "G4VisCommandsTouchableSet.hh"        << 
 45 #include "G4VisCommandsViewer.hh"              << 
 46 #include "G4VisCommandsViewerDefault.hh"       << 
 47 #include "G4VisCommandsViewerSet.hh"           << 
 48 #include "G4UImanager.hh"                          16 #include "G4UImanager.hh"
 49 #include "G4VisStateDependent.hh"                  17 #include "G4VisStateDependent.hh"
 50 #include "G4UIdirectory.hh"                        18 #include "G4UIdirectory.hh"
                                                   >>  19 #include "G4VisFeaturesOfFukuiRenderer.hh"
                                                   >>  20 #include "G4VisFeaturesOfDAWNFILE.hh"
                                                   >>  21 #include "G4VisFeaturesOfOpenGL.hh"
                                                   >>  22 #include "G4VisFeaturesOfOpenInventor.hh"
 51 #include "G4VGraphicsSystem.hh"                    23 #include "G4VGraphicsSystem.hh"
 52 #include "G4VSceneHandler.hh"                      24 #include "G4VSceneHandler.hh"
 53 #include "G4VViewer.hh"                            25 #include "G4VViewer.hh"
 54 #include "G4VPhysicalVolume.hh"                    26 #include "G4VPhysicalVolume.hh"
 55 #include "G4LogicalVolume.hh"                      27 #include "G4LogicalVolume.hh"
 56 #include "G4VSolid.hh"                             28 #include "G4VSolid.hh"
 57 #include "G4Vector3D.hh"                           29 #include "G4Vector3D.hh"
 58 #include "G4Point3D.hh"                            30 #include "G4Point3D.hh"
 59 #include "G4RotationMatrix.hh"                     31 #include "G4RotationMatrix.hh"
 60 #include "G4Polyline.hh"                           32 #include "G4Polyline.hh"
 61 #include "G4Polyhedron.hh"                         33 #include "G4Polyhedron.hh"
                                                   >>  34 #include "G4NURBS.hh"
 62 #include "G4NullModel.hh"                          35 #include "G4NullModel.hh"
 63 #include "G4ModelingParameters.hh"                 36 #include "G4ModelingParameters.hh"
 64 #include "G4TransportationManager.hh"              37 #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 "G4RunManagerFactory.hh"              << 
 75 #include "G4EventManager.hh"                   << 
 76 #include "G4Run.hh"                            << 
 77 #include "G4Event.hh"                          << 
 78 #include <map>                                 << 
 79 #include <set>                                 << 
 80 #include <vector>                              << 
 81 #include <sstream>                             << 
 82                                                << 
 83 #include "G4Threading.hh"                      << 
 84 #include "G4AutoLock.hh"                       << 
 85 #include "G4GeometryWorkspace.hh" // no_geant4 << 
 86 #include "G4SolidsWorkspace.hh"                << 
 87 #include <deque>                               << 
 88 #include <typeinfo>                            << 
 89 #include <chrono>                              << 
 90 #include <thread>                              << 
 91 #include <utility>                             << 
 92                                                << 
 93 #define G4warn G4cout                          << 
 94                                                << 
 95 // Local threading related variables           << 
 96 namespace {                                    << 
 97   G4bool mtRunInProgress = false;              << 
 98   std::deque<const G4Event*> mtVisEventQueue;  << 
 99   G4Thread* mtVisSubThread = 0;                << 
100   [[maybe_unused]] G4Mutex mtVisSubThreadMutex << 
101   //  G4Mutex visBeginOfRunMutex = G4MUTEX_INI << 
102   //  G4Mutex visBeginOfEventMutex = G4MUTEX_I << 
103   G4Mutex visEndOfEventMutex = G4MUTEX_INITIAL << 
104   //  G4Mutex visEndOfRunMutex = G4MUTEX_INITI << 
105   G4bool isSubEventRunManagerType = false;     << 
106   G4bool isValidViewForRun = false;            << 
107   G4bool isFakeRun = false;                    << 
108 }                                              << 
109                                                    38 
110 // Class statics                               <<  39 #include "G4VisManMessenger.hh"
111 G4VisManager* G4VisManager::fpInstance = 0;    <<  40 // TEMPORARY /vis/ -> /vis~/ equivalence.
                                                   >>  41 #include "G4VisToOldVisCommands.hh"
112                                                    42 
113 G4VisManager::Verbosity G4VisManager::fVerbosi <<  43 #include "G4ios.hh"
114                                                    44 
115 G4VisManager::G4VisManager (const G4String& ve <<  45 G4VisManager* G4VisManager::fpInstance = 0;
116 : fVerbose         (1)                         << 
117 , fDefaultGraphicsSystemName("OGL")          / << 
118 , fDefaultXGeometryString   ("600x600-0+0")  / << 
119 , fDefaultGraphicsSystemBasis ("G4VisManager i << 
120 , fDefaultXGeometryStringBasis("G4VisManager i << 
121 , fInitialised     (false)                     << 
122 , fpGraphicsSystem (0)                         << 
123 , fpScene          (0)                         << 
124 , fpSceneHandler   (0)                         << 
125 , fpViewer         (0)                         << 
126 , fpStateDependent (0)                         << 
127 , fEventRefreshing          (false)            << 
128 , fTransientsDrawnThisRun   (false)            << 
129 , fTransientsDrawnThisEvent (false)            << 
130 , fNoOfEventsDrawnThisRun   (0)                << 
131 , fNKeepForPostProcessingRequests (0)          << 
132 , fNKeepTheEventRequests    (0)                << 
133 , fEventKeepingSuspended    (false)            << 
134 , fDrawEventOnlyIfToBeKept  (false)            << 
135 , fpRequestedEvent          (0)                << 
136 , fReviewingKeptEvents      (false)            << 
137 , fAbortReviewKeptEvents    (false)            << 
138 , fReviewingPlots           (false)            << 
139 , fAbortReviewPlots         (false)            << 
140 , fIsDrawGroup              (false)            << 
141 , fDrawGroupNestingDepth    (0)                << 
142 , fIgnoreStateChanges       (false)            << 
143 , fMaxEventQueueSize        (100)              << 
144 , fWaitOnEventQueueFull     (true)             << 
145 // All other objects use default constructors. << 
146 {                                              << 
147   fpTrajDrawModelMgr = new G4VisModelManager<G << 
148   fpTrajFilterMgr = new G4VisFilterManager<G4V << 
149   fpHitFilterMgr = new G4VisFilterManager<G4VH << 
150   fpDigiFilterMgr = new G4VisFilterManager<G4V << 
151                                                << 
152   VerbosityGuidanceStrings.push_back           << 
153     ("Simple graded message scheme - digit or  << 
154   VerbosityGuidanceStrings.push_back           << 
155     ("  0) quiet,         // Nothing is printe << 
156   VerbosityGuidanceStrings.push_back           << 
157     ("  1) startup,       // Startup and endup << 
158   VerbosityGuidanceStrings.push_back           << 
159     ("  2) errors,        // ...and errors..." << 
160   VerbosityGuidanceStrings.push_back           << 
161     ("  3) warnings,      // ...and warnings.. << 
162   VerbosityGuidanceStrings.push_back           << 
163     ("  4) confirmations, // ...and confirming << 
164   VerbosityGuidanceStrings.push_back           << 
165     ("  5) parameters,    // ...and parameters << 
166   VerbosityGuidanceStrings.push_back           << 
167     ("  6) all            // ...and everything << 
168                                                    46 
                                                   >>  47 G4VisManager::G4VisManager ():
                                                   >>  48   fInitialised     (false),
                                                   >>  49   fpGraphicsSystem (0),
                                                   >>  50   fpScene          (0),
                                                   >>  51   fpSceneHandler   (0),
                                                   >>  52   fpViewer         (0),
                                                   >>  53   fVerbose         (0)  // All other objects use default constructors.
                                                   >>  54 {
169   if (fpInstance) {                                55   if (fpInstance) {
170     G4Exception                                    56     G4Exception
171       ("G4VisManager::G4VisManager",           <<  57       ("G4VisManager: attempt to Construct more than one VisManager.");
172        "visman0001", FatalException,           <<  58   }
173        "Attempt to Construct more than one Vis <<  59   else {
174   }                                            <<  60 
175                                                <<  61     fpInstance = this;
176   fpInstance = this;                           <<  62 
177   SetConcreteInstance(this);                   <<  63     fpStateDependent = new G4VisStateDependent (this);
178                                                <<  64     // No need to delete this; G4StateManager does this.
179   fpStateDependent = new G4VisStateDependent ( <<  65 
180   // No need to delete this; G4StateManager do <<  66     G4cout << "Constructing Visualization Manager...." << G4endl;
181                                                <<  67     // Note: You might think that we could register graphics systems
182   fVerbosity = GetVerbosityValue(verbosityStri <<  68     // and messengers here but we have to give the subclass time to
183   if (fVerbosity >= startup) {                 <<  69     // instantiate.  So the user has to invoke Initialise().
184       G4cout                                   <<  70   }
185   << "Visualization Manager instantiating with << 
186   << VerbosityString(fVerbosity)               << 
187   << "\"..." << G4endl;                        << 
188   }                                            << 
189                                                << 
190   // Note: The specific graphics systems must  << 
191   // higher level library to avoid circular de << 
192   // some specifically need additional externa << 
193   // user must supply.  Therefore we ask the u << 
194   // RegisterGraphicsSystems() and RegisterMod << 
195   // in a subclass.  We have to wait for the s << 
196   // so RegisterGraphicsSystems() cannot be ca << 
197   // constructor; it is called from Initialise << 
198   // user:                                     << 
199   //   (a) to write a subclass and implement   << 
200   //       and RegisterModelFactories().  See  << 
201   //       visualization/include/G4VisExecutiv << 
202   //   (b) instantiate the subclass.           << 
203   //   (c) invoke the Initialise() method of t << 
204   // For example:                              << 
205   //   ...                                     << 
206   //   // Instantiate and initialise Visualiza << 
207   //   G4VisManager* visManager = new G4VisExe << 
208   //   visManager -> SetVerboseLevel (Verbose) << 
209   //   visManager -> Initialise ();            << 
210   //   // (Don't forget to delete visManager;) << 
211   //   ...                                     << 
212                                                << 
213   // Make top level command directory...       << 
214   // vis commands should *not* be broadcast to << 
215   G4bool propagateToWorkers;                   << 
216   auto directory = new G4UIdirectory ("/vis/", << 
217   directory -> SetGuidance ("Visualization com << 
218   // Request commands in name order            << 
219   directory -> Sort();  // Ordering propagates << 
220   fDirectoryList.push_back (directory);        << 
221                                                << 
222   // Instantiate *basic* top level commands so << 
223   // immediately after instantiation of the vi << 
224   // level and lower level commands are instan << 
225   // RegisterMessengers.                       << 
226   G4VVisCommand::SetVisManager (this);  // Set << 
227   RegisterMessenger(new G4VisCommandVerbose);  << 
228   RegisterMessenger(new G4VisCommandInitialize << 
229 }                                                  71 }
230                                                    72 
231 G4VisManager::~G4VisManager()                  <<  73 G4VisManager::~G4VisManager () {
232 {                                              <<  74   fpInstance = 0;
233   G4UImanager* UImanager = G4UImanager::GetUIp <<  75   int i;
234   UImanager->SetCoutDestination(nullptr);      << 
235   std::size_t i;                               << 
236   for (i = 0; i < fSceneList.size (); ++i) {       76   for (i = 0; i < fSceneList.size (); ++i) {
237     delete fSceneList[i];                          77     delete fSceneList[i];
238   }                                                78   }
239   for (i = 0; i < fAvailableSceneHandlers.size     79   for (i = 0; i < fAvailableSceneHandlers.size (); ++i) {
240   if (fAvailableSceneHandlers[i] != NULL) {    << 
241     delete fAvailableSceneHandlers[i];             80     delete fAvailableSceneHandlers[i];
242   }                                                81   }
243   }                                            << 
244   for (i = 0; i < fAvailableGraphicsSystems.si     82   for (i = 0; i < fAvailableGraphicsSystems.size (); ++i) {
245     if (fAvailableGraphicsSystems[i]) {        <<  83     delete fAvailableGraphicsSystems[i];
246       delete fAvailableGraphicsSystems[i];     << 
247     }                                          << 
248   }                                            << 
249   if (fVerbosity >= startup) {                 << 
250     G4cout << "Graphics systems deleted." << G << 
251     G4cout << "Visualization Manager deleting. << 
252   }                                                84   }
                                                   >>  85   G4cout << "Graphics systems deleted." << G4endl;
                                                   >>  86   G4cout << "VisManager deleting." << G4endl;
253   for (i = 0; i < fMessengerList.size (); ++i)     87   for (i = 0; i < fMessengerList.size (); ++i) {
254     delete fMessengerList[i];                      88     delete fMessengerList[i];
255   }                                                89   }
256   for (i = 0; i < fDirectoryList.size (); ++i) <<  90   delete fpMessenger;
257     delete fDirectoryList[i];                  << 
258   }                                            << 
259                                                << 
260   delete fpDigiFilterMgr;                      << 
261   delete fpHitFilterMgr;                       << 
262   delete fpTrajFilterMgr;                      << 
263   delete fpTrajDrawModelMgr;                   << 
264   fpInstance = 0;                              << 
265 }                                                  91 }
266                                                    92 
267 G4VisManager* G4VisManager::GetInstance () {       93 G4VisManager* G4VisManager::GetInstance () {
268   if (!fpInstance) {                               94   if (!fpInstance) {
269     G4Exception                                    95     G4Exception
270       ("G4VisManager::GetInstance",            <<  96       ("G4VisManager::GetInstance: VisManager not yet instantiated!");
271        "visman0002", FatalException, "VisManag << 
272   }                                                97   }
273   return fpInstance;                               98   return fpInstance;
274 }                                                  99 }
275                                                   100 
276 void G4VisManager::Initialise () {                101 void G4VisManager::Initialise () {
277                                                   102 
278   if (fInitialised && fVerbosity >= warnings)  << 103   G4cout << "Initialising Visualization Manager...." << G4endl;
279     G4warn << "WARNING: G4VisManager::Initiali << 
280      << G4endl;                                << 
281     return;                                    << 
282   }                                            << 
283                                                << 
284   if (fVerbosity >= startup) {                 << 
285     G4cout << "Visualization Manager initialis << 
286   }                                            << 
287                                                   104 
288   if (fVerbosity >= parameters) {              << 105   if (fVerbose > 0) {
                                                   >> 106     PrintAllGraphicsSystems ();
                                                   >> 107     PrintInstalledGraphicsSystems ();
289     G4cout <<                                     108     G4cout <<
290       "\nYou have instantiated your own Visual    109       "\nYou have instantiated your own Visualization Manager, inheriting"
291       "\n  G4VisManager and implementing Regis << 110       "\n  G4VisManager and implementing RegisterGraphicsSystems.  An example"
292       "\n  you should, normally, instantiate d << 111       "\n  class MyVisManager is provided which is controlled by the"
293       "\n  external packages or libraries, and << 112       "\n  following environment variables:"
294       "\n  control of environment variables."  << 113 #ifdef G4VIS_BUILD_DAWN_DRIVER
295       "\n  Also you should implement RegisterM << 114       "\n    G4VIS_USE_DAWN"
296       "\n  See visualization/management/includ << 115 #endif
297       "\n  In your main() you will have someth << 116 #ifdef G4VIS_BUILD_DAWNFILE_DRIVER
298       "\n    G4VisManager* visManager = new G4 << 117       "\n    G4VIS_USE_DAWNFILE"
299       "\n    visManager -> SetVerboseLevel (Ve << 118 #endif
                                                   >> 119 #ifdef G4VIS_BUILD_OPACS_DRIVER
                                                   >> 120       "\n    G4VIS_USE_OPACS"
                                                   >> 121 #endif
                                                   >> 122 #ifdef G4VIS_BUILD_OPENGLX_DRIVER
                                                   >> 123       "\n    G4VIS_USE_OPENGLX"
                                                   >> 124 #endif
                                                   >> 125 #ifdef G4VIS_BUILD_OPENGLXM_DRIVER
                                                   >> 126       "\n    G4VIS_USE_OPENGLXM"
                                                   >> 127 #endif
                                                   >> 128 #ifdef G4VIS_BUILD_OIX_DRIVER
                                                   >> 129       "\n    G4VIS_USE_OIX"
                                                   >> 130 #endif
                                                   >> 131 #ifdef G4VIS_BUILD_OIWIN32_DRIVER
                                                   >> 132       "\n    G4VIS_USE_OIWIN32"
                                                   >> 133 #endif
                                                   >> 134 #ifdef G4VIS_BUILD_VRML_DRIVER
                                                   >> 135       "\n    G4VIS_USE_VRML"
                                                   >> 136 #endif
                                                   >> 137 #ifdef G4VIS_BUILD_VRMLFILE_DRIVER
                                                   >> 138       "\n    G4VIS_USE_VRMLFILE"
                                                   >> 139 #endif
                                                   >> 140 #ifdef G4VIS_BUILD_RAYTRACER_DRIVER
                                                   >> 141       "\n    G4VIS_USE_RAYTRACER"
                                                   >> 142 #endif
                                                   >> 143       "\n  Thus, in your main() you have something like:"
                                                   >> 144       "\n    G4VisManager* visManager = new MyVisManager;"
300       "\n    visManager -> Initialize ();"        145       "\n    visManager -> Initialize ();"
301       "\n  (Don't forget to delete visManager;    146       "\n  (Don't forget to delete visManager;)"
302       "\n"                                     << 
303    << G4endl;                                     147    << G4endl;
304   }                                               148   }
305                                                << 149    
306   if (fVerbosity >= startup) {                 << 150   G4cout << "Registering graphics systems...." << G4endl;
307     G4cout << "Registering graphics systems... << 
308   }                                            << 
309                                                   151 
310   RegisterGraphicsSystems ();                     152   RegisterGraphicsSystems ();
311                                                   153 
312   if (fVerbosity >= startup) {                 << 
313     G4cout <<                                  << 
314       "\nYou have successfully registered the  << 
315    << G4endl;                                  << 
316     PrintAvailableGraphicsSystems (fVerbosity) << 
317     G4cout << G4endl;                          << 
318   }                                            << 
319                                                << 
320   // Make command directories for commands ins << 
321   // modeling subcategory...                   << 
322   G4UIcommand* directory;                      << 
323   directory = new G4UIdirectory ("/vis/modelin << 
324   directory -> SetGuidance ("Modeling commands << 
325   fDirectoryList.push_back (directory);        << 
326   directory = new G4UIdirectory ("/vis/modelin << 
327   directory -> SetGuidance ("Trajectory model  << 
328   fDirectoryList.push_back (directory);        << 
329   directory = new G4UIdirectory ("/vis/modelin << 
330   directory -> SetGuidance ("Create trajectory << 
331   fDirectoryList.push_back (directory);        << 
332                                                << 
333   // Filtering command directory               << 
334   directory = new G4UIdirectory ("/vis/filteri << 
335   directory -> SetGuidance ("Filtering command << 
336   fDirectoryList.push_back (directory);        << 
337   directory = new G4UIdirectory ("/vis/filteri << 
338   directory -> SetGuidance ("Trajectory filter << 
339   fDirectoryList.push_back (directory);        << 
340   directory = new G4UIdirectory ("/vis/filteri << 
341   directory -> SetGuidance ("Create trajectory << 
342   fDirectoryList.push_back (directory);        << 
343   directory = new G4UIdirectory ("/vis/filteri << 
344   directory -> SetGuidance ("Hit filtering com << 
345   fDirectoryList.push_back (directory);        << 
346   directory = new G4UIdirectory ("/vis/filteri << 
347   directory -> SetGuidance ("Create hit filter << 
348   fDirectoryList.push_back (directory);        << 
349   directory = new G4UIdirectory ("/vis/filteri << 
350   directory -> SetGuidance ("Digi filtering co << 
351   fDirectoryList.push_back (directory);        << 
352   directory = new G4UIdirectory ("/vis/filteri << 
353   directory -> SetGuidance ("Create digi filte << 
354   fDirectoryList.push_back (directory);        << 
355                                                << 
356   RegisterMessengers ();                          154   RegisterMessengers ();
357                                                   155 
358   if (fVerbosity >= startup) {                 << 156   // Remaining commands - not yet template-ised.
359     G4cout << "Registering model factories..." << 157   fpMessenger = new G4VisManMessenger (this);
360   }                                            << 
361                                                   158 
362   RegisterModelFactories();                    << 159   // TEMPORARY /vis/ -> /vis~/ equivalence.
363                                                << 160   fMessengerList.push_back (new G4VisToOldVisCommands);  
364   if (fVerbosity >= startup) {                 << 
365     G4cout <<                                  << 
366       "\nYou have successfully registered the  << 
367      << G4endl;                                << 
368     PrintAvailableModels (fVerbosity);         << 
369     G4cout << G4endl;                          << 
370   }                                            << 
371                                                << 
372   if (fVerbosity >= startup) {                 << 
373     PrintAvailableUserVisActions (fVerbosity); << 
374     G4cout << G4endl;                          << 
375   }                                            << 
376                                                << 
377   InitialiseG4ColourMap();                     << 
378                                                << 
379   if (fVerbosity >= startup) {                 << 
380     G4cout <<                                  << 
381     "Some /vis commands (optionally) take a st << 
382     "\n\"/vis/list\" to see available colours. << 
383     << G4endl;                                 << 
384   }                                            << 
385                                                   161 
386   fInitialised = true;                            162   fInitialised = true;
387 }                                                 163 }
388                                                   164 
389 void G4VisManager::InitialiseG4ColourMap() con << 165 // void G4VisManager::RegisterMessengers () - see separate file,
390 {                                              << 166 // G4VisManagerRegisterMessengers.cc.
391   G4Colour::InitialiseColourMap();  // Initial << 
392                                                << 
393   // our forever 65 named colors taken long ti << 
394   // Extracted from g4tools/include/tools/colo << 
395   // Copyright (C) 2010, Guy Barrand. All righ << 
396   // See the file tools.license for terms.     << 
397                                                << 
398 #define TOOLS_COLORS_STAT(name,r,g,b) \        << 
399 G4Colour::AddToMap(#name, G4Colour(r,g,b));    << 
400                                                << 
401   //0-9                                        << 
402   TOOLS_COLORS_STAT(aquamarine,0.496101F,0.996 << 
403   TOOLS_COLORS_STAT(mediumaquamarine,0.398444F << 
404   //  TOOLS_COLORS_STAT(black,0,0,0) (already  << 
405   //  TOOLS_COLORS_STAT(blue,0,0,1) (already d << 
406   TOOLS_COLORS_STAT(cadetblue,0.371099F,0.6171 << 
407   TOOLS_COLORS_STAT(cornflowerblue,0.390631F,0 << 
408   TOOLS_COLORS_STAT(darkslateblue,0.281254F,0. << 
409   TOOLS_COLORS_STAT(lightblue,0.675792F,0.8437 << 
410   TOOLS_COLORS_STAT(lightsteelblue,0.68751F,0. << 
411   TOOLS_COLORS_STAT(mediumblue,0,0,0.800793F)  << 
412                                                << 
413   //10-19                                      << 
414   TOOLS_COLORS_STAT(mediumslateblue,0.480476F, << 
415   TOOLS_COLORS_STAT(midnightblue,0.0976577F,0. << 
416   TOOLS_COLORS_STAT(navyblue,0,0,0.500008F)    << 
417   TOOLS_COLORS_STAT(navy,0,0,0.500008F)        << 
418   TOOLS_COLORS_STAT(skyblue,0.527352F,0.8047F, << 
419   TOOLS_COLORS_STAT(slateblue,0.414069F,0.3515 << 
420   TOOLS_COLORS_STAT(steelblue,0.273442F,0.5078 << 
421   TOOLS_COLORS_STAT(coral,0.996109F,0.496101F, << 
422   //  TOOLS_COLORS_STAT(cyan,0,1,1) (already d << 
423   TOOLS_COLORS_STAT(firebrick,0.695323F,0.1328 << 
424                                                << 
425   //20-29                                      << 
426   //  TOOLS_COLORS_STAT(brown,0.644541F,0.1640 << 
427   TOOLS_COLORS_STAT(gold,0.996109F,0.839857F,0 << 
428   TOOLS_COLORS_STAT(goldenrod,0.851575F,0.6445 << 
429   //  TOOLS_COLORS_STAT(green,0,1,0) (already  << 
430   TOOLS_COLORS_STAT(darkgreen,0,0.390631F,0)   << 
431   TOOLS_COLORS_STAT(darkolivegreen,0.332036F,0 << 
432   TOOLS_COLORS_STAT(forestgreen,0.132815F,0.54 << 
433   TOOLS_COLORS_STAT(limegreen,0.195315F,0.8007 << 
434   TOOLS_COLORS_STAT(mediumseagreen,0.234379F,0 << 
435   TOOLS_COLORS_STAT(mediumspringgreen,0,0.9765 << 
436                                                << 
437   //30-39                                      << 
438   TOOLS_COLORS_STAT(palegreen,0.593759F,0.9804 << 
439   TOOLS_COLORS_STAT(seagreen,0.17969F,0.542977 << 
440   TOOLS_COLORS_STAT(springgreen,0,0.996109F,0. << 
441   TOOLS_COLORS_STAT(yellowgreen,0.601572F,0.80 << 
442   TOOLS_COLORS_STAT(darkslategrey,0.183597F,0. << 
443   TOOLS_COLORS_STAT(dimgrey,0.410163F,0.410163 << 
444   TOOLS_COLORS_STAT(lightgrey,0.824231F,0.8242 << 
445   //  TOOLS_COLORS_STAT(grey,0.750011F,0.75001 << 
446   TOOLS_COLORS_STAT(khaki,0.937514F,0.898451F, << 
447   //  TOOLS_COLORS_STAT(magenta,1,0,1) (alread << 
448                                                << 
449   //40-49                                      << 
450   TOOLS_COLORS_STAT(maroon,0.68751F,0.187503F, << 
451   TOOLS_COLORS_STAT(orange,0.996109F,0.644541F << 
452   TOOLS_COLORS_STAT(orchid,0.851575F,0.437507F << 
453   TOOLS_COLORS_STAT(darkorchid,0.597665F,0.195 << 
454   TOOLS_COLORS_STAT(mediumorchid,0.726574F,0.3 << 
455   TOOLS_COLORS_STAT(pink,0.996109F,0.750011F,0 << 
456   TOOLS_COLORS_STAT(plum,0.863294F,0.62501F,0. << 
457   //  TOOLS_COLORS_STAT(red,1,0,0) (already de << 
458   TOOLS_COLORS_STAT(indianred,0.800793F,0.3593 << 
459   TOOLS_COLORS_STAT(mediumvioletred,0.777356F, << 
460                                                << 
461   //50-59                                      << 
462   TOOLS_COLORS_STAT(orangered,0.996109F,0.2695 << 
463   TOOLS_COLORS_STAT(violetred,0.812512F,0.1250 << 
464   TOOLS_COLORS_STAT(salmon,0.976577F,0.500008F << 
465   TOOLS_COLORS_STAT(sienna,0.62501F,0.320317F, << 
466   TOOLS_COLORS_STAT(tan,0.820325F,0.703136F,0. << 
467   TOOLS_COLORS_STAT(thistle,0.843763F,0.746105 << 
468   TOOLS_COLORS_STAT(turquoise,0.250004F,0.8750 << 
469   TOOLS_COLORS_STAT(darkturquoise,0,0.8047F,0. << 
470   TOOLS_COLORS_STAT(mediumturquoise,0.281254F, << 
471   TOOLS_COLORS_STAT(violet,0.929702F,0.50782F, << 
472                                                << 
473   //60-64                                      << 
474   TOOLS_COLORS_STAT(blueviolet,0.539071F,0.167 << 
475   TOOLS_COLORS_STAT(wheat,0.957046F,0.867201F, << 
476   //  TOOLS_COLORS_STAT(white,1,1,1) (already  << 
477   //  TOOLS_COLORS_STAT(yellow,1,1,0) (already << 
478   TOOLS_COLORS_STAT(greenyellow,0.675792F,0.99 << 
479                                                << 
480 #undef TOOLS_COLORS_STAT                       << 
481 }                                              << 
482                                                << 
483 void G4VisManager::RegisterMessengers () {     << 
484                                                << 
485   // Instantiate individual messengers/command << 
486   // always - one command per messenger).      << 
487                                                << 
488   G4UIcommand* directory;                      << 
489                                                << 
490   directory = new G4UIdirectory ("/vis/geometr << 
491   directory -> SetGuidance("Operations on vis  << 
492   fDirectoryList.push_back (directory);        << 
493   RegisterMessenger(new G4VisCommandGeometryLi << 
494   RegisterMessenger(new G4VisCommandGeometryRe << 
495                                                << 
496   directory = new G4UIdirectory ("/vis/geometr << 
497   directory -> SetGuidance("Set vis attributes << 
498   fDirectoryList.push_back (directory);        << 
499   RegisterMessenger(new G4VisCommandGeometrySe << 
500   RegisterMessenger(new G4VisCommandGeometrySe << 
501   RegisterMessenger(new G4VisCommandGeometrySe << 
502   RegisterMessenger(new G4VisCommandGeometrySe << 
503   RegisterMessenger(new G4VisCommandGeometrySe << 
504   RegisterMessenger(new G4VisCommandGeometrySe << 
505   RegisterMessenger(new G4VisCommandGeometrySe << 
506   RegisterMessenger(new G4VisCommandGeometrySe << 
507   RegisterMessenger(new G4VisCommandGeometrySe << 
508   RegisterMessenger(new G4VisCommandGeometrySe << 
509                                                << 
510   directory = new G4UIdirectory ("/vis/multith << 
511   directory -> SetGuidance("Commands unique to << 
512   fDirectoryList.push_back (directory);        << 
513   RegisterMessenger(new G4VisCommandMultithrea << 
514   RegisterMessenger(new G4VisCommandMultithrea << 
515                                                << 
516   directory = new G4UIdirectory ("/vis/set/"); << 
517   directory -> SetGuidance                     << 
518     ("Set quantities for use in future command << 
519   fDirectoryList.push_back (directory);        << 
520   RegisterMessenger(new G4VisCommandSetArrow3D << 
521   RegisterMessenger(new G4VisCommandSetColour) << 
522   RegisterMessenger(new G4VisCommandSetExtentF << 
523   RegisterMessenger(new G4VisCommandSetLineWid << 
524   RegisterMessenger(new G4VisCommandSetTextCol << 
525   RegisterMessenger(new G4VisCommandSetTextLay << 
526   RegisterMessenger(new G4VisCommandSetTextSiz << 
527   RegisterMessenger(new G4VisCommandSetTouchab << 
528   RegisterMessenger(new G4VisCommandSetVolumeF << 
529                                                << 
530   directory = new G4UIdirectory ("/vis/scene/" << 
531   directory -> SetGuidance ("Operations on Gea << 
532   fDirectoryList.push_back (directory);        << 
533   RegisterMessenger(new G4VisCommandSceneActiv << 
534   RegisterMessenger(new G4VisCommandSceneCreat << 
535   RegisterMessenger(new G4VisCommandSceneEndOf << 
536   RegisterMessenger(new G4VisCommandSceneEndOf << 
537   RegisterMessenger(new G4VisCommandSceneList) << 
538   RegisterMessenger(new G4VisCommandSceneNotif << 
539   RegisterMessenger(new G4VisCommandSceneRemov << 
540   RegisterMessenger(new G4VisCommandSceneSelec << 
541   RegisterMessenger(new G4VisCommandSceneShowE << 
542                                                << 
543   directory = new G4UIdirectory ("/vis/scene/a << 
544   directory -> SetGuidance ("Add model to curr << 
545   fDirectoryList.push_back (directory);        << 
546   RegisterMessenger(new G4VisCommandSceneAddAr << 
547   RegisterMessenger(new G4VisCommandSceneAddAr << 
548   RegisterMessenger(new G4VisCommandSceneAddAx << 
549   RegisterMessenger(new G4VisCommandSceneAddDa << 
550   RegisterMessenger(new G4VisCommandSceneAddDi << 
551   RegisterMessenger(new G4VisCommandSceneAddEv << 
552   RegisterMessenger(new G4VisCommandSceneAddEx << 
553   RegisterMessenger(new G4VisCommandSceneAddEl << 
554   RegisterMessenger(new G4VisCommandSceneAddFr << 
555   RegisterMessenger(new G4VisCommandSceneAddGP << 
556   RegisterMessenger(new G4VisCommandSceneAddHi << 
557   RegisterMessenger(new G4VisCommandSceneAddLi << 
558   RegisterMessenger(new G4VisCommandSceneAddLi << 
559   RegisterMessenger(new G4VisCommandSceneAddLo << 
560   RegisterMessenger(new G4VisCommandSceneAddLo << 
561   RegisterMessenger(new G4VisCommandSceneAddLo << 
562   RegisterMessenger(new G4VisCommandSceneAddLo << 
563   RegisterMessenger(new G4VisCommandSceneAddMa << 
564   RegisterMessenger(new G4VisCommandSceneAddPl << 
565   RegisterMessenger(new G4VisCommandSceneAddPS << 
566   RegisterMessenger(new G4VisCommandSceneAddSc << 
567   RegisterMessenger(new G4VisCommandSceneAddTe << 
568   RegisterMessenger(new G4VisCommandSceneAddTe << 
569   RegisterMessenger(new G4VisCommandSceneAddTr << 
570   RegisterMessenger(new G4VisCommandSceneAddUs << 
571   RegisterMessenger(new G4VisCommandSceneAddVo << 
572                                                << 
573   RegisterMessenger(new G4VisCommandPlotterCre << 
574   RegisterMessenger(new G4VisCommandPlotterSet << 
575   RegisterMessenger(new G4VisCommandPlotterAdd << 
576   RegisterMessenger(new G4VisCommandPlotterAdd << 
577   RegisterMessenger(new G4VisCommandPlotterAdd << 
578   RegisterMessenger(new G4VisCommandPlotterCle << 
579   RegisterMessenger(new G4VisCommandPlotterCle << 
580   RegisterMessenger(new G4VisCommandPlotterLis << 
581   RegisterMessenger(new G4VisCommandPlotterAdd << 
582   RegisterMessenger(new G4VisCommandPlotterAdd << 
583                                                << 
584   directory = new G4UIdirectory ("/vis/sceneHa << 
585   directory -> SetGuidance ("Operations on Gea << 
586   fDirectoryList.push_back (directory);        << 
587   RegisterMessenger(new G4VisCommandSceneHandl << 
588   RegisterMessenger(new G4VisCommandSceneHandl << 
589   RegisterMessenger(new G4VisCommandSceneHandl << 
590   RegisterMessenger(new G4VisCommandSceneHandl << 
591                                                << 
592   directory = new G4UIdirectory ("/vis/touchab << 
593   directory -> SetGuidance ("Operations on tou << 
594   fDirectoryList.push_back (directory);        << 
595   RegisterMessenger(new G4VisCommandsTouchable << 
596                                                << 
597   directory = new G4UIdirectory ("/vis/touchab << 
598   directory -> SetGuidance ("Set vis attribute << 
599   fDirectoryList.push_back (directory);        << 
600   RegisterMessenger(new G4VisCommandsTouchable << 
601                                                << 
602   directory = new G4UIdirectory ("/vis/viewer/ << 
603   directory -> SetGuidance ("Operations on Gea << 
604   fDirectoryList.push_back (directory);        << 
605   RegisterMessenger(new G4VisCommandViewerAddC << 
606   RegisterMessenger(new G4VisCommandViewerCent << 
607   RegisterMessenger(new G4VisCommandViewerChan << 
608   RegisterMessenger(new G4VisCommandViewerClea << 
609   RegisterMessenger(new G4VisCommandViewerClea << 
610   RegisterMessenger(new G4VisCommandViewerClea << 
611   RegisterMessenger(new G4VisCommandViewerClea << 
612   RegisterMessenger(new G4VisCommandViewerClon << 
613   RegisterMessenger(new G4VisCommandViewerColo << 
614   RegisterMessenger(new G4VisCommandViewerCopy << 
615   RegisterMessenger(new G4VisCommandViewerCrea << 
616   RegisterMessenger(new G4VisCommandViewerDoll << 
617   RegisterMessenger(new G4VisCommandViewerFlus << 
618   RegisterMessenger(new G4VisCommandViewerInte << 
619   RegisterMessenger(new G4VisCommandViewerList << 
620   RegisterMessenger(new G4VisCommandViewerPan) << 
621   RegisterMessenger(new G4VisCommandViewerRebu << 
622   RegisterMessenger(new G4VisCommandViewerRefr << 
623   RegisterMessenger(new G4VisCommandViewerRese << 
624   RegisterMessenger(new G4VisCommandViewerRese << 
625   RegisterMessenger(new G4VisCommandViewerSave << 
626   RegisterMessenger(new G4VisCommandViewerScal << 
627   RegisterMessenger(new G4VisCommandViewerSele << 
628   RegisterMessenger(new G4VisCommandViewerUpda << 
629   RegisterMessenger(new G4VisCommandViewerZoom << 
630                                                << 
631   directory = new G4UIdirectory ("/vis/viewer/ << 
632   directory -> SetGuidance("Set default values << 
633   fDirectoryList.push_back (directory);        << 
634   RegisterMessenger(new G4VisCommandViewerDefa << 
635   RegisterMessenger(new G4VisCommandViewerDefa << 
636                                                << 
637   directory = new G4UIdirectory ("/vis/viewer/ << 
638   directory -> SetGuidance ("Set view paramete << 
639   fDirectoryList.push_back (directory);        << 
640   RegisterMessenger(new G4VisCommandsViewerSet << 
641                                                << 
642   // *Basic* top level commands were instantia << 
643   // so that they can be used immediately afte << 
644   // vis manager.  Other top level commands, i << 
645   // (i.e., commands that invoke other command << 
646                                                << 
647   RegisterMessenger(new G4VisCommandAbortRevie << 
648   RegisterMessenger(new G4VisCommandAbortRevie << 
649   RegisterMessenger(new G4VisCommandDrawOnlyTo << 
650   RegisterMessenger(new G4VisCommandDrawTree); << 
651   RegisterMessenger(new G4VisCommandDrawView); << 
652   RegisterMessenger(new G4VisCommandDrawLogica << 
653   RegisterMessenger(new G4VisCommandDrawVolume << 
654   RegisterMessenger(new G4VisCommandEnable);   << 
655   RegisterMessenger(new G4VisCommandList);     << 
656   RegisterMessenger(new G4VisCommandOpen);     << 
657   RegisterMessenger(new G4VisCommandPlot);     << 
658   RegisterMessenger(new G4VisCommandReviewKept << 
659   RegisterMessenger(new G4VisCommandReviewPlot << 
660   RegisterMessenger(new G4VisCommandSpecify);  << 
661                                                << 
662   // List manager commands                     << 
663   RegisterMessenger(new G4VisCommandListManage << 
664         (fpTrajDrawModelMgr, fpTrajDrawModelMg << 
665   RegisterMessenger(new G4VisCommandListManage << 
666         (fpTrajDrawModelMgr, fpTrajDrawModelMg << 
667                                                << 
668   // Trajectory filter manager commands        << 
669   RegisterMessenger(new G4VisCommandListManage << 
670                     (fpTrajFilterMgr, fpTrajFi << 
671   RegisterMessenger(new G4VisCommandManagerMod << 
672                     (fpTrajFilterMgr, fpTrajFi << 
673                                                << 
674   // Hit filter manager commands               << 
675   RegisterMessenger(new G4VisCommandListManage << 
676                     (fpHitFilterMgr, fpHitFilt << 
677   RegisterMessenger(new G4VisCommandManagerMod << 
678                     (fpHitFilterMgr, fpHitFilt << 
679                                                << 
680   // Digi filter manager commands              << 
681   RegisterMessenger(new G4VisCommandListManage << 
682                     (fpDigiFilterMgr, fpDigiFi << 
683   RegisterMessenger(new G4VisCommandManagerMod << 
684                     (fpDigiFilterMgr, fpDigiFi << 
685 }                                              << 
686                                                << 
687 #include <tools/histo/h1d>                     << 
688 #include <tools/histo/h2d>                     << 
689                                                << 
690 namespace {                                    << 
691   struct PlotResults {                         << 
692     std::size_t fNumberOfPlots = 0;            << 
693     std::size_t fTotalEntries = 0;             << 
694   };                                           << 
695   template <typename HT>  // tools::histo::h1d << 
696   PlotResults ResultsOfHnPlots(const G4String& << 
697     PlotResults plotResults;                   << 
698     auto ui = G4UImanager::GetUIpointer();     << 
699     auto keepControlVerbose = ui->GetVerboseLe << 
700     ui->SetVerboseLevel(0);                    << 
701     auto status = ui->ApplyCommand("/analysis/ << 
702     ui->SetVerboseLevel(keepControlVerbose);   << 
703     if(status==G4UIcommandStatus::fCommandSucc << 
704       G4String hexString = ui->GetCurrentValue << 
705       if(hexString.size()) {                   << 
706         void* ptr; std::istringstream is(hexSt << 
707         auto vectorOfPlots = (const std::vecto << 
708         for (std::size_t i = 0; i < vectorOfPl << 
709           auto plot = (*vectorOfPlots)[i];     << 
710           if (plot == nullptr) continue;  // I << 
711           ++plotResults.fNumberOfPlots;        << 
712           plotResults.fTotalEntries += plot->e << 
713         }                                      << 
714       }                                        << 
715     }                                          << 
716     return plotResults;                        << 
717   }                                            << 
718   void PrintListOfPlots() {                    << 
719     std::size_t numberOfPlots = 0;             << 
720     std::size_t numberOfEntries = 0;           << 
721     PlotResults h1results = ResultsOfHnPlots<t << 
722     numberOfPlots += h1results.fNumberOfPlots; << 
723     numberOfEntries += h1results.fTotalEntries << 
724     PlotResults h2results = ResultsOfHnPlots<t << 
725     numberOfPlots += h2results.fNumberOfPlots; << 
726     numberOfEntries += h2results.fTotalEntries << 
727     if (numberOfPlots > 0) {                   << 
728       G4warn << "There are histograms that can << 
729       if (h1results.fNumberOfPlots > 0) {      << 
730         G4warn << "\n  " << h1results.fNumberO << 
731       }                                        << 
732       if (h2results.fNumberOfPlots > 0) {      << 
733         G4warn << "\n  " << h2results.fNumberO << 
734       }                                        << 
735       G4warn                                   << 
736       << "\n  List them with \"/analysis/list\ << 
737       << "\n  View them immediately with \"/vi << 
738       << G4endl;                               << 
739       if (numberOfEntries == 0) {              << 
740         G4warn <<                              << 
741         "  But...there are no entries. To make << 
742         "\n  plotting in this UI session, use  << 
743         "\n  EndOfRunAction and Reset() in you << 
744         << G4endl;                             << 
745       }                                        << 
746     }                                          << 
747   }                                            << 
748 }                                              << 
749                                                   167 
750 void G4VisManager::Enable() {                     168 void G4VisManager::Enable() {
751   if (IsValidView ()) {                           169   if (IsValidView ()) {
752     SetConcreteInstance(this);                 << 170     G4cout << "G4VisManager::Enable: visualization enabled." << G4endl;
753     if (fVerbosity >= confirmations) {         << 
754       G4cout << "G4VisManager::Enable: visuali << 
755     }                                          << 
756     if (fVerbosity >= warnings) {              << 
757       std::size_t nKeptEvents = 0;             << 
758       const G4Run* run = G4RunManager::GetRunM << 
759       if (run) nKeptEvents = run->GetNumberOfK << 
760       G4String isare("are"),plural("s");       << 
761       if (nKeptEvents == 1) {isare = "is"; plu << 
762       G4cout <<                                << 
763       "There " << isare << ' ' << nKeptEvents  << 
764       << G4endl;                               << 
765       if (nKeptEvents > 0) {                   << 
766         G4cout <<                              << 
767   "  \"/vis/reviewKeptEvents\" to review one b << 
768   "\n  To see accumulated, \"/vis/enable\", th << 
769         << G4endl;                             << 
770       }                                        << 
771       PrintListOfPlots();                      << 
772     }                                          << 
773   }                                               171   }
774   else {                                          172   else {
775     if (fVerbosity >= warnings) {              << 173     G4cout <<
776       G4warn <<                                << 174       "G4VisManager::Enable: visualization remains disabled for above reasons."
777   "G4VisManager::Enable: WARNING: visualizatio << 175       "\n  Rectifying with valid vis commands will automatically enable."
778   "\n  above reasons.  Rectifying with valid v << 176      << G4endl;
779   "\n  automatically enable."                  << 
780        << G4endl;                              << 
781     }                                          << 
782   }                                               177   }
783 }                                                 178 }
784                                                   179 
785 void G4VisManager::Disable() {                    180 void G4VisManager::Disable() {
786   SetConcreteInstance(0);                      << 181   fpConcreteInstance = 0;
787   if (fVerbosity >= confirmations) {           << 182   G4cout <<
788     G4cout <<                                  << 
789     "G4VisManager::Disable: visualization disa    183     "G4VisManager::Disable: visualization disabled."
790     "\n  The pointer returned by GetConcreteIn << 
791     "\n  Note that it will become enabled afte    184     "\n  Note that it will become enabled after some valid vis commands."
792      << G4endl;                                << 185    << G4endl;
793   }                                            << 
794   if (fVerbosity >= warnings) {                << 
795     G4int currentTrajectoryType =              << 
796     G4RunManagerKernel::GetRunManagerKernel()- << 
797     if (currentTrajectoryType > 0) {           << 
798     G4warn <<                                  << 
799       "You may wish to disable trajectory prod << 
800       "\n  \"/tracking/storeTrajectory 0\""    << 
801       "\nbut don't forget to re-enable with"   << 
802       "\n  \"/vis/enable\""                    << 
803       "\n  \"/tracking/storeTrajectory " << cu << 
804       << "\"\n  and maybe \"/vis/viewer/rebuil << 
805       << G4endl;                               << 
806     }                                          << 
807   }                                            << 
808 }                                                 186 }
809                                                   187 
810 const G4GraphicsSystemList& G4VisManager::GetA    188 const G4GraphicsSystemList& G4VisManager::GetAvailableGraphicsSystems () {
811   std::size_t nSystems = fAvailableGraphicsSys << 189   G4int nSystems = fAvailableGraphicsSystems.size ();
812   if (nSystems == 0) {                            190   if (nSystems == 0) {
813     if (fVerbosity >= warnings) {              << 191     G4cout << "G4VisManager::GetAvailableGraphicsSystems: WARNING: no graphics"
814       G4warn << "G4VisManager::GetAvailableGra << 192       " system available!"
815   "\n graphics system available!"              << 193       "\n  1) Did you have environment variables G4VIS_BUILD_xxxx_DRIVER set"
816   "\n  1) Did you have environment variables G << 194       "\n     when you compiled/built the visualization code?"
817   "\n     when you compiled/built the visualiz << 195       "\n  2) Did you instantiate your own Visualization Manager and forget"
818   "\n  2) Did you instantiate your own Visuali << 196       "\n     to implement RegisterGraphicsSystems correctly?"
819   "\n     to implement RegisterGraphicsSystems << 197       "\n  3) You can register your own graphics system, e.g.,"
820   "\n  3) You can register your own graphics s << 198       "\n     G4VisManager::GetInstance () ->"
821   "\n     visManager->RegisterGraphicsSystem(n << 199       "\n       RegisterGraphicsSystem (new MyGraphicsSystem);)"
822   "\n     after instantiating your vis manager << 200    << G4endl;
823   "\n     visManager->Initialize()."           << 
824        << G4endl;                              << 
825     }                                          << 
826   }                                               201   }
827   return fAvailableGraphicsSystems;               202   return fAvailableGraphicsSystems;
828 }                                                 203 }
829                                                   204 
830 G4bool G4VisManager::RegisterGraphicsSystem (G    205 G4bool G4VisManager::RegisterGraphicsSystem (G4VGraphicsSystem* pSystem) {
831   G4bool happy = true;                         << 206   if (pSystem -> GetFunctionality () == G4VGraphicsSystem::noFunctionality) {
832   if (pSystem) {                               << 207     G4cout << "G4VisManager::RegisterGraphicsSystem: WARNING: attempt to"
                                                   >> 208       "\n  register a \"no functionality\" graphics system, probably an"
                                                   >> 209       "\n  unbuilt system, i.e., a system not available locally.  Please"
                                                   >> 210       "\n  consult your computer manager.  System was "
                                                   >> 211    << pSystem -> GetName ();
                                                   >> 212     if (pSystem -> GetNickname () != "") {
                                                   >> 213       G4cout << " (" << pSystem -> GetNickname () << ")";
                                                   >> 214     }
                                                   >> 215     G4cout << G4endl;
                                                   >> 216     return false;
                                                   >> 217   }
                                                   >> 218   else {
833     fAvailableGraphicsSystems.push_back (pSyst    219     fAvailableGraphicsSystems.push_back (pSystem);
834     if (fVerbosity >= confirmations) {         << 220     if (fVerbose > 0) {
835       G4cout << "G4VisManager::RegisterGraphic    221       G4cout << "G4VisManager::RegisterGraphicsSystem: "
836        << pSystem -> GetName ();               << 222      << pSystem -> GetName ();
837       if (pSystem -> GetNickname () != "") {      223       if (pSystem -> GetNickname () != "") {
838   G4cout << " (" << pSystem -> GetNickname ()     224   G4cout << " (" << pSystem -> GetNickname () << ")";
839       }                                           225       }
840       G4cout << " registered." << G4endl;         226       G4cout << " registered." << G4endl;
841     }                                             227     }
                                                   >> 228     return true;
842   }                                               229   }
843   else {                                       << 230 }
844     if (fVerbosity >= errors) {                << 231 
845       G4warn << "G4VisManager::RegisterGraphic << 232 void G4VisManager::CopyViewParameters () {
846        << G4endl;                              << 233   if (IsValidView ()) {
847     }                                          << 234     fVP = fpViewer -> GetViewParameters ();
848     happy=false;                               << 
849   }                                               235   }
850   return happy;                                << 
851 }                                                 236 }
852                                                   237 
853 const G4VTrajectoryModel*                      << 238 /***********
854 G4VisManager::CurrentTrajDrawModel() const     << 239 void G4VisManager::Clear () {
855 {                                              << 
856   assert (0 != fpTrajDrawModelMgr);            << 
857                                                   240 
858   const G4VTrajectoryModel* model = fpTrajDraw << 241   // Clear current scene and current view, marking all its views as
                                                   >> 242   // needing refreshing.  This is a comprehensive clear which clears
                                                   >> 243   // both framebuffers of a double buffered system and clears the
                                                   >> 244   // scene's graphics databse (display lists, etc.) and clears the
                                                   >> 245   // current scene data.
859                                                   246 
860   if (0 == model) {                            << 247   if (IsValidView ()) {
861     // No model was registered with the trajec << 
862     // Use G4TrajectoryDrawByCharge as a fallb << 
863     fpTrajDrawModelMgr->Register(new G4Traject << 
864     if (fVerbosity >= warnings) {              << 
865       G4warn<<"G4VisManager: Using G4Trajector << 
866       G4warn<<"See commands in /vis/modeling/t << 
867     }                                          << 
868   }                                            << 
869                                                   248 
870   model = fpTrajDrawModelMgr->Current();       << 249     fpViewer -> ClearView ();
871   assert (0 != model); // Should definitely ex << 250     // Clears current buffer, i.e., back buffer in case of double
                                                   >> 251     // buffered system.
872                                                   252 
873   return model;                                << 253     fpViewer -> FinishView ();
874 }                                              << 254     // Swaps buffers of double buffered systems.
875                                                   255 
876 void G4VisManager::RegisterModel(G4VTrajectory << 256     fpViewer -> ClearView ();
877 {                                              << 257     // Clears the swapped buffer.
878   fpTrajDrawModelMgr->Register(model);         << 
879 }                                              << 
880                                                   258 
881 void                                           << 259     fpViewer -> NeedKernelVisit ();
882 G4VisManager::RegisterModelFactory(G4TrajDrawM << 260     // Informs all views of need to revisit kernel.
883 {                                              << 
884   fpTrajDrawModelMgr->Register(factory);       << 
885 }                                              << 
886                                                   261 
887 void G4VisManager::RegisterModel(G4VFilter<G4V << 262     fpSceneHandler -> ClearStore ();
888 {                                              << 263     // Clears the graphics database (display lists) if any.
889   fpTrajFilterMgr->Register(model);            << 
890 }                                              << 
891                                                   264 
892 void                                           << 265     fSD.Clear ();
893 G4VisManager::RegisterModelFactory(G4TrajFilte << 266     fpSceneHandler -> SetSceneData (fSD);
894 {                                              << 267     // Clears current scene data - then updates scene.
895   fpTrajFilterMgr->Register(factory);          << 268   }
896 }                                                 269 }
                                                   >> 270 *****************/
897                                                   271 
898 void G4VisManager::RegisterModel(G4VFilter<G4V << 272 /****************
899 {                                              << 273 void G4VisManager::ClearScene () {
900   fpHitFilterMgr->Register(model);             << 
901 }                                              << 
902                                                   274 
903 void                                           << 275   // Clear current scene, marking all its views as needing refreshing.
904 G4VisManager::RegisterModelFactory(G4HitFilter << 276   // Clears the scene handler's graphics database (display lists, etc.)
905 {                                              << 
906   fpHitFilterMgr->Register(factory);           << 
907 }                                              << 
908                                                   277 
909 void G4VisManager::RegisterModel(G4VFilter<G4V << 278   if (IsValidView ()) {
910 {                                              << 
911   fpDigiFilterMgr->Register(model);            << 
912 }                                              << 
913                                                   279 
914 void                                           << 280     fpViewer -> NeedKernelVisit ();
915 G4VisManager::RegisterModelFactory(G4DigiFilte << 281     // Informs all views of need to revisit kernel.
916 {                                              << 
917   fpDigiFilterMgr->Register(factory);          << 
918 }                                              << 
919                                                   282 
920 void G4VisManager::SelectTrajectoryModel(const << 283     fpSceneHandler -> ClearStore ();
921 {                                              << 284     // Clears the graphics database (display lists) if any.
922    fpTrajDrawModelMgr->SetCurrent(model);      << 
923 }                                              << 
924                                                   285 
925 void G4VisManager::BeginDraw (const G4Transfor << 286     fSD.Clear ();
926 {                                              << 287     fpSceneHandler -> SetSceneData (fSD);
927   if (G4Threading::IsWorkerThread()) return;   << 288     // Clears current scene data - then updates scene.
928                                                << 
929   fDrawGroupNestingDepth++;                    << 
930   if (fDrawGroupNestingDepth > 1) {            << 
931     G4Exception                                << 
932       ("G4VisManager::BeginDraw",              << 
933        "visman0008", JustWarning,              << 
934        "Nesting detected. It is illegal to nes << 
935        "\n Ignored");                          << 
936     return;                                    << 
937   }                                            << 
938   if (IsValidView ()) {                        << 
939     ClearTransientStoreIfMarked();             << 
940     fpSceneHandler -> BeginPrimitives (objectT << 
941     fIsDrawGroup = true;                       << 
942   }                                               289   }
943 }                                                 290 }
                                                   >> 291 ********************/
                                                   >> 292 
                                                   >> 293 void G4VisManager::ClearView () {
                                                   >> 294 
                                                   >> 295   // Clear visible window of current view (both buffers of a double
                                                   >> 296   // buffered system).
944                                                   297 
945 void G4VisManager::EndDraw ()                  << 
946 {                                              << 
947   if (G4Threading::IsWorkerThread()) return;   << 
948                                                << 
949   fDrawGroupNestingDepth--;                    << 
950   if (fDrawGroupNestingDepth != 0) {           << 
951     if (fDrawGroupNestingDepth < 0) fDrawGroup << 
952     return;                                    << 
953   }                                            << 
954   if (IsValidView ()) {                           298   if (IsValidView ()) {
955     fpSceneHandler -> EndPrimitives ();        << 299 
                                                   >> 300     fpViewer -> ClearView ();
                                                   >> 301     // Clears current buffer, i.e., back buffer in case of double
                                                   >> 302     // buffered system.
                                                   >> 303 
                                                   >> 304     fpViewer -> FinishView ();
                                                   >> 305     // Swaps buffers of double buffered systems.
                                                   >> 306 
                                                   >> 307     fpViewer -> ClearView ();
                                                   >> 308     // Clears the swapped buffer.
956   }                                               309   }
957   fIsDrawGroup = false;                        << 
958 }                                                 310 }
959                                                   311 
960 void G4VisManager::BeginDraw2D (const G4Transf << 312 void G4VisManager::Draw () {
961 {                                              << 
962   if (G4Threading::IsWorkerThread()) return;   << 
963                                                << 
964   fDrawGroupNestingDepth++;                    << 
965   if (fDrawGroupNestingDepth > 1) {            << 
966     G4Exception                                << 
967       ("G4VisManager::BeginDraw2D",            << 
968        "visman0009", JustWarning,              << 
969        "Nesting detected. It is illegal to nes << 
970        "\n Ignored");                          << 
971     return;                                    << 
972   }                                            << 
973   if (IsValidView ()) {                           313   if (IsValidView ()) {
974     ClearTransientStoreIfMarked();             << 314     fpViewer -> SetViewParameters (fVP);
975     fpSceneHandler -> BeginPrimitives2D (objec << 315     fpViewer -> DrawView ();
976     fIsDrawGroup = true;                       << 
977   }                                               316   }
978 }                                                 317 }
979                                                   318 
980 void G4VisManager::EndDraw2D ()                << 319 void G4VisManager::Show () {
981 {                                              << 
982   if (G4Threading::IsWorkerThread()) return;   << 
983                                                << 
984   fDrawGroupNestingDepth--;                    << 
985   if (fDrawGroupNestingDepth != 0) {           << 
986     if (fDrawGroupNestingDepth < 0) fDrawGroup << 
987     return;                                    << 
988   }                                            << 
989   if (IsValidView ()) {                           320   if (IsValidView ()) {
990     fpSceneHandler -> EndPrimitives2D ();      << 321      fpViewer -> ShowView ();
991   }                                               322   }
992   fIsDrawGroup = false;                        << 
993 }                                                 323 }
994                                                   324 
995 template <class T> void G4VisManager::DrawT    << 325 void G4VisManager::Draw (const G4Polyline& line,
996 (const T& graphics_primitive, const G4Transfor << 326        const G4Transform3D& objectTransform) {
997   if (G4Threading::IsWorkerThread()) return;   << 327   if (IsValidView ()) {
998                                                << 328     G4ModelingParameters* pMP = fpSceneHandler -> CreateModelingParameters ();
999   if (fIsDrawGroup) {                          << 329     G4VModel* pModel = new G4NullModel (pMP);
1000     if (objectTransform != fpSceneHandler->Ge << 330     fpSceneHandler -> SetModel (pModel);
1001       G4Exception                             << 331     fpSceneHandler -> BeginPrimitives (objectTransform);
1002   ("G4VSceneHandler::DrawT",                  << 332     fpSceneHandler -> AddPrimitive (line);
1003    "visman0010", FatalException,              << 333     fpSceneHandler -> EndPrimitives ();
1004    "Different transform detected in Begin/End << 334     fpSceneHandler -> SetModel (0);
1005     }                                         << 335     delete pModel;
1006     fpSceneHandler -> AddPrimitive (graphics_ << 336     delete pMP;
1007   } else {                                    << 
1008     if (IsValidView ()) {                     << 
1009       ClearTransientStoreIfMarked();          << 
1010       fpSceneHandler -> BeginPrimitives (obje << 
1011       fpSceneHandler -> AddPrimitive (graphic << 
1012       fpSceneHandler -> EndPrimitives ();     << 
1013     }                                         << 
1014   }                                              337   }
1015 }                                                338 }
1016                                                  339 
1017 template <class T> void G4VisManager::DrawT2D << 340 void G4VisManager::Draw (const G4Text& text,
1018 (const T& graphics_primitive, const G4Transfo << 341        const G4Transform3D& objectTransform) {
1019   if (G4Threading::IsWorkerThread()) return;  << 342   if (IsValidView ()) {
1020                                               << 343     G4ModelingParameters* pMP = fpSceneHandler -> CreateModelingParameters ();
1021   if (fIsDrawGroup) {                         << 344     G4VModel* pModel = new G4NullModel (pMP);
1022     if (objectTransform != fpSceneHandler->Ge << 345     fpSceneHandler -> SetModel (pModel);
1023       G4Exception                             << 346     fpSceneHandler -> BeginPrimitives (objectTransform);
1024   ("G4VSceneHandler::DrawT",                  << 347     fpSceneHandler -> AddPrimitive (text);
1025    "visman0011", FatalException,              << 348     fpSceneHandler -> EndPrimitives ();
1026    "Different transform detected in Begin/End << 349     fpSceneHandler -> SetModel (0);
1027     }                                         << 350     delete pModel;
1028     fpSceneHandler -> AddPrimitive (graphics_ << 351     delete pMP;
1029   } else {                                    << 
1030     if (IsValidView ()) {                     << 
1031       ClearTransientStoreIfMarked();          << 
1032       fpSceneHandler -> BeginPrimitives2D (ob << 
1033       fpSceneHandler -> AddPrimitive (graphic << 
1034       fpSceneHandler -> EndPrimitives2D ();   << 
1035     }                                         << 
1036   }                                              352   }
1037 }                                                353 }
1038                                                  354 
1039 void G4VisManager::Draw (const G4Circle& circ    355 void G4VisManager::Draw (const G4Circle& circle,
1040        const G4Transform3D& objectTransform)  << 356        const G4Transform3D& objectTransform) {
1041 {                                             << 357   if (IsValidView ()) {
1042   DrawT (circle, objectTransform);            << 358     G4ModelingParameters* pMP = fpSceneHandler -> CreateModelingParameters ();
1043 }                                             << 359     G4VModel* pModel = new G4NullModel (pMP);
1044                                               << 360     fpSceneHandler -> SetModel (pModel);
1045 void G4VisManager::Draw (const G4Polyhedron&  << 361     fpSceneHandler -> BeginPrimitives (objectTransform);
1046        const G4Transform3D& objectTransform)  << 362     fpSceneHandler -> AddPrimitive (circle);
1047 {                                             << 363     fpSceneHandler -> EndPrimitives ();
1048   DrawT (polyhedron, objectTransform);        << 364     fpSceneHandler -> SetModel (0);
                                                   >> 365     delete pModel;
                                                   >> 366     delete pMP;
                                                   >> 367   }
1049 }                                                368 }
1050                                                  369 
1051 void G4VisManager::Draw (const G4Polyline& li << 370 void G4VisManager::Draw (const G4Square& Square,
1052        const G4Transform3D& objectTransform)  << 371        const G4Transform3D& objectTransform) {
1053 {                                             << 372   if (IsValidView ()) {
1054   DrawT (line, objectTransform);              << 373     G4ModelingParameters* pMP = fpSceneHandler -> CreateModelingParameters ();
                                                   >> 374     G4VModel* pModel = new G4NullModel (pMP);
                                                   >> 375     fpSceneHandler -> SetModel (pModel);
                                                   >> 376     fpSceneHandler -> BeginPrimitives (objectTransform);
                                                   >> 377     fpSceneHandler -> AddPrimitive (Square);
                                                   >> 378     fpSceneHandler -> EndPrimitives ();
                                                   >> 379     fpSceneHandler -> SetModel (0);
                                                   >> 380     delete pModel;
                                                   >> 381     delete pMP;
                                                   >> 382   }
1055 }                                                383 }
1056                                                  384 
1057 void G4VisManager::Draw (const G4Polymarker&     385 void G4VisManager::Draw (const G4Polymarker& polymarker,
1058        const G4Transform3D& objectTransform)  << 386        const G4Transform3D& objectTransform) {
1059 {                                             << 387   if (IsValidView ()) {
1060   DrawT (polymarker, objectTransform);        << 388     G4ModelingParameters* pMP = fpSceneHandler -> CreateModelingParameters ();
1061 }                                             << 389     G4VModel* pModel = new G4NullModel (pMP);
1062                                               << 390     fpSceneHandler -> SetModel (pModel);
1063 void G4VisManager::Draw (const G4Square& squa << 391     fpSceneHandler -> BeginPrimitives (objectTransform);
1064        const G4Transform3D& objectTransform)  << 392     fpSceneHandler -> AddPrimitive (polymarker);
1065 {                                             << 393     fpSceneHandler -> EndPrimitives ();
1066   DrawT (square, objectTransform);            << 394     fpSceneHandler -> SetModel (0);
1067 }                                             << 395     delete pModel;
1068                                               << 396     delete pMP;
1069 void G4VisManager::Draw (const G4Text& text,  << 397   }
1070        const G4Transform3D& objectTransform)  << 
1071 {                                             << 
1072   DrawT (text, objectTransform);              << 
1073 }                                             << 
1074                                               << 
1075 void G4VisManager::Draw2D (const G4Circle& ci << 
1076          const G4Transform3D& objectTransform << 
1077 {                                             << 
1078   DrawT2D (circle, objectTransform);          << 
1079 }                                             << 
1080                                               << 
1081 void G4VisManager::Draw2D (const G4Polyhedron << 
1082          const G4Transform3D& objectTransform << 
1083 {                                             << 
1084   DrawT2D (polyhedron, objectTransform);      << 
1085 }                                             << 
1086                                               << 
1087 void G4VisManager::Draw2D (const G4Polyline&  << 
1088          const G4Transform3D& objectTransform << 
1089 {                                             << 
1090   DrawT2D (line, objectTransform);            << 
1091 }                                             << 
1092                                               << 
1093 void G4VisManager::Draw2D (const G4Polymarker << 
1094          const G4Transform3D& objectTransform << 
1095 {                                             << 
1096   DrawT2D (polymarker, objectTransform);      << 
1097 }                                             << 
1098                                               << 
1099 void G4VisManager::Draw2D (const G4Square& sq << 
1100          const G4Transform3D& objectTransform << 
1101 {                                             << 
1102   DrawT2D (square, objectTransform);          << 
1103 }                                             << 
1104                                               << 
1105 void G4VisManager::Draw2D (const G4Text& text << 
1106          const G4Transform3D& objectTransform << 
1107 {                                             << 
1108   DrawT2D (text, objectTransform);            << 
1109 }                                                398 }
1110                                                  399 
1111 void G4VisManager::Draw (const G4VHit& hit) { << 400 void G4VisManager::Draw (const G4Polyhedron& polyhedron,
1112   if (G4Threading::IsWorkerThread()) return;  << 401        const G4Transform3D& objectTransform) {
1113                                               << 402   if (IsValidView ()) {
1114   if (fIsDrawGroup) {                         << 403     G4ModelingParameters* pMP = fpSceneHandler -> CreateModelingParameters ();
1115     fpSceneHandler -> AddCompound (hit);      << 404     G4VModel* pModel = new G4NullModel (pMP);
1116   } else {                                    << 405     fpSceneHandler -> SetModel (pModel);
1117     if (IsValidView ()) {                     << 406     fpSceneHandler -> BeginPrimitives (objectTransform);
1118       ClearTransientStoreIfMarked();          << 407     fpSceneHandler -> AddPrimitive (polyhedron);
1119       fpSceneHandler -> AddCompound (hit);    << 408     fpSceneHandler -> EndPrimitives ();
1120     }                                         << 409     fpSceneHandler -> SetModel (0);
                                                   >> 410     delete pModel;
                                                   >> 411     delete pMP;
1121   }                                              412   }
1122 }                                                413 }
1123                                                  414 
1124 void G4VisManager::Draw (const G4VDigi& digi) << 415 void G4VisManager::Draw (const G4NURBS& nurbs,
1125   if (G4Threading::IsWorkerThread()) return;  << 416        const G4Transform3D& objectTransform) {
1126                                               << 417   if (IsValidView ()) {
1127   if (fIsDrawGroup) {                         << 418     G4ModelingParameters* pMP = fpSceneHandler -> CreateModelingParameters ();
1128     fpSceneHandler -> AddCompound (digi);     << 419     G4VModel* pModel = new G4NullModel (pMP);
1129   } else {                                    << 420     fpSceneHandler -> SetModel (pModel);
1130     if (IsValidView ()) {                     << 421     fpSceneHandler -> BeginPrimitives (objectTransform);
1131       ClearTransientStoreIfMarked();          << 422     fpSceneHandler -> AddPrimitive (nurbs);
1132       fpSceneHandler -> AddCompound (digi);   << 423     fpSceneHandler -> EndPrimitives ();
1133     }                                         << 424     fpSceneHandler -> SetModel (0);
                                                   >> 425     delete pModel;
                                                   >> 426     delete pMP;
1134   }                                              427   }
1135 }                                                428 }
1136                                                  429 
1137 void G4VisManager::Draw (const G4VTrajectory& << 430 void G4VisManager::Draw (const G4VSolid& solid,
1138   if (G4Threading::IsWorkerThread()) return;  << 431        const G4VisAttributes& attribs,
1139                                               << 432        const G4Transform3D& objectTransform) {
1140   // A trajectory needs a trajectories model  << 433   if (IsValidView ()) {
1141   static G4TrajectoriesModel trajectoriesMode << 434     G4ModelingParameters* pMP = fpSceneHandler -> CreateModelingParameters ();
1142   trajectoriesModel.SetCurrentTrajectory(&tra << 435     G4VModel* pModel = new G4NullModel (pMP);
1143   G4RunManager* runManager = G4RunManagerFact << 436     fpSceneHandler -> SetModel (pModel);
1144   const G4Run* currentRun  = runManager->GetC << 437     fpSceneHandler -> PreAddThis (objectTransform, attribs);
1145   if (currentRun) {                           << 438     solid.DescribeYourselfTo (*fpSceneHandler);
1146     trajectoriesModel.SetRunID(currentRun->Ge << 439     fpSceneHandler -> PostAddThis ();
1147   }                                           << 
1148   const G4Event* currentEvent =               << 
1149   G4EventManager::GetEventManager()->GetConst << 
1150   if (currentEvent) {                         << 
1151     trajectoriesModel.SetEventID(currentEvent << 
1152   }                                           << 
1153   if (fIsDrawGroup) {                         << 
1154     fpSceneHandler -> SetModel (&trajectories << 
1155     fpSceneHandler -> AddCompound (traj);     << 
1156     fpSceneHandler -> SetModel (0);              440     fpSceneHandler -> SetModel (0);
1157   } else {                                    << 441     delete pModel;
1158     if (IsValidView ()) {                     << 442     delete pMP;
1159       ClearTransientStoreIfMarked();          << 
1160       fpSceneHandler -> SetModel (&trajectori << 
1161       fpSceneHandler -> AddCompound (traj);   << 
1162       fpSceneHandler -> SetModel (0);         << 
1163     }                                         << 
1164   }                                              443   }
1165 }                                                444 }
1166                                                  445 
1167 void G4VisManager::Draw (const G4LogicalVolum    446 void G4VisManager::Draw (const G4LogicalVolume& logicalVol,
1168        const G4VisAttributes& attribs,           447        const G4VisAttributes& attribs,
1169        const G4Transform3D& objectTransform)     448        const G4Transform3D& objectTransform) {
1170   if (G4Threading::IsWorkerThread()) return;  << 
1171                                               << 
1172   // Find corresponding solid.                   449   // Find corresponding solid.
1173   G4VSolid* pSol = logicalVol.GetSolid ();       450   G4VSolid* pSol = logicalVol.GetSolid ();
1174   Draw (*pSol, attribs, objectTransform);        451   Draw (*pSol, attribs, objectTransform);
1175 }                                                452 }
1176                                                  453 
1177 void G4VisManager::Draw (const G4VSolid& soli << 
1178        const G4VisAttributes& attribs,        << 
1179        const G4Transform3D& objectTransform)  << 
1180   if (G4Threading::IsWorkerThread()) return;  << 
1181                                               << 
1182   if (fIsDrawGroup) {                         << 
1183     fpSceneHandler -> PreAddSolid (objectTran << 
1184     solid.DescribeYourselfTo (*fpSceneHandler << 
1185     fpSceneHandler -> PostAddSolid ();        << 
1186   } else {                                    << 
1187     if (IsValidView ()) {                     << 
1188       ClearTransientStoreIfMarked();          << 
1189       fpSceneHandler -> PreAddSolid (objectTr << 
1190       solid.DescribeYourselfTo (*fpSceneHandl << 
1191       fpSceneHandler -> PostAddSolid ();      << 
1192     }                                         << 
1193   }                                           << 
1194 }                                             << 
1195                                               << 
1196 void G4VisManager::Draw (const G4VPhysicalVol    454 void G4VisManager::Draw (const G4VPhysicalVolume& physicalVol,
1197        const G4VisAttributes& attribs,           455        const G4VisAttributes& attribs,
1198        const G4Transform3D& objectTransform)     456        const G4Transform3D& objectTransform) {
1199   if (G4Threading::IsWorkerThread()) return;  << 
1200                                               << 
1201   // Note: It is tempting to use a temporary  << 
1202   // trajectories, in order to get at the G4A << 
1203   // volume.  I tried it (JA).  But it's not  << 
1204   // vis attributes.  Also other aspects of t << 
1205   // be properly set up.  So, the idea has be << 
1206   // being.  The model pointer will be null.  << 
1207   // will be no G4Atts from this physical vol << 
1208   //                                          << 
1209   // If this is called from DrawHit, for exam << 
1210   // hit and these will be available with "/v << 
1211   //                                          << 
1212   // Find corresponding logical volume and so    457   // Find corresponding logical volume and solid.
1213   G4LogicalVolume* pLV  = physicalVol.GetLogi    458   G4LogicalVolume* pLV  = physicalVol.GetLogicalVolume ();
1214   G4VSolid*        pSol = pLV -> GetSolid ();    459   G4VSolid*        pSol = pLV -> GetSolid ();
1215   Draw (*pSol, attribs, objectTransform);        460   Draw (*pSol, attribs, objectTransform);
1216 }                                                461 }
1217                                                  462 
1218 void G4VisManager::DrawGeometry               << 463 void G4VisManager::CreateSceneHandler (G4String name) {
1219 (G4VPhysicalVolume* v, const G4Transform3D& t << 
1220 // Draws a geometry tree starting at the spec << 
1221 {                                             << 
1222   auto modelingParameters = fpSceneHandler->C << 
1223   auto depth = G4PhysicalVolumeModel::UNLIMIT << 
1224   const G4bool useFullExtent = true;          << 
1225   G4PhysicalVolumeModel aPVModel(v,depth,t,mo << 
1226   aPVModel.DescribeYourselfTo(*fpSceneHandler << 
1227   delete modelingParameters;                  << 
1228 }                                             << 
1229                                               << 
1230 void G4VisManager::CreateSceneHandler (const  << 
1231   if (!fInitialised) Initialise ();              464   if (!fInitialised) Initialise ();
1232   if (fpGraphicsSystem) {                        465   if (fpGraphicsSystem) {
1233     G4VSceneHandler* pSceneHandler =             466     G4VSceneHandler* pSceneHandler =
1234       fpGraphicsSystem -> CreateSceneHandler     467       fpGraphicsSystem -> CreateSceneHandler (name);
                                                   >> 468     G4VViewer* pViewer;
1235     if (pSceneHandler) {                         469     if (pSceneHandler) {
1236       fAvailableSceneHandlers.push_back (pSce    470       fAvailableSceneHandlers.push_back (pSceneHandler);
1237       fpSceneHandler = pSceneHandler;            471       fpSceneHandler = pSceneHandler;                         // Make current.
1238     }                                            472     }
1239     else {                                       473     else {
1240       if (fVerbosity >= errors) {             << 474       G4cout << "Error in G4VisManager::CreateSceneHandler during "
1241   G4warn << "ERROR in G4VisManager::CreateSce << 475        << fpGraphicsSystem -> GetName ()
1242          << fpGraphicsSystem -> GetName ()    << 476        << " scene creation.\n  No action taken."
1243          << " scene handler creation.\n  No a << 477        << G4endl;
1244          << G4endl;                           << 
1245       }                                       << 
1246     }                                            478     }
1247   }                                              479   }
1248   else PrintInvalidPointers ();                  480   else PrintInvalidPointers ();
1249 }                                                481 }
1250                                                  482 
1251 void G4VisManager::CreateViewer               << 483 void G4VisManager::CreateViewer (G4String name) {
1252 (const G4String& name, const G4String& XGeome << 
1253 {                                             << 
1254                                                  484 
1255   if (!fInitialised) Initialise ();              485   if (!fInitialised) Initialise ();
1256                                                  486 
1257   if (!fpSceneHandler) {                      << 487   if (fpSceneHandler) {
1258     PrintInvalidPointers ();                  << 488     G4VViewer* p = fpGraphicsSystem -> CreateViewer (*fpSceneHandler, name);
1259     return;                                   << 489     if (p) {
1260   }                                           << 490       fpViewer = p;                             // Make current.
1261                                               << 491       fpSceneHandler -> AddViewerToList (fpViewer);
1262   G4VViewer* p = fpGraphicsSystem -> CreateVi << 492       fpSceneHandler -> SetCurrentViewer (fpViewer);
1263                                               << 493       // Make it possible for user action code to Draw.
1264   if (!p) {                                   << 494       fpConcreteInstance = this;
1265     if (fVerbosity >= errors) {               << 495 
1266       G4warn << "ERROR in G4VisManager::Creat << 496       G4bool warnings = false;
1267        << fpGraphicsSystem -> GetName ()      << 497       if (fVP.IsCulling () && fVP.IsCullingInvisible ()) {
1268        << " viewer creation.\n  No action tak << 498   warnings = true;
                                                   >> 499   G4cout << "G4VisManager::CreateViewer: new viewer created:";
                                                   >> 500   if (fVerbose > 0) {
                                                   >> 501     G4cout << " view parameters are:\n  " << fVP;
                                                   >> 502   }
                                                   >> 503   G4cout <<
                                                   >> 504     "\n  NOTE: objects with visibility flag set to \"false\""
                                                   >> 505     " will not be drawn!"
                                                   >> 506     "\n  \"/vis/set/culling off\" to Draw such objects.";
                                                   >> 507       }
                                                   >> 508       if (fVP.IsCullingCovered ()) {
                                                   >> 509   if (!warnings) {
                                                   >> 510     G4cout << "G4VisManager::CreateViewer: new viewer created:";
                                                   >> 511   }
                                                   >> 512   warnings = true;
                                                   >> 513   G4cout <<
                                                   >> 514     "\n  ALSO: covered objects in solid mode will not be part of"
                                                   >> 515     " the scene!"
                                                   >> 516     "\n  \"/vis/set/cull_covered_daughters off\" to reverse this.";
                                                   >> 517       }
                                                   >> 518       if (warnings) {
                                                   >> 519   G4cout << "\n  Also see other \"/vis/set\" commands."
1269        << G4endl;                                520        << G4endl;
                                                   >> 521       }
1270     }                                            522     }
1271     return;                                   << 523     else {
1272   }                                           << 524       G4cout << "Error in G4VisManager::CreateViewer during "
1273                                               << 
1274   if (p -> GetViewId() < 0) {                 << 
1275     if (fVerbosity >= errors) {               << 
1276       G4warn << "ERROR in G4VisManager::Creat << 
1277        << fpGraphicsSystem -> GetName ()         525        << fpGraphicsSystem -> GetName ()
1278        << " viewer instantiation.\n  No actio << 526        << " viewer creation.\n  No action taken."
1279        << G4endl;                                527        << G4endl;
1280     }                                            528     }
1281     return;                                   << 
1282   }                                              529   }
                                                   >> 530   else PrintInvalidPointers ();
                                                   >> 531 }
1283                                                  532 
1284   // Viewer is created, now we can set geomet << 533 void G4VisManager::DeleteCurrentSceneHandler () {
1285   // Before 12/2008, it was done in G4VViewer << 534   G4cout << "G4VisManager::DeleteCurrentSceneHandler: scene handler \""
1286                                               << 535    << fpSceneHandler -> GetName ()
1287   G4ViewParameters initialvp = p -> GetViewPa << 536    << "\"\n  and its viewer(s) are being deleted.";
1288   initialvp.SetXGeometryString(XGeometry); // << 537   if(fpSceneHandler) {
1289   p -> SetViewParameters(initialvp);          << 538     fAvailableSceneHandlers.remove (fpSceneHandler);
1290   p -> Initialise ();  // (Viewer itself may  << 539     delete fpSceneHandler;
1291   if (p -> GetViewId() < 0) {                 << 540   }
1292     if (fVerbosity >= errors) {               << 541   const G4SceneHandlerList& sceneHandlerList = fAvailableSceneHandlers;
1293       G4warn << "ERROR in G4VisManager::Creat << 542   G4int nSH = sceneHandlerList.size ();
1294        << fpGraphicsSystem -> GetName ()      << 543   G4int iSH;
1295        << " viewer initialisation.\n  No acti << 544   for (iSH = 0; iSH < nSH; iSH++) {
1296        << G4endl;                             << 545     if (sceneHandlerList [iSH] -> GetViewerList ().size ()) break;
1297     }                                         << 546   }
1298     return;                                   << 547   if (iSH < nSH) {
                                                   >> 548     fpSceneHandler = sceneHandlerList [iSH];
                                                   >> 549     G4cout << "\n  scene handler is now \""
                                                   >> 550      << fpSceneHandler -> GetName ();
                                                   >> 551     fpViewer = fpSceneHandler -> GetViewerList () [0];
                                                   >> 552     G4cout << "\"\n  and viewer now \""
                                                   >> 553      << fpViewer -> GetName ()
                                                   >> 554      << ".";
                                                   >> 555     IsValidView ();  // Check.
                                                   >> 556   }
                                                   >> 557   else if (nSH) {
                                                   >> 558     fpSceneHandler = fAvailableSceneHandlers [0];
                                                   >> 559     G4cout << "\n  scene handler is now \""
                                                   >> 560      << fpSceneHandler -> GetName ();
                                                   >> 561     fpViewer = 0;
                                                   >> 562     // Make it impossible for user action code to Draw.
                                                   >> 563     fpConcreteInstance = 0;
                                                   >> 564     G4cout << "\" but it has no viewers -\n  please create one.";
1299   }                                              565   }
1300                                               << 566   else {
1301   fpViewer = p;                             / << 567     fpSceneHandler = 0;
1302   fpSceneHandler -> AddViewerToList (fpViewer << 568     fpViewer  = 0;
1303   fpSceneHandler -> SetCurrentViewer (fpViewe << 569     // Make it impossible for user action code to Draw.
1304   if (fVerbosity >= confirmations) {          << 570     fpConcreteInstance = 0;
1305     G4cout << "G4VisManager::CreateViewer: ne << 571     G4cout <<
1306      << G4endl;                               << 572       "\n  There are now no scene handlers left.  /vis/sceneHandler/select"
                                                   >> 573       "\n  to select a scene handler and /vis/viewer/select to select"
                                                   >> 574       "\n  a viewer, or maybe you will have to create some.";
1307   }                                              575   }
                                                   >> 576   G4cout << G4endl;
                                                   >> 577 }
1308                                                  578 
1309   const G4ViewParameters& vp = fpViewer->GetV << 579 void G4VisManager::DeleteCurrentViewer () {
1310   if (fVerbosity >= parameters) {             << 580   G4cout << "G4VisManager::DeleteCurrentViewer: viewer \""
1311     G4cout << " view parameters are:\n  " <<  << 581    << fpViewer -> GetName () 
                                                   >> 582    << "\" being deleted.";
                                                   >> 583   if (fpViewer ) {
                                                   >> 584     fpViewer -> GetSceneHandler () -> RemoveViewerFromList (fpViewer);
                                                   >> 585     delete fpViewer;
1312   }                                              586   }
1313                                               << 587   const G4ViewerList& viewerList = fpSceneHandler -> GetViewerList ();
1314   if (vp.IsCulling () && vp.IsCullingInvisibl << 588   if (viewerList.size () > 0) {
1315     static G4bool warned = false;             << 589     fpViewer = viewerList [0];
1316     if (fVerbosity >= confirmations) {        << 590     fpSceneHandler -> SetCurrentViewer (fpViewer);
1317       if (!warned) {                          << 591     if (IsValidView ()) {
1318   G4cout <<                                   << 592       G4cout << "\n  viewer is now \""
1319   "NOTE: objects with visibility flag set to  << 593        << fpViewer -> GetName ()
1320   " will not be drawn!"                       << 594        << "\".";
1321   "\n  \"/vis/viewer/set/culling global false << 
1322   "\n  Also see other \"/vis/viewer/set\" com << 
1323          << G4endl;                           << 
1324   warned = true;                              << 
1325       }                                       << 
1326     }                                            595     }
1327   }                                              596   }
1328   if (vp.IsCullingCovered ()) {               << 597   else {
1329     static G4bool warned = false;             << 598     fpViewer = 0;
1330     if (fVerbosity >= warnings) {             << 599     fpSceneHandler -> SetCurrentViewer (0);
1331       if (!warned) {                          << 600     // Make it impossible for user action code to Draw.
1332   G4warn <<                                   << 601     fpConcreteInstance = 0;
1333   "WARNING: covered objects in solid mode wil << 602     G4cout <<
1334   "\n  \"/vis/viewer/set/culling coveredDaugh << 603       "\n  There are now no viewers left for this scene handler."
1335   "\n  Also see other \"/vis/viewer/set\" com << 604       "\n  /vis/sceneHandler/select to select a different scene handler"
1336          << G4endl;                           << 605       "\n  and /vis/viewer/select to select a viewer, or maybe you will"
1337   warned = true;                              << 606       "\n  have to create some.";
1338       }                                       << 
1339     }                                         << 
1340   }                                              607   }
                                                   >> 608   G4cout << G4endl;
1341 }                                                609 }
1342                                                  610 
1343 void G4VisManager::GeometryHasChanged () {       611 void G4VisManager::GeometryHasChanged () {
1344   if (fVerbosity >= confirmations) {          << 612   G4cout << "G4VisManager::GeometryHasChanged() called." << G4endl;
1345     G4cout << "G4VisManager::GeometryHasChang << 
1346   }                                           << 
1347                                                  613 
1348   // Change the world...                         614   // Change the world...
1349   G4VPhysicalVolume* pWorld =                    615   G4VPhysicalVolume* pWorld =
1350     G4TransportationManager::GetTransportatio    616     G4TransportationManager::GetTransportationManager ()
1351     -> GetNavigatorForTracking () -> GetWorld    617     -> GetNavigatorForTracking () -> GetWorldVolume ();
1352   if (!pWorld) {                                 618   if (!pWorld) {
1353     if (fVerbosity >= warnings) {             << 619     G4cout << "  The world has ended!!!  (Is this serious?)" << G4endl;
1354       G4warn << "WARNING: There is no world v << 
1355     }                                         << 
1356   }                                              620   }
1357                                                  621 
1358   // Check scenes.                               622   // Check scenes.
1359   G4SceneList& sceneList = fSceneList;           623   G4SceneList& sceneList = fSceneList;
1360   std::size_t iScene, nScenes = sceneList.siz << 624   G4int iScene, nScenes = sceneList.size ();
1361   for (iScene = 0; iScene < nScenes; ++iScene << 625   for (iScene = 0; iScene < nScenes; iScene++) {
1362     G4Scene* pScene = sceneList [iScene];        626     G4Scene* pScene = sceneList [iScene];
1363     std::vector<G4Scene::Model>& modelList =  << 627     G4std::vector<G4VModel*>& modelList = pScene -> SetRunDurationModelList ();
1364     if (modelList.size ()) {                  << 
1365       G4bool modelInvalid;                    << 
1366       do {  // Remove, if required, one at a  << 
1367   modelInvalid = false;                       << 
1368   std::vector<G4Scene::Model>::iterator iterM << 
1369   for (iterModel = modelList.begin();         << 
1370        iterModel != modelList.end();          << 
1371        ++iterModel) {                         << 
1372     modelInvalid = !(iterModel->fpModel->Vali << 
1373     if (modelInvalid) {                       << 
1374       // Model invalid - remove and break.    << 
1375       if (fVerbosity >= warnings) {           << 
1376         G4warn << "WARNING: Model \""         << 
1377          << iterModel->fpModel->GetGlobalDesc << 
1378          <<                                   << 
1379     "\" is no longer valid - being removed\n  << 
1380          << pScene -> GetName () << "\""      << 
1381          << G4endl;                           << 
1382       }                                       << 
1383       modelList.erase (iterModel);            << 
1384       break;                                  << 
1385     }                                         << 
1386   }                                           << 
1387       } while (modelInvalid);                 << 
1388                                                  628 
1389       if (modelList.size () == 0) {           << 629     G4bool modelInvalid;
1390   if (fVerbosity >= warnings) {               << 630     do {  // Remove, if required, one at a time.
1391     G4warn << "WARNING: No run-duration model << 631       modelInvalid = false;
1392      << pScene -> GetName ()                  << 632       G4std::vector<G4VModel*>::iterator iterModel;
1393      << "\"."                                 << 633       for (iterModel = modelList.begin();
                                                   >> 634      iterModel != modelList.end();
                                                   >> 635      ++iterModel) {
                                                   >> 636   if (modelInvalid = !((*iterModel) -> Validate ())) {
                                                   >> 637     // Model invalid - remove and break.
                                                   >> 638     G4cout << "  Model \""
                                                   >> 639      << (*iterModel) -> GetGlobalDescription ()
                                                   >> 640      <<
                                                   >> 641       "\" is no longer valid - being removed\n  from scene \""
                                                   >> 642      << pScene -> GetName () << "\""
1394      << G4endl;                                  643      << G4endl;
                                                   >> 644     modelList.erase (iterModel);
                                                   >> 645       break;
1395   }                                              646   }
1396         if (pWorld) {                         << 
1397           if (fVerbosity >= warnings) {       << 
1398             G4warn << "  Adding current world << 
1399             << pScene -> GetName ()           << 
1400             << "\"."                          << 
1401             << G4endl;                        << 
1402           }                                   << 
1403           pScene->AddRunDurationModel(new G4P << 
1404           // (The above includes a re-calcula << 
1405           G4UImanager::GetUIpointer () ->     << 
1406           ApplyCommand (G4String("/vis/scene/ << 
1407         }                                     << 
1408       }                                       << 
1409       else {                                  << 
1410   pScene->CalculateExtent();  // Recalculate  << 
1411   G4UImanager::GetUIpointer () ->             << 
1412     ApplyCommand (G4String("/vis/scene/notify << 
1413       }                                       << 
1414     }                                         << 
1415   }                                           << 
1416                                               << 
1417   // Check the manager's current scene...     << 
1418   if (fpScene && fpScene -> GetRunDurationMod << 
1419     if (fVerbosity >= warnings) {             << 
1420       G4warn << "WARNING: The current scene \ << 
1421        << fpScene -> GetName ()               << 
1422        << "\" has no run duration models."    << 
1423              << "\n  Use \"/vis/scene/add/vol << 
1424        << G4endl;                             << 
1425     }                                         << 
1426     // Clean up                               << 
1427     if (fpSceneHandler) {                     << 
1428       fpSceneHandler->ClearTransientStore();  << 
1429       fpSceneHandler->ClearStore();           << 
1430       if (fpViewer) {                         << 
1431         fpViewer->NeedKernelVisit();          << 
1432         fpViewer->SetView();                  << 
1433         fpViewer->ClearView();                << 
1434         fpViewer->FinishView();               << 
1435       }                                       << 
1436     }                                         << 
1437   }                                           << 
1438 }                                             << 
1439                                               << 
1440 void G4VisManager::NotifyHandlers () {        << 
1441                                               << 
1442   if (fVerbosity >= confirmations) {          << 
1443     G4cout << "G4VisManager::NotifyHandler()  << 
1444   }                                           << 
1445                                               << 
1446   if (IsValidView()) {                        << 
1447                                               << 
1448     // Check scenes.                          << 
1449     G4SceneList& sceneList = fSceneList;      << 
1450     std::size_t iScene, nScenes = sceneList.s << 
1451     for (iScene = 0; iScene < nScenes; ++iSce << 
1452       G4Scene* pScene = sceneList [iScene];   << 
1453       std::vector<G4Scene::Model>& modelList  << 
1454                                               << 
1455       if (modelList.size ()) {                << 
1456         pScene->CalculateExtent();            << 
1457         G4UImanager::GetUIpointer () ->       << 
1458         ApplyCommand (G4String("/vis/scene/no << 
1459       }                                          647       }
1460     }                                         << 648     } while (modelInvalid);
1461                                               << 
1462     // Check the manager's current scene...   << 
1463     if (fpScene && fpScene -> GetRunDurationM << 
1464       if (fVerbosity >= warnings) {           << 
1465         G4warn << "WARNING: The current scene << 
1466         << fpScene -> GetName ()              << 
1467         << "\" has no run duration models."   << 
1468         << "\n  Use \"/vis/scene/add/volume\" << 
1469         << G4endl;                            << 
1470       }                                       << 
1471       fpSceneHandler->ClearTransientStore();  << 
1472       fpSceneHandler->ClearStore();           << 
1473       fpViewer->NeedKernelVisit();            << 
1474       fpViewer->SetView();                    << 
1475       fpViewer->ClearView();                  << 
1476       fpViewer->FinishView();                 << 
1477     }                                         << 
1478   }                                           << 
1479 }                                             << 
1480                                               << 
1481 G4bool G4VisManager::FilterTrajectory(const G << 
1482 {                                             << 
1483   return fpTrajFilterMgr->Accept(trajectory); << 
1484 }                                             << 
1485                                               << 
1486 G4bool G4VisManager::FilterHit(const G4VHit&  << 
1487 {                                             << 
1488   return fpHitFilterMgr->Accept(hit);         << 
1489 }                                             << 
1490                                               << 
1491 G4bool G4VisManager::FilterDigi(const G4VDigi << 
1492 {                                             << 
1493   return fpDigiFilterMgr->Accept(digi);       << 
1494 }                                             << 
1495                                               << 
1496 void G4VisManager::DispatchToModel(const G4VT << 
1497 {                                             << 
1498   G4bool visible(true);                       << 
1499                                               << 
1500   // See if trajectory passes filter          << 
1501   G4bool passed = FilterTrajectory(trajectory << 
1502                                               << 
1503   if (!passed) {                              << 
1504     // Draw invisible trajectory if trajector << 
1505     // are filtering in soft mode             << 
1506     if (fpTrajFilterMgr->GetMode() == FilterM << 
1507     else {return;}                            << 
1508   }                                           << 
1509                                               << 
1510   // Go on to draw trajectory                 << 
1511   assert (0 != fpTrajDrawModelMgr);           << 
1512                                               << 
1513   const G4VTrajectoryModel* trajectoryModel = << 
1514                                               << 
1515   assert (0 != trajectoryModel); // Should ex << 
1516                                                  649 
1517   if (IsValidView()) {                        << 650     if (modelList.size () == 0) {
1518       trajectoryModel->Draw(trajectory, visib << 651       G4cout << "  No models left in this scene \""
1519   }                                           << 652        << pScene -> GetName ()
1520 }                                             << 653        << "\"."
1521                                               << 
1522 void G4VisManager::RegisterRunDurationUserVis << 
1523 (const G4String& name,                        << 
1524  G4VUserVisAction* pVisAction,                << 
1525  const G4VisExtent& extent) {                 << 
1526   fRunDurationUserVisActions.push_back(UserVi << 
1527   if (extent.GetExtentRadius() > 0.) {        << 
1528     fUserVisActionExtents[pVisAction] = exten << 
1529   } else {                                    << 
1530     if (fVerbosity >= warnings) {             << 
1531       G4warn <<                               << 
1532   "WARNING: No extent set for user vis action << 
1533        << G4endl;                                654        << G4endl;
1534     }                                            655     }
1535   }                                              656   }
1536   if (fVerbosity >= confirmations) {          << 
1537     G4cout                                    << 
1538     << "Run duration user vis action \"" << n << 
1539     << G4endl;                                << 
1540   }                                           << 
1541 }                                             << 
1542                                                  657 
1543 void G4VisManager::RegisterEndOfEventUserVisA << 658   // Check the manager's current scene...
1544 (const G4String& name,                        << 659   if (fpScene && fpScene -> GetRunDurationModelList ().size () == 0) {
1545  G4VUserVisAction* pVisAction,                << 660     G4cout << "  The current scene \""
1546  const G4VisExtent& extent) {                 << 661      << fpScene -> GetName ()
1547   fEndOfEventUserVisActions.push_back(UserVis << 662      << "\" has no models left."
1548   if (extent.GetExtentRadius() > 0.) {        << 663      << G4endl;
1549     fUserVisActionExtents[pVisAction] = exten << 664   }
1550   } else {                                    << 
1551     if (fVerbosity >= warnings) {             << 
1552       G4warn <<                               << 
1553   "WARNING: No extent set for user vis action << 
1554        << G4endl;                             << 
1555     }                                         << 
1556   }                                           << 
1557   if (fVerbosity >= confirmations) {          << 
1558     G4cout                                    << 
1559     << "End of event user vis action \"" << n << 
1560     << G4endl;                                << 
1561   }                                           << 
1562 }                                             << 
1563                                               << 
1564 void G4VisManager::RegisterEndOfRunUserVisAct << 
1565 (const G4String& name,                        << 
1566  G4VUserVisAction* pVisAction,                << 
1567  const G4VisExtent& extent) {                 << 
1568   fEndOfRunUserVisActions.push_back(UserVisAc << 
1569   if (extent.GetExtentRadius() > 0.) {        << 
1570     fUserVisActionExtents[pVisAction] = exten << 
1571   } else {                                    << 
1572     if (fVerbosity >= warnings) {             << 
1573       G4warn <<                               << 
1574   "WARNING: No extent set for user vis action << 
1575        << G4endl;                             << 
1576     }                                         << 
1577   }                                           << 
1578   if (fVerbosity >= confirmations) {          << 
1579     G4cout                                    << 
1580     << "End of run user vis action \"" << nam << 
1581     << G4endl;                                << 
1582   }                                           << 
1583 }                                                665 }
1584                                                  666 
1585 void G4VisManager::SetCurrentScene (G4Scene*  << 667 void G4VisManager::SetCurrentGraphicsSystemAndCreateViewer
1586   if (pScene != fpScene) {                    << 668 (G4VGraphicsSystem* pSystem) {
1587     // A change of scene.  Therefore reset tr << 669   // This is used only by the deprecated
1588     // memory of previous transient proceessi << 670   // /vis~/create_view/new_graphics_system command.  Hence the ad hoc
1589     ResetTransientsDrawnFlags();              << 671   // creation of "scene-vis~" below as a working solution while these
                                                   >> 672   // old commands exist.
                                                   >> 673   fpGraphicsSystem = pSystem;
                                                   >> 674   if (!fpScene) {
                                                   >> 675     fpScene = new G4Scene ("scene-vis~");
                                                   >> 676     fSceneList.push_back (fpScene);
                                                   >> 677     G4cout << "G4VisManager::SetCurrentGraphicsSystemAndCreateViewer:"
                                                   >> 678       "\n  Empty scene \"scene-vis~\" created."
                                                   >> 679      << G4endl;
1590   }                                              680   }
1591   fpScene = pScene;                           << 681   CreateSceneHandler ();
                                                   >> 682   CreateViewer ();
1592 }                                                683 }
1593                                                  684 
1594 void G4VisManager::SetCurrentGraphicsSystem (    685 void G4VisManager::SetCurrentGraphicsSystem (G4VGraphicsSystem* pSystem) {
1595   fpGraphicsSystem = pSystem;                    686   fpGraphicsSystem = pSystem;
1596   if (fVerbosity >= confirmations) {          << 687   G4cout << "G4VisManager::SetCurrentGraphicsSystem: system now "
1597     G4cout << "G4VisManager::SetCurrentGraphi << 688    << pSystem -> GetName ();
1598      << pSystem -> GetName () << G4endl;      << 
1599   }                                           << 
1600   // If current scene handler is of same grap    689   // If current scene handler is of same graphics system, leave unchanged.
1601   // Else find the most recent scene handler     690   // Else find the most recent scene handler of same graphics system.
1602   // Or clear pointers.                          691   // Or clear pointers.
1603   if (!(fpSceneHandler && fpSceneHandler -> G    692   if (!(fpSceneHandler && fpSceneHandler -> GetGraphicsSystem () == pSystem)) {
1604     const G4SceneHandlerList& sceneHandlerLis    693     const G4SceneHandlerList& sceneHandlerList = fAvailableSceneHandlers;
1605     G4int nSH = (G4int)sceneHandlerList.size  << 694     G4int nSH = sceneHandlerList.size ();  // No. of scene handlers.
1606     G4int iSH;                                   695     G4int iSH;
1607     for (iSH = nSH - 1; iSH >= 0; iSH--) {       696     for (iSH = nSH - 1; iSH >= 0; iSH--) {
1608       if (sceneHandlerList [iSH] -> GetGraphi    697       if (sceneHandlerList [iSH] -> GetGraphicsSystem () == pSystem) break;
1609     }                                            698     }
1610     if (iSH >= 0) {                              699     if (iSH >= 0) {
1611       fpSceneHandler = sceneHandlerList [iSH]    700       fpSceneHandler = sceneHandlerList [iSH];
1612       if (fVerbosity >= confirmations) {      << 701       G4cout << "\n  Scene Handler now "
1613   G4cout << "  Scene Handler now "            << 702        << fpSceneHandler -> GetName ();
1614          << fpSceneHandler -> GetName () << G << 
1615       }                                       << 
1616       if (fpScene != fpSceneHandler -> GetSce << 
1617   fpScene = fpSceneHandler -> GetScene ();    << 
1618   if (fVerbosity >= confirmations) {          << 
1619     G4cout << "  Scene now \""                << 
1620      << fpScene -> GetName () << "\"" << G4en << 
1621   }                                           << 
1622       }                                       << 
1623       const G4ViewerList& viewerList = fpScen    703       const G4ViewerList& viewerList = fpSceneHandler -> GetViewerList ();
1624       if (viewerList.size ()) {                  704       if (viewerList.size ()) {
1625   fpViewer = viewerList [0];                     705   fpViewer = viewerList [0];
1626   if (fVerbosity >= confirmations) {          << 706   G4cout << "\n  Viewer now " << fpViewer -> GetName ();
1627     G4cout << "  Viewer now " << fpViewer ->  << 
1628   }                                           << 
1629       }                                          707       }
1630       else {                                     708       else {
1631   fpViewer = 0;                                  709   fpViewer = 0;
                                                   >> 710   // Make it impossible for user action code to Draw.
                                                   >> 711   fpConcreteInstance = 0;
1632       }                                          712       }
1633     }                                            713     }
1634     else {                                       714     else {
1635       fpSceneHandler = 0;                        715       fpSceneHandler = 0;
1636       fpViewer = 0;                              716       fpViewer = 0;
                                                   >> 717       // Make it impossible for user action code to Draw.
                                                   >> 718       fpConcreteInstance = 0;
1637     }                                            719     }
1638   }                                              720   }
                                                   >> 721   G4cout << G4endl;
1639 }                                                722 }
1640                                                  723 
1641 void G4VisManager::SetCurrentSceneHandler (G4    724 void G4VisManager::SetCurrentSceneHandler (G4VSceneHandler* pSceneHandler) {
1642   fpSceneHandler = pSceneHandler;                725   fpSceneHandler = pSceneHandler;
1643   if (fVerbosity >= confirmations) {          << 726   G4cout << "G4VisManager::SetCurrentSceneHandler: scene handler now \""
1644     G4cout << "G4VisManager::SetCurrentSceneH << 727    << pSceneHandler -> GetName () << "\"";
1645      << pSceneHandler -> GetName () << "\"" < << 
1646   }                                           << 
1647   if (fpScene != fpSceneHandler -> GetScene ( << 
1648     fpScene = fpSceneHandler -> GetScene ();  << 
1649     if (fVerbosity >= confirmations) {        << 
1650       G4cout << "  Scene now \""              << 
1651        << fpScene -> GetName () << "\"" << G4 << 
1652     }                                         << 
1653   }                                           << 
1654   if (fpGraphicsSystem != pSceneHandler -> Ge    728   if (fpGraphicsSystem != pSceneHandler -> GetGraphicsSystem ()) {
1655     fpGraphicsSystem = pSceneHandler -> GetGr    729     fpGraphicsSystem = pSceneHandler -> GetGraphicsSystem ();
1656     if (fVerbosity >= confirmations) {        << 730     G4cout << "\n  graphics system now \""
1657       G4cout << "  Graphics system now \""    << 731      << fpGraphicsSystem -> GetName () << "\"";
1658        << fpGraphicsSystem -> GetName () << " << 
1659     }                                         << 
1660   }                                              732   }
1661   const G4ViewerList& viewerList = fpSceneHan    733   const G4ViewerList& viewerList = fpSceneHandler -> GetViewerList ();
1662   std::size_t nViewers = viewerList.size ();  << 734   G4int nViewers = viewerList.size ();
1663   if (nViewers) {                                735   if (nViewers) {
1664     std::size_t iViewer;                      << 736     G4int iViewer;
1665     for (iViewer = 0; iViewer < nViewers; ++i << 737     for (iViewer = 0; iViewer < nViewers; iViewer++) {
1666       if (fpViewer == viewerList [iViewer]) b    738       if (fpViewer == viewerList [iViewer]) break;
1667     }                                            739     }
1668     if (iViewer >= nViewers) {                   740     if (iViewer >= nViewers) {
1669       fpViewer = viewerList [0];                 741       fpViewer = viewerList [0];
1670       if (fVerbosity >= confirmations) {      << 742       G4cout << "\n  Viewer now \"" << fpViewer -> GetName () << "\"";
1671   G4cout << "  Viewer now \"" << fpViewer ->  << 
1672          << G4endl;                           << 
1673       }                                       << 
1674     }                                         << 
1675     if (!IsValidView ()) {                    << 
1676       if (fVerbosity >= warnings) {           << 
1677   G4warn <<                                   << 
1678   "WARNING: Problem setting scene handler - p << 
1679          << G4endl;                           << 
1680       }                                       << 
1681     }                                            743     }
                                                   >> 744     IsValidView ();  // Checks.
1682   }                                              745   }
1683   else {                                         746   else {
1684     fpViewer = 0;                                747     fpViewer = 0;
1685     if (fVerbosity >= warnings) {             << 748     // Make it impossible for user action code to Draw.
1686       G4warn <<                               << 749     fpConcreteInstance = 0;
1687   "WARNING: No viewers for this scene handler << 750     G4cout << "\n  No viewers for this scene handler - please create one.";
1688        << G4endl;                             << 
1689     }                                         << 
1690   }                                              751   }
                                                   >> 752   G4cout << G4endl; 
1691 }                                                753 }
1692                                                  754 
1693 void G4VisManager::SetCurrentViewer (G4VViewe    755 void G4VisManager::SetCurrentViewer (G4VViewer* pViewer) {
1694   fpViewer  = pViewer;                           756   fpViewer  = pViewer;
1695   if (fpViewer == nullptr) {                  << 757   G4cout << "G4VisManager::SetCurrentViewer: viewer now "
1696     if (fVerbosity >= confirmations) {        << 758    << pViewer -> GetName ()
1697       G4cout << "G4VisManager::SetCurrentView << 759    << G4endl;
1698       << G4endl;                              << 
1699     }                                         << 
1700     return;                                   << 
1701   }                                           << 
1702   if (fVerbosity >= confirmations) {          << 
1703     G4cout << "G4VisManager::SetCurrentViewer << 
1704      << pViewer -> GetName ()                 << 
1705      << G4endl;                               << 
1706   }                                           << 
1707   fpSceneHandler = fpViewer -> GetSceneHandle    760   fpSceneHandler = fpViewer -> GetSceneHandler ();
1708   if (!fpSceneHandler) {                      << 
1709     if (fVerbosity >= warnings) {             << 
1710       G4warn <<                               << 
1711       "WARNING: No scene handler for this vie << 
1712       << G4endl;                              << 
1713     }                                         << 
1714     return;                                   << 
1715   }                                           << 
1716   // JA: I don't think we need this. Setview  << 
1717   // fpViewer->SetView();                     << 
1718   fpSceneHandler -> SetCurrentViewer (pViewer    761   fpSceneHandler -> SetCurrentViewer (pViewer);
1719   fpScene = fpSceneHandler -> GetScene ();    << 
1720   fpGraphicsSystem = fpSceneHandler -> GetGra    762   fpGraphicsSystem = fpSceneHandler -> GetGraphicsSystem ();
1721   if (!IsValidView ()) {                      << 763   IsValidView ();  // Checks.
1722     if (fVerbosity >= warnings) {             << 
1723       G4warn <<                               << 
1724   "WARNING: Problem setting viewer - please r << 
1725        << G4endl;                             << 
1726     }                                         << 
1727   }                                           << 
1728 }                                                764 }
1729                                                  765 
1730 void G4VisManager::PrintAvailableGraphicsSyst << 766 void G4VisManager::PrintCurrentSystems () const {
1731 (Verbosity verbosity, std::ostream& out) cons << 767   if (fpGraphicsSystem && fpSceneHandler && fpViewer) {
1732 {                                             << 768     G4int nSystems = fAvailableGraphicsSystems.size ();
1733   out << "Registered graphics systems are:\n" << 769     if (nSystems <= 0) {
1734   if (fAvailableGraphicsSystems.size ()) {    << 770       G4cout << "No graphics systems available yet." << G4endl;
1735     for (const auto& gs: fAvailableGraphicsSy << 
1736       const G4String& name = gs->GetName();   << 
1737       const std::vector<G4String>& nicknames  << 
1738       if (verbosity >= warnings) {            << 
1739         // Brief output                       << 
1740         out << "  " << name << " (";          << 
1741         for (std::size_t i = 0; i < nicknames << 
1742           if (i != 0) {                       << 
1743             out << ", ";                      << 
1744           }                                   << 
1745           out << nicknames[i];                << 
1746         }                                     << 
1747         out << ')';                           << 
1748       } else {                                << 
1749         // Full output                        << 
1750         out << *gs;                           << 
1751       }                                       << 
1752       out << std::endl;                       << 
1753     }                                            771     }
1754     out <<                                    << 
1755     "You may choose a graphics system (driver << 
1756     "\nthe command \"/vis/open\" or \"/vis/sc << 
1757     "\nor you may omit the driver parameter a << 
1758     "\n- by argument in the construction of G << 
1759     "\n- by environment variable \"G4VIS_DEFA << 
1760     "\n- by entry in \"~/.g4session\";"       << 
1761     "\n- by build flags."                     << 
1762     "\n- Note: This feature is not allowed in << 
1763     "\nFor further information see \"examples << 
1764     "\nand \"vis.mac\"."                      << 
1765     << std::endl;                             << 
1766   } else {                                    << 
1767     out << "  NONE!!!  None registered - yet! << 
1768   }                                           << 
1769 }                                             << 
1770                                               << 
1771 void G4VisManager::PrintAvailableModels (Verb << 
1772 {                                             << 
1773   {                                           << 
1774     //fpTrajDrawModelMgr->Print(G4cout);      << 
1775     G4cout << "Registered model factories:" < << 
1776     const std::vector<G4VModelFactory<G4VTraj << 
1777       fpTrajDrawModelMgr->FactoryList();      << 
1778     if (factoryList.empty()) G4cout << "  Non << 
1779     else {                                       772     else {
1780       std::vector<G4VModelFactory<G4VTrajecto << 773       PrintAvailableGraphicsSystems ();
1781       for (i = factoryList.begin(); i != fact << 
1782         (*i)->Print(G4cout);                  << 
1783       }                                       << 
1784     }                                         << 
1785     G4cout << "\nRegistered models:" << G4end << 
1786     const G4VisListManager<G4VTrajectoryModel << 
1787       fpTrajDrawModelMgr->ListManager();      << 
1788     const std::map<G4String, G4VTrajectoryMod << 
1789       listManager->Map();                     << 
1790     if (modelMap.empty()) G4cout << "  None"  << 
1791     else {                                    << 
1792       std::map<G4String, G4VTrajectoryModel*> << 
1793       for (i = modelMap.begin(); i != modelMa << 
1794   G4cout << "  " << i->second->Name();        << 
1795   if (i->second == listManager->Current()) G4 << 
1796   G4cout << G4endl;                           << 
1797   if (verbosity >= parameters) i->second->Pri << 
1798       }                                       << 
1799     }                                         << 
1800   }                                           << 
1801                                               << 
1802   G4cout << G4endl;                           << 
1803                                               << 
1804   {                                           << 
1805     //fpTrajFilterMgr->Print(G4cout);         << 
1806     G4cout << "Registered filter factories:"  << 
1807     const std::vector<G4VModelFactory<G4VFilt << 
1808       factoryList = fpTrajFilterMgr->FactoryL << 
1809     if (factoryList.empty()) G4cout << "  Non << 
1810     else {                                    << 
1811       std::vector<G4VModelFactory<G4VFilter<G << 
1812       for (i = factoryList.begin(); i != fact << 
1813         (*i)->Print(G4cout);                  << 
1814       }                                       << 
1815     }                                         << 
1816                                               << 
1817     G4cout << "\nRegistered filters:" << G4en << 
1818     const std::vector<G4VFilter<G4VTrajectory << 
1819       filterList = fpTrajFilterMgr->FilterLis << 
1820     if (filterList.empty()) G4cout << "  None << 
1821     else {                                    << 
1822       std::vector<G4VFilter<G4VTrajectory>*>: << 
1823       for (i = filterList.begin(); i != filte << 
1824   G4cout << "  " << (*i)->GetName() << G4endl << 
1825   if (verbosity >= parameters) (*i)->PrintAll << 
1826       }                                       << 
1827     }                                            774     }
1828   }                                              775   }
                                                   >> 776   else PrintInvalidPointers ();
1829 }                                                777 }
1830                                                  778 
1831 void G4VisManager::PrintAvailableUserVisActio << 779 void G4VisManager::PrintCurrentSystem () const {
1832 {                                             << 780   if (fpGraphicsSystem && fpSceneHandler && fpViewer) {
1833   G4cout <<                                   << 781     G4cout << "Current graphics system is: " << *fpGraphicsSystem;
1834     "You have successfully registered the fol << 
1835    << G4endl;                                 << 
1836   G4cout << "Run Duration User Vis Actions:"; << 
1837   if (fRunDurationUserVisActions.empty()) G4c << 
1838   else {                                      << 
1839     G4cout << G4endl;                         << 
1840     for (std::size_t i = 0; i < fRunDurationU << 
1841       const G4String& name = fRunDurationUser << 
1842       G4cout << "  " << name << G4endl;       << 
1843     }                                         << 
1844   }                                           << 
1845                                               << 
1846   G4cout << "End of Event User Vis Actions:"; << 
1847   if (fEndOfEventUserVisActions.empty()) G4co << 
1848   else {                                      << 
1849     G4cout << G4endl;                         << 
1850     for (std::size_t i = 0; i < fEndOfEventUs << 
1851       const G4String& name = fEndOfEventUserV << 
1852       G4cout << "  " << name << G4endl;       << 
1853     }                                         << 
1854   }                                           << 
1855                                               << 
1856   G4cout << "End of Run User Vis Actions:";   << 
1857   if (fEndOfRunUserVisActions.empty()) G4cout << 
1858   else {                                      << 
1859     G4cout << G4endl;                            782     G4cout << G4endl;
1860     for (std::size_t i = 0; i < fEndOfRunUser << 
1861       const G4String& name = fEndOfRunUserVis << 
1862       G4cout << "  " << name << G4endl;       << 
1863     }                                         << 
1864   }                                              783   }
                                                   >> 784   else PrintInvalidPointers ();
1865 }                                                785 }
1866                                                  786 
1867 void G4VisManager::PrintAvailableColours (Ver << 787 void G4VisManager::PrintCurrentScene () const {
1868   G4cout <<                                   << 788   if (fpGraphicsSystem && fpSceneHandler && fpViewer) {
1869   "Some /vis commands (optionally) take a str << 789     G4cout << "Current Scene is: " << fpSceneHandler -> GetName ();
1870   "\nThey are also available in your C++ code << 790     G4cout << '\n' << *fpSceneHandler;
1871   "\n  G4Colour niceColour;  // Default - whi << 791     G4cout << G4endl;
1872   "\n  G4Colour::GetColour(\"pink\", niceColo << 
1873   "\n  logical->SetVisAttributes(niceColour); << 
1874   "\nSee G4Colour.hh."                        << 
1875   "\nAvailable colours";                      << 
1876   for (const auto& i: G4Colour::GetMap()) {   << 
1877     G4cout << ", " << i.first;                << 
1878   }                                              792   }
1879   G4cout << G4endl;                           << 793   else PrintInvalidPointers ();
1880 }                                                794 }
1881                                                  795 
1882 void G4VisManager::PrintInvalidPointers () co << 796 void G4VisManager::PrintCurrentView () const {
1883   if (fVerbosity >= errors) {                 << 797   if (fpGraphicsSystem && fpSceneHandler && fpViewer) {
1884     G4warn << "ERROR: G4VisManager::PrintInva << 798     G4cout << "Current View is: ";
1885     if (!fpGraphicsSystem) {                  << 799     G4cout << fpGraphicsSystem -> GetName () << '-'
1886       G4warn << "\n null graphics system poin << 800      << fpSceneHandler  -> GetSceneHandlerId () << '-'
                                                   >> 801      << fpViewer   -> GetViewId ()
                                                   >> 802      << " selected (check: " << fpViewer -> GetName () << ").";
                                                   >> 803     G4cout << '\n' << *fpViewer;
                                                   >> 804     G4cout << "\nCurrent view parameters";
                                                   >> 805     if (fVP != fpViewer -> GetViewParameters ()) {
                                                   >> 806       G4cout << " differ in the following respect:\n";
                                                   >> 807       fVP.PrintDifferences (fpViewer -> GetViewParameters ());
1887     }                                            808     }
1888     else {                                       809     else {
1889       G4warn << "\n  Graphics system is " <<  << 810       G4cout << " are same."
1890        << " but:";                            << 811      << G4endl;
1891       if (!fpScene)                           << 
1892   G4warn <<                                   << 
1893     "\n  Null scene pointer. Use \"/vis/drawV << 
1894     " \"/vis/scene/create\".";                << 
1895       if (!fpSceneHandler)                    << 
1896   G4warn <<                                   << 
1897     "\n  Null scene handler pointer. Use \"/v << 
1898     " \"/vis/sceneHandler/create\".";         << 
1899       if (!fpViewer )                         << 
1900   G4warn <<                                   << 
1901     "\n  Null viewer pointer. Use \"/vis/view << 
1902     }                                            812     }
1903     G4warn << G4endl;                         << 
1904   }                                              813   }
                                                   >> 814   else PrintInvalidPointers ();
1905 }                                                815 }
1906                                                  816 
1907                                               << 817 void G4VisManager::PrintAllGraphicsSystems () const {
1908 G4ThreadFunReturnType G4VisManager::G4VisSubT << 818   G4cout << "\nThe following graphics systems drivers are supported in the"
1909 {                                             << 819     " GEANT4 distribution:"
1910 #ifdef G4MULTITHREADED                        << 820        << "\n\n  DAWN     (socket connection to the Fukui Renderer DAWN) " << G4VisFeaturesOfFukuiRenderer ()
1911   G4VisManager* pVisManager = (G4VisManager*) << 821        << "\n\n  DAWNFILE (file connection to the Fukui Renderer DAWN  ) " << G4VisFeaturesOfDAWNFILE      ()
1912   G4VSceneHandler* pSceneHandler = pVisManage << 822        << "\n\n  OPACS (the Orsay Package) "
1913   if (!pSceneHandler) return 0;               << 823        << "\n\n  OpenGLIX (direct/immediate drawing on X Windows)\n"
1914   G4Scene* pScene = pSceneHandler->GetScene() << 824        << G4VisFeaturesOfOpenGLIX ()
1915   if (!pScene) return 0;                      << 825        << "\n\n  OpenGLSX (display List/stored drawing on X Windows)\n"
1916   G4VViewer* pViewer = pVisManager->GetCurren << 826        << G4VisFeaturesOfOpenGLSX ()
1917   if (!pViewer) return 0;                     << 827        << "\n\n  OpenGLIXm (with Motif widgets)\n"
1918                                               << 828        << G4VisFeaturesOfOpenGLIXm ()
1919   G4UImanager::GetUIpointer()->SetUpForSpecia << 829        << "\n\n  OpenGLSXm (with Motif widgets)\n"
1920                                               << 830        << G4VisFeaturesOfOpenGLSXm ()
1921   // Set up geometry and navigation for a thr << 831        << "\n\n  Open Inventor"
1922   G4GeometryWorkspace::GetPool()->CreateAndUs << 832        << G4VisFeaturesOfOpenInventor ()
1923   G4SolidsWorkspace::GetPool()->CreateAndUseW << 833        << "\n\n  VRML1     (produces VRML 1 file over network)"
1924   G4Navigator* navigator = G4TransportationMa << 834        << "\n\n  VRML1FILE (produces VRML 1 file locally    )"
1925                              ->GetNavigatorFo << 835        << "\n\n  VRML2     (produces VRML 2 file over network)"
1926   navigator->SetWorldVolume(                  << 836        << "\n\n  VRML2FILE (produces VRML 2 file locally    )"
1927     G4RunManagerFactory::GetMasterRunManagerK << 837        << "\n\n  RayTracer (produces JPEG file)"
1928                                               << 838        << G4endl;
1929   pViewer->SwitchToVisSubThread();            << 839 }
1930                                               << 840 
1931   while (true) {                              << 841 void G4VisManager::PrintInstalledGraphicsSystems () const {
1932                                               << 842   G4cout << "\nThe following graphics systems drivers are installed on your"
1933     G4MUTEXLOCK(&mtVisSubThreadMutex);        << 843     " system:"
1934     std::size_t eventQueueSize = mtVisEventQu << 844 #ifdef G4VIS_BUILD_DAWN_DRIVER
1935     G4MUTEXUNLOCK(&mtVisSubThreadMutex);      << 845        << "\n  DAWN     (socket connection to the Fukui Renderer DAWN)"
1936     // G4cout << "Event queue size (A): " <<  << 
1937                                               << 
1938     while (eventQueueSize) {                  << 
1939                                               << 
1940       G4MUTEXLOCK(&mtVisSubThreadMutex);      << 
1941       const G4Event* event = mtVisEventQueue. << 
1942       G4MUTEXUNLOCK(&mtVisSubThreadMutex);    << 
1943                                               << 
1944       // Here comes the event drawing         << 
1945       pVisManager->SetTransientsDrawnThisEven << 
1946       pSceneHandler->SetTransientsDrawnThisEv << 
1947                                               << 
1948       // We are about to draw the event (traj << 
1949       // have to clear the previous event(s)  << 
1950       // needs to be drawn afresh, e.g., the  << 
1951       // "accumulate" is not requested, the o << 
1952       // We have postponed this so that, for  << 
1953       // previous event(s) stay on screen unt << 
1954       // along.  For a file-writing viewer th << 
1955       // See, for example, G4HepRepFileSceneH << 
1956       pVisManager->ClearTransientStoreIfMarke << 
1957                                               << 
1958       // Now draw the event...                << 
1959       pSceneHandler->DrawEvent(event);        << 
1960       ++pVisManager->fNoOfEventsDrawnThisRun; << 
1961                                               << 
1962       // Then pop and release event           << 
1963       G4MUTEXLOCK(&mtVisSubThreadMutex);      << 
1964       mtVisEventQueue.pop_front();            << 
1965       pVisManager->EndOfEventCleanup(event);  << 
1966       eventQueueSize = mtVisEventQueue.size() << 
1967       G4MUTEXUNLOCK(&mtVisSubThreadMutex);    << 
1968     }                                         << 
1969                                               << 
1970     G4MUTEXLOCK(&mtVisSubThreadMutex);        << 
1971     G4bool runInProgress = mtRunInProgress;   << 
1972     G4MUTEXUNLOCK(&mtVisSubThreadMutex);      << 
1973     if (!runInProgress) {                     << 
1974       // EndOfRun on master thread has signal << 
1975       // nothing to draw so...                << 
1976       break;                                  << 
1977     }                                         << 
1978                                               << 
1979     // Run still in progress but nothing to d << 
1980     std::this_thread::sleep_for(std::chrono:: << 
1981   }                                           << 
1982                                               << 
1983   // Inform viewer that we have finished all  << 
1984   pViewer->DoneWithVisSubThread();            << 
1985   pViewer->MovingToMasterThread();            << 
1986 #else                                         << 
1987   G4ConsumeParameters(p);                     << 
1988 #endif                                           846 #endif
1989   return nullptr;                             << 847 #ifdef G4VIS_BUILD_DAWNFILE_DRIVER
1990 }                                             << 848        << "\n  DAWNFILE (file connection to the Fukui Renderer DAWN)"
1991                                               << 
1992 void G4VisManager::BeginOfRun ()              << 
1993 {                                             << 
1994   if (fIgnoreStateChanges) return;            << 
1995   if (G4Threading::IsWorkerThread()) return;  << 
1996   if (!GetConcreteInstance()) return;         << 
1997                                               << 
1998   // Check if view is valid                   << 
1999   // Protect IsValidView() with fpSceneHandle << 
2000   isValidViewForRun = fpSceneHandler && IsVal << 
2001   if (!isValidViewForRun) return;             << 
2002                                               << 
2003   // For a fake run...                        << 
2004   G4RunManager* runManager = G4RunManagerFact << 
2005   G4int nEventsToBeProcessed = runManager->Ge << 
2006   isFakeRun = (nEventsToBeProcessed == 0);    << 
2007   if (isFakeRun) return;                      << 
2008                                               << 
2009   // Is the run manager a sub-event type?     << 
2010   G4RunManager::RMType rmType = runManager->G << 
2011   isSubEventRunManagerType =                  << 
2012   (rmType == G4RunManager::subEventMasterRM)  << 
2013   (rmType == G4RunManager::subEventWorkerRM); << 
2014                                               << 
2015   fNKeepForPostProcessingRequests = 0;        << 
2016   fNKeepTheEventRequests = 0;                 << 
2017   fEventKeepingSuspended = false;             << 
2018   fTransientsDrawnThisRun = false;            << 
2019   if (fpSceneHandler) fpSceneHandler->SetTran << 
2020   fNoOfEventsDrawnThisRun = 0;                << 
2021                                               << 
2022   // Check to see if the user has created a t << 
2023   // a default one. To avoid code duplication << 
2024   // and its result (a const G4VTrajectoryMod << 
2025   // The function is called again later when  << 
2026   CurrentTrajDrawModel();                     << 
2027                                               << 
2028   // Actions only in MT mode                  << 
2029   if (G4Threading::IsMultithreadedApplication << 
2030                                               << 
2031     // Inform viewer that we have finished al << 
2032     if (fpViewer) fpViewer->DoneWithMasterThr << 
2033                                               << 
2034     // Start vis sub-thread                   << 
2035     G4MUTEXLOCK(&mtVisSubThreadMutex);        << 
2036     mtRunInProgress = true;                   << 
2037     G4MUTEXUNLOCK(&mtVisSubThreadMutex);      << 
2038     mtVisSubThread = new G4Thread;            << 
2039     // Launch vis thread                      << 
2040     G4THREADCREATE(mtVisSubThread,G4VisSubThr << 
2041                                               << 
2042     // Tricky things for some viewers (e.g.,  << 
2043     // - Launch the vis thread                << 
2044     // - Wait for the vis thread to set its Q << 
2045     // - Then move current QOpenGL context (i << 
2046     // - Go ahead                             << 
2047     if (fpViewer) fpViewer->MovingToVisSubThr << 
2048   }                                           << 
2049 }                                             << 
2050                                               << 
2051 void G4VisManager::BeginOfEvent ()            << 
2052 {                                             << 
2053   if (fIgnoreStateChanges) return;            << 
2054   if (!GetConcreteInstance()) return;         << 
2055   if (!isValidViewForRun) return;             << 
2056   if (isFakeRun) return;                      << 
2057                                               << 
2058   // Some instructions that should NOT be in  << 
2059   // TODO: protect with G4Threading::IsMultit << 
2060 #ifndef G4MULTITHREADED                       << 
2061   // These instructions are in G4VisSubThread << 
2062   fTransientsDrawnThisEvent = false;          << 
2063   if (fpSceneHandler) fpSceneHandler->SetTran << 
2064 #endif                                           849 #endif
                                                   >> 850 #ifdef G4VIS_BUILD_OPACS_DRIVER
                                                   >> 851        << "\n  OPACS (the Orsay Package)"
                                                   >> 852 #endif
                                                   >> 853 #ifdef G4VIS_BUILD_OPENGLX_DRIVER
                                                   >> 854        << "\n  OpenGLIX (direct/immediate drawing on X Windows)"
                                                   >> 855        << "\n  OpenGLSX (display List/stored drawing on X Windows)"
                                                   >> 856 #endif
                                                   >> 857 #ifdef G4VIS_BUILD_OPENGLXM_DRIVER
                                                   >> 858        << "\n  OpenGLIXm (with Motif widgets)"
                                                   >> 859        << "\n  OpenGLSXm (with Motif widgets)"
                                                   >> 860 #endif
                                                   >> 861 #ifdef G4VIS_BUILD_OIX_DRIVER
                                                   >> 862        << "\n  Open Inventor X11"
                                                   >> 863 #endif
                                                   >> 864 #ifdef G4VIS_BUILD_OIWIN32_DRIVER
                                                   >> 865        << "\n  Open Inventor Win32"
                                                   >> 866 #endif
                                                   >> 867 #ifdef G4VIS_BUILD_VRML_DRIVER
                                                   >> 868        << "\n  VRML1 (produces VRML 1 file over network)"
                                                   >> 869        << "\n  VRML2 (produces VRML 2 file over network)"
                                                   >> 870 #endif
                                                   >> 871 #ifdef G4VIS_BUILD_VRMLFILE_DRIVER
                                                   >> 872        << "\n  VRML1FILE (produces VRML 1 file locally)"
                                                   >> 873        << "\n  VRML2FILE (produces VRML 2 file locally)"
                                                   >> 874 #endif
                                                   >> 875 #ifdef G4VIS_BUILD_RAYTRACER_DRIVER
                                                   >> 876        << "\n  RayTracer (produces JPEG file)"
                                                   >> 877 #endif
                                                   >> 878        << G4endl;
2065 }                                                879 }
2066                                                  880 
2067 // Here begins a sequence of functions that d << 881 void G4VisManager::PrintAvailableGraphicsSystems () const {
2068 // Sequential/Serial mode:                    << 882   G4int nSystems = fAvailableGraphicsSystems.size ();
2069 //   EndOfEvent is invoked by a state change  << 883   G4cout << "Current available graphics systems are:";
2070 //     EndOfEvent pulls the event from the Ev << 884   if (nSystems) {
2071 //     EndOfEventKernel draws the event and c << 885     for (int i = 0; i < nSystems; i++) {
2072 //     (Unless the user him/herself has reque << 886       const G4VGraphicsSystem* pSystem = fAvailableGraphicsSystems [i];
2073 //      also sets KeepTheEvent for a certain  << 887       G4cout << "\n  " << pSystem -> GetName ();
2074 //      of events. The run manager keeps thes << 888       if (pSystem -> GetNickname () != "") {
2075 //      run, so, for example, the vis manager << 889   G4cout << " (" << pSystem -> GetNickname () << ")";
2076 // Multithreading/Tasking:                    << 
2077 //   EndOfEvent is invoked by a state change  << 
2078 //     EndOfEvent pulls the event from the (w << 
2079 //     EndOfEventKernel pushes it to the vis  << 
2080 //       are marked KeepForPostProcessing so  << 
2081 //       PostProcessingFinished in EndOfEvent << 
2082 //     EndOfEventKernel also sets KeepTheEven << 
2083 //     The vis sub thread pulls events from t << 
2084 //       calls EndOfEventCleanup, which calls << 
2085 // Sub-event parallelism:                     << 
2086 //   EndOfEvent is invoked by a state change  << 
2087 //     multithreading, but actually, the even << 
2088 //     employed on sub-events, so we ignore s << 
2089 //     G4SubEvtRunManager knows when the even << 
2090 //   Events are pushed to the Vis Manager by  << 
2091 //      when the event is ready. EventReadyFo << 
2092 //      processsing continues as for Multithr << 
2093                                               << 
2094 void G4VisManager::EndOfEvent ()              << 
2095 {                                             << 
2096   if (fIgnoreStateChanges) return;            << 
2097   if (!GetConcreteInstance()) return;         << 
2098   if (!isValidViewForRun) return;             << 
2099   if (isFakeRun) return;                      << 
2100                                               << 
2101   // For sub-event parallelism, this is not t << 
2102   if (isSubEventRunManagerType) return;       << 
2103                                               << 
2104   G4AutoLock al(&visEndOfEventMutex);         << 
2105                                               << 
2106   G4RunManager* runManager = G4RunManagerFact << 
2107                                               << 
2108   const G4Run* currentRun = runManager->GetCu << 
2109   if (!currentRun) return;                    << 
2110                                               << 
2111   // This gets the appropriate event manager  << 
2112   G4EventManager* eventManager = G4EventManag << 
2113   const G4Event* currentEvent = eventManager- << 
2114   if (!currentEvent) return;                  << 
2115                                               << 
2116   // Call kernel                              << 
2117   EndOfEventKernel(currentEvent);             << 
2118 }                                             << 
2119                                               << 
2120 void G4VisManager::EventReadyForVis(const G4E << 
2121 // This is invoked by G4SubEvtRunManager.     << 
2122 // The event is passed to EndOfEventKernel.   << 
2123 {                                             << 
2124   if (fIgnoreStateChanges) return;            << 
2125   if (!GetConcreteInstance()) return;         << 
2126   if (!isValidViewForRun) return;             << 
2127   if (isFakeRun) return;                      << 
2128                                               << 
2129   G4AutoLock al(&visEndOfEventMutex);         << 
2130   EndOfEventKernel(event);                    << 
2131 }                                             << 
2132                                               << 
2133 void G4VisManager::EndOfEventKernel (const G4 << 
2134 {                                             << 
2135   // Note: we are still subject to the mutex  << 
2136                                               << 
2137   // Discard event if fDrawEventOnlyIfToBeKep << 
2138   // user has requested the event to be kept. << 
2139   if (fDrawEventOnlyIfToBeKept) {             << 
2140     if (!currentEvent->KeepTheEventFlag()) re << 
2141   }                                           << 
2142                                               << 
2143   if (G4Threading::IsMultithreadedApplication << 
2144                                               << 
2145     // Wait if too many events in the queue.  << 
2146     G4MUTEXLOCK(&mtVisSubThreadMutex);        << 
2147     std::size_t eventQueueSize = mtVisEventQu << 
2148     G4MUTEXUNLOCK(&mtVisSubThreadMutex);      << 
2149                                               << 
2150     G4bool eventQueueFull = false;            << 
2151     while (fMaxEventQueueSize > 0 && (G4int)e << 
2152                                               << 
2153       if (fWaitOnEventQueueFull) {            << 
2154                                               << 
2155         static G4bool warned = false;         << 
2156         if (!warned) {                        << 
2157           G4warn <<                           << 
2158           "WARNING: The number of events in t << 
2159           "\n  the maximum, "                 << 
2160           << fMaxEventQueueSize <<            << 
2161           ".\n  If, during a multithreaded ru << 
2162           "\n  visualisation by more than thi << 
2163           "\n  until the vis sub-thread has d << 
2164           "\n  from the queue.  You may chang << 
2165           "\n  \"/vis/multithreading/maxEvent << 
2166           "\n  number you wish to allow.  N < << 
2167           "\n  Alternatively you may choose t << 
2168           "\n  \"/vis/multithreading/actionOn << 
2169           "\n  To avoid visualisation altoget << 
2170           "\n  And maybe \"/tracking/storeTra << 
2171           << G4endl;                          << 
2172           warned = true;                      << 
2173         }                                     << 
2174                                               << 
2175         // Wait a while to give event drawing << 
2176         std::this_thread::sleep_for(std::chro << 
2177                                               << 
2178       } else {                                << 
2179                                               << 
2180         static G4bool warned = false;         << 
2181         if (!warned) {                        << 
2182           G4warn <<                           << 
2183           "WARNING: The number of events in t << 
2184           "\n  the maximum, "                 << 
2185           << fMaxEventQueueSize <<            << 
2186           ".\n  Some events have been discard << 
2187           "\n  behaviour with \"/vis/multithr << 
2188           "\n  To avoid visualisation altoget << 
2189           "\n  And maybe \"/tracking/storeTra << 
2190           << G4endl;                          << 
2191           warned = true;                      << 
2192         }                                     << 
2193                                               << 
2194         eventQueueFull = true;  // Causes eve << 
2195         break;                                << 
2196       }                                          890       }
2197                                               << 
2198       G4MUTEXLOCK(&mtVisSubThreadMutex);      << 
2199       eventQueueSize = mtVisEventQueue.size() << 
2200       G4MUTEXUNLOCK(&mtVisSubThreadMutex);    << 
2201     }                                            891     }
2202                                               << 
2203     if (!eventQueueFull) {                    << 
2204                                               << 
2205       if (RequiredToBeKeptForVis(currentEvent << 
2206         currentEvent->KeepTheEvent();         << 
2207         fNKeepTheEventRequests++;  // Counts  << 
2208       }                                       << 
2209                                               << 
2210       G4MUTEXLOCK(&mtVisSubThreadMutex);      << 
2211                                               << 
2212       // Keep while post processing (i.e., dr << 
2213       // Make sure the event is not deleted b << 
2214       currentEvent->KeepForPostProcessing();  << 
2215       fNKeepForPostProcessingRequests++;      << 
2216                                               << 
2217       // Put event on vis queue               << 
2218       mtVisEventQueue.push_back(currentEvent) << 
2219                                               << 
2220       G4MUTEXUNLOCK(&mtVisSubThreadMutex);    << 
2221     }                                         << 
2222                                               << 
2223   } else {                                    << 
2224                                               << 
2225     // Sequential mode                        << 
2226                                               << 
2227     // We are about to draw the event (trajec << 
2228     // have to clear the previous event(s) if << 
2229     // needs to be drawn afresh, e.g., the fi << 
2230     // "accumulate" is not requested, the old << 
2231     // We have postponed this so that, for no << 
2232     // previous event(s) stay on screen until << 
2233     // along.  For a file-writing viewer the  << 
2234     // See, for example, G4HepRepFileSceneHan << 
2235     ClearTransientStoreIfMarked();            << 
2236                                               << 
2237     // Keep while post processing (i.e., draw << 
2238     currentEvent->KeepForPostProcessing();    << 
2239     fNKeepForPostProcessingRequests++;        << 
2240                                               << 
2241     if (RequiredToBeKeptForVis(currentEvent-> << 
2242       currentEvent->KeepTheEvent();           << 
2243       fNKeepTheEventRequests++;  // Counts nu << 
2244     }                                         << 
2245                                               << 
2246     // Now draw the event...                  << 
2247     fpSceneHandler->DrawEvent(currentEvent);  << 
2248     ++fNoOfEventsDrawnThisRun;                << 
2249                                               << 
2250     EndOfEventCleanup(currentEvent);          << 
2251   }                                              892   }
2252 }                                             << 893   else {
2253                                               << 894     G4cout << "\n  NONE!!!  None registered - yet!  Mmmmm!";
2254 void G4VisManager::EndOfEventCleanup(const G4 << 
2255 {                                             << 
2256   if (fpScene->GetRefreshAtEndOfEvent()) {    << 
2257                                               << 
2258     fpSceneHandler->SetMarkForClearingTransie << 
2259                                               << 
2260     // ShowView guarantees the view is flushe << 
2261     // triggers other features such as pickin << 
2262     // file-writing viewers to close the file << 
2263     fpViewer->ShowView();                     << 
2264   }                                           << 
2265                                               << 
2266   currentEvent->PostProcessingFinished();     << 
2267 }                                             << 
2268                                               << 
2269 G4bool G4VisManager::RequiredToBeKeptForVis ( << 
2270 // i.e., kept by the run manager at least to  << 
2271 {                                             << 
2272   G4bool requiredToBeKept = false;            << 
2273                                               << 
2274   G4RunManager* runManager = G4RunManagerFact << 
2275   G4int nEventsToBeProcessed = runManager->Ge << 
2276                                               << 
2277   if (fpScene->GetRefreshAtEndOfEvent()) {  / << 
2278                                               << 
2279     // Keep last event only                   << 
2280     if (eventID == nEventsToBeProcessed - 1)  << 
2281       requiredToBeKept = true;                << 
2282     }                                         << 
2283                                               << 
2284   } else {  //  Accumulating events           << 
2285                                               << 
2286     G4int maxNumberOfKeptEvents = fpScene->Ge << 
2287                                               << 
2288     if (maxNumberOfKeptEvents >= 0) {  // Eve << 
2289                                               << 
2290       if (fNKeepTheEventRequests < maxNumberO << 
2291                                               << 
2292         // Not yet reached the limit          << 
2293         requiredToBeKept = true;              << 
2294                                               << 
2295       } else {                                << 
2296                                               << 
2297         // We have already reached the limit  << 
2298         fEventKeepingSuspended = true;        << 
2299         static G4bool warned = false;         << 
2300         if (!warned) {                        << 
2301           if (fVerbosity >= warnings) {       << 
2302             G4warn <<                         << 
2303             "WARNING: G4VisManager::EndOfEven << 
2304             << G4endl;                        << 
2305             if (maxNumberOfKeptEvents > 0) {  << 
2306               G4warn <<                       << 
2307               "\n  The number of events excee << 
2308               << maxNumberOfKeptEvents <<     << 
2309               ", that may be kept by\n  the v << 
2310               << G4endl;                      << 
2311             }                                 << 
2312           }                                   << 
2313           warned = true;                      << 
2314         }                                     << 
2315       }                                       << 
2316                                               << 
2317     } else {  // Indefinite event keeping (ma << 
2318                                               << 
2319       requiredToBeKept = true;                << 
2320                                               << 
2321     }                                         << 
2322   }                                              895   }
2323                                               << 896   G4cout << G4endl;
2324   return requiredToBeKept;                    << 
2325 }                                                897 }
2326                                                  898 
2327 void G4VisManager::EndOfRun ()                << 899 void G4VisManager::PrintInvalidPointers () const {
2328 {                                             << 900   G4cout << "Error in G4VisManager::PrintInvalidPointers:";
2329   if (fIgnoreStateChanges) return;            << 901   if (!fpGraphicsSystem) {
2330   if (G4Threading::IsWorkerThread()) return;  << 902     G4cout << "\n null graphics system pointer.";
2331   if (!GetConcreteInstance()) return;         << 
2332   if (!isValidViewForRun) return;             << 
2333   if (isFakeRun) return;                      << 
2334                                               << 
2335   G4RunManager* runManager = G4RunManagerFact << 
2336                                               << 
2337   // For a fake run...                        << 
2338   G4int nEventsToBeProcessed = runManager->Ge << 
2339   if (nEventsToBeProcessed == 0) return;      << 
2340                                               << 
2341   const G4Run* currentRun = runManager->GetCu << 
2342   if (!currentRun) return;                    << 
2343                                               << 
2344   //  G4AutoLock al(&visEndOfRunMutex);  ???  << 
2345   if (G4Threading::IsMultithreadedApplication << 
2346     // Reset flag so that sub-thread exits wh << 
2347     G4MUTEXLOCK(&mtVisSubThreadMutex);        << 
2348     mtRunInProgress = false;                  << 
2349     G4MUTEXUNLOCK(&mtVisSubThreadMutex);      << 
2350     // Wait for sub-thread to finish.         << 
2351     G4THREADJOIN(*mtVisSubThread);            << 
2352     delete mtVisSubThread;                    << 
2353     fpViewer->SwitchToMasterThread();         << 
2354   }                                           << 
2355                                               << 
2356   if (G4Threading::IsMultithreadedApplication << 
2357     G4int noOfEventsRequested = runManager->G << 
2358     if (fNoOfEventsDrawnThisRun != noOfEvents << 
2359       if (!fWaitOnEventQueueFull && fVerbosit << 
2360         G4warn                                << 
2361         << "WARNING: Number of events drawn t << 
2362         << fNoOfEventsDrawnThisRun << ", is d << 
2363         << noOfEventsRequested <<             << 
2364         ".\n  (This is because you requested  << 
2365         << G4endl;                            << 
2366       }                                       << 
2367     }                                         << 
2368   }                                           << 
2369                                               << 
2370   G4int nKeptEvents = currentRun->GetNumberOf << 
2371   if (fVerbosity >= warnings && nKeptEvents > << 
2372     G4warn << nKeptEvents;                    << 
2373     if (nKeptEvents == 1) G4warn << " event h << 
2374     else G4warn << " events have";            << 
2375     G4warn << " been kept for refreshing and/ << 
2376     if (nKeptEvents != fNKeepTheEventRequests << 
2377       if (fNKeepTheEventRequests == 0) {      << 
2378         G4warn << "No keep requests were";    << 
2379       } else if (fNKeepTheEventRequests == 1) << 
2380         G4warn << "1 keep request was";       << 
2381       } else {                                << 
2382         G4warn << fNKeepTheEventRequests << " << 
2383       }                                       << 
2384       G4warn << " made by the vis manager.";  << 
2385       if (fNKeepTheEventRequests == 0) {      << 
2386         G4warn <<                             << 
2387         "\n  The kept events are those you ha << 
2388       } else {                                << 
2389         G4warn <<                             << 
2390         "\n  The same or further events may h << 
2391         "\n  To turn off event keeping by the << 
2392         "\n  or use /vis/scene/endOfEventActi << 
2393       }                                       << 
2394       G4warn << G4endl;                       << 
2395     }                                         << 
2396     G4warn <<                                 << 
2397   "  \"/vis/reviewKeptEvents\" to review one  << 
2398   "\n  To see accumulated, \"/vis/enable\", t << 
2399     << G4endl;                                << 
2400   }                                           << 
2401                                               << 
2402   if (fVerbosity >= warnings) PrintListOfPlot << 
2403                                               << 
2404   if (fEventKeepingSuspended && fVerbosity >= << 
2405     G4warn <<                                 << 
2406     "WARNING: G4VisManager::EndOfRun: Automat << 
2407     << G4endl;                                << 
2408     if (fpScene->GetMaxNumberOfKeptEvents() > << 
2409       G4warn <<                               << 
2410       "  The number of events in the run exce << 
2411       << fpScene->GetMaxNumberOfKeptEvents()  << 
2412       ", that may be\n  kept by the vis manag << 
2413       "\n  The number of events kept by the v << 
2414       "\n  \"/vis/scene/endOfEventAction accu << 
2415       "\n  maximum number you wish to allow.  << 
2416       << G4endl;                              << 
2417     }                                         << 
2418   }                                              903   }
2419                                               << 904   else {
2420 //    // if (!fpSceneHandler->GetMarkForClear << 905     G4cout << "\n graphics system is " << fpGraphicsSystem -> GetName ()
2421 //    // is here.  It prevents ShowView at en << 906    << " but:";
2422 //    // for sequential mode, but MT mode see << 907     if (!fpScene) G4cout << "\nNull scene pointer. ";
2423 //    // figured out why). ???? JA ????       << 908     if (!fpSceneHandler) G4cout << "\nNull scene handler pointer. ";
2424 //    if (!fpSceneHandler->GetMarkForClearing << 909     if (!fpViewer ) G4cout << "\nNull viewer pointer. ";
2425   if (fpScene->GetRefreshAtEndOfRun()) {      << 
2426     fpSceneHandler->DrawEndOfRunModels();     << 
2427     // An extra refresh for auto-refresh view << 
2428     // ???? I DON'T WHY THIS IS NECESSARY ??? << 
2429     if (fpViewer->GetViewParameters().IsAutoR << 
2430       fpViewer->RefreshView();                << 
2431     }                                         << 
2432     // ShowView guarantees the view is flushe << 
2433     // triggers other features such picking ( << 
2434     // file-writing viewers to close the file << 
2435     fpViewer->ShowView();                     << 
2436     fpSceneHandler->SetMarkForClearingTransie << 
2437   } else {                                    << 
2438     if (fpGraphicsSystem->GetFunctionality()  << 
2439         G4VGraphicsSystem::fileWriter) {      << 
2440       if (fVerbosity >= warnings) {           << 
2441         G4warn << "\"/vis/viewer/update\" to  << 
2442       }                                       << 
2443     }                                         << 
2444   }                                              910   }
2445 //}                                           << 911   G4cout << G4endl;
2446   fEventRefreshing = false;                   << 
2447 }                                                912 }
2448                                                  913 
2449 void G4VisManager::ClearTransientStoreIfMarke << 914 void G4VisManager::RefreshCurrentView  () {  // Soft clear, then redraw.
2450   // Assumes valid view.                      << 915   if (IsValidView ()) {
2451   if (fpSceneHandler->GetMarkForClearingTrans << 916     fpViewer -> ClearView ();  // Soft clear, i.e., clears buffer only.
2452     fpSceneHandler->SetMarkForClearingTransie << 917     Draw ();
2453     fpSceneHandler->ClearTransientStore();    << 918     Show ();
2454   }                                              919   }
2455   // Record if transients drawn.  These local << 
2456   // *after* ClearTransientStore.  In the cod << 
2457   // triggered by ClearTransientStore, use th << 
2458   // event refreshing is not done too early.  << 
2459   fTransientsDrawnThisEvent = fpSceneHandler- << 
2460   fTransientsDrawnThisRun = fpSceneHandler->G << 
2461 }                                                920 }
2462                                                  921 
2463 void G4VisManager::ResetTransientsDrawnFlags( << 922 void G4VisManager::EndOfEvent () {
2464 {                                             << 923   if (fpConcreteInstance && IsValidView ()) {
2465   fTransientsDrawnThisRun = false;            << 924     G4ModelingParameters* pMP =
2466   fTransientsDrawnThisEvent = false;          << 925       fpSceneHandler -> CreateModelingParameters ();
2467   G4SceneHandlerListConstIterator i;          << 926     const G4std::vector<G4VModel*>& EOEModelList =
2468   for (i = fAvailableSceneHandlers.begin();   << 927       fpScene -> GetEndOfEventModelList ();
2469        i != fAvailableSceneHandlers.end(); ++ << 928     fpSceneHandler->ClearTransientStore(); //GB
2470     (*i)->SetTransientsDrawnThisEvent(false); << 929     for (int i = 0; i < EOEModelList.size (); i++) {
2471     (*i)->SetTransientsDrawnThisRun(false);   << 930       G4VModel* pModel = EOEModelList [i];
                                                   >> 931       pModel -> SetModelingParameters (pMP);
                                                   >> 932       pModel -> DescribeYourselfTo (*fpSceneHandler);
                                                   >> 933       pModel -> SetModelingParameters (0);
                                                   >> 934     }
                                                   >> 935     delete pMP;
2472   }                                              936   }
2473 }                                                937 }
2474                                                  938 
2475 G4String G4VisManager::ViewerShortName (const    939 G4String G4VisManager::ViewerShortName (const G4String& viewerName) const {
2476   const G4String& viewerShortName = viewerNam << 940   G4String viewerShortName (viewerName);
2477   return G4StrUtil::strip_copy(viewerShortNam << 941   viewerShortName = viewerShortName (0, viewerShortName.find (' '));
                                                   >> 942   return viewerShortName.strip ();
2478 }                                                943 }
2479                                                  944 
2480 G4VViewer* G4VisManager::GetViewer (const G4S    945 G4VViewer* G4VisManager::GetViewer (const G4String& viewerName) const {
2481   G4String viewerShortName = ViewerShortName     946   G4String viewerShortName = ViewerShortName (viewerName);
2482   std::size_t nHandlers = fAvailableSceneHand << 947   G4int nHandlers = fAvailableSceneHandlers.size ();
2483   std::size_t iHandler, iViewer;              << 948   G4int iHandler, iViewer;
2484   G4VViewer* viewer = 0;                      << 949   G4VSceneHandler* sceneHandler;
                                                   >> 950   G4VViewer* viewer;
2485   G4bool found = false;                          951   G4bool found = false;
2486   for (iHandler = 0; iHandler < nHandlers; iH    952   for (iHandler = 0; iHandler < nHandlers; iHandler++) {
2487     G4VSceneHandler* sceneHandler = fAvailabl << 953     sceneHandler = fAvailableSceneHandlers [iHandler];
2488     const G4ViewerList& viewerList = sceneHan    954     const G4ViewerList& viewerList = sceneHandler -> GetViewerList ();
2489     for (iViewer = 0; iViewer < viewerList.si    955     for (iViewer = 0; iViewer < viewerList.size (); iViewer++) {
2490       viewer = viewerList [iViewer];             956       viewer = viewerList [iViewer];
2491       if (viewerShortName == viewer -> GetSho    957       if (viewerShortName == viewer -> GetShortName ()) {
2492   found = true;                                  958   found = true;
2493   break;                                         959   break;
2494       }                                          960       }
2495     }                                            961     }
2496     if (found) break;                            962     if (found) break;
2497   }                                              963   }
2498   if (found) return viewer;                      964   if (found) return viewer;
2499   else return 0;                                 965   else return 0;
2500 }                                                966 }
2501                                                  967 
2502 std::vector<G4String> G4VisManager::Verbosity << 
2503                                               << 
2504 G4String G4VisManager::VerbosityString(Verbos << 
2505   G4String rs;                                << 
2506   switch (verbosity) {                        << 
2507   case         quiet: rs = "quiet (0)"; break << 
2508   case       startup: rs = "startup (1)"; bre << 
2509   case        errors: rs = "errors (2)"; brea << 
2510   case      warnings: rs = "warnings (3)"; br << 
2511   case confirmations: rs = "confirmations (4) << 
2512   case    parameters: rs = "parameters (5)";  << 
2513   case           all: rs = "all (6)"; break;  << 
2514   }                                           << 
2515   return rs;                                  << 
2516 }                                             << 
2517                                               << 
2518 void G4VisManager::PrintAvailableVerbosity(st << 
2519 {                                             << 
2520   os << "Available verbosity options:";       << 
2521   for (std::size_t i = 0; i < VerbosityGuidan << 
2522     os << '\n' << VerbosityGuidanceStrings[i] << 
2523   }                                           << 
2524   os << "\nCurrent verbosity: " << G4VisManag << 
2525   os << std::endl;                            << 
2526 }                                             << 
2527                                               << 
2528 G4VisManager::Verbosity                       << 
2529 G4VisManager::GetVerbosityValue(const G4Strin << 
2530   G4String ss = G4StrUtil::to_lower_copy(verb << 
2531   Verbosity verbosity;                        << 
2532   if      (ss[0] == 'q') verbosity = quiet;   << 
2533   else if (ss[0] == 's') verbosity = startup; << 
2534   else if (ss[0] == 'e') verbosity = errors;  << 
2535   else if (ss[0] == 'w') verbosity = warnings << 
2536   else if (ss[0] == 'c') verbosity = confirma << 
2537   else if (ss[0] == 'p') verbosity = paramete << 
2538   else if (ss[0] == 'a') verbosity = all;     << 
2539   else {                                      << 
2540     // Could be an integer                    << 
2541     G4int intVerbosity;                       << 
2542     std::istringstream is(ss);                << 
2543     is >> intVerbosity;                       << 
2544     if (!is) {                                << 
2545       G4warn << "ERROR: G4VisManager::GetVerb << 
2546        << verbosityString << "\"\n";          << 
2547       PrintAvailableVerbosity(G4warn);        << 
2548       // Return existing verbosity            << 
2549       return fVerbosity;                      << 
2550     }                                         << 
2551     else {                                    << 
2552       verbosity = GetVerbosityValue(intVerbos << 
2553     }                                         << 
2554   }                                           << 
2555   return verbosity;                           << 
2556 }                                             << 
2557                                               << 
2558 G4VisManager::Verbosity G4VisManager::GetVerb << 
2559   Verbosity verbosity;                        << 
2560   if      (intVerbosity < quiet) verbosity =  << 
2561   else if (intVerbosity > all)   verbosity =  << 
2562   else                           verbosity =  << 
2563   return verbosity;                           << 
2564 }                                             << 
2565                                               << 
2566 G4VisManager::Verbosity G4VisManager::GetVerb << 
2567   return fVerbosity;                          << 
2568 }                                             << 
2569                                               << 
2570 void G4VisManager::SetVerboseLevel (G4int int << 
2571   fVerbosity = GetVerbosityValue(intVerbosity << 
2572 }                                             << 
2573                                               << 
2574 void G4VisManager::SetVerboseLevel (const G4S << 
2575   fVerbosity = GetVerbosityValue(verbosityStr << 
2576 }                                             << 
2577                                               << 
2578 G4bool G4VisManager::IsValidView () {            968 G4bool G4VisManager::IsValidView () {
2579                                                  969 
2580   if (!fInitialised) Initialise ();              970   if (!fInitialised) Initialise ();
2581                                                  971 
2582   static G4bool noGSPrinting = true;          << 972   fpConcreteInstance = 0;
2583   if (!fpGraphicsSystem) {                    << 973   // Unless we survive a few preliminary tests, users must not use.
2584     // Limit printing - we do not want printi << 974 
2585     // not want to use graphics, e.g., in bat << 975   if (!fpGraphicsSystem) return false;
2586     if (noGSPrinting) {                       << 976   // Simply return without printing - we do not want printing if the
2587       noGSPrinting = false;                   << 977   // user simply does not want to use graphics, e.g., in batch mode.
2588       if (fVerbosity >= warnings) {           << 
2589   G4warn <<                                   << 
2590   "WARNING: G4VisManager::IsValidView(): Atte << 
2591   "\n  has been instantiated.  Use \"/vis/ope << 
2592   "\n  Alternatively, to avoid this message,  << 
2593   "\n  manager (G4VisExecutive) and ensure dr << 
2594   "\n  G4VVisManager::GetConcreteInstance() i << 
2595         << G4endl;                            << 
2596       }                                       << 
2597     }                                         << 
2598     return false;                             << 
2599   }                                           << 
2600                                                  978 
2601   if ((!fpScene) || (!fpSceneHandler) || (!fp    979   if ((!fpScene) || (!fpSceneHandler) || (!fpViewer)) {
2602     if (fVerbosity >= errors) {               << 980     G4cout << "G4VisManager::IsValidView ():"
2603       G4warn <<                               << 981       "\n  Current view is not valid.";
2604   "ERROR: G4VisManager::IsValidView(): Curren << 982     G4cout << G4endl;
2605        << G4endl;                             << 983     PrintInvalidPointers ();
2606       PrintInvalidPointers ();                << 
2607     }                                         << 
2608     return false;                                984     return false;
2609   }                                              985   }
2610                                                  986 
2611   if (fpScene != fpSceneHandler -> GetScene (    987   if (fpScene != fpSceneHandler -> GetScene ()) {
2612     if (fVerbosity >= errors) {               << 988     G4cout << "G4VisManager::IsValidView ():";
2613       G4warn << "ERROR: G4VisManager::IsValid << 989     if (fpSceneHandler -> GetScene ()) {
2614       if (fpSceneHandler -> GetScene ()) {    << 990       G4cout <<
2615   G4warn <<                                   << 991   "\n  The current scene \""
2616     "\n  The current scene \""                << 992        << fpScene -> GetName ()
2617          << fpScene -> GetName ()             << 993        << "\" is not handled by"
2618          << "\" is not handled by"            << 994   "\n  the current scene handler \""
2619     "\n  the current scene handler \""        << 995        << fpSceneHandler -> GetName ()
2620          << fpSceneHandler -> GetName ()      << 996        << "\""
2621          << "\""                              << 997   "\n  (it currently handles scene \""
2622     "\n  (it currently handles scene \""      << 998        << fpSceneHandler -> GetScene () -> GetName ()
2623          << fpSceneHandler -> GetScene () ->  << 999        << "\")."
2624          << "\")."                            << 1000   "\n  Either:"
2625     "\n  Either:"                             << 1001   "\n  (a) attach it to the scene handler with"
2626     "\n  (a) attach it to the scene handler w << 1002   "\n      /vis/sceneHandler/attach "
2627     "\n      /vis/sceneHandler/attach "       << 1003        << fpScene -> GetName ()
2628          << fpScene -> GetName ()             << 1004        << ", or"
2629          << ", or"                            << 1005   "\n  (b) create a new scene handler with "
2630     "\n  (b) create a new scene handler with  << 1006   "\n      /vis/sceneHandler/create <graphics-system>,"
2631     "\n      /vis/sceneHandler/create <graphi << 1007   "\n      in which case it should pick up the the new scene."
2632     "\n      in which case it should pick up  << 1008        << G4endl;
2633          << G4endl;                           << 1009     }
2634       }                                       << 1010     else {
2635       else {                                  << 1011       G4cout << "\n  Scene handler \""
2636   G4warn << "\n  Scene handler \""            << 1012        << fpSceneHandler -> GetName ()
2637          << fpSceneHandler -> GetName ()      << 1013        << "\" has null scene pointer."
2638          << "\" has null scene pointer."      << 1014   "\n  Attach a scene with /vis/sceneHandler/attach [<scene-name>]"
2639     "\n  Attach a scene with /vis/sceneHandle << 1015        << G4endl;
2640          << G4endl;                           << 
2641       }                                       << 
2642     }                                            1016     }
2643     return false;                                1017     return false;
2644   }                                              1018   }
2645                                                  1019 
2646   const G4ViewerList& viewerList = fpSceneHan    1020   const G4ViewerList& viewerList = fpSceneHandler -> GetViewerList ();
2647   if (viewerList.size () == 0) {                 1021   if (viewerList.size () == 0) {
2648     if (fVerbosity >= errors) {               << 1022     G4cout << "G4VisManager::IsValidView (): the current scene handler\n  \""
2649       G4warn <<                               << 1023      << fpSceneHandler -> GetName ()
2650   "ERROR: G4VisManager::IsValidView (): the c << 1024      << "\" has no viewers.  Do /vis/viewer/create."
2651        << fpSceneHandler -> GetName ()        << 1025      << G4endl;
2652        << "\" has no viewers.  Do /vis/viewer << 
2653        << G4endl;                             << 
2654     }                                         << 
2655     return false;                                1026     return false;
2656   }                                              1027   }
2657                                                  1028 
                                                   >> 1029   fpConcreteInstance = this;  // Unless we find another problem, users can use!
2658   G4bool isValid = true;                         1030   G4bool isValid = true;
2659   if (fpScene -> IsEmpty ()) {  // Add world  << 1031   if (fpScene -> IsEmpty ()) {
2660     G4bool warn(fVerbosity >= warnings);      << 1032     fpScene -> AddWorldIfEmpty ();  // Add world by default if possible.
2661     G4bool successful = fpScene -> AddWorldIf << 1033     if (fpScene -> IsEmpty ()) {    // If still empty...
2662     if (!successful || fpScene -> IsEmpty ()) << 1034       G4cout << "G4VisManager::IsViewValid ():";
2663       if (fVerbosity >= errors) {             << 1035       G4cout <<
2664   G4warn << "ERROR: G4VisManager::IsValidView << 1036   "\n  Attempt at some drawing operation when scene is empty."
2665   G4warn <<                                   << 1037   "\n  Maybe the geometry has not yet been defined."
2666     "\n  Attempt at some drawing operation wh << 1038   "  Try /run/initialize."
2667     "\n  Maybe the geometry has not yet been  << 1039        << G4endl;
2668     "  Try /run/initialize."                  << 
2669           "\n  Or use \"/vis/scene/add/extent << 
2670          << G4endl;                           << 
2671       }                                       << 
2672       isValid = false;                           1040       isValid = false;
                                                   >> 1041       fpConcreteInstance = 0;  // Users must not use!
2673     }                                            1042     }
2674     else {                                       1043     else {
2675       G4UImanager::GetUIpointer()->ApplyComma << 1044       G4UImanager::GetUIpointer () -> ApplyCommand ("/vis/camera/reset");
2676       if (fVerbosity >= warnings) {           << 1045       G4cout <<
2677   G4warn <<                                   << 1046   "G4VisManager: the scene was empty, \"world\" has been added"
2678     "WARNING: G4VisManager: the scene was emp << 1047   "\n  and the view parameters have been reset.";
2679     "\n  added and the scene handlers notifie << 1048       G4cout << G4endl;
2680   G4warn << G4endl;                           << 
2681       }                                       << 
2682     }                                            1049     }
2683   }                                              1050   }
2684   return isValid;                                1051   return isValid;
2685 }                                                1052 }
2686                                                  1053 
2687 void                                          << 1054 void G4VisManager::PrintCommandDeprecation(const G4String& message) {
2688 G4VisManager::RegisterModelFactories()        << 1055   G4cout <<
2689 {                                             << 1056     "**** DEPRECATED COMMAND ***"
2690   if (fVerbosity >= warnings) {               << 1057     "\n****  Will be discontinued as a \"/vis/\" command after Geant4 3.0."
2691     G4warn<<"G4VisManager: No model factories << 1058     "\n****  Will still be available as a \"/vis~/\" command for a while."
2692     G4warn<<"G4VisManager::RegisterModelFacto << 1059     "\n****  " << message << G4endl;
2693     G4warn<<"class. See G4VisExecutive for an << 1060 }
2694   }                                           << 1061 
2695 }                                             << 1062 // "No functionality" graphics systems to trap accidental attempt to
                                                   >> 1063 // use unbuilt systems.
                                                   >> 1064 
                                                   >> 1065 #ifndef G4VIS_BUILD_DAWN_DRIVER
                                                   >> 1066 
                                                   >> 1067 class G4FukuiRenderer: public G4VGraphicsSystem {
                                                   >> 1068 public:
                                                   >> 1069   G4FukuiRenderer ();
                                                   >> 1070 };
                                                   >> 1071 G4FukuiRenderer::G4FukuiRenderer ():
                                                   >> 1072   G4VGraphicsSystem ("FukuiRenderer",
                                                   >> 1073                      "DAWN",
                                                   >> 1074          G4VGraphicsSystem::noFunctionality) {}
2696                                                  1075 
2697 void G4VisManager::SetUpForAThread()          << 
2698 {                                             << 
2699   // TODO: protect with G4Threading::IsMultit << 
2700 #ifdef G4MULTITHREADED                        << 
2701   new G4VisStateDependent(this);              << 
2702 #endif                                           1076 #endif
2703 }                                             << 
2704                                                  1077 
2705 void G4VisManager::IgnoreStateChanges(G4bool  << 1078 #ifndef G4VIS_BUILD_DAWNFILE_DRIVER
2706 {                                             << 1079 
2707   fIgnoreStateChanges = val;                  << 1080 class G4DAWNFILE: public G4VGraphicsSystem {
2708 }                                             << 1081 public:
                                                   >> 1082   G4DAWNFILE ();
                                                   >> 1083 };
                                                   >> 1084 G4DAWNFILE::G4DAWNFILE ():
                                                   >> 1085   G4VGraphicsSystem ("FukuiRendererFile",
                                                   >> 1086                      "DAWNFILE",
                                                   >> 1087          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1088 
                                                   >> 1089 #endif
                                                   >> 1090 
                                                   >> 1091 #ifndef G4VIS_BUILD_RAYTRACER_DRIVER
                                                   >> 1092 
                                                   >> 1093 class G4RayTracer: public G4VGraphicsSystem {
                                                   >> 1094 public:
                                                   >> 1095   G4RayTracer ();
                                                   >> 1096 };
                                                   >> 1097 G4RayTracer::G4RayTracer ():
                                                   >> 1098   G4VGraphicsSystem ("RayTracer",
                                                   >> 1099                      "RayTracer",
                                                   >> 1100          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1101 
                                                   >> 1102 #endif
                                                   >> 1103 
                                                   >> 1104 #ifndef G4VIS_BUILD_OPACS_DRIVER
                                                   >> 1105 
                                                   >> 1106 class G4Wo: public G4VGraphicsSystem {
                                                   >> 1107 public:
                                                   >> 1108   G4Wo ();
                                                   >> 1109 };
                                                   >> 1110 G4Wo::G4Wo ():
                                                   >> 1111   G4VGraphicsSystem ("Wo",
                                                   >> 1112          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1113 
                                                   >> 1114 class G4Xo: public G4VGraphicsSystem {
                                                   >> 1115 public:
                                                   >> 1116   G4Xo ();
                                                   >> 1117 };
                                                   >> 1118 G4Xo::G4Xo ():
                                                   >> 1119   G4VGraphicsSystem ("Xo",
                                                   >> 1120          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1121 
                                                   >> 1122 #endif
                                                   >> 1123 
                                                   >> 1124 #ifndef G4VIS_BUILD_OPENGLX_DRIVER
                                                   >> 1125 
                                                   >> 1126 class G4OpenGLImmediateX: public G4VGraphicsSystem {
                                                   >> 1127 public:
                                                   >> 1128   G4OpenGLImmediateX ();
                                                   >> 1129 };
                                                   >> 1130 G4OpenGLImmediateX::G4OpenGLImmediateX ():
                                                   >> 1131   G4VGraphicsSystem ("OpenGLImmediateX",
                                                   >> 1132                      "OGLIX",
                                                   >> 1133          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1134 
                                                   >> 1135 class G4OpenGLStoredX: public G4VGraphicsSystem {
                                                   >> 1136 public:
                                                   >> 1137   G4OpenGLStoredX ();
                                                   >> 1138 };
                                                   >> 1139 G4OpenGLStoredX::G4OpenGLStoredX ():
                                                   >> 1140   G4VGraphicsSystem ("OpenGLStoredX",
                                                   >> 1141                      "OGLSX",
                                                   >> 1142          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1143 
                                                   >> 1144 #endif
                                                   >> 1145 
                                                   >> 1146 #ifndef G4VIS_BUILD_OPENGLXM_DRIVER
                                                   >> 1147 
                                                   >> 1148 class G4OpenGLImmediateXm: public G4VGraphicsSystem {
                                                   >> 1149 public:
                                                   >> 1150   G4OpenGLImmediateXm ();
                                                   >> 1151 };
                                                   >> 1152 G4OpenGLImmediateXm::G4OpenGLImmediateXm ():
                                                   >> 1153   G4VGraphicsSystem ("OpenGLImmediateXm",
                                                   >> 1154                      "OGLIXm",
                                                   >> 1155          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1156 
                                                   >> 1157 class G4OpenGLStoredXm: public G4VGraphicsSystem {
                                                   >> 1158 public:
                                                   >> 1159   G4OpenGLStoredXm ();
                                                   >> 1160 };
                                                   >> 1161 G4OpenGLStoredXm::G4OpenGLStoredXm ():
                                                   >> 1162   G4VGraphicsSystem ("OpenGLStoredXm",
                                                   >> 1163                      "OGLSXm",
                                                   >> 1164          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1165 
                                                   >> 1166 #endif
                                                   >> 1167 
                                                   >> 1168 #ifndef G4VIS_BUILD_OIX_DRIVER
                                                   >> 1169 
                                                   >> 1170 class G4OpenInventorX: public G4VGraphicsSystem {
                                                   >> 1171 public:
                                                   >> 1172   G4OpenInventorX ();
                                                   >> 1173 };
                                                   >> 1174 G4OpenInventorX::G4OpenInventorX ():
                                                   >> 1175   G4VGraphicsSystem ("OpenInventorX",
                                                   >> 1176          "OIX",
                                                   >> 1177          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1178 
                                                   >> 1179 #endif
                                                   >> 1180 
                                                   >> 1181 #ifndef G4VIS_BUILD_OIWIN32_DRIVER
                                                   >> 1182 
                                                   >> 1183 class G4OpenInventorWin32: public G4VGraphicsSystem {
                                                   >> 1184 public:
                                                   >> 1185   G4OpenInventorWin32 ();
                                                   >> 1186 };
                                                   >> 1187 G4OpenInventorWin32::G4OpenInventorWin32 ():
                                                   >> 1188   G4VGraphicsSystem ("OpenInventorWin32",
                                                   >> 1189          "OIWIN32",
                                                   >> 1190          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1191 
                                                   >> 1192 #endif
                                                   >> 1193 
                                                   >> 1194 #ifndef G4VIS_BUILD_VRML_DRIVER
                                                   >> 1195 
                                                   >> 1196 class G4VRML1: public G4VGraphicsSystem {
                                                   >> 1197 public:
                                                   >> 1198   G4VRML1 ();
                                                   >> 1199 };
                                                   >> 1200 G4VRML1::G4VRML1 ():
                                                   >> 1201   G4VGraphicsSystem ("VRML1.0",
                                                   >> 1202          "VRML1",
                                                   >> 1203          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1204 
                                                   >> 1205 class G4VRML2: public G4VGraphicsSystem {
                                                   >> 1206 public:
                                                   >> 1207   G4VRML2 ();
                                                   >> 1208 };
                                                   >> 1209 G4VRML2::G4VRML2 ():
                                                   >> 1210   G4VGraphicsSystem ("VRML2.0",
                                                   >> 1211          "VRML2",
                                                   >> 1212          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1213 
                                                   >> 1214 #endif
                                                   >> 1215 
                                                   >> 1216 #ifndef G4VIS_BUILD_VRMLFILE_DRIVER
                                                   >> 1217 
                                                   >> 1218 class G4VRML1File: public G4VGraphicsSystem {
                                                   >> 1219 public:
                                                   >> 1220   G4VRML1File ();
                                                   >> 1221 };
                                                   >> 1222 G4VRML1File::G4VRML1File ():
                                                   >> 1223   G4VGraphicsSystem ("VRML1.0File",
                                                   >> 1224          "VRML1File",
                                                   >> 1225          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1226 
                                                   >> 1227 class G4VRML2File: public G4VGraphicsSystem {
                                                   >> 1228 public:
                                                   >> 1229   G4VRML2File ();
                                                   >> 1230 };
                                                   >> 1231 G4VRML2File::G4VRML2File ():
                                                   >> 1232   G4VGraphicsSystem ("VRML2.0File",
                                                   >> 1233          "VRML2File",
                                                   >> 1234          G4VGraphicsSystem::noFunctionality) {}
                                                   >> 1235 
                                                   >> 1236 #endif
2709                                                  1237