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

Last change on this file since 1146 was 1140, checked in by garnier, 15 years ago

update to CVS

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