ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4RayTracerViewer.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4RayTracerViewer.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 
28 #include "G4RayTracerViewer.hh"
29 
30 #include "G4ios.hh"
31 #include <sstream>
32 #include <iomanip>
33 
34 #include "G4SystemOfUnits.hh"
35 
36 #include "G4VSceneHandler.hh"
37 #include "G4Scene.hh"
38 #include "G4TheRayTracer.hh"
39 #include "G4UImanager.hh"
40 
42 (G4VSceneHandler& sceneHandler,
43  const G4String& name,
44  G4TheRayTracer* aTracer)
45 : G4VViewer(sceneHandler, sceneHandler.IncrementViewCount(), name)
46 , fFileCount(0)
47 , theTracer(aTracer)
48 {
49  if (!theTracer) {
50  G4cerr << "G4RayTracerViewer::Initialise: No tracer" << G4endl;
51  fViewId = -1; // This flags an error.
52  return;
53  }
54 }
55 
57 
59 {
62 }
63 
65 {
66  // Get radius of scene, etc. (See G4OpenGLViewer::SetView().)
67  // Note that this procedure properly takes into account zoom, dolly and pan.
68  const G4Point3D& targetPoint
71  G4double radius = // See G4ViewParameters for following procedure.
73  if(radius<=0.) radius = 1.;
74  const G4double cameraDistance = fVP.GetCameraDistance(radius);
75  const G4Point3D cameraPosition =
76  targetPoint + cameraDistance * fVP.GetViewpointDirection().unit();
77  const G4double nearDistance = fVP.GetNearDistance(cameraDistance,radius);
78  const G4double frontHalfHeight = fVP.GetFrontHalfHeight(nearDistance,radius);
79  const G4double frontHalfAngle = std::atan(frontHalfHeight / nearDistance);
80 
81  // Calculate and set ray tracer parameters.
82  theTracer->
83  SetViewSpan(200. * frontHalfAngle / theTracer->GetNColumn());
84  theTracer->SetTargetPosition(targetPoint);
85  theTracer->SetEyePosition(cameraPosition);
87  const G4Vector3D
88  actualLightpointDirection(-fVP.GetActualLightpointDirection());
89  theTracer->SetLightDirection(actualLightpointDirection);
91 }
92 
93 
95 
97 {
98  // Trap recursive call
99  static G4bool called = false;
100  if (called) return;
101  called = true;
102 
103  if (fVP.GetFieldHalfAngle() == 0.) { // Orthogonal (parallel) projection.
104  G4double fieldHalfAngle = perMillion;
105  fVP.SetFieldHalfAngle(fieldHalfAngle);
106  G4cout <<
107  "WARNING: G4RayTracerViewer::DrawView: true orthogonal projection"
108  "\n not yet implemented. Doing a \"long shot\", i.e., a perspective"
109  "\n projection with a half field angle of "
110  << fieldHalfAngle <<
111  " radians."
112  << G4endl;
113  SetView(); // With this fieldHalfAngle
114  ProcessView();
116  }
117  else {
118  ProcessView();
119  }
120  std::ostringstream filename;
121  filename << "g4RayTracer." << fShortName << '_'
122  << std::setw(4) << std::setfill('0') << fFileCount++ << ".jpeg";
123  theTracer->Trace(filename.str());
124 
125  // Reset call flag
126  called = false;
127 }