Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4NavigationLogger.cc
Go to the documentation of this file.
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// $Id$
28//
29//
30// class G4NavigationLogger Implementation
31//
32// Author: G.Cosmo, 2010
33//
34// --------------------------------------------------------------------
35
36#include <iomanip>
37
38#include "G4NavigationLogger.hh"
40
42 : fId(id), fVerbose(0)
43{
44}
45
47{
48}
49
50void
52 G4double motherSafety,
53 const G4ThreeVector& localPoint) const
54{
55 G4VSolid* motherSolid = motherPhysical->GetLogicalVolume()->GetSolid();
56 G4String fType = fId + "::ComputeStep()";
57 if( fVerbose == 1 )
58 {
59 G4cout << "*************** " << fType << " *****************" << G4endl
60 << " VolType "
61 << std::setw(15) << "Safety/mm" << " "
62 << std::setw(15) << "Distance/mm" << " "
63 << std::setw(52) << "Position (local coordinates)"
64 << " - Solid" << G4endl;
65 G4cout << " Mother "
66 << std::setw(15) << motherSafety << " "
67 << std::setw(15) << "N/C" << " " << localPoint << " - "
68 << motherSolid->GetEntityType() << ": " << motherSolid->GetName()
69 << G4endl;
70 }
71 if ( motherSafety < 0.0 )
72 {
73 std::ostringstream message;
74 message << "Negative Safety In Voxel Navigation !" << G4endl
75 << " Current solid " << motherSolid->GetName()
76 << " gave negative safety: " << motherSafety << G4endl
77 << " for the current (local) point " << localPoint;
78 motherSolid->DumpInfo();
79 G4Exception(fType, "GeomNav0003", FatalException, message);
80 }
81 if( motherSolid->Inside(localPoint)==kOutside )
82 {
83 std::ostringstream message;
84 message << "Point is outside Current Volume - " << G4endl
85 << " Point " << localPoint
86 << " is outside current volume " << motherPhysical->GetName()
87 << G4endl;
88 G4double estDistToSolid= motherSolid->DistanceToIn(localPoint);
89 message << " Estimated isotropic distance to solid (distToIn)= "
90 << estDistToSolid;
91 if( estDistToSolid > 100.0 * motherSolid->GetTolerance() )
92 {
93 motherSolid->DumpInfo();
94 G4Exception(fType, "GeomNav0003", FatalException, message,
95 "Point is far outside Current Volume !" );
96 }
97 else
98 G4Exception(fType, "GeomNav1001", JustWarning, message,
99 "Point is a little outside Current Volume.");
100 }
101
102 // Verification / verbosity
103 //
104 if ( fVerbose > 1 )
105 {
106 static G4int precVerf= 20; // Precision
107 G4int oldprec = G4cout.precision(precVerf);
108 G4cout << " - Information on mother / key daughters ..." << G4endl;
109 G4cout << " Type " << std::setw(12) << "Solid-Name" << " "
110 << std::setw(3*(6+precVerf)) << " local point" << " "
111 << std::setw(4+precVerf) << "solid-Safety" << " "
112 << std::setw(4+precVerf) << "solid-Step" << " "
113 << std::setw(17) << "distance Method "
114 << std::setw(3*(6+precVerf)) << " local direction" << " "
115 << G4endl;
116 G4cout << " Mother " << std::setw(12) << motherSolid->GetName() << " "
117 << std::setw(4+precVerf) << localPoint << " "
118 << std::setw(4+precVerf) << motherSafety << " "
119 << G4endl;
120 G4cout.precision(oldprec);
121 }
122}
123
124void
126 const G4ThreeVector& samplePoint,
127 const G4ThreeVector& sampleDirection,
128 const G4ThreeVector& localDirection,
129 G4double sampleSafety,
130 G4double sampleStep) const
131{
132 // Check to see that the resulting point is indeed in/on volume.
133 // This check could eventually be made only for successful candidate.
134
135 if ( sampleStep < kInfinity )
136 {
137 G4ThreeVector intersectionPoint;
138 intersectionPoint= samplePoint + sampleStep * sampleDirection;
139 EInside insideIntPt= sampleSolid->Inside(intersectionPoint);
140 G4String fType = fId + "::ComputeStep()";
141
142 G4String solidResponse = "-kInside-";
143 if (insideIntPt == kOutside)
144 { solidResponse = "-kOutside-"; }
145 else if (insideIntPt == kSurface)
146 { solidResponse = "-kSurface-"; }
147
148 if ( fVerbose == 1 )
149 {
150 G4cout << " Invoked Inside() for solid: "
151 << sampleSolid->GetName()
152 << ". Solid replied: " << solidResponse << G4endl
153 << " For point p: " << intersectionPoint
154 << ", considered as 'intersection' point." << G4endl;
155 }
156
157 G4double safetyIn= -1, safetyOut= -1; // Set to invalid values
158 G4double newDistIn= -1, newDistOut= -1;
159 if( insideIntPt != kInside )
160 {
161 safetyIn= sampleSolid->DistanceToIn(intersectionPoint);
162 newDistIn= sampleSolid->DistanceToIn(intersectionPoint,
163 sampleDirection);
164 }
165 if( insideIntPt != kOutside )
166 {
167 safetyOut= sampleSolid->DistanceToOut(intersectionPoint);
168 newDistOut= sampleSolid->DistanceToOut(intersectionPoint,
169 sampleDirection);
170 }
171 if( insideIntPt != kSurface )
172 {
173 G4int oldcoutPrec = G4cout.precision(16);
174 std::ostringstream message;
175 message << "Conflicting response from Solid." << G4endl
176 << " Inaccurate solid DistanceToIn"
177 << " for solid " << sampleSolid->GetName() << G4endl
178 << " Solid gave DistanceToIn = "
179 << sampleStep << " yet returns " << solidResponse
180 << " for this point !" << G4endl
181 << " Point = " << intersectionPoint << G4endl
182 << " Safety values: " << G4endl;
183 if ( insideIntPt != kInside )
184 {
185 message << " DistanceToIn(p) = " << safetyIn;
186 }
187 if ( insideIntPt != kOutside )
188 {
189 message << " DistanceToOut(p) = " << safetyOut;
190 }
191 G4Exception(fType, "GeomNav1001", JustWarning, message);
192 G4cout.precision(oldcoutPrec);
193 }
194 else
195 {
196 // If it is on the surface, *ensure* that either DistanceToIn
197 // or DistanceToOut returns a finite value ( >= Tolerance).
198 //
199 if( std::max( newDistIn, newDistOut ) <=
200 G4GeometryTolerance::GetInstance()->GetSurfaceTolerance() )
201 {
202 std::ostringstream message;
203 message << "Zero from both Solid DistanceIn and Out(p,v)." << G4endl
204 << " Identified point for which the solid "
205 << sampleSolid->GetName() << G4endl
206 << " has MAJOR problem: " << G4endl
207 << " --> Both DistanceToIn(p,v) and DistanceToOut(p,v) "
208 << "return Zero, an equivalent value or negative value."
209 << G4endl
210 << " Solid: " << sampleSolid << G4endl
211 << " Point p= " << intersectionPoint << G4endl
212 << " Direction v= " << sampleDirection << G4endl
213 << " DistanceToIn(p,v) = " << newDistIn << G4endl
214 << " DistanceToOut(p,v,..) = " << newDistOut << G4endl
215 << " Safety values: " << G4endl
216 << " DistanceToIn(p) = " << safetyIn << G4endl
217 << " DistanceToOut(p) = " << safetyOut;
218 G4Exception(fType, "GeomNav0003", FatalException, message);
219 }
220 }
221
222 // Verification / verbosity
223 //
224 if ( fVerbose > 1 )
225 {
226 static G4int precVerf= 20; // Precision
227 G4int oldprec = G4cout.precision(precVerf);
228 G4cout << "Daughter "
229 << std::setw(12) << sampleSolid->GetName() << " "
230 << std::setw(4+precVerf) << samplePoint << " "
231 << std::setw(4+precVerf) << sampleSafety << " "
232 << std::setw(4+precVerf) << sampleStep << " "
233 << std::setw(16) << "distanceToIn" << " "
234 << std::setw(4+precVerf) << localDirection << " "
235 << G4endl;
236 G4cout.precision(oldprec);
237 }
238 }
239}
240
241void
243 const G4ThreeVector& localPoint,
244 const G4ThreeVector& localDirection,
245 G4double motherStep,
246 G4double motherSafety) const
247{
248 if( fVerbose == 1 )
249 {
250 G4cout << " Mother "
251 << std::setw(15) << motherSafety << " "
252 << std::setw(15) << motherStep << " " << localPoint << " - "
253 << motherSolid->GetEntityType() << ": " << motherSolid->GetName()
254 << G4endl;
255 }
256 if( ( motherStep < 0.0 ) || ( motherStep >= kInfinity) )
257 {
258 G4String fType = fId + "::ComputeStep()";
259 G4int oldPrOut= G4cout.precision(16);
260 G4int oldPrErr= G4cerr.precision(16);
261 std::ostringstream message;
262 message << "Current point is outside the current solid !" << G4endl
263 << " Problem in Navigation" << G4endl
264 << " Point (local coordinates): "
265 << localPoint << G4endl
266 << " Local Direction: " << localDirection << G4endl
267 << " Solid: " << motherSolid->GetName();
268 motherSolid->DumpInfo();
269 G4Exception(fType, "GeomNav0003", FatalException, message);
270 G4cout.precision(oldPrOut);
271 G4cerr.precision(oldPrErr);
272 }
273 if ( fVerbose > 1 )
274 {
275 static G4int precVerf= 20; // Precision
276 G4int oldprec = G4cout.precision(precVerf);
277 G4cout << " Mother " << std::setw(12) << motherSolid->GetName() << " "
278 << std::setw(4+precVerf) << localPoint << " "
279 << std::setw(4+precVerf) << motherSafety << " "
280 << std::setw(4+precVerf) << motherStep << " "
281 << std::setw(16) << "distanceToOut" << " "
282 << std::setw(4+precVerf) << localDirection << " "
283 << G4endl;
284 G4cout.precision(oldprec);
285 }
286}
287
288void
290 const G4ThreeVector& point,
291 G4double safety,
292 G4bool banner) const
293{
294 G4String volumeType = "Daughter ";
295 if (banner)
296 {
297 G4cout << "************** " << fId << "::ComputeSafety() ****************" << G4endl;
298 G4cout << " VolType "
299 << std::setw(15) << "Safety/mm" << " "
300 << std::setw(52) << "Position (local coordinates)"
301 << " - Solid" << G4endl;
302 volumeType = " Mother ";
303 }
304 G4cout << volumeType
305 << std::setw(15) << safety << " " << point << " - "
306 << solid->GetEntityType() << ": " << solid->GetName() << G4endl;
307}
308
309void
311 const G4ThreeVector& samplePoint,
312 G4double sampleSafety,
313 G4double sampleStep) const
314{
315 if ( fVerbose == 1 )
316 {
317 G4cout << "Daughter "
318 << std::setw(15) << sampleSafety << " ";
319 if (sampleStep)
320 {
321 G4cout << std::setw(15) << sampleStep << " ";
322 }
323 else
324 {
325 G4cout << std::setw(15) << "N/C" << " ";
326 }
327 G4cout << samplePoint << " - "
328 << sampleSolid->GetEntityType() << ": " << sampleSolid->GetName()
329 << G4endl;
330 }
331}
@ JustWarning
@ FatalException
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
static G4GeometryTolerance * GetInstance()
G4VSolid * GetSolid() const
void PreComputeStepLog(const G4VPhysicalVolume *motherPhysical, G4double motherSafety, const G4ThreeVector &localPoint) const
G4NavigationLogger(const G4String &id)
void PostComputeStepLog(const G4VSolid *motherSolid, const G4ThreeVector &localPoint, const G4ThreeVector &localDirection, G4double motherStep, G4double motherSafety) const
void PrintDaughterLog(const G4VSolid *sampleSolid, const G4ThreeVector &samplePoint, G4double sampleSafety, G4double sampleStep) const
void ComputeSafetyLog(const G4VSolid *solid, const G4ThreeVector &point, G4double safety, G4bool banner) const
void AlongComputeStepLog(const G4VSolid *sampleSolid, const G4ThreeVector &samplePoint, const G4ThreeVector &sampleDirection, const G4ThreeVector &localDirection, G4double sampleSafety, G4double sampleStep) const
G4LogicalVolume * GetLogicalVolume() const
const G4String & GetName() const
G4String GetName() const
G4double GetTolerance() const
virtual EInside Inside(const G4ThreeVector &p) const =0
void DumpInfo() const
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=0, G4ThreeVector *n=0) const =0
virtual G4double DistanceToIn(const G4ThreeVector &p, const G4ThreeVector &v) const =0
virtual G4GeometryType GetEntityType() const =0
EInside
Definition: geomdefs.hh:58
@ kInside
Definition: geomdefs.hh:58
@ kOutside
Definition: geomdefs.hh:58
@ kSurface
Definition: geomdefs.hh:58
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41