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

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

update from CVS

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