Geant4 Cross Reference

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

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

Diff markup

Differences between /visualization/management/src/G4VisCommandsSceneAdd.cc (Version 11.3.0) and /visualization/management/src/G4VisCommandsSceneAdd.cc (Version 1.1)


                                                   >>   1 // This code implementation is the intellectual property of
                                                   >>   2 // the GEANT4 collaboration.
  1 //                                                  3 //
  2 // ******************************************* <<   4 // By copying, distributing or modifying the Program (or any work
  3 // * License and Disclaimer                    <<   5 // based on the Program) you indicate your acceptance of this statement,
  4 // *                                           <<   6 // and all its terms.
  5 // * The  Geant4 software  is  copyright of th << 
  6 // * the Geant4 Collaboration.  It is provided << 
  7 // * conditions of the Geant4 Software License << 
  8 // * LICENSE and available at  http://cern.ch/ << 
  9 // * include a list of copyright holders.      << 
 10 // *                                           << 
 11 // * Neither the authors of this software syst << 
 12 // * institutes,nor the agencies providing fin << 
 13 // * work  make  any representation or  warran << 
 14 // * regarding  this  software system or assum << 
 15 // * use.  Please see the license in the file  << 
 16 // * for the full disclaimer and the limitatio << 
 17 // *                                           << 
 18 // * This  code  implementation is the result  << 
 19 // * technical work of the GEANT4 collaboratio << 
 20 // * By using,  copying,  modifying or  distri << 
 21 // * any work based  on the software)  you  ag << 
 22 // * use  in  resulting  scientific  publicati << 
 23 // * acceptance of all terms of the Geant4 Sof << 
 24 // ******************************************* << 
 25 //                                                  7 //
 26 //                                             <<   8 // $Id: G4VisCommandsSceneAdd.cc,v 1.9 1999/12/15 14:54:26 gunter Exp $
 27 // /vis/scene/add commands - John Allison  9th <<   9 // GEANT4 tag $Name: geant4-01-01 $
                                                   >>  10 
                                                   >>  11 // /vis/scene commands - John Allison  9th August 1998
 28                                                    12 
 29 #include "G4VisCommandsSceneAdd.hh"                13 #include "G4VisCommandsSceneAdd.hh"
 30                                                    14 
                                                   >>  15 #include "G4VisManager.hh"
 31 #include "G4TransportationManager.hh"              16 #include "G4TransportationManager.hh"
 32 #include "G4LogicalVolumeStore.hh"                 17 #include "G4LogicalVolumeStore.hh"
 33 #include "G4PhysicalVolumeModel.hh"                18 #include "G4PhysicalVolumeModel.hh"
 34 #include "G4LogicalVolumeModel.hh"                 19 #include "G4LogicalVolumeModel.hh"
 35 #include "G4ModelingParameters.hh"                 20 #include "G4ModelingParameters.hh"
 36 #include "G4HitsModel.hh"                      <<  21 #include "G4PhysicalVolumeSearchScene.hh"
 37 #include "G4DigiModel.hh"                      <<  22 #include "G4VGlobalFastSimulationManager.hh"
 38 #include "G4GPSModel.hh"                       << 
 39 #include "G4ElectricFieldModel.hh"             << 
 40 #include "G4MagneticFieldModel.hh"             << 
 41 #include "G4PSHitsModel.hh"                    << 
 42 #include "G4TrajectoriesModel.hh"              << 
 43 #include "G4TextModel.hh"                      << 
 44 #include "G4ArrowModel.hh"                     << 
 45 #include "G4AxesModel.hh"                      << 
 46 #include "G4PlotterModel.hh"                   << 
 47 #include "G4PhysicalVolumesSearchScene.hh"     << 
 48 #include "G4ParticleTable.hh"                      23 #include "G4ParticleTable.hh"
 49 #include "G4ParticleDefinition.hh"                 24 #include "G4ParticleDefinition.hh"
                                                   >>  25 #include "G4FlavoredParallelWorldModel.hh"
 50 #include "G4ApplicationState.hh"                   26 #include "G4ApplicationState.hh"
 51 #include "G4VUserVisAction.hh"                 << 
 52 #include "G4CallbackModel.hh"                  << 
 53 #include "G4UnionSolid.hh"                     << 
 54 #include "G4SubtractionSolid.hh"               << 
 55 #include "G4Polyhedron.hh"                     << 
 56 #include "G4UImanager.hh"                      << 
 57 #include "G4UIcommandTree.hh"                  << 
 58 #include "G4UIcommand.hh"                          27 #include "G4UIcommand.hh"
 59 #include "G4UIcmdWithAString.hh"                   28 #include "G4UIcmdWithAString.hh"
 60 #include "G4UIcmdWithoutParameter.hh"          <<  29 #include "G4ios.hh"
 61 #include "G4UIcmdWithAnInteger.hh"             <<  30 #include "g4std/strstream"
 62 #include "G4Tokenizer.hh"                      << 
 63 #include "G4RunManager.hh"                     << 
 64 #include "G4RunManagerFactory.hh"              << 
 65 #include "G4StateManager.hh"                   << 
 66 #include "G4Run.hh"                            << 
 67 #include "G4Event.hh"                          << 
 68 #include "G4Trajectory.hh"                     << 
 69 #include "G4TrajectoryPoint.hh"                << 
 70 #include "G4RichTrajectory.hh"                 << 
 71 #include "G4RichTrajectoryPoint.hh"            << 
 72 #include "G4SmoothTrajectory.hh"               << 
 73 #include "G4SmoothTrajectoryPoint.hh"          << 
 74 #include "G4AttDef.hh"                         << 
 75 #include "G4AttCheck.hh"                       << 
 76 #include "G4Polyline.hh"                       << 
 77 #include "G4UnitsTable.hh"                     << 
 78 #include "G4PhysicalConstants.hh"              << 
 79 #include "G4SystemOfUnits.hh"                  << 
 80 #include "G4GeneralParticleSourceData.hh"      << 
 81 #include "G4PlotterManager.hh"                 << 
 82                                                << 
 83 #include <sstream>                             << 
 84                                                << 
 85 #define G4warn G4cout                          << 
 86                                                << 
 87 ////////////// /vis/scene/add/arrow ////////// << 
 88                                                << 
 89 G4VisCommandSceneAddArrow::G4VisCommandSceneAd << 
 90   fpCommand = new G4UIcommand("/vis/scene/add/ << 
 91   fpCommand -> SetGuidance ("Adds arrow to cur << 
 92   G4bool omitable;                             << 
 93   G4UIparameter* parameter;                    << 
 94   parameter = new G4UIparameter ("x1", 'd', om << 
 95   fpCommand -> SetParameter (parameter);       << 
 96   parameter = new G4UIparameter ("y1", 'd', om << 
 97   fpCommand -> SetParameter (parameter);       << 
 98   parameter = new G4UIparameter ("z1", 'd', om << 
 99   fpCommand -> SetParameter (parameter);       << 
100   parameter = new G4UIparameter ("x2", 'd', om << 
101   fpCommand -> SetParameter (parameter);       << 
102   parameter = new G4UIparameter ("y2", 'd', om << 
103   fpCommand -> SetParameter (parameter);       << 
104   parameter = new G4UIparameter ("z2", 'd', om << 
105   fpCommand -> SetParameter (parameter);       << 
106   parameter =  new G4UIparameter ("unit", 's', << 
107   parameter->SetDefaultValue ("m");            << 
108   fpCommand->SetParameter    (parameter);      << 
109 }                                              << 
110                                                << 
111 G4VisCommandSceneAddArrow::~G4VisCommandSceneA << 
112   delete fpCommand;                            << 
113 }                                              << 
114                                                << 
115 G4String G4VisCommandSceneAddArrow::GetCurrent << 
116   return "";                                   << 
117 }                                              << 
118                                                << 
119 void G4VisCommandSceneAddArrow::SetNewValue (G << 
120 {                                              << 
121   G4VisManager::Verbosity verbosity = fpVisMan << 
122   G4bool warn(verbosity >= G4VisManager::warni << 
123                                                << 
124   G4Scene* pScene = fpVisManager->GetCurrentSc << 
125   if (!pScene) {                               << 
126     if (verbosity >= G4VisManager::errors) {   << 
127       G4warn << "ERROR: No current scene.  Ple << 
128     }                                          << 
129     return;                                    << 
130   }                                            << 
131                                                << 
132   G4String unitString;                         << 
133   G4double x1, y1, z1, x2, y2, z2;             << 
134   std::istringstream is(newValue);             << 
135   is >> x1 >> y1 >> z1 >> x2 >> y2 >> z2 >> un << 
136   G4double unit = G4UIcommand::ValueOf(unitStr << 
137   x1 *= unit; y1 *= unit; z1 *= unit;          << 
138   x2 *= unit; y2 *= unit; z2 *= unit;          << 
139                                                << 
140   // Consult scene for arrow width.            << 
141   const G4VisExtent& sceneExtent = pScene->Get << 
142   G4double arrowWidth =                        << 
143     0.005 * fCurrentLineWidth * sceneExtent.Ge << 
144                                                << 
145   G4VModel* model = new G4ArrowModel           << 
146     (x1, y1, z1, x2, y2, z2,                   << 
147      arrowWidth, fCurrentColour, newValue,     << 
148      fCurrentArrow3DLineSegmentsPerCircle);    << 
149                                                << 
150   const G4String& currentSceneName = pScene -> << 
151   G4bool successful = pScene -> AddRunDuration << 
152   if (successful) {                            << 
153     if (verbosity >= G4VisManager::confirmatio << 
154       G4cout << "Arrow has been added to scene << 
155        << currentSceneName << "\"."            << 
156        << G4endl;                              << 
157     }                                          << 
158   }                                            << 
159   else G4VisCommandsSceneAddUnsuccessful(verbo << 
160                                                << 
161   CheckSceneAndNotifyHandlers (pScene);        << 
162 }                                              << 
163                                                << 
164 ////////////// /vis/scene/add/arrow2D //////// << 
165                                                << 
166 G4VisCommandSceneAddArrow2D::G4VisCommandScene << 
167   fpCommand = new G4UIcommand("/vis/scene/add/ << 
168   fpCommand -> SetGuidance ("Adds 2D arrow to  << 
169   fpCommand -> SetGuidance ("x,y in range [-1, << 
170   G4bool omitable;                             << 
171   G4UIparameter* parameter;                    << 
172   parameter = new G4UIparameter ("x1", 'd', om << 
173   fpCommand -> SetParameter (parameter);       << 
174   parameter = new G4UIparameter ("y1", 'd', om << 
175   fpCommand -> SetParameter (parameter);       << 
176   parameter = new G4UIparameter ("x2", 'd', om << 
177   fpCommand -> SetParameter (parameter);       << 
178   parameter = new G4UIparameter ("y2", 'd', om << 
179   fpCommand -> SetParameter (parameter);       << 
180 }                                              << 
181                                                << 
182 G4VisCommandSceneAddArrow2D::~G4VisCommandScen << 
183   delete fpCommand;                            << 
184 }                                              << 
185                                                << 
186 G4String G4VisCommandSceneAddArrow2D::GetCurre << 
187   return "";                                   << 
188 }                                              << 
189                                                << 
190 void G4VisCommandSceneAddArrow2D::SetNewValue  << 
191 {                                              << 
192   G4VisManager::Verbosity verbosity = fpVisMan << 
193   G4bool warn(verbosity >= G4VisManager::warni << 
194                                                << 
195   G4Scene* pScene = fpVisManager->GetCurrentSc << 
196   if (!pScene) {                               << 
197     if (verbosity >= G4VisManager::errors) {   << 
198       G4warn << "ERROR: No current scene.  Ple << 
199     }                                          << 
200     return;                                    << 
201   }                                            << 
202                                                << 
203   G4double x1, y1, x2, y2;                     << 
204   std::istringstream is(newValue);             << 
205   is >> x1 >> y1 >> x2 >> y2;                  << 
206                                                << 
207   Arrow2D* arrow2D = new Arrow2D               << 
208     (x1, y1, x2, y2, fCurrentLineWidth, fCurre << 
209   G4VModel* model =                            << 
210     new G4CallbackModel<G4VisCommandSceneAddAr << 
211   model->SetType("Arrow2D");                   << 
212   model->SetGlobalTag("Arrow2D");              << 
213   model->SetGlobalDescription("Arrow2D: " + ne << 
214   const G4String& currentSceneName = pScene -> << 
215   G4bool successful = pScene -> AddRunDuration << 
216   if (successful) {                            << 
217     if (verbosity >= G4VisManager::confirmatio << 
218       G4cout << "A 2D arrow has been added to  << 
219        << currentSceneName << "\"."            << 
220        << G4endl;                              << 
221     }                                          << 
222   }                                            << 
223   else G4VisCommandsSceneAddUnsuccessful(verbo << 
224                                                << 
225   CheckSceneAndNotifyHandlers (pScene);        << 
226 }                                              << 
227                                                << 
228 G4VisCommandSceneAddArrow2D::Arrow2D::Arrow2D  << 
229 (G4double x1, G4double y1,                     << 
230  G4double x2, G4double y2,                     << 
231  G4double width, const G4Colour& colour):      << 
232   fWidth(width), fColour(colour)               << 
233 {                                              << 
234   fShaftPolyline.push_back(G4Point3D(x1,y1,0)) << 
235   fShaftPolyline.push_back(G4Point3D(x2,y2,0)) << 
236   G4Vector3D arrowDirection = G4Vector3D(x2-x1 << 
237   G4Vector3D arrowPointLeftDirection(arrowDire << 
238   arrowPointLeftDirection.rotateZ(150.*deg);   << 
239   G4Vector3D arrowPointRightDirection(arrowDir << 
240   arrowPointRightDirection.rotateZ(-150.*deg); << 
241   fHeadPolyline.push_back(G4Point3D(x2,y2,0)+0 << 
242   fHeadPolyline.push_back(G4Point3D(x2,y2,0)); << 
243   fHeadPolyline.push_back(G4Point3D(x2,y2,0)+0 << 
244   G4VisAttributes va;                          << 
245   va.SetLineWidth(fWidth);                     << 
246   va.SetColour(fColour);                       << 
247   fShaftPolyline.SetVisAttributes(va);         << 
248   fHeadPolyline.SetVisAttributes(va);          << 
249 }                                              << 
250                                                << 
251 void G4VisCommandSceneAddArrow2D::Arrow2D::ope << 
252   (G4VGraphicsScene& sceneHandler, const G4Mod << 
253 {                                              << 
254   sceneHandler.BeginPrimitives2D();            << 
255   sceneHandler.AddPrimitive(fShaftPolyline);   << 
256   sceneHandler.AddPrimitive(fHeadPolyline);    << 
257   sceneHandler.EndPrimitives2D();              << 
258 }                                              << 
259                                                << 
260 ////////////// /vis/scene/add/axes /////////// << 
261                                                << 
262 G4VisCommandSceneAddAxes::G4VisCommandSceneAdd << 
263   G4bool omitable;                             << 
264   fpCommand = new G4UIcommand ("/vis/scene/add << 
265   fpCommand -> SetGuidance ("Add axes.");      << 
266   fpCommand -> SetGuidance                     << 
267   ("Draws axes at (x0, y0, z0) of given length << 
268   fpCommand -> SetGuidance                     << 
269   ("If \"colour-string\" is \"auto\", x, y and << 
270    "\n  respectively.  Otherwise it can be one << 
271    "\n  colours - see information printed by t << 
272    "\n  use \"/vis/list\".");                  << 
273   fpCommand -> SetGuidance                     << 
274   ("If \"length\" is negative, it is set to ab << 
275   fpCommand -> SetGuidance                     << 
276   ("If \"showtext\" is false, annotations are  << 
277   G4UIparameter* parameter;                    << 
278   parameter =  new G4UIparameter ("x0", 'd', o << 
279   parameter->SetDefaultValue (0.);             << 
280   fpCommand->SetParameter (parameter);         << 
281   parameter =  new G4UIparameter ("y0", 'd', o << 
282   parameter->SetDefaultValue (0.);             << 
283   fpCommand->SetParameter (parameter);         << 
284   parameter =  new G4UIparameter ("z0", 'd', o << 
285   parameter->SetDefaultValue (0.);             << 
286   fpCommand->SetParameter (parameter);         << 
287   parameter =  new G4UIparameter ("length", 'd << 
288   parameter->SetDefaultValue (-1.);            << 
289   fpCommand->SetParameter (parameter);         << 
290   parameter =  new G4UIparameter ("unit", 's', << 
291   parameter->SetDefaultValue ("m");            << 
292   fpCommand->SetParameter (parameter);         << 
293   parameter =  new G4UIparameter ("colour-stri << 
294   parameter->SetDefaultValue  ("auto");        << 
295   fpCommand->SetParameter (parameter);         << 
296   parameter =  new G4UIparameter ("showtext",  << 
297   parameter->SetDefaultValue  ("true");        << 
298   fpCommand->SetParameter (parameter);         << 
299 }                                              << 
300                                                << 
301 G4VisCommandSceneAddAxes::~G4VisCommandSceneAd << 
302   delete fpCommand;                            << 
303 }                                              << 
304                                                << 
305 G4String G4VisCommandSceneAddAxes::GetCurrentV << 
306   return "";                                   << 
307 }                                              << 
308                                                << 
309 void G4VisCommandSceneAddAxes::SetNewValue (G4 << 
310                                                << 
311   G4VisManager::Verbosity verbosity = fpVisMan << 
312   G4bool warn(verbosity >= G4VisManager::warni << 
313                                                << 
314   G4Scene* pScene = fpVisManager->GetCurrentSc << 
315   if (!pScene) {                               << 
316     if (verbosity >= G4VisManager::errors) {   << 
317       G4warn << "ERROR: No current scene.  Ple << 
318     }                                          << 
319     return;                                    << 
320   } else {                                     << 
321     if (pScene->GetExtent().GetExtentRadius()  << 
322       if (verbosity >= G4VisManager::errors) { << 
323         G4warn                                 << 
324   << "ERROR: Scene has no extent. Add volumes  << 
325         << G4endl;                             << 
326       }                                        << 
327       return;                                  << 
328     }                                          << 
329   }                                            << 
330                                                << 
331   G4String unitString, colourString, showTextS << 
332   G4double x0, y0, z0, length;                 << 
333   std::istringstream is (newValue);            << 
334   is >> x0 >> y0 >> z0 >> length >> unitString << 
335   >> colourString >> showTextString;           << 
336   G4bool showText = G4UIcommand::ConvertToBool << 
337                                                << 
338                                                << 
339   G4double unit = G4UIcommand::ValueOf(unitStr << 
340   x0 *= unit; y0 *= unit; z0 *= unit;          << 
341   const G4VisExtent& sceneExtent = pScene->Get << 
342   if (length < 0.) {                           << 
343     const G4double lengthMax = 0.5 * sceneExte << 
344     const G4double intLog10Length = std::floor << 
345     length = std::pow(10,intLog10Length);      << 
346     if (5.*length < lengthMax) length *= 5.;   << 
347     else if (2.*length < lengthMax) length *=  << 
348   } else {                                     << 
349     length *= unit;                            << 
350   }                                            << 
351                                                << 
352   // Consult scene for arrow width...          << 
353   G4double arrowWidth =                        << 
354     0.05 * fCurrentLineWidth * sceneExtent.Get << 
355   // ...but limit it to length/30.             << 
356   if (arrowWidth > length/30.) arrowWidth = le << 
357                                                << 
358   G4VModel* model = new G4AxesModel            << 
359     (x0, y0, z0, length, arrowWidth, colourStr << 
360      showText, fCurrentTextSize);              << 
361                                                << 
362   G4bool successful = pScene -> AddRunDuration << 
363   const G4String& currentSceneName = pScene -> << 
364   if (successful) {                            << 
365     if (verbosity >= G4VisManager::confirmatio << 
366       G4cout << "Axes of length " << G4BestUni << 
367       << "have been added to scene \"" << curr << 
368       << G4endl;                               << 
369     }                                          << 
370   }                                            << 
371   else G4VisCommandsSceneAddUnsuccessful(verbo << 
372                                                << 
373   CheckSceneAndNotifyHandlers (pScene);        << 
374 }                                              << 
375                                                << 
376 ////////////// /vis/scene/add/date /////////// << 
377                                                << 
378 G4VisCommandSceneAddDate::G4VisCommandSceneAdd << 
379   G4bool omitable;                             << 
380   fpCommand = new G4UIcommand ("/vis/scene/add << 
381   fpCommand -> SetGuidance ("Adds date to curr << 
382   fpCommand -> SetGuidance                     << 
383   ("If \"date\"is omitted, the current date an << 
384    "\nOtherwise, the string, including the res << 
385   G4UIparameter* parameter;                    << 
386   parameter = new G4UIparameter ("size", 'i',  << 
387   parameter -> SetGuidance ("Screen size of te << 
388   parameter -> SetDefaultValue (18);           << 
389   fpCommand -> SetParameter (parameter);       << 
390   parameter = new G4UIparameter ("x-position", << 
391   parameter -> SetGuidance ("x screen position << 
392   parameter -> SetDefaultValue (0.95);         << 
393   fpCommand -> SetParameter (parameter);       << 
394   parameter = new G4UIparameter ("y-position", << 
395   parameter -> SetGuidance ("y screen position << 
396   parameter -> SetDefaultValue (0.9);          << 
397   fpCommand -> SetParameter (parameter);       << 
398   parameter = new G4UIparameter ("layout", 's' << 
399   parameter -> SetGuidance ("Layout, i.e., adj << 
400   parameter -> SetDefaultValue ("right");      << 
401   fpCommand -> SetParameter (parameter);       << 
402   parameter = new G4UIparameter ("date", 's',  << 
403   parameter -> SetDefaultValue ("-");          << 
404   fpCommand -> SetParameter (parameter);       << 
405 }                                              << 
406                                                << 
407 G4VisCommandSceneAddDate::~G4VisCommandSceneAd << 
408   delete fpCommand;                            << 
409 }                                              << 
410                                                << 
411 G4String G4VisCommandSceneAddDate::GetCurrentV << 
412   return "";                                   << 
413 }                                              << 
414                                                << 
415 void G4VisCommandSceneAddDate::SetNewValue (G4 << 
416 {                                              << 
417   G4VisManager::Verbosity verbosity = fpVisMan << 
418   G4bool warn(verbosity >= G4VisManager::warni << 
419                                                << 
420   G4Scene* pScene = fpVisManager->GetCurrentSc << 
421   if (!pScene) {                               << 
422     if (verbosity >= G4VisManager::errors) {   << 
423       G4warn << "ERROR: No current scene.  Ple << 
424     }                                          << 
425     return;                                    << 
426   }                                            << 
427                                                << 
428   G4int size;                                  << 
429   G4double x, y;                               << 
430   G4String layoutString, dateString;           << 
431   std::istringstream is(newValue);             << 
432   is >> size >> x >> y >> layoutString >> date << 
433   // Read rest of line, if any.                << 
434   const size_t NREMAINDER = 100;               << 
435   char remainder[NREMAINDER];                  << 
436   remainder[0]='\0';  // In case there is noth << 
437   is.getline(remainder, NREMAINDER);           << 
438   dateString += remainder;                     << 
439   G4Text::Layout layout = G4Text::right;       << 
440   if (layoutString[0] == 'l') layout = G4Text: << 
441   else if (layoutString[0] == 'c') layout = G4 << 
442   else if (layoutString[0] == 'r') layout = G4 << 
443                                                << 
444   Date* date = new Date(fpVisManager, size, x, << 
445   G4VModel* model =                            << 
446     new G4CallbackModel<G4VisCommandSceneAddDa << 
447   model->SetType("Date");                      << 
448   model->SetGlobalTag("Date");                 << 
449   model->SetGlobalDescription("Date: " + newVa << 
450   const G4String& currentSceneName = pScene -> << 
451   G4bool successful = pScene -> AddEndOfEventM << 
452   if (successful) {                            << 
453     if (verbosity >= G4VisManager::confirmatio << 
454       G4cout << "Date has been added to scene  << 
455        << currentSceneName << "\"."            << 
456        << G4endl;                              << 
457     }                                          << 
458   }                                            << 
459   else G4VisCommandsSceneAddUnsuccessful(verbo << 
460                                                << 
461   CheckSceneAndNotifyHandlers (pScene);        << 
462 }                                              << 
463                                                << 
464 void G4VisCommandSceneAddDate::Date::operator( << 
465   (G4VGraphicsScene& sceneHandler, const G4Mod << 
466 {                                              << 
467   G4String time;                               << 
468   if (fDate == "-") {                          << 
469     time = fTimer.GetClockTime();              << 
470   } else {                                     << 
471     time = fDate;                              << 
472   }                                            << 
473   // Check for \n, starting from back, and era << 
474   std::string::size_type i = time.rfind('\n'); << 
475   if (i != std::string::npos) time.erase(i);   << 
476   G4Text text(time, G4Point3D(fX, fY, 0.));    << 
477   text.SetScreenSize(fSize);                   << 
478   text.SetLayout(fLayout);                     << 
479   G4VisAttributes textAtts(G4Colour(0.,1.,1)); << 
480   text.SetVisAttributes(textAtts);             << 
481   sceneHandler.BeginPrimitives2D();            << 
482   sceneHandler.AddPrimitive(text);             << 
483   sceneHandler.EndPrimitives2D();              << 
484 }                                              << 
485                                                << 
486 ////////////// /vis/scene/add/digis ////////// << 
487                                                << 
488 G4VisCommandSceneAddDigis::G4VisCommandSceneAd << 
489   fpCommand = new G4UIcmdWithoutParameter ("/v << 
490   fpCommand -> SetGuidance ("Adds digis to cur << 
491   fpCommand -> SetGuidance                     << 
492     ("Digis are drawn at end of event when the << 
493      "\nthey are added is current.");          << 
494 }                                              << 
495                                                << 
496 G4VisCommandSceneAddDigis::~G4VisCommandSceneA << 
497   delete fpCommand;                            << 
498 }                                              << 
499                                                << 
500 G4String G4VisCommandSceneAddDigis::GetCurrent << 
501   return "";                                   << 
502 }                                              << 
503                                                << 
504 void G4VisCommandSceneAddDigis::SetNewValue (G << 
505                                                    31 
506   G4VisManager::Verbosity verbosity = fpVisMan <<  32 ////////////// /vis/scene/add/volume ///////////////////////////////////////
507   G4bool warn(verbosity >= G4VisManager::warni << 
508                                                << 
509   G4Scene* pScene = fpVisManager->GetCurrentSc << 
510   if (!pScene) {                               << 
511     if (verbosity >= G4VisManager::errors) {   << 
512       G4warn << "ERROR: No current scene.  Ple << 
513     }                                          << 
514     return;                                    << 
515   }                                            << 
516                                                << 
517   G4VModel* model = new G4DigiModel;           << 
518   const G4String& currentSceneName = pScene -> << 
519   G4bool successful = pScene -> AddEndOfEventM << 
520   if (successful) {                            << 
521     if (verbosity >= G4VisManager::confirmatio << 
522       G4cout << "Digis, if any, will be drawn  << 
523        << currentSceneName << "\"."            << 
524        << G4endl;                              << 
525     }                                          << 
526   }                                            << 
527   else G4VisCommandsSceneAddUnsuccessful(verbo << 
528                                                << 
529   CheckSceneAndNotifyHandlers (pScene);        << 
530 }                                              << 
531                                                << 
532 ////////////// /vis/scene/add/electricField // << 
533                                                    33 
534 G4VisCommandSceneAddElectricField::G4VisComman <<  34 G4VisCommandSceneAddVolume::G4VisCommandSceneAddVolume () {
535   G4bool omitable;                                 35   G4bool omitable;
536   fpCommand = new G4UIcommand ("/vis/scene/add <<  36   fpCommand = new G4UIcommand ("/vis/scene/add/volume", this);
                                                   >>  37   fpCommand -> AvailableForStates (Idle, GeomClosed);
537   fpCommand -> SetGuidance                         38   fpCommand -> SetGuidance
538   ("Adds electric field representation to curr <<  39     ("/vis/scene/add/volume [<physical-volume-name>] [<copy-no>] [<depth-of-descending>]");
                                                   >>  40   fpCommand -> SetGuidance ("Adds a physical volume to the current scene.");
539   fpCommand -> SetGuidance                         41   fpCommand -> SetGuidance
540   ("The first parameter is no. of data points  <<  42     ("1st parameter: volume name (default \"world\").");
541    "\nmaximum, the number of data points sampl <<  43   //  fpCommand -> SetGuidance  // Not implemented - should be in geom?
542    "\nlarge--be warned!"                       <<  44   //    ("               \"list\" to list all volumes.");
543    "\nThe default value is 10, i.e., a 21x21x2 << 
544    "\nThat may swamp your view, but usually, a << 
545    "\nthe extent, so it's not a problem. But i << 
546    "\nyou can do:"                             << 
547    "\n- reduce the number of data points per h << 
548    "\n- specify \"lightArrow\" (second paramet << 
549    "\n- restrict the region sampled with \"/vi << 
550    "\n- restrict the drawing to a specific vol << 
551    "\n    \"/vis/set/volumeForField\" or \"/vi << 
552    "\nNote: you might have to deactivate exist << 
553    "\n  \"/vis/scene/activateModel Field false << 
554    "\n  \"/vis/scene/add/...Field\" command ag << 
555   fpCommand -> SetGuidance                         45   fpCommand -> SetGuidance
556   ("In the arrow representation, the length of <<  46     ("2nd parameter: copy number (default 0).");
557    "\nto the magnitude of the field and the co << 
558    "\nas a fraction of the maximum magnitude:  << 
559   G4UIparameter* parameter;                    << 
560   parameter = new G4UIparameter ("nDataPointsP << 
561   parameter -> SetDefaultValue (10);           << 
562   fpCommand -> SetParameter (parameter);       << 
563   parameter = new G4UIparameter ("representati << 
564   parameter -> SetParameterCandidates("fullArr << 
565   parameter -> SetDefaultValue ("fullArrow");  << 
566   fpCommand -> SetParameter (parameter);       << 
567 }                                              << 
568                                                << 
569 G4VisCommandSceneAddElectricField::~G4VisComma << 
570   delete fpCommand;                            << 
571 }                                              << 
572                                                << 
573 G4String G4VisCommandSceneAddElectricField::Ge << 
574   return "";                                   << 
575 }                                              << 
576                                                << 
577 void G4VisCommandSceneAddElectricField::SetNew << 
578 (G4UIcommand*, G4String newValue) {            << 
579                                                << 
580   G4VisManager::Verbosity verbosity = fpVisMan << 
581   G4bool warn(verbosity >= G4VisManager::warni << 
582                                                << 
583   G4Scene* pScene = fpVisManager->GetCurrentSc << 
584   if (!pScene) {                               << 
585     if (verbosity >= G4VisManager::errors) {   << 
586       G4warn <<  "ERROR: No current scene.  Pl << 
587     }                                          << 
588     return;                                    << 
589   }                                            << 
590                                                << 
591   G4int nDataPointsPerHalfExtent;              << 
592   G4String representation;                     << 
593   std::istringstream iss(newValue);            << 
594   iss >> nDataPointsPerHalfExtent >> represent << 
595   G4ElectricFieldModel::Representation         << 
596   modelRepresentation = G4ElectricFieldModel:: << 
597   if (representation == "lightArrow") {        << 
598     modelRepresentation = G4ElectricFieldModel << 
599   }                                            << 
600   G4VModel* model;                             << 
601   model = new G4ElectricFieldModel             << 
602   (nDataPointsPerHalfExtent,modelRepresentatio << 
603    fCurrentArrow3DLineSegmentsPerCircle,       << 
604    fCurrentExtentForField,                     << 
605    fCurrrentPVFindingsForField);               << 
606   const G4String& currentSceneName = pScene -> << 
607   G4bool successful = pScene -> AddRunDuration << 
608   if (successful) {                            << 
609     if (verbosity >= G4VisManager::confirmatio << 
610       G4cout                                   << 
611       << "Electric field, if any, will be draw << 
612       << currentSceneName                      << 
613       << "\"\n  with "                         << 
614       << nDataPointsPerHalfExtent              << 
615       << " data points per half extent and wit << 
616       << representation                        << 
617       << '\"'                                  << 
618       << G4endl;                               << 
619     }                                          << 
620   }                                            << 
621   else G4VisCommandsSceneAddUnsuccessful(verbo << 
622                                                << 
623   CheckSceneAndNotifyHandlers (pScene);        << 
624 }                                              << 
625                                                << 
626 ////////////// /vis/scene/add/eventID //////// << 
627                                                << 
628 G4VisCommandSceneAddEventID::G4VisCommandScene << 
629   G4bool omitable;                             << 
630   fpCommand = new G4UIcommand ("/vis/scene/add << 
631   fpCommand -> SetGuidance ("Adds eventID to c << 
632   fpCommand -> SetGuidance                     << 
633     ("Run and event numbers are drawn at end o << 
634      "\n the scene in which they are added is  << 
635   G4UIparameter* parameter;                    << 
636   parameter = new G4UIparameter ("size", 'i',  << 
637   parameter -> SetGuidance ("Screen size of te << 
638   parameter -> SetDefaultValue (18);           << 
639   fpCommand -> SetParameter (parameter);       << 
640   parameter = new G4UIparameter ("x-position", << 
641   parameter -> SetGuidance ("x screen position << 
642   parameter -> SetDefaultValue (-0.95);        << 
643   fpCommand -> SetParameter (parameter);       << 
644   parameter = new G4UIparameter ("y-position", << 
645   parameter -> SetGuidance ("y screen position << 
646   parameter -> SetDefaultValue (0.9);          << 
647   fpCommand -> SetParameter (parameter);       << 
648   parameter = new G4UIparameter ("layout", 's' << 
649   parameter -> SetGuidance ("Layout, i.e., adj << 
650   parameter -> SetDefaultValue ("left");       << 
651   fpCommand -> SetParameter (parameter);       << 
652 }                                              << 
653                                                << 
654 G4VisCommandSceneAddEventID::~G4VisCommandScen << 
655   delete fpCommand;                            << 
656 }                                              << 
657                                                << 
658 G4String G4VisCommandSceneAddEventID::GetCurre << 
659   return "";                                   << 
660 }                                              << 
661                                                << 
662 void G4VisCommandSceneAddEventID::SetNewValue  << 
663 {                                              << 
664   G4VisManager::Verbosity verbosity = fpVisMan << 
665   G4bool warn(verbosity >= G4VisManager::warni << 
666                                                << 
667   G4Scene* pScene = fpVisManager->GetCurrentSc << 
668   if (!pScene) {                               << 
669     if (verbosity >= G4VisManager::errors) {   << 
670       G4warn << "ERROR: No current scene.  Ple << 
671     }                                          << 
672     return;                                    << 
673   }                                            << 
674                                                << 
675   G4int size;                                  << 
676   G4double x, y;                               << 
677   G4String layoutString;                       << 
678   std::istringstream is(newValue);             << 
679   is >> size >> x >> y >> layoutString;        << 
680                                                << 
681   G4Text::Layout layout = G4Text::right;       << 
682   if (layoutString[0] == 'l') layout = G4Text: << 
683   else if (layoutString[0] == 'c') layout = G4 << 
684   else if (layoutString[0] == 'r') layout = G4 << 
685                                                << 
686   // For End of Event (only for reviewing kept << 
687   EventID* eoeEventID                          << 
688   = new EventID(forEndOfEvent, fpVisManager, s << 
689   G4VModel* eoeModel =                         << 
690     new G4CallbackModel<G4VisCommandSceneAddEv << 
691   eoeModel->SetType("EoEEventID");             << 
692   eoeModel->SetGlobalTag("EoEEventID");        << 
693   eoeModel->SetGlobalDescription("EoEEventID:  << 
694   G4bool successfulEoE = pScene -> AddEndOfEve << 
695                                                << 
696   // For End of Run                            << 
697   EventID* eorEventID                          << 
698   = new EventID(forEndOfRun, fpVisManager, siz << 
699   G4VModel* eorModel =                         << 
700   new G4CallbackModel<G4VisCommandSceneAddEven << 
701   eorModel->SetType("EoREventID");             << 
702   eorModel->SetGlobalTag("EoREventID");        << 
703   eorModel->SetGlobalDescription("EoREventID:  << 
704   G4bool successfulEoR = pScene -> AddEndOfRun << 
705                                                << 
706   if (successfulEoE && successfulEoR) {        << 
707     if (verbosity >= G4VisManager::confirmatio << 
708       const G4String& currentSceneName = pScen << 
709       G4cout << "EventID has been added to sce << 
710       << currentSceneName << "\"."             << 
711       << G4endl;                               << 
712     }                                          << 
713   }                                            << 
714   else G4VisCommandsSceneAddUnsuccessful(verbo << 
715                                                << 
716   CheckSceneAndNotifyHandlers (pScene);        << 
717 }                                              << 
718                                                << 
719 void G4VisCommandSceneAddEventID::EventID::ope << 
720 (G4VGraphicsScene& sceneHandler, const G4Model << 
721 {                                              << 
722   G4RunManager* runManager = G4RunManagerFacto << 
723   if(!runManager)                              << 
724     return;                                    << 
725                                                << 
726   const G4Run* currentRun = runManager->GetCur << 
727   if (!currentRun) return;                     << 
728                                                << 
729   const G4int currentRunID = currentRun->GetRu << 
730                                                << 
731   std::ostringstream oss;                      << 
732   switch (fForWhat) {                          << 
733     case forEndOfEvent:                        << 
734     {                                          << 
735       // Only use if reviewing kept events     << 
736       if (!fpVisManager->GetReviewingKeptEvent << 
737       const G4Event* currentEvent = mp->GetEve << 
738       if (!currentEvent) return;               << 
739       G4int eventID = currentEvent->GetEventID << 
740       oss << "Run " << currentRunID << " Event << 
741       break;                                   << 
742     }                                          << 
743     case forEndOfRun:                          << 
744     {                                          << 
745       // Only use if NOT reviewing kept events << 
746       if (fpVisManager->GetReviewingKeptEvents << 
747       const G4int nEvents = currentRun->GetNum << 
748       size_t nKeptEvents = (size_t)(currentRun << 
749       oss << "Run " << currentRunID << " (" << << 
750       if (nEvents != 1) oss << 's';            << 
751       oss << ", " << nKeptEvents << " kept)";  << 
752       break;                                   << 
753     }                                          << 
754     default:                                   << 
755       return;                                  << 
756   }                                            << 
757                                                << 
758   G4Text text(oss.str(), G4Point3D(fX, fY, 0.) << 
759   text.SetScreenSize(fSize);                   << 
760   text.SetLayout(fLayout);                     << 
761   G4VisAttributes textAtts(G4Colour(0.,1.,1)); << 
762   text.SetVisAttributes(textAtts);             << 
763   sceneHandler.BeginPrimitives2D();            << 
764   sceneHandler.AddPrimitive(text);             << 
765   sceneHandler.EndPrimitives2D();              << 
766 }                                              << 
767                                                << 
768 ////////////// /vis/scene/add/extent ///////// << 
769                                                << 
770 G4VisCommandSceneAddExtent::G4VisCommandSceneA << 
771   fpCommand = new G4UIcommand("/vis/scene/add/ << 
772   fpCommand -> SetGuidance                         47   fpCommand -> SetGuidance
773   ("Adds a dummy model with given extent to th <<  48     ("3rd parameter: depth of descending geometry hierarchy"
774    "\nRequires the limits: xmin, xmax, ymin, y <<  49      " (default G4Scene::UNLIMITED (-1)).");
775    "\nThis can be used to provide an extent to << 
776    "\nno other models with extent are availabl << 
777    "\neven if there is no geometry.  In that c << 
778    "\n  /vis/open OGL"                         << 
779    "\n  /vis/scene/create"                     << 
780    "\n  /vis/scene/add/extent -300 300 -300 30 << 
781    "\n  /vis/sceneHandler/attach");            << 
782   G4bool omitable;                             << 
783   G4UIparameter* parameter;                        50   G4UIparameter* parameter;
784   parameter = new G4UIparameter ("xmin", 'd',  <<  51   parameter = new G4UIparameter ("volume", 's', omitable = true);
785   parameter -> SetDefaultValue (0.);           <<  52   parameter -> SetDefaultValue ("world");
786   fpCommand -> SetParameter (parameter);       << 
787   parameter = new G4UIparameter ("xmax", 'd',  << 
788   parameter -> SetDefaultValue (0.);           << 
789   fpCommand -> SetParameter (parameter);       << 
790   parameter = new G4UIparameter ("ymin", 'd',  << 
791   parameter -> SetDefaultValue (0.);           << 
792   fpCommand -> SetParameter (parameter);       << 
793   parameter = new G4UIparameter ("ymax", 'd',  << 
794   parameter -> SetDefaultValue (0.);           << 
795   fpCommand -> SetParameter (parameter);       << 
796   parameter = new G4UIparameter ("zmin", 'd',  << 
797   parameter -> SetDefaultValue (0.);           << 
798   fpCommand -> SetParameter (parameter);       << 
799   parameter = new G4UIparameter ("zmax", 'd',  << 
800   parameter -> SetDefaultValue (0.);           << 
801   fpCommand -> SetParameter (parameter);       << 
802   parameter =  new G4UIparameter ("unit", 's', << 
803   parameter -> SetDefaultValue ("m");          << 
804   fpCommand -> SetParameter (parameter);       << 
805 }                                              << 
806                                                << 
807 G4VisCommandSceneAddExtent::~G4VisCommandScene << 
808   delete fpCommand;                            << 
809 }                                              << 
810                                                << 
811 G4String G4VisCommandSceneAddExtent::GetCurren << 
812   return "";                                   << 
813 }                                              << 
814                                                << 
815 void G4VisCommandSceneAddExtent::SetNewValue ( << 
816 {                                              << 
817   G4VisManager::Verbosity verbosity = fpVisMan << 
818   G4bool warn(verbosity >= G4VisManager::warni << 
819                                                << 
820   G4Scene* pScene = fpVisManager->GetCurrentSc << 
821   if (!pScene) {                               << 
822     if (verbosity >= G4VisManager::errors) {   << 
823       G4warn << "ERROR: No current scene.  Ple << 
824     }                                          << 
825     return;                                    << 
826   }                                            << 
827                                                << 
828   G4double xmin, xmax, ymin, ymax, zmin, zmax; << 
829   G4String unitString;                         << 
830   std::istringstream is(newValue);             << 
831   is >> xmin >> xmax >> ymin >> ymax >> zmin > << 
832   G4double unit = G4UIcommand::ValueOf(unitStr << 
833   xmin *= unit; xmax *= unit;                  << 
834   ymin *= unit; ymax *= unit;                  << 
835   zmin *= unit; zmax *= unit;                  << 
836                                                << 
837   G4VisExtent visExtent(xmin, xmax, ymin, ymax << 
838   Extent* extent = new Extent(xmin, xmax, ymin << 
839   G4VModel* model =                            << 
840   new G4CallbackModel<G4VisCommandSceneAddExte << 
841   model->SetType("Extent");                    << 
842   model->SetGlobalTag("Extent");               << 
843   model->SetGlobalDescription("Extent: " + new << 
844   model->SetExtent(visExtent);                 << 
845   const G4String& currentSceneName = pScene -> << 
846   G4bool successful = pScene -> AddRunDuration << 
847   if (successful) {                            << 
848     if (verbosity >= G4VisManager::confirmatio << 
849       G4cout << "A benign model with extent "  << 
850       << visExtent                             << 
851       << " has been added to scene \""         << 
852        << currentSceneName << "\"."            << 
853        << G4endl;                              << 
854     }                                          << 
855   }                                            << 
856   else G4VisCommandsSceneAddUnsuccessful(verbo << 
857                                                << 
858   CheckSceneAndNotifyHandlers (pScene);        << 
859 }                                              << 
860                                                << 
861 G4VisCommandSceneAddExtent::Extent::Extent     << 
862 (G4double xmin, G4double xmax,                 << 
863  G4double ymin, G4double ymax,                 << 
864  G4double zmin, G4double zmax):                << 
865 fExtent(xmin,xmax,ymin,ymax,zmin,zmax)         << 
866 {}                                             << 
867                                                << 
868 void G4VisCommandSceneAddExtent::Extent::opera << 
869 (G4VGraphicsScene&, const G4ModelingParameters << 
870 {}                                             << 
871                                                << 
872 ////////////// /vis/scene/add/frame ////////// << 
873                                                << 
874 G4VisCommandSceneAddFrame::G4VisCommandSceneAd << 
875   fpCommand = new G4UIcommand("/vis/scene/add/ << 
876   fpCommand -> SetGuidance ("Add frame to curr << 
877   G4bool omitable;                             << 
878   G4UIparameter* parameter;                    << 
879   parameter = new G4UIparameter ("size", 'd',  << 
880   parameter -> SetGuidance ("Size of frame.  1 << 
881   parameter -> SetParameterRange ("size > 0 && << 
882   parameter -> SetDefaultValue (0.97);         << 
883   fpCommand -> SetParameter (parameter);       << 
884 }                                              << 
885                                                << 
886 G4VisCommandSceneAddFrame::~G4VisCommandSceneA << 
887   delete fpCommand;                            << 
888 }                                              << 
889                                                << 
890 G4String G4VisCommandSceneAddFrame::GetCurrent << 
891   return "";                                   << 
892 }                                              << 
893                                                << 
894 void G4VisCommandSceneAddFrame::SetNewValue (G << 
895 {                                              << 
896   G4VisManager::Verbosity verbosity = fpVisMan << 
897   G4bool warn(verbosity >= G4VisManager::warni << 
898                                                << 
899   G4Scene* pScene = fpVisManager->GetCurrentSc << 
900   if (!pScene) {                               << 
901     if (verbosity >= G4VisManager::errors) {   << 
902       G4warn << "ERROR: No current scene.  Ple << 
903     }                                          << 
904     return;                                    << 
905   }                                            << 
906                                                << 
907   G4double size;                               << 
908   std::istringstream is(newValue);             << 
909   is >> size;                                  << 
910                                                << 
911   Frame* frame = new Frame(size, fCurrentLineW << 
912   G4VModel* model =                            << 
913     new G4CallbackModel<G4VisCommandSceneAddFr << 
914   model->SetType("Frame");                     << 
915   model->SetGlobalTag("Frame");                << 
916   model->SetGlobalDescription("Frame: " + newV << 
917   const G4String& currentSceneName = pScene -> << 
918   G4bool successful = pScene -> AddRunDuration << 
919   if (successful) {                            << 
920     if (verbosity >= G4VisManager::confirmatio << 
921       G4cout << "Frame has been added to scene << 
922        << currentSceneName << "\"."            << 
923        << G4endl;                              << 
924     }                                          << 
925   }                                            << 
926   else G4VisCommandsSceneAddUnsuccessful(verbo << 
927                                                << 
928   CheckSceneAndNotifyHandlers (pScene);        << 
929 }                                              << 
930                                                << 
931 void G4VisCommandSceneAddFrame::Frame::operato << 
932   (G4VGraphicsScene& sceneHandler, const G4Mod << 
933 {                                              << 
934   G4Polyline frame;                            << 
935   frame.push_back(G4Point3D( fSize,  fSize, 0. << 
936   frame.push_back(G4Point3D(-fSize,  fSize, 0. << 
937   frame.push_back(G4Point3D(-fSize, -fSize, 0. << 
938   frame.push_back(G4Point3D( fSize, -fSize, 0. << 
939   frame.push_back(G4Point3D( fSize,  fSize, 0. << 
940   G4VisAttributes va;                          << 
941   va.SetLineWidth(fWidth);                     << 
942   va.SetColour(fColour);                       << 
943   frame.SetVisAttributes(va);                  << 
944   sceneHandler.BeginPrimitives2D();            << 
945   sceneHandler.AddPrimitive(frame);            << 
946   sceneHandler.EndPrimitives2D();              << 
947 }                                              << 
948                                                << 
949 ////////////// /vis/scene/add/gps //////////// << 
950                                                << 
951 G4VisCommandSceneAddGPS::G4VisCommandSceneAddG << 
952   G4bool omitable;                             << 
953   G4UIparameter* parameter;                    << 
954   fpCommand = new G4UIcommand ("/vis/scene/add << 
955   fpCommand -> SetGuidance                     << 
956   ("A representation of the source(s) of the G << 
957    "\nwill be added to current scene and drawn << 
958   fpCommand->SetGuidance(ConvertToColourGuidan << 
959   fpCommand->SetGuidance("Default: red and tra << 
960   parameter = new G4UIparameter("red_or_string << 
961   parameter -> SetDefaultValue ("1.");         << 
962   fpCommand -> SetParameter (parameter);       << 
963   parameter = new G4UIparameter("green", 'd',  << 
964   parameter -> SetDefaultValue (0.);           << 
965   fpCommand -> SetParameter (parameter);       << 
966   parameter = new G4UIparameter ("blue", 'd',  << 
967   parameter -> SetDefaultValue (0.);           << 
968   fpCommand -> SetParameter (parameter);       << 
969   parameter = new G4UIparameter ("opacity", 'd << 
970   parameter -> SetDefaultValue (0.3);          << 
971   fpCommand -> SetParameter (parameter);       << 
972 }                                              << 
973                                                << 
974 G4VisCommandSceneAddGPS::~G4VisCommandSceneAdd << 
975   delete fpCommand;                            << 
976 }                                              << 
977                                                << 
978 G4String G4VisCommandSceneAddGPS::GetCurrentVa << 
979   return "";                                   << 
980 }                                              << 
981                                                << 
982 void G4VisCommandSceneAddGPS::SetNewValue (G4U << 
983                                                << 
984   G4VisManager::Verbosity verbosity = fpVisMan << 
985   G4bool warn(verbosity >= G4VisManager::warni << 
986                                                << 
987   G4Scene* pScene = fpVisManager->GetCurrentSc << 
988   if (!pScene) {                               << 
989     if (verbosity >= G4VisManager::errors) {   << 
990       G4warn << "ERROR: No current scene.  Ple << 
991     }                                          << 
992     return;                                    << 
993   }                                            << 
994                                                << 
995   G4String redOrString;                        << 
996   G4double green, blue, opacity;               << 
997   std::istringstream iss(newValue);            << 
998   iss >> redOrString >> green >> blue >> opaci << 
999   G4Colour colour(1.,0.,0.,0.3);  // Default r << 
1000   ConvertToColour(colour, redOrString, green, << 
1001                                               << 
1002   G4VModel* model = new G4GPSModel(colour);   << 
1003   const G4String& currentSceneName = pScene - << 
1004   G4bool successful = pScene -> AddRunDuratio << 
1005   if (successful) {                           << 
1006     if (verbosity >= G4VisManager::confirmati << 
1007       G4cout <<                               << 
1008       "A representation of the source(s) of t << 
1009       "\n  in colour " << colour << " for sce << 
1010       << currentSceneName << "\" if applicabl << 
1011       << G4endl;                              << 
1012     }                                         << 
1013   }                                           << 
1014   else G4VisCommandsSceneAddUnsuccessful(verb << 
1015                                               << 
1016   CheckSceneAndNotifyHandlers (pScene);       << 
1017 }                                             << 
1018                                               << 
1019 ////////////// /vis/scene/add/hits ////////// << 
1020                                               << 
1021 G4VisCommandSceneAddHits::G4VisCommandSceneAd << 
1022   fpCommand = new G4UIcmdWithoutParameter ("/ << 
1023   fpCommand -> SetGuidance ("Adds hits to cur << 
1024   fpCommand -> SetGuidance                    << 
1025     ("Hits are drawn at end of event when the << 
1026      "\nthey are added is current.");         << 
1027 }                                             << 
1028                                               << 
1029 G4VisCommandSceneAddHits::~G4VisCommandSceneA << 
1030   delete fpCommand;                           << 
1031 }                                             << 
1032                                               << 
1033 G4String G4VisCommandSceneAddHits::GetCurrent << 
1034   return "";                                  << 
1035 }                                             << 
1036                                               << 
1037 void G4VisCommandSceneAddHits::SetNewValue (G << 
1038                                               << 
1039   G4VisManager::Verbosity verbosity = fpVisMa << 
1040   G4bool warn(verbosity >= G4VisManager::warn << 
1041                                               << 
1042   G4Scene* pScene = fpVisManager->GetCurrentS << 
1043   if (!pScene) {                              << 
1044     if (verbosity >= G4VisManager::errors) {  << 
1045       G4warn << "ERROR: No current scene.  Pl << 
1046     }                                         << 
1047     return;                                   << 
1048   }                                           << 
1049                                               << 
1050   G4VModel* model = new G4HitsModel;          << 
1051   const G4String& currentSceneName = pScene - << 
1052   G4bool successful = pScene -> AddEndOfEvent << 
1053   if (successful) {                           << 
1054     if (verbosity >= G4VisManager::confirmati << 
1055       G4cout << "Hits, if any, will be drawn  << 
1056        << currentSceneName << "\"."           << 
1057        << G4endl;                             << 
1058     }                                         << 
1059   }                                           << 
1060   else G4VisCommandsSceneAddUnsuccessful(verb << 
1061                                               << 
1062   CheckSceneAndNotifyHandlers (pScene);       << 
1063 }                                             << 
1064                                               << 
1065 ////////////// /vis/scene/add/line ////////// << 
1066                                               << 
1067 G4VisCommandSceneAddLine::G4VisCommandSceneAd << 
1068   fpCommand = new G4UIcommand("/vis/scene/add << 
1069   fpCommand -> SetGuidance ("Adds line to cur << 
1070   G4bool omitable;                            << 
1071   G4UIparameter* parameter;                   << 
1072   parameter = new G4UIparameter ("x1", 'd', o << 
1073   fpCommand -> SetParameter (parameter);      << 
1074   parameter = new G4UIparameter ("y1", 'd', o << 
1075   fpCommand -> SetParameter (parameter);      << 
1076   parameter = new G4UIparameter ("z1", 'd', o << 
1077   fpCommand -> SetParameter (parameter);      << 
1078   parameter = new G4UIparameter ("x2", 'd', o << 
1079   fpCommand -> SetParameter (parameter);      << 
1080   parameter = new G4UIparameter ("y2", 'd', o << 
1081   fpCommand -> SetParameter (parameter);      << 
1082   parameter = new G4UIparameter ("z2", 'd', o << 
1083   fpCommand -> SetParameter (parameter);      << 
1084   parameter =  new G4UIparameter ("unit", 's' << 
1085   parameter->SetDefaultValue ("m");           << 
1086   fpCommand->SetParameter    (parameter);     << 
1087 }                                             << 
1088                                               << 
1089 G4VisCommandSceneAddLine::~G4VisCommandSceneA << 
1090   delete fpCommand;                           << 
1091 }                                             << 
1092                                               << 
1093 G4String G4VisCommandSceneAddLine::GetCurrent << 
1094   return "";                                  << 
1095 }                                             << 
1096                                               << 
1097 void G4VisCommandSceneAddLine::SetNewValue (G << 
1098 {                                             << 
1099   G4VisManager::Verbosity verbosity = fpVisMa << 
1100   G4bool warn(verbosity >= G4VisManager::warn << 
1101                                               << 
1102   G4Scene* pScene = fpVisManager->GetCurrentS << 
1103   if (!pScene) {                              << 
1104     if (verbosity >= G4VisManager::errors) {  << 
1105       G4warn << "ERROR: No current scene.  Pl << 
1106     }                                         << 
1107     return;                                   << 
1108   }                                           << 
1109                                               << 
1110   G4String unitString;                        << 
1111   G4double x1, y1, z1, x2, y2, z2;            << 
1112   std::istringstream is(newValue);            << 
1113   is >> x1 >> y1 >> z1 >> x2 >> y2 >> z2 >> u << 
1114   G4double unit = G4UIcommand::ValueOf(unitSt << 
1115   x1 *= unit; y1 *= unit; z1 *= unit;         << 
1116   x2 *= unit; y2 *= unit; z2 *= unit;         << 
1117                                               << 
1118   Line* line = new Line(x1, y1, z1, x2, y2, z << 
1119       fCurrentLineWidth, fCurrentColour);     << 
1120   G4VModel* model =                           << 
1121     new G4CallbackModel<G4VisCommandSceneAddL << 
1122   model->SetType("Line");                     << 
1123   model->SetGlobalTag("Line");                << 
1124   model->SetGlobalDescription("Line: " + newV << 
1125   const G4String& currentSceneName = pScene - << 
1126   G4bool successful = pScene -> AddRunDuratio << 
1127   if (successful) {                           << 
1128     if (verbosity >= G4VisManager::confirmati << 
1129       G4cout << "Line has been added to scene << 
1130        << currentSceneName << "\"."           << 
1131        << G4endl;                             << 
1132     }                                         << 
1133   }                                           << 
1134   else G4VisCommandsSceneAddUnsuccessful(verb << 
1135                                               << 
1136   CheckSceneAndNotifyHandlers (pScene);       << 
1137 }                                             << 
1138                                               << 
1139 G4VisCommandSceneAddLine::Line::Line          << 
1140 (G4double x1, G4double y1, G4double z1,       << 
1141  G4double x2, G4double y2, G4double z2,       << 
1142  G4double width, const G4Colour& colour):     << 
1143   fWidth(width), fColour(colour)              << 
1144 {                                             << 
1145   fPolyline.push_back(G4Point3D(x1,y1,z1));   << 
1146   fPolyline.push_back(G4Point3D(x2,y2,z2));   << 
1147   G4VisAttributes va;                         << 
1148   va.SetLineWidth(fWidth);                    << 
1149   va.SetColour(fColour);                      << 
1150   fPolyline.SetVisAttributes(va);             << 
1151 }                                             << 
1152                                               << 
1153 void G4VisCommandSceneAddLine::Line::operator << 
1154   (G4VGraphicsScene& sceneHandler, const G4Mo << 
1155 {                                             << 
1156   sceneHandler.BeginPrimitives();             << 
1157   sceneHandler.AddPrimitive(fPolyline);       << 
1158   sceneHandler.EndPrimitives();               << 
1159 }                                             << 
1160                                               << 
1161 ////////////// /vis/scene/add/line2D //////// << 
1162                                               << 
1163 G4VisCommandSceneAddLine2D::G4VisCommandScene << 
1164   fpCommand = new G4UIcommand("/vis/scene/add << 
1165   fpCommand -> SetGuidance ("Adds 2D line to  << 
1166   fpCommand -> SetGuidance ("x,y in range [-1 << 
1167   G4bool omitable;                            << 
1168   G4UIparameter* parameter;                   << 
1169   parameter = new G4UIparameter ("x1", 'd', o << 
1170   fpCommand -> SetParameter (parameter);      << 
1171   parameter = new G4UIparameter ("y1", 'd', o << 
1172   fpCommand -> SetParameter (parameter);      << 
1173   parameter = new G4UIparameter ("x2", 'd', o << 
1174   fpCommand -> SetParameter (parameter);      << 
1175   parameter = new G4UIparameter ("y2", 'd', o << 
1176   fpCommand -> SetParameter (parameter);      << 
1177 }                                             << 
1178                                               << 
1179 G4VisCommandSceneAddLine2D::~G4VisCommandScen << 
1180   delete fpCommand;                           << 
1181 }                                             << 
1182                                               << 
1183 G4String G4VisCommandSceneAddLine2D::GetCurre << 
1184   return "";                                  << 
1185 }                                             << 
1186                                               << 
1187 void G4VisCommandSceneAddLine2D::SetNewValue  << 
1188 {                                             << 
1189   G4VisManager::Verbosity verbosity = fpVisMa << 
1190   G4bool warn(verbosity >= G4VisManager::warn << 
1191                                               << 
1192   G4Scene* pScene = fpVisManager->GetCurrentS << 
1193   if (!pScene) {                              << 
1194     if (verbosity >= G4VisManager::errors) {  << 
1195       G4warn << "ERROR: No current scene.  Pl << 
1196     }                                         << 
1197     return;                                   << 
1198   }                                           << 
1199                                               << 
1200   G4double x1, y1, x2, y2;                    << 
1201   std::istringstream is(newValue);            << 
1202   is >> x1 >> y1 >> x2 >> y2;                 << 
1203                                               << 
1204   Line2D* line2D = new Line2D                 << 
1205     (x1, y1, x2, y2, fCurrentLineWidth, fCurr << 
1206   G4VModel* model =                           << 
1207     new G4CallbackModel<G4VisCommandSceneAddL << 
1208   model->SetType("Line2D");                   << 
1209   model->SetGlobalTag("Line2D");              << 
1210   model->SetGlobalDescription("Line2D: " + ne << 
1211   const G4String& currentSceneName = pScene - << 
1212   G4bool successful = pScene -> AddRunDuratio << 
1213   if (successful) {                           << 
1214     if (verbosity >= G4VisManager::confirmati << 
1215       G4cout << "A 2D line has been added to  << 
1216        << currentSceneName << "\"."           << 
1217        << G4endl;                             << 
1218     }                                         << 
1219   }                                           << 
1220   else G4VisCommandsSceneAddUnsuccessful(verb << 
1221                                               << 
1222   CheckSceneAndNotifyHandlers (pScene);       << 
1223 }                                             << 
1224                                               << 
1225 G4VisCommandSceneAddLine2D::Line2D::Line2D    << 
1226 (G4double x1, G4double y1,                    << 
1227  G4double x2, G4double y2,                    << 
1228  G4double width, const G4Colour& colour):     << 
1229   fWidth(width), fColour(colour)              << 
1230 {                                             << 
1231   fPolyline.push_back(G4Point3D(x1,y1,0));    << 
1232   fPolyline.push_back(G4Point3D(x2,y2,0));    << 
1233   G4VisAttributes va;                         << 
1234   va.SetLineWidth(fWidth);                    << 
1235   va.SetColour(fColour);                      << 
1236   fPolyline.SetVisAttributes(va);             << 
1237 }                                             << 
1238                                               << 
1239 void G4VisCommandSceneAddLine2D::Line2D::oper << 
1240   (G4VGraphicsScene& sceneHandler, const G4Mo << 
1241 {                                             << 
1242   sceneHandler.BeginPrimitives2D();           << 
1243   sceneHandler.AddPrimitive(fPolyline);       << 
1244   sceneHandler.EndPrimitives2D();             << 
1245 }                                             << 
1246                                               << 
1247 ////////////// /vis/scene/add/localAxes ///// << 
1248                                               << 
1249 G4VisCommandSceneAddLocalAxes::G4VisCommandSc << 
1250   G4bool omitable;                            << 
1251   fpCommand = new G4UIcommand ("/vis/scene/ad << 
1252   fpCommand -> SetGuidance                    << 
1253   ("Adds local axes to physical volume(s)."); << 
1254   G4UIparameter* parameter;                   << 
1255   parameter = new G4UIparameter ("physical-vo << 
1256   fpCommand -> SetParameter (parameter);          53   fpCommand -> SetParameter (parameter);
1257   parameter = new G4UIparameter ("copy-no", '     54   parameter = new G4UIparameter ("copy-no", 'i', omitable = true);
1258   parameter -> SetGuidance ("If negative, mat <<  55   parameter -> SetDefaultValue (0);
1259   parameter -> SetDefaultValue (-1);          <<  56   fpCommand -> SetParameter (parameter);
                                                   >>  57   parameter = new G4UIparameter ("depth", 'i', omitable = true);
                                                   >>  58   parameter -> SetDefaultValue (G4Scene::UNLIMITED);
1260   fpCommand -> SetParameter (parameter);          59   fpCommand -> SetParameter (parameter);
1261 }                                                 60 }
1262                                                   61 
1263 G4VisCommandSceneAddLocalAxes::~G4VisCommandS <<  62 G4VisCommandSceneAddVolume::~G4VisCommandSceneAddVolume () {
1264   delete fpCommand;                               63   delete fpCommand;
1265 }                                                 64 }
1266                                                   65 
1267 G4String G4VisCommandSceneAddLocalAxes::GetCu <<  66 G4String G4VisCommandSceneAddVolume::GetCurrentValue (G4UIcommand* command) {
1268   return "world 0 -1";                            67   return "world 0 -1";
1269 }                                                 68 }
1270                                                   69 
1271 void G4VisCommandSceneAddLocalAxes::SetNewVal <<  70 void G4VisCommandSceneAddVolume::SetNewValue (G4UIcommand* command,
1272              G4String newValue) {             <<  71                 G4String newValue) {
1273                                               <<  72   G4SceneList& sceneList = fpVisManager -> SetSceneList ();
1274   G4VisManager::Verbosity verbosity = fpVisMa <<  73   if (sceneList.isEmpty ()) {
1275   G4bool warn = verbosity >= G4VisManager::wa <<  74     G4cout << "No scenes - please create one before adding anything."
1276                                               <<  75      << G4endl;
1277   G4Scene* pScene = fpVisManager->GetCurrentS << 
1278   if (!pScene) {                              << 
1279     if (verbosity >= G4VisManager::errors) {  << 
1280       G4warn << "ERROR: No current scene.  Pl << 
1281     }                                         << 
1282     return;                                       76     return;
1283   }                                               77   }
1284                                                   78 
1285   G4String name;                                  79   G4String name;
1286   G4int copyNo;                                   80   G4int copyNo;
1287   std::istringstream is (newValue);           <<  81   G4int requestedDepthOfDescent;
1288   is >> name >> copyNo;                       <<  82   const char* s = newValue;
1289                                               <<  83   G4std::istrstream is ((char*)s);
1290   std::vector<G4PhysicalVolumesSearchScene::F <<  84   is >> name >> copyNo >> requestedDepthOfDescent;
                                                   >>  85   G4VPhysicalVolume* world =
                                                   >>  86     G4TransportationManager::GetTransportationManager ()
                                                   >>  87     -> GetNavigatorForTracking () -> GetWorldVolume ();
                                                   >>  88   G4PhysicalVolumeModel* model = 0;
                                                   >>  89   G4VPhysicalVolume* foundVolume = 0;
                                                   >>  90   G4int foundDepth = 0;
1291                                                   91 
1292   // Search all worlds...                     <<  92   if (name == "world") {
1293   G4TransportationManager* transportationMana <<  93     if (world) {
1294   G4TransportationManager::GetTransportationM <<  94       model = new G4PhysicalVolumeModel (world);
1295   std::vector<G4VPhysicalVolume*>::iterator i <<  95       foundVolume = world;
1296   transportationManager->GetWorldsIterator(); <<  96     }
1297   size_t nWorlds = transportationManager->Get <<  97     else {
1298   for (size_t i = 0; i < nWorlds; ++i, ++iter <<  98       G4cerr << "G4VisCommandSceneAddVolume::SetNewValue: *** ERROR ***"
1299     G4ModelingParameters mp;  // Default - no <<  99        << "\n  No world - shouldn't happen if G4ApplicationState is"
1300     G4PhysicalVolumeModel searchModel         << 100        << " being properly handled!!" << G4endl;
1301     (*iterWorld,                              << 
1302      G4PhysicalVolumeModel::UNLIMITED,        << 
1303      G4Transform3D(),                         << 
1304      &mp,                                     << 
1305      true);  // Use full extent (avoids initi << 
1306     G4PhysicalVolumesSearchScene searchScene  << 
1307     (&searchModel, name, copyNo);             << 
1308     searchModel.DescribeYourselfTo (searchSce << 
1309     for (const auto& findings: searchScene.Ge << 
1310       findingsVector.push_back(findings);     << 
1311     }                                            101     }
1312   }                                              102   }
1313                                               << 103   else {
1314   G4int id = 0;  // To distinguish axes model << 104  
1315   for (const auto& findings: findingsVector)  << 105     // Create search scene, model and modeling parameters with
1316                                               << 106     // long-enough life...
1317     // Create axes model based on size and tr << 107     G4PhysicalVolumeSearchScene searchScene (name, copyNo);
1318     const auto& extent = findings.fpFoundPV-> << 108     G4PhysicalVolumeModel searchModel (world);
1319     const auto& transform = findings.fFoundOb << 109     G4ModelingParameters mp;
1320                                               << 110     searchModel.SetModelingParameters (&mp);
1321     const G4double lengthMax = extent.GetExte << 111 
1322     const G4double intLog10LengthMax = std::f << 112     // Initiate search...
1323     G4double length = std::pow(10,intLog10Len << 113     searchModel.DescribeYourselfTo (searchScene);
1324     if (5.*length < lengthMax) length *= 5.;  << 114 
1325     else if (2.*length < lengthMax) length *= << 115     // OK, what have we got...?
1326                                               << 116     foundVolume = searchScene.GetFoundVolume ();
1327     const auto& axesModel = new G4AxesModel(0 << 117     const G4Transform3D&
1328     axesModel->SetGlobalTag("LocalAxesModel") << 118       transformation = searchScene.GetFoundTransformation ();
1329     std::ostringstream oss; oss               << 119     foundDepth = searchScene.GetFoundDepth ();
1330     << "Local Axes for " << findings.fpFoundP << 120 
1331     << ':' << findings.fFoundPVCopyNo << ':'  << 121     if (foundVolume) {
1332     axesModel->SetGlobalDescription(oss.str() << 122       model = new G4PhysicalVolumeModel (foundVolume,
1333     // ...so add it to the scene.             << 123            requestedDepthOfDescent,
1334     G4bool successful = pScene->AddRunDuratio << 124            transformation);
1335     if (successful) {                         << 125     }
1336       if (verbosity >= G4VisManager::confirma << 126     else {
1337   G4cout << "\"" << findings.fpFoundPV->GetNa << 127       G4cout << "Volume \"" << name << "\", copy no. " << copyNo
1338   << "\", copy no. " << findings.fFoundPVCopy << 128        << " not found." << G4endl;
1339   << ",\n  found in searched volume \""       << 
1340   << findings.fpSearchPV->GetName()           << 
1341   << "\" at depth " << findings.fFoundDepth   << 
1342   << ",\n  base path: \"" << findings.fFoundB << 
1343   << "\".\n  Local axes have been added to sc << 
1344   << pScene->GetName() << "\".";              << 
1345   if (verbosity >= G4VisManager::parameters)  << 
1346     G4cout << "  With extent " << extent      << 
1347     << "\n  at " << transform.getRotation()   << 
1348     << "  " << transform.getTranslation();    << 
1349   }                                           << 
1350   G4cout << G4endl;                           << 
1351       }                                       << 
1352     } else {                                  << 
1353       G4VisCommandsSceneAddUnsuccessful(verbo << 
1354     }                                            129     }
1355   }                                              130   }
1356                                                  131 
1357   if (findingsVector.empty()) {               << 132   if (model) {
1358     if (verbosity >= G4VisManager::errors) {  << 133     G4Scene* pScene = fpVisManager -> GetCurrentScene ();
1359       G4warn << "ERROR: Volume \"" << name << << 134     const G4String& currentSceneName = pScene -> GetName ();
1360       if (copyNo >= 0) {                      << 135     G4bool successful = pScene -> AddRunDurationModel (model);
1361   G4warn << ", copy no. " << copyNo << ",";   << 136     UpdateVisManagerScene (currentSceneName);
1362       }                                       << 137     if (successful) {
1363       G4warn << " not found." << G4endl;      << 138       G4cout << "First occurrence of \"" << foundVolume -> GetName ()
                                                   >> 139        << "\", copy no. " << copyNo
                                                   >> 140        << ", found at depth " << foundDepth
                                                   >> 141        << ",\n  with further requested depth of descent "
                                                   >> 142        << requestedDepthOfDescent
                                                   >> 143        << ", has been added to scene \"" << currentSceneName << "\""
                                                   >> 144        << G4endl;
1364     }                                            145     }
1365     G4VisCommandsSceneAddUnsuccessful(verbosi << 
1366     return;                                   << 
1367   }                                              146   }
1368                                               << 
1369   CheckSceneAndNotifyHandlers(pScene);        << 
1370 }                                                147 }
1371                                                  148 
1372 ////////////// /vis/scene/add/logicalVolume / << 149 ////////////// /vis/scene/add/logicalVolume ///////////////////////////////////////
1373                                                  150 
1374 G4VisCommandSceneAddLogicalVolume::G4VisComma    151 G4VisCommandSceneAddLogicalVolume::G4VisCommandSceneAddLogicalVolume () {
1375   G4bool omitable;                               152   G4bool omitable;
1376   fpCommand = new G4UIcommand ("/vis/scene/ad    153   fpCommand = new G4UIcommand ("/vis/scene/add/logicalVolume", this);
1377   fpCommand -> SetGuidance ("Adds a logical v << 154   fpCommand -> AvailableForStates (Idle, GeomClosed);
                                                   >> 155   fpCommand -> SetGuidance
                                                   >> 156     ("/vis/scene/add/logicalVolume <logical-volume-name> [<depth-of-descending>]");
                                                   >> 157   fpCommand -> SetGuidance ("Adds a logical volume to the current scene.");
1378   fpCommand -> SetGuidance                       158   fpCommand -> SetGuidance
1379   ("Shows boolean components (if any), voxels << 159     ("1st parameter: volume name.");
1380    "\n  (if any), local axes and overlaps (if << 160   //  fpCommand -> SetGuidance  // Not implemented - should be in geom?
1381    "\n  appropriate flag."                    << 161   //    ("               \"list\" to list all volumes.");
1382    "\n  Note: voxels are not constructed unti << 162   fpCommand -> SetGuidance
1383    "\n \"/run/beamOn\".  (For voxels without  << 163     ("2nd parameter: depth of descending geometry hierarchy (default 1).");
1384   G4UIparameter* parameter;                      164   G4UIparameter* parameter;
1385   parameter = new G4UIparameter ("logical-vol << 165   parameter = new G4UIparameter ("volume", 's', omitable = false);
1386   fpCommand -> SetParameter (parameter);         166   fpCommand -> SetParameter (parameter);
1387   parameter = new G4UIparameter ("depth-of-de << 167   parameter = new G4UIparameter ("depth", 'i', omitable = true);
1388   parameter -> SetGuidance ("Depth of descent << 
1389   parameter -> SetDefaultValue (1);              168   parameter -> SetDefaultValue (1);
1390   fpCommand -> SetParameter (parameter);         169   fpCommand -> SetParameter (parameter);
1391   parameter = new G4UIparameter ("booleans-fl << 
1392   parameter -> SetDefaultValue (true);        << 
1393   fpCommand -> SetParameter (parameter);      << 
1394   parameter = new G4UIparameter ("voxels-flag << 
1395   parameter -> SetDefaultValue (true);        << 
1396   fpCommand -> SetParameter (parameter);      << 
1397   parameter = new G4UIparameter ("readout-fla << 
1398   parameter -> SetDefaultValue (true);        << 
1399   fpCommand -> SetParameter (parameter);      << 
1400   parameter = new G4UIparameter ("axes-flag", << 
1401   parameter -> SetDefaultValue (true);        << 
1402   parameter -> SetGuidance ("Set \"false\" to << 
1403   fpCommand -> SetParameter (parameter);      << 
1404   parameter = new G4UIparameter("check-overla << 
1405   parameter->SetDefaultValue(true);           << 
1406   parameter -> SetGuidance ("Set \"false\" to << 
1407   fpCommand->SetParameter(parameter);         << 
1408 }                                                170 }
1409                                                  171 
1410 G4VisCommandSceneAddLogicalVolume::~G4VisComm    172 G4VisCommandSceneAddLogicalVolume::~G4VisCommandSceneAddLogicalVolume () {
1411   delete fpCommand;                              173   delete fpCommand;
1412 }                                                174 }
1413                                                  175 
1414 G4String G4VisCommandSceneAddLogicalVolume::G    176 G4String G4VisCommandSceneAddLogicalVolume::GetCurrentValue (G4UIcommand*) {
1415   return "";                                     177   return "";
1416 }                                                178 }
1417                                                  179 
1418 void G4VisCommandSceneAddLogicalVolume::SetNe << 180 void G4VisCommandSceneAddLogicalVolume::SetNewValue (G4UIcommand* command,
1419                  G4String newValue) {            181                  G4String newValue) {
1420                                               << 182   G4SceneList& sceneList = fpVisManager -> SetSceneList ();
1421   G4VisManager::Verbosity verbosity = fpVisMa << 183   if (sceneList.isEmpty ()) {
1422   G4bool warn(verbosity >= G4VisManager::warn << 184     G4cout << "No scenes - please create one before adding anything."
1423                                               << 185      << G4endl;
1424   G4Scene* pScene = fpVisManager->GetCurrentS << 
1425   if (!pScene) {                              << 
1426     if (verbosity >= G4VisManager::errors) {  << 
1427       G4warn << "ERROR: No current scene.  Pl << 
1428     }                                         << 
1429     return;                                      186     return;
1430   }                                              187   }
1431                                                  188 
1432   G4String name;                                 189   G4String name;
1433   G4int requestedDepthOfDescent;                 190   G4int requestedDepthOfDescent;
1434   G4String booleansString, voxelsString, read << 191   const char* s = newValue;
1435   G4String overlapString;                     << 192   G4std::istrstream is ((char*)s);
1436   std::istringstream is (newValue);           << 193   is >> name >> requestedDepthOfDescent;
1437   is >> name >> requestedDepthOfDescent       << 
1438      >>  booleansString >> voxelsString >> re << 
1439      >> overlapString;                        << 
1440   G4bool booleans = G4UIcommand::ConvertToBoo << 
1441   G4bool voxels = G4UIcommand::ConvertToBool( << 
1442   G4bool readout = G4UIcommand::ConvertToBool << 
1443   G4bool axes = G4UIcommand::ConvertToBool(ax << 
1444   G4bool checkOverlaps = G4UIcommand::Convert << 
1445                                                  194 
1446   G4LogicalVolumeStore *pLVStore = G4LogicalV    195   G4LogicalVolumeStore *pLVStore = G4LogicalVolumeStore::GetInstance();
1447   G4LogicalVolume* pLV = nullptr;             << 196   int nLV = pLVStore -> entries ();
1448   pLV = pLVStore->GetVolume(name);            << 197   int iLV;
1449   if (pLV == nullptr) return;  // Volume not  << 198   G4LogicalVolume* pLV;
1450                                               << 199   for (iLV = 0; iLV < nLV; iLV++ ) {
1451   const std::vector<G4Scene::Model>& rdModelL << 200     pLV = (*pLVStore) [iLV];
1452     pScene -> GetRunDurationModelList();      << 201     if (pLV -> GetName () == name) break;
1453   std::vector<G4Scene::Model>::const_iterator << 202   }
1454   for (i = rdModelList.begin(); i != rdModelL << 203   if (iLV == nLV) {
1455     if (i->fpModel->GetGlobalDescription().fi << 204     G4cout << "Logical volume " << name
1456   }                                           << 205      << " not found in logical volume Store." << G4endl;
1457   if (i != rdModelList.end()) {               << 
1458     if (verbosity >= G4VisManager::errors) {  << 
1459       G4warn << "There is already a volume, \ << 
1460              << i->fpModel->GetGlobalDescript << 
1461              << "\",\n in the run-duration mo << 
1462              << pScene -> GetName()           << 
1463              << "\".\n Your logical volume mu << 
1464        << "\n Create a new scene and try agai << 
1465        << "\n  /vis/specify " << name         << 
1466        << "\n or"                             << 
1467        << "\n  /vis/scene/create"             << 
1468        << "\n  /vis/scene/add/logicalVolume " << 
1469        << "\n  /vis/sceneHandler/attach"      << 
1470        << "\n (and also, if necessary, /vis/v << 
1471              << G4endl;                       << 
1472     }                                         << 
1473     return;                                      206     return;
1474   }                                              207   }
1475                                                  208 
1476   G4LogicalVolumeModel* model = new G4Logical << 209   G4VModel* model = new G4LogicalVolumeModel (pLV, requestedDepthOfDescent);
1477     (pLV, requestedDepthOfDescent, booleans,  << 210   G4Scene* pScene = fpVisManager -> GetCurrentScene ();
1478   const G4String& currentSceneName = pScene - << 211   const G4String& currentSceneName = pScene -> GetName ();
1479   G4bool successful = pScene -> AddRunDuratio << 212   G4bool succesful = pScene -> AddRunDurationModel (model);
1480                                               << 213   UpdateVisManagerScene (currentSceneName);
1481   if (successful) {                           << 214   if (succesful) {
1482                                               << 215     G4cout << "Logical volume \"" << pLV -> GetName ()
1483     G4bool axesSuccessful = false;            << 216      << " with requested depth of descent "
1484     if (axes) {                               << 217      << requestedDepthOfDescent
1485       const G4double radius = model->GetExten << 218      << ",\n  has been added to scene \"" << currentSceneName << "\""
1486       const G4double axisLengthMax = radius / << 219      << G4endl;
1487       const G4double intLog10Length = std::fl << 
1488       G4double axisLength = std::pow(10,intLo << 
1489       if (5.*axisLength < axisLengthMax) axis << 
1490       else if (2.*axisLength < axisLengthMax) << 
1491       const G4double axisWidth = axisLength / << 
1492       G4VModel* axesModel = new G4AxesModel(0 << 
1493       axesSuccessful = pScene -> AddRunDurati << 
1494     }                                         << 
1495                                               << 
1496 //    if (verbosity >= G4VisManager::warnings << 
1497 //      const std::map<G4String,G4AttDef>* at << 
1498 //      std::vector<G4AttValue>* attValues =  << 
1499 //      G4warn << G4AttCheck(attValues, attDe << 
1500 //      delete attValues;                     << 
1501 //    }                                       << 
1502                                               << 
1503     if (verbosity >= G4VisManager::confirmati << 
1504       G4cout << "Logical volume \"" << pLV -> << 
1505        << "\" with requested depth of descent << 
1506        << requestedDepthOfDescent             << 
1507        << ",\n  with";                        << 
1508       if (!booleans) G4cout << "out";         << 
1509       G4cout << " boolean components, with";  << 
1510       if (!voxels) G4cout << "out";           << 
1511       G4cout << " voxels,\n  with";           << 
1512       if (!readout) G4cout << "out";          << 
1513       G4cout << " readout geometry and with"; << 
1514       if (!checkOverlaps) G4cout << "out";    << 
1515       G4cout << " overlap checking"           << 
1516        << "\n  has been added to scene \"" << << 
1517       if (axes) {                             << 
1518         if (axesSuccessful) {                 << 
1519           G4cout <<                           << 
1520           "\n  Axes have also been added at t << 
1521         } else {                              << 
1522           G4cout <<                           << 
1523           "\n  Axes have not been added for s << 
1524         }                                     << 
1525       }                                       << 
1526       G4cout << G4endl;                       << 
1527     }                                         << 
1528   }                                           << 
1529   else {                                      << 
1530     G4VisCommandsSceneAddUnsuccessful(verbosi << 
1531     return;                                   << 
1532   }                                           << 
1533                                               << 
1534   CheckSceneAndNotifyHandlers (pScene);       << 
1535 }                                             << 
1536                                               << 
1537                                               << 
1538 ////////////// /vis/scene/add/logo ////////// << 
1539                                               << 
1540 G4VisCommandSceneAddLogo::G4VisCommandSceneAd << 
1541   G4bool omitable;                            << 
1542   fpCommand = new G4UIcommand ("/vis/scene/ad << 
1543   fpCommand -> SetGuidance ("Adds a G4 logo t << 
1544   fpCommand -> SetGuidance                    << 
1545   ("If \"unit\" is \"auto\", height is roughl << 
1546   fpCommand -> SetGuidance                    << 
1547   ("\"direction\" is that of outward-facing n << 
1548    "\nIf \"direction\" is \"auto\", logo face << 
1549   fpCommand -> SetGuidance                    << 
1550   ("\nIf \"placement\" is \"auto\", logo is p << 
1551    "\n  when viewed from logo direction.");   << 
1552   G4UIparameter* parameter;                   << 
1553   parameter = new G4UIparameter ("height", 'd << 
1554   parameter->SetDefaultValue (1.);            << 
1555   fpCommand->SetParameter (parameter);        << 
1556   parameter =  new G4UIparameter ("unit", 's' << 
1557   parameter->SetDefaultValue ("auto");        << 
1558   fpCommand->SetParameter (parameter);        << 
1559   parameter =  new G4UIparameter ("direction" << 
1560   parameter->SetGuidance ("auto|[-]x|[-]y|[-] << 
1561   parameter->SetDefaultValue ("auto");        << 
1562   fpCommand->SetParameter (parameter);        << 
1563   parameter =  new G4UIparameter ("red", 'd', << 
1564   parameter->SetDefaultValue (0.);            << 
1565   fpCommand->SetParameter (parameter);        << 
1566   parameter =  new G4UIparameter ("green", 'd << 
1567   parameter->SetDefaultValue (1.);            << 
1568   fpCommand->SetParameter (parameter);        << 
1569   parameter =  new G4UIparameter ("blue", 'd' << 
1570   parameter->SetDefaultValue (0.);            << 
1571   fpCommand->SetParameter (parameter);        << 
1572   parameter =  new G4UIparameter ("placement" << 
1573   parameter -> SetParameterCandidates("auto m << 
1574   parameter->SetDefaultValue  ("auto");       << 
1575   fpCommand->SetParameter     (parameter);    << 
1576   parameter =  new G4UIparameter ("xmid", 'd' << 
1577   parameter->SetDefaultValue (0.);            << 
1578   fpCommand->SetParameter (parameter);        << 
1579   parameter =  new G4UIparameter ("ymid", 'd' << 
1580   parameter->SetDefaultValue (0.);            << 
1581   fpCommand->SetParameter (parameter);        << 
1582   parameter =  new G4UIparameter ("zmid", 'd' << 
1583   parameter->SetDefaultValue (0.);            << 
1584   fpCommand->SetParameter (parameter);        << 
1585   parameter =  new G4UIparameter ("unit", 's' << 
1586   parameter->SetDefaultValue ("m");           << 
1587   fpCommand->SetParameter (parameter);        << 
1588 }                                             << 
1589                                               << 
1590 G4VisCommandSceneAddLogo::~G4VisCommandSceneA << 
1591   delete fpCommand;                           << 
1592 }                                             << 
1593                                               << 
1594 G4String G4VisCommandSceneAddLogo::GetCurrent << 
1595   return "";                                  << 
1596 }                                             << 
1597                                               << 
1598 void G4VisCommandSceneAddLogo::SetNewValue (G << 
1599                                               << 
1600   G4VisManager::Verbosity verbosity = fpVisMa << 
1601   G4bool warn = verbosity >= G4VisManager::wa << 
1602                                               << 
1603   G4Scene* pScene = fpVisManager->GetCurrentS << 
1604   if (!pScene) {                              << 
1605     if (verbosity >= G4VisManager::errors) {  << 
1606       G4warn << "ERROR: No current scene.  Pl << 
1607     }                                         << 
1608     return;                                   << 
1609   } else {                                    << 
1610     if (pScene->GetExtent().GetExtentRadius() << 
1611       if (verbosity >= G4VisManager::errors)  << 
1612         G4warn                                << 
1613   << "ERROR: Scene has no extent. Add volumes << 
1614         << G4endl;                            << 
1615       }                                       << 
1616       return;                                 << 
1617     }                                         << 
1618   }                                           << 
1619                                               << 
1620   G4VViewer* pViewer = fpVisManager->GetCurre << 
1621   if (!pViewer) {                             << 
1622     if (verbosity >= G4VisManager::errors) {  << 
1623       G4warn <<                               << 
1624   "ERROR: G4VisCommandSceneAddLogo::SetNewVal << 
1625   "\n  Auto direction needs a viewer."        << 
1626        << G4endl;                             << 
1627     }                                         << 
1628     return;                                   << 
1629   }                                           << 
1630                                               << 
1631   G4double userHeight, red, green, blue, xmid << 
1632   G4String userHeightUnit, direction, placeme << 
1633   std::istringstream is (newValue);           << 
1634   is >> userHeight >> userHeightUnit >> direc << 
1635      >> red >> green >> blue                  << 
1636      >> placement                             << 
1637      >> xmid >> ymid >> zmid >> positionUnit; << 
1638                                               << 
1639   G4double height = userHeight;               << 
1640   const G4VisExtent& sceneExtent = pScene->Ge << 
1641   if (userHeightUnit == "auto") {             << 
1642     height *= 0.2 * sceneExtent.GetExtentRadi << 
1643   } else {                                    << 
1644     height *= G4UIcommand::ValueOf(userHeight << 
1645   }                                           << 
1646                                               << 
1647   G4double unit = G4UIcommand::ValueOf(positi << 
1648   xmid *= unit; ymid *= unit; zmid *= unit;   << 
1649                                               << 
1650   Direction logoDirection = X;  // Initialise << 
1651   if (direction == "auto") {                  << 
1652     // Take cue from viewer                   << 
1653     const G4Vector3D& vp =                    << 
1654       pViewer->GetViewParameters().GetViewpoi << 
1655     if (vp.x() > vp.y() && vp.x() > vp.z()) l << 
1656     else if (vp.x() < vp.y() && vp.x() < vp.z << 
1657     else if (vp.y() > vp.x() && vp.y() > vp.z << 
1658     else if (vp.y() < vp.x() && vp.y() < vp.z << 
1659     else if (vp.z() > vp.x() && vp.z() > vp.y << 
1660     else if (vp.z() < vp.x() && vp.z() < vp.y << 
1661   }                                           << 
1662   else if (direction[0] == 'x') logoDirection << 
1663   else if (direction[0] == 'y') logoDirection << 
1664   else if (direction[0] == 'z') logoDirection << 
1665   else if (direction[0] == '-') {             << 
1666     if (direction[1] == 'x') logoDirection =  << 
1667     else if (direction[1] == 'y') logoDirecti << 
1668     else if (direction[1] == 'z') logoDirecti << 
1669   } else {                                    << 
1670     if (verbosity >= G4VisManager::errors) {  << 
1671       G4warn << "ERROR: Unrecogniseed directi << 
1672        << direction << "\"." << G4endl;       << 
1673       return;                                 << 
1674     }                                         << 
1675   }                                           << 
1676                                               << 
1677   G4bool autoPlacing = false; if (placement = << 
1678   // Parameters read and interpreted.         << 
1679                                               << 
1680   // Current scene extent                     << 
1681   const G4double xmin = sceneExtent.GetXmin() << 
1682   const G4double xmax = sceneExtent.GetXmax() << 
1683   const G4double ymin = sceneExtent.GetYmin() << 
1684   const G4double ymax = sceneExtent.GetYmax() << 
1685   const G4double zmin = sceneExtent.GetZmin() << 
1686   const G4double zmax = sceneExtent.GetZmax() << 
1687                                               << 
1688   // Test existing extent and issue warnings. << 
1689   G4bool worried = false;                     << 
1690   if (sceneExtent.GetExtentRadius() == 0) {   << 
1691     worried = true;                           << 
1692     if (verbosity >= G4VisManager::warnings)  << 
1693       G4warn <<                               << 
1694   "WARNING: Existing scene does not yet have  << 
1695   "\n  Maybe you have not yet added any geome << 
1696        << G4endl;                             << 
1697     }                                         << 
1698   }                                           << 
1699                                               << 
1700   // Useful constants, etc...                 << 
1701   const G4double halfHeight(height / 2.);     << 
1702   const G4double comfort(0.01);  // 0.15 seem << 
1703   const G4double freeHeightFraction (1. + 2.  << 
1704                                               << 
1705   // Test existing scene for room...          << 
1706   G4bool room = true;                         << 
1707   switch (logoDirection) {                    << 
1708   case X:                                     << 
1709   case minusX:                                << 
1710     if (freeHeightFraction * (xmax - xmin) <  << 
1711     break;                                    << 
1712   case Y:                                     << 
1713   case minusY:                                << 
1714     if (freeHeightFraction * (ymax - ymin) <  << 
1715     break;                                    << 
1716   case Z:                                     << 
1717   case minusZ:                                << 
1718     if (freeHeightFraction * (zmax - zmin) <  << 
1719     break;                                    << 
1720   }                                           << 
1721   if (!room) {                                << 
1722     worried = true;                           << 
1723     if (verbosity >= G4VisManager::warnings)  << 
1724       G4warn <<                               << 
1725   "WARNING: Not enough room in existing scene << 
1726        << G4endl;                             << 
1727     }                                         << 
1728   }                                           << 
1729   if (worried) {                              << 
1730     if (verbosity >= G4VisManager::warnings)  << 
1731       G4warn <<                               << 
1732   "WARNING: The logo you have asked for is bi << 
1733   "\n  scene.  Maybe you have added it too so << 
1734   "\n  you add the logo last so that it can b << 
1735   "\n  so as not to be obscured by any existi << 
1736   "\n  view parameters can be correctly recal << 
1737        << G4endl;                             << 
1738     }                                         << 
1739   }                                           << 
1740                                               << 
1741   G4double sxmid(xmid), symid(ymid), szmid(zm << 
1742   if (autoPlacing) {                          << 
1743     // Aim to place at bottom right of screen << 
1744     // Give some comfort zone.                << 
1745     const G4double xComfort = comfort * (xmax << 
1746     const G4double yComfort = comfort * (ymax << 
1747     const G4double zComfort = comfort * (zmax << 
1748     switch (logoDirection) {                  << 
1749     case X:  // y-axis up, z-axis to left?    << 
1750       sxmid = xmax + halfHeight + xComfort;   << 
1751       symid = ymin - yComfort;                << 
1752       szmid = zmin - zComfort;                << 
1753       break;                                  << 
1754     case minusX:  // y-axis up, z-axis to rig << 
1755       sxmid = xmin - halfHeight - xComfort;   << 
1756       symid = ymin - yComfort;                << 
1757       szmid = zmax + zComfort;                << 
1758       break;                                  << 
1759     case Y:  // z-axis up, x-axis to left?    << 
1760       sxmid = xmin - xComfort;                << 
1761       symid = ymax + halfHeight + yComfort;   << 
1762       szmid = zmin - zComfort;                << 
1763       break;                                  << 
1764     case minusY:  // z-axis up, x-axis to rig << 
1765       sxmid = xmax + xComfort;                << 
1766       symid = ymin - halfHeight - yComfort;   << 
1767       szmid = zmin - zComfort;                << 
1768       break;                                  << 
1769     case Z:  // y-axis up, x-axis to right?   << 
1770       sxmid = xmax + xComfort;                << 
1771       symid = ymin - yComfort;                << 
1772       szmid = zmax + halfHeight + zComfort;   << 
1773       break;                                  << 
1774     case minusZ:  // y-axis up, x-axis to lef << 
1775       sxmid = xmin - xComfort;                << 
1776       symid = ymin - yComfort;                << 
1777       szmid = zmin - halfHeight - zComfort;   << 
1778       break;                                  << 
1779     }                                         << 
1780   }                                           << 
1781                                               << 
1782   G4Transform3D transform;                    << 
1783   switch (logoDirection) {                    << 
1784   case X:  // y-axis up, z-axis to left?      << 
1785     transform = G4RotateY3D(halfpi);          << 
1786     break;                                    << 
1787   case minusX:  // y-axis up, z-axis to right << 
1788     transform = G4RotateY3D(-halfpi);         << 
1789     break;                                    << 
1790   case Y:  // z-axis up, x-axis to left?      << 
1791     transform = G4RotateX3D(-halfpi) * G4Rota << 
1792     break;                                    << 
1793   case minusY:  // z-axis up, x-axis to right << 
1794     transform = G4RotateX3D(halfpi);          << 
1795     break;                                    << 
1796   case Z:  // y-axis up, x-axis to right?     << 
1797     // No transformation required.            << 
1798     break;                                    << 
1799   case minusZ:  // y-axis up, x-axis to left? << 
1800     transform = G4RotateY3D(pi);              << 
1801     break;                                    << 
1802   }                                           << 
1803   transform = G4Translate3D(sxmid,symid,szmid << 
1804                                               << 
1805   G4VisAttributes visAtts(G4Colour(red, green << 
1806   visAtts.SetForceSolid(true);         // Alw << 
1807                                               << 
1808   G4Logo* logo = new G4Logo(height,visAtts,tr << 
1809   G4VModel* model =                           << 
1810     new G4CallbackModel<G4VisCommandSceneAddL << 
1811   model->SetType("G4Logo");                   << 
1812   model->SetGlobalTag("G4Logo");              << 
1813   model->SetGlobalDescription("G4Logo: " + ne << 
1814   G4double& h = height;                       << 
1815   G4double h2 = h/2.;                         << 
1816   G4VisExtent extent(-h,h,-h2,h2,-h2,h2);     << 
1817   model->SetExtent(extent.Transform(transform << 
1818   // This extent gets "added" to existing sce << 
1819   // AddRunDurationModel below.               << 
1820   const G4String& currentSceneName = pScene - << 
1821   G4bool successful = pScene -> AddRunDuratio << 
1822   if (successful) {                           << 
1823     if (verbosity >= G4VisManager::confirmati << 
1824       G4cout << "G4 Logo of height " << userH << 
1825        << ", " << direction << "-direction, a << 
1826        << currentSceneName << "\"";           << 
1827       if (verbosity >= G4VisManager::paramete << 
1828   G4cout << "\n  with extent " << extent      << 
1829          << "\n  at " << transform.getRotatio << 
1830          << "  " << transform.getTranslation( << 
1831       }                                       << 
1832       G4cout << G4endl;                       << 
1833     }                                         << 
1834   }                                              220   }
1835   else G4VisCommandsSceneAddUnsuccessful(verb << 
1836                                               << 
1837   CheckSceneAndNotifyHandlers (pScene);       << 
1838 }                                                221 }
1839                                                  222 
1840 G4VisCommandSceneAddLogo::G4Logo::G4Logo      << 
1841 (G4double height, const G4VisAttributes& visA << 
1842 {                                             << 
1843   const G4double& h =  height;                << 
1844   const G4double h2  = 0.5 * h;   // Half hei << 
1845   const G4double ri  = 0.25 * h;  // Inner ra << 
1846   const G4double ro  = 0.5 * h;   // Outer ra << 
1847   const G4double ro2 = 0.5 * ro;  // Half out << 
1848   const G4double w   = ro - ri;   // Width.   << 
1849   const G4double w2  = 0.5 * w;   // Half wid << 
1850   const G4double d2  = 0.2 * h;   // Half dep << 
1851   const G4double f1  = 0.05 * h;  // left edg << 
1852   const G4double f2  = -0.3 * h;  // bottom e << 
1853   const G4double e = 1.e-4 * h;   // epsilon. << 
1854   const G4double xt = f1, yt = h2;      // To << 
1855   const G4double xb = -h2, yb = f2 + w; // Bo << 
1856   const G4double dx = xt - xb, dy = yt - yb;  << 
1857   const G4double angle = std::atan2(dy,dx);   << 
1858   G4RotationMatrix rm;                        << 
1859   rm.rotateZ(angle*rad);                      << 
1860   const G4double d = std::sqrt(dx * dx + dy * << 
1861   const G4double ss = h;  // Half height of s << 
1862   const G4double y8 = ss; // Choose y of subt << 
1863   const G4double x8 = ((-ss * d - dx * (yt -  << 
1864   G4double y9 = ss; // Choose y of subtractor << 
1865   G4double x9 = ((-(ss - w) * d - dx * (yt -  << 
1866   // But to get inner, we make a triangle tra << 
1867   const G4double xtr = ss - f1, ytr = -ss - f << 
1868   x9 += xtr; y9 += ytr;                       << 
1869                                               << 
1870   // The idea here is to create a polyhedron  << 
1871   // this we use Geant4 geometry solids and m << 
1872   // Note that we do not need to keep the sol << 
1873   // which, of course, are deleted on leaving << 
1874   // is contrary to the usual requirement for << 
1875   // detector for which solids MUST be create << 
1876   // Finally we invoke CreatePolyhedron, whic << 
1877   // and returns a pointer.  It is the user's << 
1878   // which is done in the destructor of this  << 
1879   // created here, remain on the heap for the << 
1880                                               << 
1881   // G...                                     << 
1882   G4Tubs tG("tG",ri,ro,d2,0.15*pi,1.85*pi);   << 
1883   G4Box bG("bG",w2,ro2,d2);                   << 
1884   G4UnionSolid logoG("logoG",&tG,&bG,G4Transl << 
1885   // Create with these vis atts (force solid) << 
1886   G4Polyhedron::SetNumberOfRotationSteps      << 
1887   (fpVisManager->GetCurrentViewer()->GetViewP << 
1888   fpG = logoG.CreatePolyhedron();             << 
1889   G4Polyhedron::ResetNumberOfRotationSteps () << 
1890   fpG->SetVisAttributes(visAtts);             << 
1891   fpG->Transform(G4Translate3D(-0.55*h,0.,0.) << 
1892   fpG->Transform(transform);                  << 
1893                                               << 
1894   // 4...                                     << 
1895   G4Box b1("b1",h2,h2,d2);                    << 
1896   G4Box bS("bS",ss,ss,d2+e);  // Subtractor.  << 
1897   G4Box bS2("bS2",ss,ss,d2+2.*e);  // 2nd Sub << 
1898   G4SubtractionSolid s1("s1",&b1,&bS,G4Transl << 
1899   G4SubtractionSolid s2("s2",&s1,&bS,G4Transl << 
1900   G4SubtractionSolid s3("s3",&s2,&bS,G4Transl << 
1901   G4SubtractionSolid s4                       << 
1902     ("s4",&s3,&bS,G4Transform3D(rm,G4ThreeVec << 
1903   G4SubtractionSolid s5    // Triangular hole << 
1904     ("s5",&bS,&bS2,G4Transform3D(rm,G4ThreeVe << 
1905   G4SubtractionSolid logo4("logo4",&s4,&s5,G4 << 
1906   fp4 = logo4.CreatePolyhedron();             << 
1907   /* Experiment with creating own polyhedron. << 
1908   int nNodes = 4;                             << 
1909   int nFaces = 4;                             << 
1910   double xyz[][3] = {{0,0,0},{1*m,0,0},{0,1*m << 
1911   int faces[][4] = {{1,3,2,0},{1,2,4,0},{1,4, << 
1912   fp4 = new G4Polyhedron();                   << 
1913   fp4->createPolyhedron(nNodes,nFaces,xyz,fac << 
1914   */                                          << 
1915   fp4->SetVisAttributes(visAtts);             << 
1916   fp4->Transform(G4Translate3D(0.55*h,0.,0.)) << 
1917   fp4->Transform(transform);                  << 
1918 }                                             << 
1919                                               << 
1920 G4VisCommandSceneAddLogo::G4Logo::~G4Logo() { << 
1921   delete fpG;                                 << 
1922   delete fp4;                                 << 
1923 }                                             << 
1924                                                  223 
1925 void G4VisCommandSceneAddLogo::G4Logo::operat << 224 ////////////// /vis/scene/add/ghosts ///////////////////////////////////////
1926   (G4VGraphicsScene& sceneHandler, const G4Mo << 
1927   sceneHandler.BeginPrimitives();             << 
1928   sceneHandler.AddPrimitive(*fpG);            << 
1929   sceneHandler.AddPrimitive(*fp4);            << 
1930   sceneHandler.EndPrimitives();               << 
1931 }                                             << 
1932                                               << 
1933 ////////////// /vis/scene/add/logo2D //////// << 
1934                                                  225 
1935 G4VisCommandSceneAddLogo2D::G4VisCommandScene << 226 G4VisCommandSceneAddGhosts::G4VisCommandSceneAddGhosts () {
1936   G4bool omitable;                               227   G4bool omitable;
1937   fpCommand = new G4UIcommand ("/vis/scene/ad << 228   fpCommand = new G4UIcmdWithAString ("/vis/scene/add/ghosts", this);
1938   fpCommand -> SetGuidance ("Adds 2D logo to  << 229   fpCommand -> AvailableForStates (Idle, GeomClosed);
1939   G4UIparameter* parameter;                   << 
1940   parameter = new G4UIparameter ("size", 'i', << 
1941   parameter -> SetGuidance ("Screen size of t << 
1942   parameter -> SetDefaultValue (48);          << 
1943   fpCommand -> SetParameter (parameter);      << 
1944   parameter = new G4UIparameter ("x-position" << 
1945   parameter -> SetGuidance ("x screen positio << 
1946   parameter -> SetDefaultValue (-0.9);        << 
1947   fpCommand -> SetParameter (parameter);      << 
1948   parameter = new G4UIparameter ("y-position" << 
1949   parameter -> SetGuidance ("y screen positio << 
1950   parameter -> SetDefaultValue (-0.9);        << 
1951   fpCommand -> SetParameter (parameter);      << 
1952   parameter = new G4UIparameter ("layout", 's << 
1953   parameter -> SetGuidance ("Layout, i.e., ad << 
1954   parameter -> SetDefaultValue ("left");      << 
1955   fpCommand -> SetParameter (parameter);      << 
1956 }                                             << 
1957                                               << 
1958 G4VisCommandSceneAddLogo2D::~G4VisCommandScen << 
1959   delete fpCommand;                           << 
1960 }                                             << 
1961                                               << 
1962 G4String G4VisCommandSceneAddLogo2D::GetCurre << 
1963   return "";                                  << 
1964 }                                             << 
1965                                               << 
1966 void G4VisCommandSceneAddLogo2D::SetNewValue  << 
1967 {                                             << 
1968   G4VisManager::Verbosity verbosity = fpVisMa << 
1969   G4bool warn(verbosity >= G4VisManager::warn << 
1970                                               << 
1971   G4Scene* pScene = fpVisManager->GetCurrentS << 
1972   if (!pScene) {                              << 
1973     if (verbosity >= G4VisManager::errors) {  << 
1974       G4warn << "ERROR: No current scene.  Pl << 
1975     }                                         << 
1976     return;                                   << 
1977   }                                           << 
1978                                               << 
1979   G4int size;                                 << 
1980   G4double x, y;                              << 
1981   G4String layoutString;                      << 
1982   std::istringstream is(newValue);            << 
1983   is >> size >> x >> y >> layoutString;       << 
1984   G4Text::Layout layout = G4Text::right;      << 
1985   if (layoutString[0] == 'l') layout = G4Text << 
1986   else if (layoutString[0] == 'c') layout = G << 
1987   else if (layoutString[0] == 'r') layout = G << 
1988                                               << 
1989   Logo2D* logo2D = new Logo2D(fpVisManager, s << 
1990   G4VModel* model =                           << 
1991     new G4CallbackModel<G4VisCommandSceneAddL << 
1992   model->SetType("G4Logo2D");                 << 
1993   model->SetGlobalTag("G4Logo2D");            << 
1994   model->SetGlobalDescription("G4Logo2D: " +  << 
1995   const G4String& currentSceneName = pScene - << 
1996   G4bool successful = pScene -> AddRunDuratio << 
1997   if (successful) {                           << 
1998     if (verbosity >= G4VisManager::confirmati << 
1999       G4cout << "2D logo has been added to sc << 
2000        << currentSceneName << "\"."           << 
2001        << G4endl;                             << 
2002     }                                         << 
2003   }                                           << 
2004   else G4VisCommandsSceneAddUnsuccessful(verb << 
2005                                               << 
2006   CheckSceneAndNotifyHandlers (pScene);       << 
2007 }                                             << 
2008                                               << 
2009 void G4VisCommandSceneAddLogo2D::Logo2D::oper << 
2010   (G4VGraphicsScene& sceneHandler, const G4Mo << 
2011 {                                             << 
2012   G4Text text("Geant4", G4Point3D(fX, fY, 0.) << 
2013   text.SetScreenSize(fSize);                  << 
2014   text.SetLayout(fLayout);                    << 
2015   G4VisAttributes textAtts(G4Colour::Brown()) << 
2016   text.SetVisAttributes(textAtts);            << 
2017   sceneHandler.BeginPrimitives2D();           << 
2018   sceneHandler.AddPrimitive(text);            << 
2019   sceneHandler.EndPrimitives2D();             << 
2020 }                                             << 
2021                                               << 
2022 ////////////// /vis/scene/add/magneticField / << 
2023                                               << 
2024 G4VisCommandSceneAddMagneticField::G4VisComma << 
2025   fpCommand = new G4UIcommand ("/vis/scene/ad << 
2026   fpCommand -> SetGuidance                       230   fpCommand -> SetGuidance
2027   ("Adds magnetic field representation to cur << 231     ("/vis/scene/add/ghosts [<particle-name>]");
2028   const G4UIcommandTree* tree = G4UImanager:: << 
2029   const G4UIcommand* addElecFieldCmd = tree-> << 
2030   // Pick up additional guidance from /vis/sc << 
2031   CopyGuidanceFrom(addElecFieldCmd,fpCommand, << 
2032   // Pick up parameters from /vis/scene/add/e << 
2033   CopyParametersFrom(addElecFieldCmd,fpComman << 
2034 }                                             << 
2035                                               << 
2036 G4VisCommandSceneAddMagneticField::~G4VisComm << 
2037   delete fpCommand;                           << 
2038 }                                             << 
2039                                               << 
2040 G4String G4VisCommandSceneAddMagneticField::G << 
2041   return "";                                  << 
2042 }                                             << 
2043                                               << 
2044 void G4VisCommandSceneAddMagneticField::SetNe << 
2045 (G4UIcommand*, G4String newValue) {           << 
2046                                               << 
2047   G4VisManager::Verbosity verbosity = fpVisMa << 
2048   G4bool warn(verbosity >= G4VisManager::warn << 
2049                                               << 
2050   G4Scene* pScene = fpVisManager->GetCurrentS << 
2051   if (!pScene) {                              << 
2052     if (verbosity >= G4VisManager::errors) {  << 
2053       G4warn <<  "ERROR: No current scene.  P << 
2054     }                                         << 
2055     return;                                   << 
2056   }                                           << 
2057                                               << 
2058   G4int nDataPointsPerHalfScene;              << 
2059   G4String representation;                    << 
2060   std::istringstream iss(newValue);           << 
2061   iss >> nDataPointsPerHalfScene >> represent << 
2062   G4ElectricFieldModel::Representation        << 
2063   modelRepresentation = G4ElectricFieldModel: << 
2064   if (representation == "lightArrow") {       << 
2065     modelRepresentation = G4ElectricFieldMode << 
2066   }                                           << 
2067   G4VModel* model;                            << 
2068   model = new G4MagneticFieldModel            << 
2069   (nDataPointsPerHalfScene,modelRepresentatio << 
2070    fCurrentArrow3DLineSegmentsPerCircle,      << 
2071    fCurrentExtentForField,                    << 
2072    fCurrrentPVFindingsForField);              << 
2073   const G4String& currentSceneName = pScene - << 
2074   G4bool successful = pScene -> AddRunDuratio << 
2075   if (successful) {                           << 
2076     if (verbosity >= G4VisManager::confirmati << 
2077       G4cout                                  << 
2078       << "Magnetic field, if any, will be dra << 
2079       << currentSceneName                     << 
2080       << "\"\n  with "                        << 
2081       << nDataPointsPerHalfScene              << 
2082       << " data points per half extent and wi << 
2083       << representation                       << 
2084       << '\"'                                 << 
2085       << G4endl;                              << 
2086     }                                         << 
2087   }                                           << 
2088   else G4VisCommandsSceneAddUnsuccessful(verb << 
2089                                               << 
2090   CheckSceneAndNotifyHandlers (pScene);       << 
2091 }                                             << 
2092                                               << 
2093 ////////////// /vis/scene/add/psHits //////// << 
2094                                               << 
2095 G4VisCommandSceneAddPSHits::G4VisCommandScene << 
2096   G4bool omitable;                            << 
2097   fpCommand = new G4UIcmdWithAString ("/vis/s << 
2098   fpCommand -> SetGuidance                       232   fpCommand -> SetGuidance
2099     ("Adds Primitive Scorer Hits (PSHits) to  << 233     ("Adds ghost volumes (G4FlavoredParallelWorld) to the current scene.");
2100   fpCommand -> SetGuidance                       234   fpCommand -> SetGuidance
2101     ("PSHits are drawn at end of run when the << 235     ("Selects by particle (default = \"all\").");
2102      "\nthey are added is current.");         << 236   fpCommand -> SetParameterName ("particle", omitable = true);
2103   fpCommand -> SetGuidance                    << 
2104     ("Optional parameter specifies name of sc << 
2105      "\nscoring maps registered with the G4Sc << 
2106   fpCommand -> SetParameterName ("mapname", o << 
2107   fpCommand -> SetDefaultValue ("all");          237   fpCommand -> SetDefaultValue ("all");
2108 }                                                238 }
2109                                                  239 
2110 G4VisCommandSceneAddPSHits::~G4VisCommandScen << 240 G4VisCommandSceneAddGhosts::~G4VisCommandSceneAddGhosts () {
2111   delete fpCommand;                           << 
2112 }                                             << 
2113                                               << 
2114 G4String G4VisCommandSceneAddPSHits::GetCurre << 
2115   return "";                                  << 
2116 }                                             << 
2117                                               << 
2118 void G4VisCommandSceneAddPSHits::SetNewValue  << 
2119 (G4UIcommand*, G4String newValue)             << 
2120 {                                             << 
2121   G4VisManager::Verbosity verbosity = fpVisMa << 
2122   G4bool warn(verbosity >= G4VisManager::warn << 
2123                                               << 
2124   G4Scene* pScene = fpVisManager->GetCurrentS << 
2125   if (!pScene) {                              << 
2126     if (verbosity >= G4VisManager::errors) {  << 
2127       G4warn << "ERROR: No current scene.  Pl << 
2128     }                                         << 
2129     return;                                   << 
2130   }                                           << 
2131                                               << 
2132   G4VModel* model = new G4PSHitsModel(newValu << 
2133   const G4String& currentSceneName = pScene - << 
2134   G4bool successful = pScene -> AddEndOfRunMo << 
2135   if (successful) {                           << 
2136     if (verbosity >= G4VisManager::confirmati << 
2137       if (newValue == "all") {                << 
2138   G4cout << "All Primitive Scorer hits";      << 
2139       } else {                                << 
2140   G4cout << "Hits of Primitive Scorer \"" <<  << 
2141       }                                       << 
2142       G4cout << " will be drawn at end of run << 
2143        << currentSceneName << "\"."           << 
2144        << G4endl;                             << 
2145     }                                         << 
2146   }                                           << 
2147   else G4VisCommandsSceneAddUnsuccessful(verb << 
2148                                               << 
2149   CheckSceneAndNotifyHandlers (pScene);       << 
2150 }                                             << 
2151                                               << 
2152 ////////////// /vis/scene/add/scale ///////// << 
2153                                               << 
2154 G4VisCommandSceneAddScale::G4VisCommandSceneA << 
2155   G4bool omitable;                            << 
2156   fpCommand = new G4UIcommand ("/vis/scene/ad << 
2157   fpCommand -> SetGuidance                    << 
2158   ("Adds an annotated scale line to the curre << 
2159   fpCommand -> SetGuidance                    << 
2160   ("If \"unit\" is \"auto\", length is roughl << 
2161   fpCommand -> SetGuidance                    << 
2162   ("If \"direction\" is \"auto\", scale is ro << 
2163   fpCommand -> SetGuidance                    << 
2164   ("If \"placement\" is \"auto\", scale is pl << 
2165    "\n  Otherwise placed at (xmid,ymid,zmid). << 
2166   fpCommand -> SetGuidance                    << 
2167   ("An annotated line in the specified direct << 
2168    "\nend.  If autoPlacing is true it is requ << 
2169    "\nfront, right, bottom corner of the worl << 
2170    "\nthe existing bounding box/sphere so tha << 
2171    "\nobscure it.  Otherwise it is required t << 
2172    "\n(xmid, ymid, zmid)."                    << 
2173    "\n"                                       << 
2174    "\nThe auto placing algorithm is (approx): << 
2175    "\n  x = xmin + (1 + comfort) * (xmax - xm << 
2176    "\n  y = ymin - comfort * (ymax - ymin);"  << 
2177    "\n  z = zmin + (1 + comfort) * (zmax - zm << 
2178    "\n  if direction == x then (x - length,y, << 
2179    "\n  if direction == y then (x,y,z) to (x, << 
2180    "\n  if direction == z then (x,y,z - lengt << 
2181    );                                         << 
2182   G4UIparameter* parameter;                   << 
2183   parameter = new G4UIparameter ("length", 'd << 
2184   parameter->SetDefaultValue (1.);            << 
2185   fpCommand->SetParameter (parameter);        << 
2186   parameter =  new G4UIparameter ("unit", 's' << 
2187   parameter->SetDefaultValue ("auto");        << 
2188   fpCommand->SetParameter (parameter);        << 
2189   parameter =  new G4UIparameter ("direction" << 
2190   parameter->SetGuidance ("auto|x|y|z");      << 
2191   parameter->SetDefaultValue ("auto");        << 
2192   fpCommand->SetParameter (parameter);        << 
2193   parameter =  new G4UIparameter ("red", 'd', << 
2194   parameter->SetDefaultValue (1.);            << 
2195   fpCommand->SetParameter (parameter);        << 
2196   parameter =  new G4UIparameter ("green", 'd << 
2197   parameter->SetDefaultValue (0.);            << 
2198   fpCommand->SetParameter (parameter);        << 
2199   parameter =  new G4UIparameter ("blue", 'd' << 
2200   parameter->SetDefaultValue (0.);            << 
2201   fpCommand->SetParameter (parameter);        << 
2202   parameter =  new G4UIparameter ("placement" << 
2203   parameter -> SetParameterCandidates("auto m << 
2204   parameter->SetDefaultValue  ("auto");       << 
2205   fpCommand->SetParameter     (parameter);    << 
2206   parameter =  new G4UIparameter ("xmid", 'd' << 
2207   parameter->SetDefaultValue (0.);            << 
2208   fpCommand->SetParameter (parameter);        << 
2209   parameter =  new G4UIparameter ("ymid", 'd' << 
2210   parameter->SetDefaultValue (0.);            << 
2211   fpCommand->SetParameter (parameter);        << 
2212   parameter =  new G4UIparameter ("zmid", 'd' << 
2213   parameter->SetDefaultValue (0.);            << 
2214   fpCommand->SetParameter (parameter);        << 
2215   parameter =  new G4UIparameter ("unit", 's' << 
2216   parameter->SetDefaultValue ("m");           << 
2217   fpCommand->SetParameter (parameter);        << 
2218 }                                             << 
2219                                               << 
2220 G4VisCommandSceneAddScale::~G4VisCommandScene << 
2221   delete fpCommand;                           << 
2222 }                                             << 
2223                                               << 
2224 G4String G4VisCommandSceneAddScale::GetCurren << 
2225   return "";                                  << 
2226 }                                             << 
2227                                               << 
2228 void G4VisCommandSceneAddScale::SetNewValue ( << 
2229                                               << 
2230   G4VisManager::Verbosity verbosity = fpVisMa << 
2231   G4bool warn = verbosity >= G4VisManager::wa << 
2232                                               << 
2233   G4Scene* pScene = fpVisManager->GetCurrentS << 
2234   if (!pScene) {                              << 
2235     if (verbosity >= G4VisManager::errors) {  << 
2236       G4warn << "ERROR: No current scene.  Pl << 
2237     }                                         << 
2238     return;                                   << 
2239   } else {                                    << 
2240     if (pScene->GetExtent().GetExtentRadius() << 
2241       if (verbosity >= G4VisManager::errors)  << 
2242         G4warn                                << 
2243   << "ERROR: Scene has no extent. Add volumes << 
2244         << G4endl;                            << 
2245       }                                       << 
2246       return;                                 << 
2247     }                                         << 
2248   }                                           << 
2249                                               << 
2250   G4double userLength, red, green, blue, xmid << 
2251   G4String userLengthUnit, direction, placeme << 
2252   std::istringstream is (newValue);           << 
2253   is >> userLength >> userLengthUnit >> direc << 
2254      >> red >> green >> blue                  << 
2255      >> placement                             << 
2256      >> xmid >> ymid >> zmid >> positionUnit; << 
2257                                               << 
2258   G4double length = userLength;               << 
2259   const G4VisExtent& sceneExtent = pScene->Ge << 
2260   if (userLengthUnit == "auto") {             << 
2261     const G4double lengthMax = 0.5 * sceneExt << 
2262     const G4double intLog10Length = std::floo << 
2263     length = std::pow(10,intLog10Length);     << 
2264     if (5.*length < lengthMax) length *= 5.;  << 
2265     else if (2.*length < lengthMax) length *= << 
2266   } else {                                    << 
2267     length *= G4UIcommand::ValueOf(userLength << 
2268   }                                           << 
2269   G4String annotation = G4BestUnit(length,"Le << 
2270                                               << 
2271   G4double unit = G4UIcommand::ValueOf(positi << 
2272   xmid *= unit; ymid *= unit; zmid *= unit;   << 
2273                                               << 
2274   Scale::Direction scaleDirection (Scale::x); << 
2275   if (direction[0] == 'y') scaleDirection = S << 
2276   if (direction[0] == 'z') scaleDirection = S << 
2277                                               << 
2278   G4VViewer* pViewer = fpVisManager->GetCurre << 
2279   if (!pViewer) {                             << 
2280     if (verbosity >= G4VisManager::errors) {  << 
2281       G4warn <<                               << 
2282   "ERROR: G4VisCommandSceneAddScale::SetNewVa << 
2283   "\n  Auto direction needs a viewer."        << 
2284        << G4endl;                             << 
2285     }                                         << 
2286     return;                                   << 
2287   }                                           << 
2288                                               << 
2289   const G4Vector3D& vp =                      << 
2290     pViewer->GetViewParameters().GetViewpoint << 
2291   const G4Vector3D& up =                      << 
2292     pViewer->GetViewParameters().GetUpVector( << 
2293                                               << 
2294   if (direction == "auto") {  // Takes cue fr << 
2295     if (std::abs(vp.x()) > std::abs(vp.y()) & << 
2296   std::abs(vp.x()) > std::abs(vp.z())) {  //  << 
2297       if (std::abs(up.y()) > std::abs(up.z()) << 
2298     else scaleDirection = Scale::y;           << 
2299     }                                         << 
2300     else if (std::abs(vp.y()) > std::abs(vp.x << 
2301        std::abs(vp.y()) > std::abs(vp.z())) { << 
2302       if (std::abs(up.x()) > std::abs(up.z()) << 
2303     else scaleDirection = Scale::x;           << 
2304     }                                         << 
2305     else if (std::abs(vp.z()) > std::abs(vp.x << 
2306        std::abs(vp.z()) > std::abs(vp.y())) { << 
2307       if (std::abs(up.y()) > std::abs(up.x()) << 
2308     else scaleDirection = Scale::y;           << 
2309     }                                         << 
2310   }                                           << 
2311                                               << 
2312   G4bool autoPlacing = false; if (placement = << 
2313   // Parameters read and interpreted.         << 
2314                                               << 
2315   // Useful constants, etc...                 << 
2316   const G4double halfLength(length / 2.);     << 
2317   const G4double comfort(0.01);  // 0.15 seem << 
2318   const G4double freeLengthFraction (1. + 2.  << 
2319                                               << 
2320   const G4double xmin = sceneExtent.GetXmin() << 
2321   const G4double xmax = sceneExtent.GetXmax() << 
2322   const G4double ymin = sceneExtent.GetYmin() << 
2323   const G4double ymax = sceneExtent.GetYmax() << 
2324   const G4double zmin = sceneExtent.GetZmin() << 
2325   const G4double zmax = sceneExtent.GetZmax() << 
2326                                               << 
2327   // Test existing extent and issue warnings. << 
2328   G4bool worried = false;                     << 
2329   if (sceneExtent.GetExtentRadius() == 0) {   << 
2330     worried = true;                           << 
2331     if (verbosity >= G4VisManager::warnings)  << 
2332       G4warn <<                               << 
2333   "WARNING: Existing scene does not yet have  << 
2334   "\n  Maybe you have not yet added any geome << 
2335        << G4endl;                             << 
2336     }                                         << 
2337   }                                           << 
2338                                               << 
2339   // Test existing scene for room...          << 
2340   G4bool room  = true;                        << 
2341   switch (scaleDirection) {                   << 
2342   case Scale::x:                              << 
2343     if (freeLengthFraction * (xmax - xmin) <  << 
2344     break;                                    << 
2345   case Scale::y:                              << 
2346     if (freeLengthFraction * (ymax - ymin) <  << 
2347     break;                                    << 
2348   case Scale::z:                              << 
2349     if (freeLengthFraction * (zmax - zmin) <  << 
2350     break;                                    << 
2351   }                                           << 
2352   if (!room) {                                << 
2353     worried = true;                           << 
2354     if (verbosity >= G4VisManager::warnings)  << 
2355       G4warn <<                               << 
2356   "WARNING: Not enough room in existing scene << 
2357        << G4endl;                             << 
2358     }                                         << 
2359   }                                           << 
2360   if (worried) {                              << 
2361     if (verbosity >= G4VisManager::warnings)  << 
2362       G4warn <<                               << 
2363   "WARNING: The scale you have asked for is b << 
2364   "\n  scene.  Maybe you have added it too so << 
2365   "\n  you add the scale last so that it can  << 
2366   "\n  so as not to be obscured by any existi << 
2367   "\n  view parameters can be correctly recal << 
2368        << G4endl;                             << 
2369     }                                         << 
2370   }                                           << 
2371                                               << 
2372   // Now figure out the extent...             << 
2373   //                                          << 
2374   // This creates a representation of annotat << 
2375   // direction with tick marks at the end.  I << 
2376   // is required to be centred at the front,  << 
2377   // the world space, comfortably outside the << 
2378   // box/sphere so that existing objects do n << 
2379   // it is required to be drawn with mid-poin << 
2380   //                                          << 
2381   // The auto placing algorithm might be:     << 
2382   //   x = xmin + (1 + comfort) * (xmax - xmi << 
2383   //   y = ymin - comfort * (ymax - ymin)     << 
2384   //   z = zmin + (1 + comfort) * (zmax - zmi << 
2385   //   if direction == x then (x - length,y,z << 
2386   //   if direction == y then (x,y,z) to (x,y << 
2387   //   if direction == z then (x,y,z - length << 
2388   //                                          << 
2389   // Implement this in two parts.  Here, use  << 
2390   // "expand" the scene's extent.  Then rende << 
2391   // G4VSceneHandler::AddPrimitive(const G4Sc << 
2392   // ensure it's within the new extent.       << 
2393   //                                          << 
2394                                               << 
2395   G4double sxmid(xmid), symid(ymid), szmid(zm << 
2396   if (autoPlacing) {                          << 
2397     // Aim to place at bottom right of screen << 
2398     // Give some comfort zone.                << 
2399     const G4double xComfort = comfort * (xmax << 
2400     const G4double yComfort = comfort * (ymax << 
2401     const G4double zComfort = comfort * (zmax << 
2402     switch (scaleDirection) {                 << 
2403     case Scale::x:                            << 
2404       if (vp.z() > 0.) {                      << 
2405   sxmid = xmax + xComfort;                    << 
2406   symid = ymin - yComfort;                    << 
2407   szmid = zmin - zComfort;                    << 
2408       } else {                                << 
2409   sxmid = xmin - xComfort;                    << 
2410   symid = ymin - yComfort;                    << 
2411   szmid = zmax + zComfort;                    << 
2412       }                                       << 
2413       break;                                  << 
2414     case Scale::y:                            << 
2415       if (vp.x() > 0.) {                      << 
2416   sxmid = xmin - xComfort;                    << 
2417   symid = ymax + yComfort;                    << 
2418   szmid = zmin - zComfort;                    << 
2419       } else {                                << 
2420   sxmid = xmax + xComfort;                    << 
2421   symid = ymin - yComfort;                    << 
2422   szmid = zmin - zComfort;                    << 
2423       }                                       << 
2424       break;                                  << 
2425     case Scale::z:                            << 
2426       if (vp.x() > 0.) {                      << 
2427   sxmid = xmax + xComfort;                    << 
2428   symid = ymin - yComfort;                    << 
2429   szmid = zmax + zComfort;                    << 
2430       } else {                                << 
2431   sxmid = xmin - xComfort;                    << 
2432   symid = ymin - yComfort;                    << 
2433   szmid = zmax + zComfort;                    << 
2434       }                                       << 
2435       break;                                  << 
2436     }                                         << 
2437   }                                           << 
2438                                               << 
2439   G4Transform3D transform;                    << 
2440   const G4double h = halfLength;              << 
2441   const G4double t = h/5.;                    << 
2442   G4VisExtent scaleExtent(-h,h,-t,t,-t,t);    << 
2443   switch (scaleDirection) {                   << 
2444   case Scale::x:                              << 
2445     break;                                    << 
2446   case Scale::y:                              << 
2447     transform = G4RotateZ3D(halfpi);          << 
2448     break;                                    << 
2449   case Scale::z:                              << 
2450     transform = G4RotateY3D(halfpi);          << 
2451     break;                                    << 
2452   }                                           << 
2453   transform = G4Translate3D(sxmid,symid,szmid << 
2454   scaleExtent = scaleExtent.Transform(transfo << 
2455                                               << 
2456   G4Colour colour(red, green, blue);          << 
2457   if (direction == "auto") {                  << 
2458     switch (scaleDirection) {                 << 
2459       case Scale::x:                          << 
2460   colour = G4Colour::Red();                   << 
2461   break;                                      << 
2462       case Scale::y:                          << 
2463   colour = G4Colour::Green();                 << 
2464   break;                                      << 
2465       case Scale::z:                          << 
2466   colour = G4Colour::Blue();                  << 
2467   break;                                      << 
2468     }                                         << 
2469   }                                           << 
2470   G4VisAttributes visAttr(colour);            << 
2471                                               << 
2472   Scale* scale = new Scale                    << 
2473   (visAttr, length, transform,                << 
2474    annotation, fCurrentTextSize, colour);     << 
2475   G4VModel* model = new G4CallbackModel<Scale << 
2476   model->SetType("Scale");                    << 
2477   model->SetGlobalTag("Scale");               << 
2478   model->SetGlobalDescription("Scale: " + new << 
2479   model->SetExtent(scaleExtent);              << 
2480                                               << 
2481   const G4String& currentSceneName = pScene - << 
2482   G4bool successful = pScene -> AddRunDuratio << 
2483   if (successful) {                           << 
2484     if (verbosity >= G4VisManager::confirmati << 
2485       G4cout << "Scale of " << annotation     << 
2486        << " added to scene \"" << currentScen << 
2487       if (verbosity >= G4VisManager::paramete << 
2488   G4cout << "\n  with extent " << scaleExtent << 
2489          << "\n  at " << transform.getRotatio << 
2490          << "  " << transform.getTranslation( << 
2491       }                                       << 
2492       G4cout << G4endl;                       << 
2493     }                                         << 
2494   }                                           << 
2495   else G4VisCommandsSceneAddUnsuccessful(verb << 
2496                                               << 
2497   CheckSceneAndNotifyHandlers (pScene);       << 
2498 }                                             << 
2499                                               << 
2500 G4VisCommandSceneAddScale::Scale::Scale       << 
2501  (const G4VisAttributes& visAtts,             << 
2502   G4double length, const G4Transform3D& trans << 
2503   const G4String& annotation, G4double annota << 
2504   const G4Colour& annotationColour):          << 
2505 fVisAtts(visAtts)                             << 
2506 {                                             << 
2507   // Useful constants...                      << 
2508   const G4double halfLength(length / 2.);     << 
2509   const G4double tickLength(length / 20.);    << 
2510                                               << 
2511   // Create (empty) polylines having the same << 
2512   // (OK to pass address since fVisAtts is lo << 
2513   fScaleLine.SetVisAttributes(&fVisAtts);     << 
2514   fTick11.SetVisAttributes(&fVisAtts);        << 
2515   fTick12.SetVisAttributes(&fVisAtts);        << 
2516   fTick21.SetVisAttributes(&fVisAtts);        << 
2517   fTick22.SetVisAttributes(&fVisAtts);        << 
2518                                               << 
2519   // Add points to the polylines to represent << 
2520   // x-axis centred on the origin...          << 
2521   G4Point3D r1(G4Point3D(-halfLength, 0., 0.) << 
2522   G4Point3D r2(G4Point3D( halfLength, 0., 0.) << 
2523   fScaleLine.push_back(r1);                   << 
2524   fScaleLine.push_back(r2);                   << 
2525   G4Point3D ticky(0., tickLength, 0.);        << 
2526   G4Point3D tickz(0., 0., tickLength);        << 
2527   fTick11.push_back(r1 + ticky);              << 
2528   fTick11.push_back(r1 - ticky);              << 
2529   fTick12.push_back(r1 + tickz);              << 
2530   fTick12.push_back(r1 - tickz);              << 
2531   fTick21.push_back(r2 + ticky);              << 
2532   fTick21.push_back(r2 - ticky);              << 
2533   fTick22.push_back(r2 + tickz);              << 
2534   fTick22.push_back(r2 - tickz);              << 
2535   // ...and transform to chosen position and  << 
2536   fScaleLine.transform(transform);            << 
2537   fTick11.transform(transform);               << 
2538   fTick12.transform(transform);               << 
2539   fTick21.transform(transform);               << 
2540   fTick22.transform(transform);               << 
2541   // Similarly for annotation                 << 
2542   G4Point3D textPosition(0., tickLength, 0.); << 
2543   textPosition.transform(transform);          << 
2544   fText = G4Text(annotation,textPosition);    << 
2545   fText.SetVisAttributes(annotationColour);   << 
2546   fText.SetScreenSize(annotationSize);        << 
2547 }                                             << 
2548                                               << 
2549 void G4VisCommandSceneAddScale::Scale::operat << 
2550 (G4VGraphicsScene& sceneHandler,const G4Model << 
2551 {                                             << 
2552   // Draw...                                  << 
2553   sceneHandler.BeginPrimitives();             << 
2554   sceneHandler.AddPrimitive(fScaleLine);      << 
2555   sceneHandler.AddPrimitive(fTick11);         << 
2556   sceneHandler.AddPrimitive(fTick12);         << 
2557   sceneHandler.AddPrimitive(fTick21);         << 
2558   sceneHandler.AddPrimitive(fTick22);         << 
2559   sceneHandler.AddPrimitive(fText);           << 
2560   sceneHandler.EndPrimitives();               << 
2561 }                                             << 
2562                                               << 
2563 ////////////// /vis/scene/add/text ////////// << 
2564                                               << 
2565 G4VisCommandSceneAddText::G4VisCommandSceneAd << 
2566   G4bool omitable;                            << 
2567   fpCommand = new G4UIcommand ("/vis/scene/ad << 
2568   fpCommand -> SetGuidance ("Adds text to cur << 
2569   fpCommand -> SetGuidance                    << 
2570     ("Use \"/vis/set/textColour\" to set colo << 
2571   fpCommand -> SetGuidance                    << 
2572     ("Use \"/vis/set/textLayout\" to set layo << 
2573   G4UIparameter* parameter;                   << 
2574   parameter = new G4UIparameter ("x", 'd', om << 
2575   parameter->SetDefaultValue (0);             << 
2576   fpCommand->SetParameter (parameter);        << 
2577   parameter =  new G4UIparameter ("y", 'd', o << 
2578   parameter->SetDefaultValue (0);             << 
2579   fpCommand->SetParameter (parameter);        << 
2580   parameter =  new G4UIparameter ("z", 'd', o << 
2581   parameter->SetDefaultValue (0);             << 
2582   fpCommand->SetParameter (parameter);        << 
2583   parameter =  new G4UIparameter ("unit", 's' << 
2584   parameter->SetDefaultValue ("m");           << 
2585   fpCommand->SetParameter     (parameter);    << 
2586   parameter =  new G4UIparameter ("font_size" << 
2587   parameter->SetDefaultValue (12);            << 
2588   parameter->SetGuidance ("pixels");          << 
2589   fpCommand->SetParameter (parameter);        << 
2590   parameter =  new G4UIparameter ("x_offset", << 
2591   parameter->SetDefaultValue (0);             << 
2592   parameter->SetGuidance ("pixels");          << 
2593   fpCommand->SetParameter (parameter);        << 
2594   parameter =  new G4UIparameter ("y_offset", << 
2595   parameter->SetDefaultValue (0);             << 
2596   parameter->SetGuidance ("pixels");          << 
2597   fpCommand->SetParameter (parameter);        << 
2598   parameter =  new G4UIparameter ("text", 's' << 
2599   parameter->SetGuidance ("The rest of the li << 
2600   parameter->SetDefaultValue ("Hello G4");    << 
2601   fpCommand->SetParameter (parameter);        << 
2602 }                                             << 
2603                                               << 
2604 G4VisCommandSceneAddText::~G4VisCommandSceneA << 
2605   delete fpCommand;                           << 
2606 }                                             << 
2607                                               << 
2608 G4String G4VisCommandSceneAddText::GetCurrent << 
2609   return "";                                  << 
2610 }                                             << 
2611                                               << 
2612 void G4VisCommandSceneAddText::SetNewValue (G << 
2613                                               << 
2614   G4VisManager::Verbosity verbosity = fpVisMa << 
2615   G4bool warn = verbosity >= G4VisManager::wa << 
2616                                               << 
2617   G4Scene* pScene = fpVisManager->GetCurrentS << 
2618   if (!pScene) {                              << 
2619     if (verbosity >= G4VisManager::errors) {  << 
2620       G4warn << "ERROR: No current scene.  Pl << 
2621     }                                         << 
2622     return;                                   << 
2623   }                                           << 
2624                                               << 
2625   G4Tokenizer next(newValue);                 << 
2626   G4double x = StoD(next());                  << 
2627   G4double y = StoD(next());                  << 
2628   G4double z = StoD(next());                  << 
2629   G4String unitString = next();               << 
2630   G4double font_size = StoD(next());          << 
2631   G4double x_offset = StoD(next());           << 
2632   G4double y_offset = StoD(next());           << 
2633   G4String text = next("\n");                 << 
2634                                               << 
2635   G4double unit = G4UIcommand::ValueOf(unitSt << 
2636   x *= unit; y *= unit; z *= unit;            << 
2637                                               << 
2638   G4Text g4text(text, G4Point3D(x,y,z));      << 
2639   G4VisAttributes visAtts(fCurrentTextColour) << 
2640   g4text.SetVisAttributes(visAtts);           << 
2641   g4text.SetLayout(fCurrentTextLayout);       << 
2642   g4text.SetScreenSize(font_size);            << 
2643   g4text.SetOffset(x_offset,y_offset);        << 
2644   G4VModel* model = new G4TextModel(g4text);  << 
2645   const G4String& currentSceneName = pScene - << 
2646   G4bool successful = pScene -> AddRunDuratio << 
2647   if (successful) {                           << 
2648     if (verbosity >= G4VisManager::confirmati << 
2649       G4cout << "Text '" << text              << 
2650        << "' has been added to scene \"" << c << 
2651        << G4endl;                             << 
2652     }                                         << 
2653   }                                           << 
2654   else G4VisCommandsSceneAddUnsuccessful(verb << 
2655                                               << 
2656   CheckSceneAndNotifyHandlers (pScene);       << 
2657 }                                             << 
2658                                               << 
2659                                               << 
2660 ////////////// /vis/scene/add/text2D //////// << 
2661                                               << 
2662 G4VisCommandSceneAddText2D::G4VisCommandScene << 
2663   G4bool omitable;                            << 
2664   fpCommand = new G4UIcommand ("/vis/scene/ad << 
2665   fpCommand -> SetGuidance ("Adds 2D text to  << 
2666   fpCommand -> SetGuidance ("x,y in range [-1 << 
2667   fpCommand -> SetGuidance                    << 
2668     ("Use \"/vis/set/textColour\" to set colo << 
2669   fpCommand -> SetGuidance                    << 
2670     ("Use \"/vis/set/textLayout\" to set layo << 
2671   G4UIparameter* parameter;                   << 
2672   parameter = new G4UIparameter ("x", 'd', om << 
2673   parameter->SetDefaultValue (0);             << 
2674   fpCommand->SetParameter (parameter);        << 
2675   parameter =  new G4UIparameter ("y", 'd', o << 
2676   parameter->SetDefaultValue (0);             << 
2677   fpCommand->SetParameter (parameter);        << 
2678   parameter =  new G4UIparameter ("font_size" << 
2679   parameter->SetDefaultValue (12);            << 
2680   parameter->SetGuidance ("pixels");          << 
2681   fpCommand->SetParameter (parameter);        << 
2682   parameter =  new G4UIparameter ("x_offset", << 
2683   parameter->SetDefaultValue (0);             << 
2684   parameter->SetGuidance ("pixels");          << 
2685   fpCommand->SetParameter (parameter);        << 
2686   parameter =  new G4UIparameter ("y_offset", << 
2687   parameter->SetDefaultValue (0);             << 
2688   parameter->SetGuidance ("pixels");          << 
2689   fpCommand->SetParameter (parameter);        << 
2690   parameter =  new G4UIparameter ("text", 's' << 
2691   parameter->SetGuidance ("The rest of the li << 
2692   parameter->SetDefaultValue ("Hello G4");    << 
2693   fpCommand->SetParameter (parameter);        << 
2694 }                                             << 
2695                                               << 
2696 G4VisCommandSceneAddText2D::~G4VisCommandScen << 
2697   delete fpCommand;                              241   delete fpCommand;
2698 }                                                242 }
2699                                                  243 
2700 G4String G4VisCommandSceneAddText2D::GetCurre << 244 G4String G4VisCommandSceneAddGhosts::GetCurrentValue (G4UIcommand* command) {
2701   return "";                                     245   return "";
2702 }                                                246 }
2703                                                  247 
2704 void G4VisCommandSceneAddText2D::SetNewValue  << 248 void G4VisCommandSceneAddGhosts::SetNewValue (G4UIcommand* command,
2705                                               << 
2706   G4VisManager::Verbosity verbosity = fpVisMa << 
2707   G4bool warn = verbosity >= G4VisManager::wa << 
2708                                               << 
2709   G4Scene* pScene = fpVisManager->GetCurrentS << 
2710   if (!pScene) {                              << 
2711     if (verbosity >= G4VisManager::errors) {  << 
2712       G4warn << "ERROR: No current scene.  Pl << 
2713     }                                         << 
2714     return;                                   << 
2715   }                                           << 
2716                                               << 
2717   G4Tokenizer next(newValue);                 << 
2718   G4double x = StoD(next());                  << 
2719   G4double y = StoD(next());                  << 
2720   G4double font_size = StoD(next());          << 
2721   G4double x_offset = StoD(next());           << 
2722   G4double y_offset = StoD(next());           << 
2723   G4String text = next("\n");                 << 
2724                                               << 
2725   G4Text g4text(text, G4Point3D(x,y,0.));     << 
2726   G4VisAttributes visAtts(fCurrentTextColour) << 
2727   g4text.SetVisAttributes(visAtts);           << 
2728   g4text.SetLayout(fCurrentTextLayout);       << 
2729   g4text.SetScreenSize(font_size);            << 
2730   g4text.SetOffset(x_offset,y_offset);        << 
2731   G4Text2D* g4text2D = new G4Text2D(g4text);  << 
2732   G4VModel* model =                           << 
2733     new G4CallbackModel<G4VisCommandSceneAddT << 
2734   model->SetType("Text2D");                   << 
2735   model->SetGlobalTag("Text2D");              << 
2736   std::ostringstream oss;                     << 
2737   oss << "Text2D: '" << g4text.GetText()      << 
2738   << "' at " << g4text.GetPosition().x() << ' << 
2739   << " with size " << g4text.GetScreenSize()  << 
2740   << " with offsets " << g4text.GetXOffset()  << 
2741   model->SetGlobalDescription(oss.str());     << 
2742   const G4String& currentSceneName = pScene - << 
2743   G4bool successful = pScene -> AddRunDuratio << 
2744   if (successful) {                           << 
2745     if (verbosity >= G4VisManager::confirmati << 
2746       G4cout << "2D text '" << text           << 
2747        << "' has been added to scene \"" << c << 
2748        << G4endl;                             << 
2749     }                                         << 
2750   }                                           << 
2751   else G4VisCommandsSceneAddUnsuccessful(verb << 
2752                                               << 
2753   CheckSceneAndNotifyHandlers (pScene);       << 
2754 }                                             << 
2755                                               << 
2756 G4VisCommandSceneAddText2D::G4Text2D::G4Text2 << 
2757   fText(text)                                 << 
2758 {}                                            << 
2759                                               << 
2760 void G4VisCommandSceneAddText2D::G4Text2D::op << 
2761   (G4VGraphicsScene& sceneHandler, const G4Mo << 
2762   sceneHandler.BeginPrimitives2D();           << 
2763   sceneHandler.AddPrimitive(fText);           << 
2764   sceneHandler.EndPrimitives2D();             << 
2765 }                                             << 
2766                                               << 
2767                                               << 
2768 ////////////// /vis/scene/add/trajectories // << 
2769                                               << 
2770 G4VisCommandSceneAddTrajectories::G4VisComman << 
2771   G4bool omitable;                            << 
2772   fpCommand = new G4UIcmdWithAString          << 
2773     ("/vis/scene/add/trajectories", this);    << 
2774   fpCommand -> SetGuidance                    << 
2775     ("Adds trajectories to current scene.");  << 
2776   fpCommand -> SetGuidance                    << 
2777     ("Causes trajectories, if any, to be draw << 
2778      "\nevent.  Switches on trajectory storin << 
2779      "\ndefault trajectory type.");           << 
2780   fpCommand -> SetGuidance                    << 
2781     ("The command line parameter list determi << 
2782      "\nIf it contains the string \"smooth\", << 
2783      "\nbe inserted to improve the smoothness << 
2784      "\ntrajectory."                          << 
2785      "\nIf it contains the string \"rich\", s << 
2786      "\nbe stored in the trajectory (G4RichTr << 
2787      "\nand filtering with \"/vis/modeling/tr << 
2788      "\nand \"/vis/filtering/trajectories/cre << 
2789      "\nIt may contain both strings in any or << 
2790   fpCommand -> SetGuidance                    << 
2791     ("\nTo switch off trajectory storing: \"/ << 
2792      "\nSee also \"/vis/scene/endOfEventActio << 
2793   fpCommand -> SetGuidance                    << 
2794     ("Note:  This only sets the default.  Ind << 
2795      "\ncommand, a user may instantiate a tra << 
2796      "\nin PreUserTrackingAction.");          << 
2797   fpCommand -> SetParameterName ("default-tra << 
2798   fpCommand -> SetDefaultValue ("");          << 
2799 }                                             << 
2800                                               << 
2801 G4VisCommandSceneAddTrajectories::~G4VisComma << 
2802   delete fpCommand;                           << 
2803 }                                             << 
2804                                               << 
2805 G4String G4VisCommandSceneAddTrajectories::Ge << 
2806   return "";                                  << 
2807 }                                             << 
2808                                               << 
2809 void G4VisCommandSceneAddTrajectories::SetNew << 
2810                 G4String newValue) {          << 
2811                                               << 
2812   G4VisManager::Verbosity verbosity = fpVisMa << 
2813   G4bool warn = verbosity >= G4VisManager::wa << 
2814                                               << 
2815   G4Scene* pScene = fpVisManager->GetCurrentS << 
2816   if (!pScene) {                              << 
2817     if (verbosity >= G4VisManager::errors) {  << 
2818       G4warn << "ERROR: No current scene.  Pl << 
2819     }                                         << 
2820     return;                                   << 
2821   }                                           << 
2822   const G4String& currentSceneName = pScene - << 
2823                                               << 
2824   G4bool smooth = false;                      << 
2825   G4bool rich = false;                        << 
2826   if (newValue.find("smooth") != std::string: << 
2827   if (newValue.find("rich") != std::string::n << 
2828   if (newValue.size() && !(rich || smooth)) { << 
2829     if (verbosity >= G4VisManager::errors) {  << 
2830       G4warn << "ERROR: Unrecognised paramete << 
2831       "\n  No action taken."                  << 
2832       << G4endl;                              << 
2833     }                                         << 
2834     return;                                   << 
2835   }                                           << 
2836                                               << 
2837   G4UImanager* UImanager = G4UImanager::GetUI << 
2838   G4String defaultTrajectoryType;             << 
2839   if (smooth && rich) {                       << 
2840     UImanager->ApplyCommand("/tracking/storeT << 
2841     defaultTrajectoryType = "G4RichTrajectory << 
2842   } else if (smooth) {                        << 
2843     UImanager->ApplyCommand("/tracking/storeT << 
2844     defaultTrajectoryType = "G4SmoothTrajecto << 
2845   } else if (rich) {                          << 
2846     UImanager->ApplyCommand("/tracking/storeT << 
2847     defaultTrajectoryType = "G4RichTrajectory << 
2848   } else {                                    << 
2849     UImanager->ApplyCommand("/tracking/storeT << 
2850     defaultTrajectoryType = "G4Trajectory";   << 
2851   }                                           << 
2852                                               << 
2853   if (verbosity >= G4VisManager::errors) {    << 
2854     G4warn <<                                 << 
2855       "Attributes available for modeling and  << 
2856       "\n  \"/vis/modeling/trajectories/creat << 
2857       "\n  \"/vis/filtering/trajectories/crea << 
2858      << G4endl;                               << 
2859     G4warn << *G4TrajectoriesModel().GetAttDe << 
2860     if (rich) {                               << 
2861       G4warn << *G4RichTrajectory().GetAttDef << 
2862        << *G4RichTrajectoryPoint().GetAttDefs << 
2863     } else if (smooth) {                      << 
2864       G4warn << *G4SmoothTrajectory().GetAttD << 
2865        << *G4SmoothTrajectoryPoint().GetAttDe << 
2866     } else {                                  << 
2867       G4warn << *G4Trajectory().GetAttDefs()  << 
2868        << *G4TrajectoryPoint().GetAttDefs();  << 
2869     }                                         << 
2870   }                                           << 
2871                                               << 
2872   const auto& eoeList = pScene->GetEndOfEvent << 
2873   auto eoeModel = eoeList.begin();            << 
2874   for (; eoeModel != eoeList.end(); ++eoeMode << 
2875     const auto* actualModel = eoeModel->fpMod << 
2876     if (dynamic_cast<const G4TrajectoriesMode << 
2877   }                                           << 
2878   if (eoeModel == eoeList.end()) {            << 
2879     // No trajectories model exists in the sc << 
2880     G4VModel* model = new G4TrajectoriesModel << 
2881     pScene -> AddEndOfEventModel (model, warn << 
2882   }  // ...else it already exists and there i << 
2883   // because G4TrajectoriesModel simply descr << 
2884   // trajectories store whatever the type.    << 
2885                                               << 
2886   if (verbosity >= G4VisManager::confirmation << 
2887     G4cout << "Default trajectory type " << d << 
2888      << "\n  will be used to store trajectori << 
2889      << currentSceneName << "\"."             << 
2890      << G4endl;                               << 
2891   }                                           << 
2892                                               << 
2893   if (verbosity >= G4VisManager::warnings) {  << 
2894     G4warn <<                                 << 
2895       "WARNING: Trajectory storing has been r << 
2896       "\n  reversed with \"/tracking/storeTra << 
2897      << G4endl;                               << 
2898   }                                           << 
2899                                               << 
2900   CheckSceneAndNotifyHandlers (pScene);       << 
2901 }                                             << 
2902                                               << 
2903 ////////////// /vis/scene/add/userAction //// << 
2904                                               << 
2905 G4VisCommandSceneAddUserAction::G4VisCommandS << 
2906   G4bool omitable;                            << 
2907   fpCommand = new G4UIcmdWithAString("/vis/sc << 
2908   fpCommand -> SetGuidance                    << 
2909     ("Add named Vis User Action to current sc << 
2910   fpCommand -> SetGuidance                    << 
2911     ("Attempts to match search string to name << 
2912   fpCommand -> SetGuidance                    << 
2913     ("(Use /vis/list to see names of register << 
2914   fpCommand -> SetGuidance                    << 
2915     ("If name == \"all\" (default), all actio << 
2916   fpCommand -> SetParameterName("action-name" << 
2917   fpCommand -> SetDefaultValue("all");        << 
2918 }                                             << 
2919                                               << 
2920 G4VisCommandSceneAddUserAction::~G4VisCommand << 
2921   delete fpCommand;                           << 
2922 }                                             << 
2923                                               << 
2924 G4String G4VisCommandSceneAddUserAction::GetC << 
2925   return "";                                  << 
2926 }                                             << 
2927                                               << 
2928 void G4VisCommandSceneAddUserAction::SetNewVa << 
2929 (G4UIcommand*, G4String newValue) {           << 
2930                                               << 
2931   G4VisManager::Verbosity verbosity = fpVisMa << 
2932                                               << 
2933   G4Scene* pScene = fpVisManager->GetCurrentS << 
2934   if (!pScene) {                              << 
2935     if (verbosity >= G4VisManager::errors) {  << 
2936       G4warn << "ERROR: No current scene.  Pl << 
2937     }                                         << 
2938     return;                                   << 
2939   }                                           << 
2940                                               << 
2941   G4bool any = false;                         << 
2942                                               << 
2943   const std::vector<G4VisManager::UserVisActi << 
2944     fpVisManager->GetRunDurationUserVisAction << 
2945   for (size_t i = 0; i < runDurationUserVisAc << 
2946     const G4String& name = runDurationUserVis << 
2947     G4VUserVisAction* visAction = runDuration << 
2948     if (newValue == "all" || name.find(newVal << 
2949       any = true;                             << 
2950       AddVisAction(name,visAction,pScene,runD << 
2951     }                                         << 
2952   }                                           << 
2953                                               << 
2954   const std::vector<G4VisManager::UserVisActi << 
2955     fpVisManager->GetEndOfEventUserVisActions << 
2956   for (size_t i = 0; i < endOfEventUserVisAct << 
2957     const G4String& name = endOfEventUserVisA << 
2958     G4VUserVisAction* visAction = endOfEventU << 
2959     if (newValue == "all" || name.find(newVal << 
2960       any = true;                             << 
2961       AddVisAction(name,visAction,pScene,endO << 
2962     }                                         << 
2963   }                                           << 
2964                                               << 
2965   const std::vector<G4VisManager::UserVisActi << 
2966     fpVisManager->GetEndOfRunUserVisActions() << 
2967   for (size_t i = 0; i < endOfRunUserVisActio << 
2968     const G4String& name = endOfRunUserVisAct << 
2969     G4VUserVisAction* visAction = endOfRunUse << 
2970     if (newValue == "all" || name.find(newVal << 
2971       any = true;                             << 
2972       AddVisAction(name,visAction,pScene,endO << 
2973     }                                         << 
2974   }                                           << 
2975                                               << 
2976   if (!any) {                                 << 
2977     if (verbosity >= G4VisManager::warnings)  << 
2978       G4warn << "WARNING: No User Vis Action  << 
2979     }                                         << 
2980     return;                                   << 
2981   }                                           << 
2982                                               << 
2983   CheckSceneAndNotifyHandlers (pScene);       << 
2984 }                                             << 
2985                                               << 
2986 void G4VisCommandSceneAddUserAction::AddVisAc << 
2987 (const G4String& name,                        << 
2988  G4VUserVisAction* visAction,                 << 
2989  G4Scene* pScene,                             << 
2990  G4VisCommandSceneAddUserAction::ActionType t << 
2991  G4VisManager::Verbosity verbosity)           << 
2992 {                                             << 
2993   G4bool warn = verbosity >= G4VisManager::wa << 
2994                                               << 
2995   const std::map<G4VUserVisAction*,G4VisExten << 
2996     fpVisManager->GetUserVisActionExtents();  << 
2997   G4VisExtent extent;                         << 
2998   std::map<G4VUserVisAction*,G4VisExtent>::co << 
2999     visExtentMap.find(visAction);             << 
3000   if (i != visExtentMap.end()) extent = i->se << 
3001   if (warn) {                                 << 
3002     if (extent.GetExtentRadius() <= 0.) {     << 
3003       G4warn                                  << 
3004       << "WARNING: User Vis Action \"" << nam << 
3005       << G4endl;                              << 
3006     }                                         << 
3007   }                                           << 
3008                                               << 
3009   G4VModel* model = new G4CallbackModel<G4VUs << 
3010   model->SetType("User Vis Action");          << 
3011   model->SetGlobalTag(name);                  << 
3012   model->SetGlobalDescription(name);          << 
3013   model->SetExtent(extent);                   << 
3014   G4bool successful = false;;                 << 
3015   switch (type) {                             << 
3016   case runDuration:                           << 
3017     successful = pScene -> AddRunDurationMode << 
3018     break;                                    << 
3019   case endOfEvent:                            << 
3020     successful = pScene -> AddEndOfEventModel << 
3021     break;                                    << 
3022   case endOfRun:                              << 
3023     successful = pScene -> AddEndOfRunModel ( << 
3024     break;                                    << 
3025   }                                           << 
3026   if (successful) {                           << 
3027     if (verbosity >= G4VisManager::confirmati << 
3028       const G4String& currentSceneName = pSce << 
3029       G4cout << "User Vis Action added to sce << 
3030       << currentSceneName << "\"";            << 
3031       if (verbosity >= G4VisManager::paramete << 
3032         G4cout << "\n  with extent " << exten << 
3033       }                                       << 
3034       G4cout << G4endl;                       << 
3035     }                                         << 
3036   }                                           << 
3037   else G4VisCommandsSceneAddUnsuccessful(verb << 
3038 }                                             << 
3039                                               << 
3040 ////////////// /vis/scene/add/volume //////// << 
3041                                               << 
3042 G4VisCommandSceneAddVolume::G4VisCommandScene << 
3043   G4bool omitable;                            << 
3044   fpCommand = new G4UIcommand ("/vis/scene/ad << 
3045   fpCommand -> SetGuidance                    << 
3046    ("Adds a physical volume to current scene, << 
3047   fpCommand -> SetGuidance                    << 
3048     ("If physical-volume-name is \"world\" (t << 
3049      "\nmain geometry tree (material world) i << 
3050      "\ntops of all worlds - material world a << 
3051      "\nadded. Otherwise a search of all worl << 
3052   fpCommand -> SetGuidance                    << 
3053     ("In the last case the names of all volum << 
3054      "\nagainst physical-volume-name. If this << 
3055      "\nwhere regexp is a regular expression  << 
3056      "\nthe usual rules of regular expression << 
3057      "\nmatch is required."                   << 
3058      "\nFor example, \"/Shap/\" adds \"Shape1 << 
3059   fpCommand -> SetGuidance                    << 
3060     ("It may help to see a textual representa << 
3061      "\nthe worlds. Try \"/vis/drawTree [worl << 
3062      "\ncombinations that have the required f << 
3063   fpCommand -> SetGuidance                    << 
3064     ("If clip-volume-type is specified, the s << 
3065      "\nto define a clipping volume. For exam << 
3066      "\n\"/vis/scene/add/volume ! ! ! -box km << 
3067      "\nwith the positive octant cut away. (I << 
3068      "\nwarnings try replacing 0 by 0.0000000 << 
3069   fpCommand -> SetGuidance                    << 
3070     ("If clip-volume-type is prepended with ' << 
3071      "\n(cutaway). (This is the default if th << 
3072      "\nIf '*' is prepended, the intersection << 
3073      "\nclip-volume is made. (You can make a  << 
3074      "\na thin box, for example).");          << 
3075   fpCommand -> SetGuidance                    << 
3076     ("For \"box\", the parameters are xmin,xm << 
3077      "\nOnly \"box\" is programmed at present << 
3078   G4UIparameter* parameter;                   << 
3079   parameter = new G4UIparameter ("physical-vo << 
3080   parameter -> SetDefaultValue ("world");     << 
3081   fpCommand -> SetParameter (parameter);      << 
3082   parameter = new G4UIparameter ("copy-no", ' << 
3083   parameter -> SetGuidance ("If negative, mat << 
3084   parameter -> SetDefaultValue (-1);          << 
3085   fpCommand -> SetParameter (parameter);      << 
3086   parameter = new G4UIparameter ("depth-of-de << 
3087   parameter -> SetGuidance                    << 
3088     ("Depth of descent of geometry hierarchy. << 
3089   parameter -> SetDefaultValue (G4PhysicalVol << 
3090   fpCommand -> SetParameter (parameter);      << 
3091   parameter = new G4UIparameter ("clip-volume << 
3092   parameter -> SetParameterCandidates("none b << 
3093   parameter -> SetDefaultValue ("none");      << 
3094   parameter -> SetGuidance("[-|*]type.  See g << 
3095   fpCommand -> SetParameter (parameter);      << 
3096   parameter = new G4UIparameter ("parameter-u << 
3097   parameter -> SetDefaultValue ("m");         << 
3098   fpCommand -> SetParameter (parameter);      << 
3099   parameter = new G4UIparameter ("parameter-1 << 
3100   parameter -> SetDefaultValue (0.);          << 
3101   fpCommand -> SetParameter (parameter);      << 
3102   parameter = new G4UIparameter ("parameter-2 << 
3103   parameter -> SetDefaultValue (0.);          << 
3104   fpCommand -> SetParameter (parameter);      << 
3105   parameter = new G4UIparameter ("parameter-3 << 
3106   parameter -> SetDefaultValue (0.);          << 
3107   fpCommand -> SetParameter (parameter);      << 
3108   parameter = new G4UIparameter ("parameter-4 << 
3109   parameter -> SetDefaultValue (0.);          << 
3110   fpCommand -> SetParameter (parameter);      << 
3111   parameter = new G4UIparameter ("parameter-5 << 
3112   parameter -> SetDefaultValue (0.);          << 
3113   fpCommand -> SetParameter (parameter);      << 
3114   parameter = new G4UIparameter ("parameter-6 << 
3115   parameter -> SetDefaultValue (0.);          << 
3116   fpCommand -> SetParameter (parameter);      << 
3117 }                                             << 
3118                                               << 
3119 G4VisCommandSceneAddVolume::~G4VisCommandScen << 
3120   delete fpCommand;                           << 
3121 }                                             << 
3122                                               << 
3123 G4String G4VisCommandSceneAddVolume::GetCurre << 
3124   return "world 0 -1";                        << 
3125 }                                             << 
3126                                               << 
3127 void G4VisCommandSceneAddVolume::SetNewValue  << 
3128                 G4String newValue) {             249                 G4String newValue) {
                                                   >> 250   G4Scene* pCurrentScene = fpVisManager -> GetCurrentScene ();
                                                   >> 251   const G4String& currentSceneName = pCurrentScene -> GetName ();
3129                                                  252 
3130   G4VisManager::Verbosity verbosity = fpVisMa << 253   G4SceneList& sceneList = fpVisManager -> SetSceneList ();
3131   G4bool warn = verbosity >= G4VisManager::wa << 254   if (sceneList.isEmpty ()) {
3132                                               << 255     G4cout << "No scenes - please create one before adding anything."
3133   G4Scene* pScene = fpVisManager->GetCurrentS << 256      << G4endl;
3134   if (!pScene) {                              << 
3135     if (verbosity >= G4VisManager::errors) {  << 
3136       G4warn << "ERROR: No current scene.  Pl << 
3137     }                                         << 
3138     return;                                      257     return;
3139   }                                              258   }
3140                                                  259 
3141   G4String name, clipVolumeType, parameterUni << 260   G4VGlobalFastSimulationManager* theGlobalFastSimulationManager;
3142   G4int copyNo, requestedDepthOfDescent;      << 261   if(!(theGlobalFastSimulationManager = 
3143   G4double param1, param2, param3, param4, pa << 262        G4VGlobalFastSimulationManager::GetConcreteInstance ())){
3144   std::istringstream is (newValue);           << 263     G4cout<< "WARNING: no G4GlobalFastSimulationManager" << G4endl;
3145   is >> name >> copyNo >> requestedDepthOfDes << 
3146      >> clipVolumeType >> parameterUnit       << 
3147      >> param1 >> param2 >> param3 >> param4  << 
3148   G4PhysicalVolumeModel::ClippingMode clippin << 
3149     G4PhysicalVolumeModel::subtraction;  // D << 
3150   if (clipVolumeType[size_t(0)] == '-') {     << 
3151     clipVolumeType = clipVolumeType.substr(1) << 
3152   } else if (clipVolumeType[size_t(0)] == '*' << 
3153     clippingMode = G4PhysicalVolumeModel::int << 
3154     clipVolumeType = clipVolumeType.substr(1) << 
3155   }                                           << 
3156   G4double unit = G4UIcommand::ValueOf(parame << 
3157   param1 *= unit; param2 *= unit; param3 *= u << 
3158   param4 *= unit; param5 *= unit; param6 *= u << 
3159                                               << 
3160   G4VSolid* clippingSolid = nullptr;          << 
3161   if (clipVolumeType == "box") {              << 
3162     const G4double dX = (param2 - param1) / 2 << 
3163     const G4double dY = (param4 - param3) / 2 << 
3164     const G4double dZ = (param6 - param5) / 2 << 
3165     const G4double x0 = (param2 + param1) / 2 << 
3166     const G4double y0 = (param4 + param3) / 2 << 
3167     const G4double z0 = (param6 + param5) / 2 << 
3168     clippingSolid = new G4DisplacedSolid      << 
3169     ("_displaced_clipping_box",               << 
3170      new G4Box("_clipping_box",dX,dY,dZ),     << 
3171      G4Translate3D(x0,y0,z0));                << 
3172   }                                           << 
3173                                               << 
3174   G4TransportationManager* transportationMana << 
3175     G4TransportationManager::GetTransportatio << 
3176                                               << 
3177   size_t nWorlds = transportationManager->Get << 
3178   if (nWorlds > 1) {  // Parallel worlds in o << 
3179     if (verbosity >= G4VisManager::warnings)  << 
3180       static G4bool warned = false;           << 
3181       if (!warned && name != "worlds") {      << 
3182   G4warn <<                                   << 
3183     "WARNING: Parallel worlds in operation.   << 
3184     "\n  \"worlds\" or the parallel world vol << 
3185     "\n   and control visibility with /vis/ge << 
3186          << G4endl;                           << 
3187   std::vector<G4VPhysicalVolume*>::iterator i << 
3188     transportationManager->GetWorldsIterator( << 
3189   for (size_t i = 0; i < nWorlds; ++i, ++iter << 
3190     G4warn << "  World " << i << ": " << (*it << 
3191      << G4endl;                               << 
3192     warned = true;                            << 
3193   }                                           << 
3194       }                                       << 
3195     }                                         << 
3196   }                                           << 
3197                                               << 
3198   // Get the world (the initial value of the  << 
3199   G4VPhysicalVolume* world = *(transportation << 
3200                                               << 
3201   if (!world) {                               << 
3202     if (verbosity >= G4VisManager::errors) {  << 
3203       G4warn <<                               << 
3204   "ERROR: G4VisCommandSceneAddVolume::SetNewV << 
3205   "\n  No world.  Maybe the geometry has not  << 
3206   "\n  Try \"/run/initialize\""               << 
3207        << G4endl;                             << 
3208     }                                         << 
3209     return;                                      264     return;
3210   }                                              265   }
3211                                               << 266   
3212   std::vector<G4PhysicalVolumesSearchScene::F << 267   G4ParticleTable* theParticleTable=G4ParticleTable::GetParticleTable();
3213                                               << 268   
3214   // When it comes to determining the extent  << 269   if(newValue=="all") {
3215   // assume the user wishes to ignore "invisi << 270     G4VFlavoredParallelWorld* CurrentFlavoredWorld;
3216   // users make the world volume invisible. S << 271     G4bool successful;
3217   // model to traverse the geometry hierarchy << 272     for (G4int iParticle=0; iParticle<theParticleTable->entries(); 
3218   // volume, until it finds non-invisible one << 273    iParticle++)
3219   // to determine the overall extent. (Once a << 274       if(CurrentFlavoredWorld=theGlobalFastSimulationManager->
3220   // the search is curtailed - daughters are  << 275    GetFlavoredWorldForThis(theParticleTable->
3221   // so they have no subsequent influence on  << 276          GetParticle(iParticle)))
3222   // search continues at the same level until << 277   successful = pCurrentScene -> AddRunDurationModel
3223   // volumes are found an their extents accum << 278     (new G4FlavoredParallelWorldModel (CurrentFlavoredWorld));
3224   G4bool useFullExtent = false;               << 279     UpdateVisManagerScene ();
3225   // However, the above procedure can be time << 
3226   // as a nested parameterisation whose ultim << 
3227   // visible ones, which are typical of a med << 
3228   // below that if a user specifies a name ot << 
3229   // wished the extent to be determined by th << 
3230   // or not. So we set useFullExtent true at  << 
3231                                               << 
3232   if (name == "world") {                      << 
3233                                               << 
3234     findingsVector.push_back                  << 
3235     (G4PhysicalVolumesSearchScene::Findings(w << 
3236                                               << 
3237   } else if (name == "worlds") {              << 
3238                                               << 
3239     if (nWorlds <= 1) {                       << 
3240       if (verbosity >= G4VisManager::warnings << 
3241   G4warn <<                                   << 
3242     "WARNING: G4VisCommandSceneAddVolume::Set << 
3243     "\n  Parallel worlds requested but none e << 
3244     "\n  Just adding material world."         << 
3245          << G4endl;                           << 
3246       }                                       << 
3247     }                                         << 
3248     std::vector<G4VPhysicalVolume*>::iterator << 
3249       transportationManager->GetWorldsIterato << 
3250     for (size_t i = 0; i < nWorlds; ++i, ++it << 
3251       findingsVector.push_back                << 
3252       (G4PhysicalVolumesSearchScene::Findings << 
3253        (*iterWorld,*iterWorld));              << 
3254     }                                         << 
3255                                               << 
3256   } else {  // Search all worlds...           << 
3257                                               << 
3258     // Use the model's full extent. This assu << 
3259     // volumes in the findings vector (there  << 
3260     // determine the scene's extent. Otherwis << 
3261     // re-calculate each volume's extent base << 
3262     // could be time consuming.               << 
3263     useFullExtent = true;                     << 
3264                                               << 
3265     std::vector<G4VPhysicalVolume*>::iterator << 
3266       transportationManager->GetWorldsIterato << 
3267     for (size_t i = 0; i < nWorlds; ++i, ++it << 
3268       G4ModelingParameters mp;  // Default -  << 
3269       G4PhysicalVolumeModel searchModel       << 
3270       (*iterWorld,                            << 
3271        requestedDepthOfDescent,               << 
3272        G4Transform3D(),                       << 
3273        &mp,                                   << 
3274        useFullExtent);                        << 
3275       G4PhysicalVolumesSearchScene searchScen << 
3276       searchModel.DescribeYourselfTo (searchS << 
3277       for (const auto& findings: searchScene. << 
3278         findingsVector.push_back(findings);   << 
3279       }                                       << 
3280     }                                         << 
3281   }                                           << 
3282                                               << 
3283   for (const auto& findings: findingsVector)  << 
3284     // Set copy number from search findings f << 
3285     findings.fpFoundPV->SetCopyNo(findings.fF << 
3286     G4PhysicalVolumeModel* foundPVModel = new << 
3287     (findings.fpFoundPV,                      << 
3288      requestedDepthOfDescent,                 << 
3289      findings.fFoundObjectTransformation,     << 
3290      0, // No modelling parameters (these are << 
3291      useFullExtent,                           << 
3292      findings.fFoundBasePVPath);              << 
3293     if (clippingSolid) {                      << 
3294       foundPVModel->SetClippingSolid(clipping << 
3295       foundPVModel->SetClippingMode(clippingM << 
3296     }                                         << 
3297     if (!foundPVModel->Validate(warn)) return << 
3298     // ...so add it to the scene.             << 
3299     G4bool successful = pScene->AddRunDuratio << 
3300     if (successful) {                            280     if (successful) {
3301       if (verbosity >= G4VisManager::confirma << 281       G4cout << "Ghosts added to the Scene, refresh the view to see it."
3302         G4cout << "\"" << findings.fpFoundPV- << 282        << G4endl;
3303         << "\", copy no. " << findings.fFound << 
3304         << ",\n  found in searched volume \"" << 
3305         << findings.fpSearchPV->GetName()     << 
3306         << "\" at depth " << findings.fFoundD << 
3307         << ",\n  base path: \"" << findings.f << 
3308         << "\",\n  with a requested depth of  << 
3309         if (requestedDepthOfDescent < 0) {    << 
3310           G4cout << "<0 (unlimited)";         << 
3311         }                                     << 
3312         else {                                << 
3313           G4cout << requestedDepthOfDescent;  << 
3314         }                                     << 
3315         G4cout << ",\n  has been added to sce << 
3316         << G4endl;                            << 
3317       }                                       << 
3318     } else {                                  << 
3319       G4VisCommandsSceneAddUnsuccessful(verbo << 
3320     }                                         << 
3321   }                                           << 
3322                                               << 
3323   if (findingsVector.empty()) {               << 
3324     if (verbosity >= G4VisManager::errors) {  << 
3325       G4warn << "ERROR: Volume \"" << name << << 
3326       if (copyNo >= 0) {                      << 
3327         G4warn << ", copy no. " << copyNo <<  << 
3328       }                                       << 
3329       G4warn << " not found." << G4endl;      << 
3330     }                                            283     }
3331     G4VisCommandsSceneAddUnsuccessful(verbosi << 
3332     return;                                      284     return;
3333   }                                              285   }
3334                                               << 
3335   CheckSceneAndNotifyHandlers(pScene);        << 
3336 }                                             << 
3337                                               << 
3338 ///////////////////////////////////////////// << 
3339 ////////////// /vis/scene/add/plotter /////// << 
3340 ///////////////////////////////////////////// << 
3341 G4VisCommandSceneAddPlotter::G4VisCommandScen << 
3342   fpCommand = new G4UIcommand("/vis/scene/add << 
3343   fpCommand -> SetGuidance ("Add a plotter to << 
3344                                                  286   
3345   G4UIparameter* parameter;                   << 287   G4ParticleDefinition* currentParticle = 
3346   parameter =  new G4UIparameter ("plotter",  << 288     theParticleTable->FindParticle(newValue);
3347   fpCommand->SetParameter(parameter);         << 289   if (currentParticle == NULL) {
3348 }                                             << 290     G4cout << "\"" << newValue << "\": not found this particle name!" << G4endl;
3349                                               << 
3350 G4VisCommandSceneAddPlotter::~G4VisCommandSce << 
3351                                               << 
3352 G4String G4VisCommandSceneAddPlotter::GetCurr << 
3353                                               << 
3354 void G4VisCommandSceneAddPlotter::SetNewValue << 
3355 {                                             << 
3356   G4VisManager::Verbosity verbosity = fpVisMa << 
3357   G4bool warn(verbosity >= G4VisManager::warn << 
3358                                               << 
3359   G4Scene* pScene = fpVisManager->GetCurrentS << 
3360   if (!pScene) {                              << 
3361     if (verbosity >= G4VisManager::errors) {  << 
3362       G4warn << "ERROR: No current scene.  Pl << 
3363     }                                         << 
3364     return;                                      291     return;
3365   }                                              292   }
3366                                                  293 
3367   G4Plotter& _plotter = G4PlotterManager::Get << 294   G4VFlavoredParallelWorld* worldForThis;
3368   G4VModel* model = new G4PlotterModel(_plott << 295   if(worldForThis=theGlobalFastSimulationManager->
3369                                               << 296      GetFlavoredWorldForThis(currentParticle)) {
3370   const G4String& currentSceneName = pScene - << 297     G4bool successful = pCurrentScene -> AddRunDurationModel
3371   G4bool successful = pScene -> AddEndOfRunMo << 298       (new G4FlavoredParallelWorldModel (worldForThis));
3372   if (successful) {                           << 299     UpdateVisManagerScene (currentSceneName);
3373     if (verbosity >= G4VisManager::confirmati << 300     if (successful) {
3374       G4cout                                  << 301       G4cout << "Ghosts added to the Scene, refresh the view to see it."
3375       << "Plotter \"" << model->GetCurrentDes << 302        << G4endl;
3376       << "\" has been added to scene \"" << c << 
3377       << G4endl;                              << 
3378     }                                            303     }
3379   }                                              304   }
3380   else G4VisCommandsSceneAddUnsuccessful(verb << 305   else G4cout << "There are no ghosts for \""<<newValue<<"\""<<G4endl;
3381                                               << 
3382   CheckSceneAndNotifyHandlers (pScene);       << 
3383 }                                                306 }
3384                                               << 
3385                                                  307