Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4PathFinder.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// GEANT4 tag $ Name: $
29//
30// class G4PathFinder Implementation
31//
32// Original author: John Apostolakis, April 2006
33//
34// --------------------------------------------------------------------
35
36#include <iomanip>
37
38#include "G4PathFinder.hh"
39
40#include "G4SystemOfUnits.hh"
42#include "G4Navigator.hh"
45#include "G4MultiNavigator.hh"
46#include "G4SafetyHelper.hh"
47
48// Initialise the static instance of the singleton
49//
50G4PathFinder* G4PathFinder::fpPathFinder=0;
51
52// ----------------------------------------------------------------------------
53// GetInstance()
54//
55// Retrieve the static instance of the singleton
56//
58{
59 static G4PathFinder theInstance;
60 if( ! fpPathFinder )
61 {
62 fpPathFinder = &theInstance;
63 }
64 return fpPathFinder;
65}
66
67// ----------------------------------------------------------------------------
68// Constructor
69//
71 : fEndState( G4ThreeVector(), G4ThreeVector(), 0., 0., 0., 0., 0.),
72 fFieldExertedForce(false),
73 fRelocatedPoint(true),
74 fLastStepNo(-1), fCurrentStepNo(-1),
75 fVerboseLevel(0)
76{
77 fpMultiNavigator= new G4MultiNavigator();
78
80 fpFieldPropagator = fpTransportManager->GetPropagatorInField();
81
83
84 fNoActiveNavigators= 0;
85 G4ThreeVector Big3Vector( kInfinity, kInfinity, kInfinity );
86 fLastLocatedPosition= Big3Vector;
87 fSafetyLocation= Big3Vector;
88 fPreSafetyLocation= Big3Vector;
89 fPreStepLocation= Big3Vector;
90
91 fPreSafetyMinValue= -1.0;
92 fMinSafety_PreStepPt= -1.0;
93 fMinSafety_atSafLocation= -1.0;
94 fMinStep= -1.0;
95 fTrueMinStep= -1.0;
96 fPreStepCenterRenewed= false;
97 fNewTrack= false;
98 fNoGeometriesLimiting= 0;
99
100 for( register int num=0; num< fMaxNav; ++num )
101 {
102 fpNavigator[num] = 0;
103 fLimitTruth[num] = false;
104 fLimitedStep[num] = kUndefLimited;
105 fCurrentStepSize[num] = -1.0;
106 fLocatedVolume[num] = 0;
107 fPreSafetyValues[num]= -1.0;
108 fCurrentPreStepSafety[num] = -1.0;
109 fNewSafetyComputed[num]= -1.0;
110 }
111}
112
113// ----------------------------------------------------------------------------
114// Destructor
115//
117{
118 delete fpMultiNavigator;
119}
120
121// ----------------------------------------------------------------------------
122//
123void
125{
126 G4Navigator *navigatorForPropagation=0, *massNavigator=0;
127
128 massNavigator= fpTransportManager->GetNavigatorForTracking();
129 if( enableChoice )
130 {
131 navigatorForPropagation= fpMultiNavigator;
132
133 // Enable SafetyHelper to use PF
134 //
135 fpTransportManager->GetSafetyHelper()->EnableParallelNavigation(true);
136 }
137 else
138 {
139 navigatorForPropagation= massNavigator;
140
141 // Disable SafetyHelper to use PF
142 //
143 fpTransportManager->GetSafetyHelper()->EnableParallelNavigation(false);
144 }
145 fpFieldPropagator->SetNavigatorForPropagating(navigatorForPropagation);
146}
147
148// ----------------------------------------------------------------------------
149//
151G4PathFinder::ComputeStep( const G4FieldTrack &InitialFieldTrack,
152 G4double proposedStepLength,
153 G4int navigatorNo,
154 G4int stepNo, // find next step
155 G4double &pNewSafety, // for this geom
156 ELimited &limitedStep,
157 G4FieldTrack &EndState,
158 G4VPhysicalVolume* currentVolume)
159{
160 G4double possibleStep= -1.0;
161
162#ifdef G4DEBUG_PATHFINDER
163 if( fVerboseLevel > 2 )
164 {
165 G4cout << " -------------------------" << G4endl;
166 G4cout << " G4PathFinder::ComputeStep - entered " << G4endl;
167 G4cout << " - stepNo = " << std::setw(4) << stepNo << " "
168 << " navigatorId = " << std::setw(2) << navigatorNo << " "
169 << " proposed step len = " << proposedStepLength << " " << G4endl;
170 G4cout << " PF::ComputeStep requested step "
171 << " from " << InitialFieldTrack.GetPosition()
172 << " dir " << InitialFieldTrack.GetMomentumDirection() << G4endl;
173 }
174#endif
175#ifdef G4VERBOSE
176 if( navigatorNo >= fNoActiveNavigators )
177 {
178 std::ostringstream message;
179 message << "Bad Navigator ID !" << G4endl
180 << " Requested Navigator ID = " << navigatorNo << G4endl
181 << " Number of active navigators = " << fNoActiveNavigators;
182 G4Exception("G4PathFinder::ComputeStep()", "GeomNav0002",
183 FatalException, message);
184 }
185#endif
186
187 if( fNewTrack || (stepNo != fLastStepNo) )
188 {
189 // This is a new track or a new step, so we must make the step
190 // ( else we can simply retrieve its results for this Navigator Id )
191
192 G4FieldTrack currentState= InitialFieldTrack;
193
194 fCurrentStepNo = stepNo;
195
196 // Check whether a process shifted the position
197 // since the last step -- by physics processes
198 //
199 G4ThreeVector newPosition = InitialFieldTrack.GetPosition();
200 G4ThreeVector moveVector= newPosition - fLastLocatedPosition;
201 G4double moveLenSq= moveVector.mag2();
202 if( moveLenSq > kCarTolerance * kCarTolerance )
203 {
204 G4ThreeVector newDirection = InitialFieldTrack.GetMomentumDirection();
205#ifdef G4DEBUG_PATHFINDER
206 if( fVerboseLevel > 2 )
207 {
208 G4double moveLen= std::sqrt( moveLenSq );
209 G4cout << " G4PathFinder::ComputeStep : Point moved since last step "
210 << " -- at step # = " << stepNo << G4endl
211 << " by " << moveLen << " to " << newPosition << G4endl;
212 }
213#endif
214 MovePoint(); // Unintentional changed -- ????
215
216 // Relocate to cope with this move -- else could abort !?
217 //
218 Locate( newPosition, newDirection );
219 }
220
221 // Check whether the particle have an (EM) field force exerting upon it
222 //
223 G4double particleCharge= currentState.GetCharge();
224
225 G4FieldManager* fieldMgr=0;
226 G4bool fieldExertsForce = false ;
227 if( (particleCharge != 0.0) )
228 {
229 fieldMgr= fpFieldPropagator->FindAndSetFieldManager( currentVolume );
230
231 // Protect for case where field manager has no field (= field is zero)
232 //
233 fieldExertsForce = (fieldMgr != 0)
234 && (fieldMgr->GetDetectorField() != 0);
235 }
236 fFieldExertedForce = fieldExertsForce; // Store for use in later calls
237 // referring to this 'step'.
238
239 fNoGeometriesLimiting= -1; // At start of track, no process limited step
240 if( fieldExertsForce )
241 {
242 DoNextCurvedStep( currentState, proposedStepLength, currentVolume );
243 //--------------
244 }else{
245 DoNextLinearStep( currentState, proposedStepLength );
246 //--------------
247 }
248 fLastStepNo= stepNo;
249
250#ifdef G4DEBUG_PATHFINDER
251 if ( (fNoGeometriesLimiting < 0)
252 || (fNoGeometriesLimiting > fNoActiveNavigators) )
253 {
254 std::ostringstream message;
255 message << "Number of geometries limiting the step not set." << G4endl
256 << " Number of geometries limiting step = "
257 << fNoGeometriesLimiting;
258 G4Exception("G4PathFinder::ComputeStep()",
259 "GeomNav0002", FatalException, message);
260 }
261#endif
262 }
263#ifdef G4DEBUG_PATHFINDER
264 else
265 {
266 if( proposedStepLength < fTrueMinStep ) // For 2nd+ geometry
267 {
268 std::ostringstream message;
269 message << "Problem in step size request." << G4endl
270 << " Error can be caused by incorrect process ordering."
271 << " Being requested to make a step which is shorter"
272 << " than the minimum Step " << G4endl
273 << " already computed for any Navigator/geometry during"
274 << " this tracking-step: " << G4endl
275 << " This can happen due to an error in process ordering."
276 << G4endl
277 << " Check that all physics processes are registered"
278 << G4endl
279 << " before all processes with a navigator/geometry."
280 << G4endl
281 << " If using pre-packaged physics list and/or"
282 << G4endl
283 << " functionality, please report this error."
284 << G4endl << G4endl
285 << " Additional information for problem: " << G4endl
286 << " Steps request/proposed = " << proposedStepLength
287 << G4endl
288 << " MinimumStep (true) = " << fTrueMinStep
289 << G4endl
290 << " MinimumStep (navraw) = " << fMinStep
291 << G4endl
292 << " Navigator raw return value" << G4endl
293 << " Requested step now = " << proposedStepLength
294 << G4endl
295 << " Difference min-req = "
296 << fTrueMinStep-proposedStepLength << G4endl
297 << " -- Step info> stepNo= " << stepNo
298 << " last= " << fLastStepNo
299 << " newTr= " << fNewTrack << G4endl;
300 G4Exception("G4PathFinder::ComputeStep()",
301 "GeomNav0003", FatalException, message);
302 }
303 else
304 {
305 // This is neither a new track nor a new step -- just another
306 // client accessing information for the current track, step
307 // We will simply retrieve the results of the synchronous
308 // stepping for this Navigator Id below.
309 //
310 if( fVerboseLevel > 1 )
311 {
312 G4cout << " G4P::CS -> Not calling DoNextLinearStep: "
313 << " stepNo= " << stepNo << " last= " << fLastStepNo
314 << " new= " << fNewTrack << " Step already done" << G4endl;
315 }
316 }
317 }
318#endif
319
320 fNewTrack= false;
321
322 // Prepare the information to return
323
324 pNewSafety = fCurrentPreStepSafety[ navigatorNo ];
325 limitedStep = fLimitedStep[ navigatorNo ];
326 fRelocatedPoint= false;
327
328 possibleStep= std::min(proposedStepLength, fCurrentStepSize[ navigatorNo ]);
329 EndState = fEndState; // now corrected for smaller step, if needed
330
331#ifdef G4DEBUG_PATHFINDER
332 if( fVerboseLevel > 0 )
333 {
334 G4cout << " G4PathFinder::ComputeStep returns "
335 << fCurrentStepSize[ navigatorNo ]
336 << " for Navigator " << navigatorNo
337 << " Limited step = " << limitedStep
338 << " Safety(mm) = " << pNewSafety / mm
339 << G4endl;
340 }
341#endif
342
343 return possibleStep;
344}
345
346// ----------------------------------------------------------------------
347
348void
350 const G4ThreeVector& direction,
351 G4VPhysicalVolume* massStartVol)
352{
353 // Key purposes:
354 // - Check and cache set of active navigators
355 // - Reset state for new track
356
357 G4int num=0;
358
360 // Switch PropagatorInField to use MultiNavigator
361
362 fpTransportManager->GetSafetyHelper()->InitialiseHelper();
363 // Reinitialise state of safety helper -- avoid problems with overlaps
364
365 fNewTrack= true;
366 this->MovePoint(); // Signal further that the last status is wiped
367
368 // Message the G4NavigatorPanel / Dispatcher to find active navigators
369 //
370 std::vector<G4Navigator*>::iterator pNavigatorIter;
371
372 fNoActiveNavigators= fpTransportManager-> GetNoActiveNavigators();
373 if( fNoActiveNavigators > fMaxNav )
374 {
375 std::ostringstream message;
376 message << "Too many active Navigators / worlds." << G4endl
377 << " Transportation Manager has "
378 << fNoActiveNavigators << " active navigators." << G4endl
379 << " This is more than the number allowed = "
380 << fMaxNav << " !";
381 G4Exception("G4PathFinder::PrepareNewTrack()", "GeomNav0002",
382 FatalException, message);
383 }
384
385 fpMultiNavigator->PrepareNavigators();
386 //------------------------------------
387
388 pNavigatorIter= fpTransportManager->GetActiveNavigatorsIterator();
389 for( num=0; num< fNoActiveNavigators; ++pNavigatorIter,++num )
390 {
391 // Keep information in C-array ... for creating touchables - at least
392
393 fpNavigator[num] = *pNavigatorIter;
394 fLimitTruth[num] = false;
395 fLimitedStep[num] = kDoNot;
396 fCurrentStepSize[num] = 0.0;
397 fLocatedVolume[num] = 0;
398 }
399 fNoGeometriesLimiting= 0; // At start of track, no process limited step
400
401 // In case of one geometry, the tracking will have done the locating!!
402
403 if( fNoActiveNavigators > 1 )
404 {
405 Locate( position, direction, false );
406 }
407 else
408 {
409 // Update state -- depending on the tracking's call to Mass Navigator
410
411 fLastLocatedPosition= position;
412 fLocatedVolume[0]= massStartVol; // This information must be given
413 // by transportation
414 fLimitedStep[0] = kDoNot;
415 fCurrentStepSize[0] = 0.0;
416 }
417
418 // Reset Safety Information -- as in case of overlaps this can cause
419 // inconsistencies ...
420 //
421 fMinSafety_PreStepPt= fPreSafetyMinValue= fMinSafety_atSafLocation= 0.0;
422
423 for( num=0; num< fNoActiveNavigators; ++num )
424 {
425 fPreSafetyValues[num]= 0.0;
426 fNewSafetyComputed[num]= 0.0;
427 fCurrentPreStepSafety[num] = 0.0;
428 }
429
430 // The first location for each Navigator must be non-relative
431 // or else call ResetStackAndState() for each Navigator
432
433 fRelocatedPoint= false;
434}
435
437 const G4ThreeVector& NewVector,
438 const G4String& Quantity ) const
439{
440 G4ThreeVector moveVec = ( NewVector - OldVector );
441
442 G4int prc= G4cerr.precision(12);
443 std::ostringstream message;
444 message << "Endpoint moved between value returned by ComputeStep()"
445 << " and call to Locate(). " << G4endl
446 << " Change of " << Quantity << " is "
447 << moveVec.mag() / mm << " mm long" << G4endl
448 << " and its vector is "
449 << (1.0/mm) * moveVec << " mm " << G4endl
450 << " Endpoint of ComputeStep() was " << OldVector << G4endl
451 << " and current position to locate is " << NewVector;
452 G4Exception("G4PathFinder::ReportMove()", "GeomNav1002",
453 JustWarning, message);
454 G4cerr.precision(prc);
455}
456
457void
459 const G4ThreeVector& direction,
460 G4bool relative)
461{
462 // Locate the point in each geometry
463
464 std::vector<G4Navigator*>::iterator pNavIter=
465 fpTransportManager->GetActiveNavigatorsIterator();
466
467 G4ThreeVector lastEndPosition= fEndState.GetPosition();
468 G4ThreeVector moveVec = (position - lastEndPosition );
469 G4double moveLenSq= moveVec.mag2();
470 if( (!fNewTrack) && (!fRelocatedPoint)
471 && ( moveLenSq> kCarTolerance*kCarTolerance ) )
472 {
473 ReportMove( position, lastEndPosition, "Position" );
474 }
475 fLastLocatedPosition= position;
476
477#ifdef G4DEBUG_PATHFINDER
478 if( fVerboseLevel > 2 )
479 {
480 G4cout << G4endl;
481 G4cout << " G4PathFinder::Locate : entered " << G4endl;
482 G4cout << " -------------------- -------" << G4endl;
483 G4cout << " Locating at position " << position
484 << " with direction " << direction
485 << " relative= " << relative << G4endl;
486 if ( (fVerboseLevel > 1) || ( moveLenSq > 0.0) )
487 {
488 G4cout << " lastEndPosition = " << lastEndPosition
489 << " moveVec = " << moveVec
490 << " newTr = " << fNewTrack
491 << " relocated = " << fRelocatedPoint << G4endl;
492 }
493
494 G4cout << " Located at " << position ;
495 if( fNoActiveNavigators > 1 ) { G4cout << G4endl; }
496 }
497#endif
498
499 for ( register G4int num=0; num< fNoActiveNavigators ; ++pNavIter,++num )
500 {
501 // ... who limited the step ....
502
503 if( fLimitTruth[num] ) { (*pNavIter)->SetGeometricallyLimitedStep(); }
504
505 G4VPhysicalVolume *pLocated=
506 (*pNavIter)->LocateGlobalPointAndSetup( position, &direction,
507 relative,
508 false);
509 // Set the state related to the location
510 //
511 fLocatedVolume[num] = pLocated;
512
513 // Clear state related to the step
514 //
515 fLimitedStep[num] = kDoNot;
516 fCurrentStepSize[num] = 0.0;
517
518#ifdef G4DEBUG_PATHFINDER
519 if( fVerboseLevel > 2 )
520 {
521 G4cout << " - In world " << num << " geomLimStep= " << fLimitTruth[num]
522 << " gives volume= " << pLocated ;
523 if( pLocated )
524 {
525 G4cout << " name = '" << pLocated->GetName() << "'";
526 G4cout << " - CopyNo= " << pLocated->GetCopyNo();
527 }
528 G4cout << G4endl;
529 }
530#endif
531 }
532
533 fRelocatedPoint= false;
534}
535
537{
538 // Locate the point in each geometry
539
540 std::vector<G4Navigator*>::iterator pNavIter=
541 fpTransportManager->GetActiveNavigatorsIterator();
542
543#ifdef G4DEBUG_PATHFINDER
544
545 // Check that this relocation does not violate safety
546 // - at endpoint (computed from start point) AND
547 // - at last safety location (likely just called)
548
549 G4ThreeVector lastEndPosition= fEndState.GetPosition();
550
551 // Calculate end-point safety ...
552 //
553 G4double DistanceStartEnd= (lastEndPosition - fPreStepLocation).mag();
554 G4double endPointSafety_raw = fMinSafety_PreStepPt - DistanceStartEnd;
555 G4double endPointSafety_Est1 = std::max( 0.0, endPointSafety_raw );
556
557 // ... and check move from endpoint against this endpoint safety
558 //
559 G4ThreeVector moveVecEndPos = position - lastEndPosition;
560 G4double moveLenEndPosSq = moveVecEndPos.mag2();
561
562 // Check that move from endpoint of last step is within safety
563 // -- or check against last location or relocation ??
564 //
565 G4ThreeVector moveVecSafety= position - fSafetyLocation;
566 G4double moveLenSafSq= moveVecSafety.mag2();
567
568 G4double distCheckEnd_sq= ( moveLenEndPosSq - endPointSafety_Est1
569 *endPointSafety_Est1 );
570 G4double distCheckSaf_sq= ( moveLenSafSq - fMinSafety_atSafLocation
571 *fMinSafety_atSafLocation );
572
573 G4bool longMoveEnd = distCheckEnd_sq > 0.0;
574 G4bool longMoveSaf = distCheckSaf_sq > 0.0;
575
576 G4double revisedSafety= 0.0;
577
578 if( (!fNewTrack) && ( longMoveEnd && longMoveSaf ) )
579 {
580 // Recompute ComputeSafety for end position
581 //
582 revisedSafety= ComputeSafety(lastEndPosition);
583
584 const G4double kRadTolerance =
586 const G4double cErrorTolerance=1e-12;
587 // Maximum relative error from roundoff of arithmetic
588
589 G4double distCheckRevisedEnd= moveLenEndPosSq-revisedSafety*revisedSafety;
590
591 G4bool longMoveRevisedEnd= ( distCheckRevisedEnd > 0. ) ;
592
593 G4double moveMinusSafety= 0.0;
594 G4double moveLenEndPosition= std::sqrt( moveLenEndPosSq );
595 moveMinusSafety = moveLenEndPosition - revisedSafety;
596
597 if ( longMoveRevisedEnd && (moveMinusSafety > 0.0 )
598 && ( revisedSafety > 0.0 ) )
599 {
600 // Take into account possibility of roundoff error causing
601 // this apparent move further than safety
602
603 if( fVerboseLevel > 0 )
604 {
605 G4cout << " G4PF:Relocate> Ratio to revised safety is "
606 << std::fabs(moveMinusSafety)/revisedSafety << G4endl;
607 }
608
609 G4double absMoveMinusSafety= std::fabs(moveMinusSafety);
610 G4bool smallRatio= absMoveMinusSafety < kRadTolerance * revisedSafety ;
611 G4double maxCoordPos = std::max(
612 std::max( std::fabs(position.x()),
613 std::fabs(position.y())),
614 std::fabs(position.z()) );
615 G4bool smallValue= absMoveMinusSafety < cErrorTolerance * maxCoordPos;
616 if( ! (smallRatio || smallValue) )
617 {
618 G4cout << " G4PF:Relocate> Ratio to revised safety is "
619 << std::fabs(moveMinusSafety)/revisedSafety << G4endl;
620 G4cout << " Difference of move and safety is not very small."
621 << G4endl;
622 }
623 else
624 {
625 moveMinusSafety = 0.0;
626 longMoveRevisedEnd = false; // Numerical issue -- not too long!
627
628 G4cout << " Difference of move & safety is very small in magnitude, "
629 << absMoveMinusSafety << G4endl;
630 if( smallRatio )
631 {
632 G4cout << " ratio to safety " << revisedSafety
633 << " is " << absMoveMinusSafety / revisedSafety
634 << "smaller than " << kRadTolerance << " of safety ";
635 }
636 else
637 {
638 G4cout << " as fraction " << absMoveMinusSafety / maxCoordPos
639 << " of position vector max-coord " << maxCoordPos
640 << " smaller than " << cErrorTolerance ;
641 }
642 G4cout << " -- reset moveMinusSafety to "
643 << moveMinusSafety << G4endl;
644 }
645 }
646
647 if ( longMoveEnd && longMoveSaf
648 && longMoveRevisedEnd && (moveMinusSafety>0.0) )
649 {
650 G4int oldPrec= G4cout.precision(9);
651 std::ostringstream message;
652 message << "ReLocation is further than end-safety value." << G4endl
653 << " Moved from last endpoint by " << moveLenEndPosition
654 << " compared to end safety (from preStep point) = "
655 << endPointSafety_Est1 << G4endl
656 << " --> last PreSafety Location was " << fPreSafetyLocation
657 << G4endl
658 << " safety value = " << fPreSafetyMinValue << G4endl
659 << " --> last PreStep Location was " << fPreStepLocation
660 << G4endl
661 << " safety value = " << fMinSafety_PreStepPt << G4endl
662 << " --> last EndStep Location was " << lastEndPosition
663 << G4endl
664 << " safety value = " << endPointSafety_Est1
665 << " raw-value = " << endPointSafety_raw << G4endl
666 << " --> Calling again at this endpoint, we get "
667 << revisedSafety << " as safety value." << G4endl
668 << " --> last position for safety " << fSafetyLocation
669 << G4endl
670 << " its safety value = " << fMinSafety_atSafLocation
671 << G4endl
672 << " move from safety location = "
673 << std::sqrt(moveLenSafSq) << G4endl
674 << " again= " << moveVecSafety.mag() << G4endl
675 << " safety - Move-from-end= "
676 << revisedSafety - moveLenEndPosition
677 << " (negative is Bad.)" << G4endl
678 << " Debug: distCheckRevisedEnd = "
679 << distCheckRevisedEnd;
680 ReportMove( lastEndPosition, position, "Position" );
681 G4Exception("G4PathFinder::ReLocate", "GeomNav0003",
682 FatalException, message);
683 G4cout.precision(oldPrec);
684 }
685 }
686
687 if( fVerboseLevel > 2 )
688 {
689 G4cout << G4endl;
690 G4cout << " G4PathFinder::ReLocate : entered " << G4endl;
691 G4cout << " ---------------------- -------" << G4endl;
692 G4cout << " *Re*Locating at position " << position << G4endl;
693 // << " with direction " << direction
694 // << " relative= " << relative << G4endl;
695 if ( (fVerboseLevel > -1) || ( moveLenEndPosSq > 0.0) )
696 {
697 G4cout << " lastEndPosition = " << lastEndPosition
698 << " moveVec from step-end = " << moveVecEndPos
699 << " is new Track = " << fNewTrack
700 << " relocated = " << fRelocatedPoint << G4endl;
701 }
702 }
703#endif // G4DEBUG_PATHFINDER
704
705 for ( register G4int num=0; num< fNoActiveNavigators ; ++pNavIter,++num )
706 {
707 // ... none limited the step
708
709 (*pNavIter)->LocateGlobalPointWithinVolume( position );
710
711 // Clear state related to the step
712 //
713 fLimitedStep[num] = kDoNot;
714 fCurrentStepSize[num] = 0.0;
715 fLimitTruth[num] = false;
716 }
717
718 fLastLocatedPosition= position;
719 fRelocatedPoint= false;
720
721#ifdef G4DEBUG_PATHFINDER
722 if( fVerboseLevel > 2 )
723 {
724 G4cout << " G4PathFinder::ReLocate : exiting "
725 << " at position " << fLastLocatedPosition << G4endl << G4endl;
726 }
727#endif
728}
729
730// -----------------------------------------------------------------------------
731
733{
734 // Recompute safety for the relevant point
735
736 G4double minSafety= kInfinity;
737
738 std::vector<G4Navigator*>::iterator pNavigatorIter;
739 pNavigatorIter= fpTransportManager->GetActiveNavigatorsIterator();
740
741 for( register G4int num=0; num<fNoActiveNavigators; ++pNavigatorIter,++num )
742 {
743 G4double safety = (*pNavigatorIter)->ComputeSafety( position,true );
744 if( safety < minSafety ) { minSafety = safety; }
745 fNewSafetyComputed[num]= safety;
746 }
747
748 fSafetyLocation= position;
749 fMinSafety_atSafLocation = minSafety;
750
751#ifdef G4DEBUG_PATHFINDER
752 if( fVerboseLevel > 1 )
753 {
754 G4cout << " G4PathFinder::ComputeSafety - returns "
755 << minSafety << " at location " << position << G4endl;
756 }
757#endif
758 return minSafety;
759}
760
761
762// -----------------------------------------------------------------------------
763
766{
767#ifdef G4DEBUG_PATHFINDER
768 if( fVerboseLevel > 2 )
769 {
770 G4cout << "G4PathFinder::CreateTouchableHandle : navId = "
771 << navId << " -- " << GetNavigator(navId) << G4endl;
772 }
773#endif
774
775 G4TouchableHistory* touchHist;
776 touchHist= GetNavigator(navId) -> CreateTouchableHistory();
777
778 G4VPhysicalVolume* locatedVolume= fLocatedVolume[navId];
779 if( locatedVolume == 0 )
780 {
781 // Workaround to ensure that the touchable is fixed !! // TODO: fix
782
783 touchHist->UpdateYourself( locatedVolume, touchHist->GetHistory() );
784 }
785
786#ifdef G4DEBUG_PATHFINDER
787 if( fVerboseLevel > 2 )
788 {
789 G4String VolumeName("None");
790 if( locatedVolume ) { VolumeName= locatedVolume->GetName(); }
791 G4cout << " Touchable History created at address " << touchHist
792 << " volume = " << locatedVolume << " name= " << VolumeName
793 << G4endl;
794 }
795#endif
796
797 return G4TouchableHandle(touchHist);
798}
799
802 G4double proposedStepLength )
803{
804 std::vector<G4Navigator*>::iterator pNavigatorIter;
805 G4double safety= 0.0, step=0.0;
806 G4double minSafety= kInfinity, minStep;
807
808 const G4int IdTransport= 0; // Id of Mass Navigator !!
809 register G4int num=0;
810
811#ifdef G4DEBUG_PATHFINDER
812 if( fVerboseLevel > 2 )
813 {
814 G4cout << " G4PathFinder::DoNextLinearStep : entered " << G4endl;
815 G4cout << " Input field track= " << initialState << G4endl;
816 G4cout << " Requested step= " << proposedStepLength << G4endl;
817 }
818#endif
819
820 G4ThreeVector initialPosition= initialState.GetPosition();
821 G4ThreeVector initialDirection= initialState.GetMomentumDirection();
822
823 G4ThreeVector OriginShift = initialPosition - fPreSafetyLocation;
824 G4double MagSqShift = OriginShift.mag2() ;
825 G4double MagShift; // Only given value if it larger than minimum safety
826
827 // Potential optimisation using Maximum Value of safety!
828 // if( MagSqShift >= sqr(fPreSafetyMaxValue ) ){
829 // MagShift= kInfinity; // Not a useful value -- all will not use/ignore
830 // else
831 // MagShift= std::sqrt(MagSqShift) ;
832
833 MagShift= std::sqrt(MagSqShift) ;
834
835#ifdef G4PATHFINDER_OPTIMISATION
836
837 G4double fullSafety; // For all geometries, for prestep point
838
839 if( MagSqShift >= sqr(fPreSafetyMinValue ) )
840 {
841 fullSafety = 0.0 ;
842 }
843 else
844 {
845 fullSafety = fPreSafetyMinValue - MagShift;
846 }
847 if( proposedStepLength < fullSafety )
848 {
849 // Move is smaller than all safeties
850 // -> so we do not have to move the safety center
851
852 fPreStepCenterRenewed= false;
853
854 for( num=0; num< fNoActiveNavigators; ++num )
855 {
856 fCurrentStepSize[num]= kInfinity;
857 safety = std::max( 0.0, fPreSafetyValues[num] - MagShift);
858 minSafety= std::min( safety, minSafety );
859 fCurrentPreStepSafety[num]= safety;
860 }
861 minStep= kInfinity;
862
863#ifdef G4DEBUG_PATHFINDER
864 if( fVerboseLevel > 2 )
865 {
866 G4cout << "G4PathFinder::DoNextLinearStep : Quick Stepping. " << G4endl
867 << " proposedStepLength " << proposedStepLength
868 << " < (full) safety = " << fullSafety
869 << " at " << initialPosition
870 << G4endl;
871 }
872#endif
873 }
874 else
875#endif // End of G4PATHFINDER_OPTIMISATION 1
876 {
877 // Move is larger than at least one of the safeties
878 // -> so we must move the safety center!
879
880 fPreStepCenterRenewed= true;
881 pNavigatorIter= fpTransportManager-> GetActiveNavigatorsIterator();
882
883 minStep= kInfinity; // Not proposedStepLength;
884
885 for( num=0; num< fNoActiveNavigators; ++pNavigatorIter,++num )
886 {
887 safety = std::max( 0.0, fPreSafetyValues[num] - MagShift);
888
889#ifdef G4PATHFINDER_OPTIMISATION
890 if( proposedStepLength <= safety ) // Should be just < safety ?
891 {
892 // The Step is guaranteed to be taken
893
894 step= kInfinity; // ComputeStep Would return this
895
896#ifdef G4DEBUG_PATHFINDER
897 G4cout.precision(8);
898 G4cout << "PathFinder::ComputeStep> small proposed step = "
899 << proposedStepLength
900 << " <= safety = " << safety << " for nav " << num
901 << " Step fully taken. " << G4endl;
902#endif
903 }
904 else
905#endif // End of G4PATHFINDER_OPTIMISATION 2
906 {
907#ifdef G4DEBUG_PATHFINDER
908 G4double previousSafety= safety;
909#endif
910 step= (*pNavigatorIter)->ComputeStep( initialPosition,
911 initialDirection,
912 proposedStepLength,
913 safety );
914 minStep = std::min( step, minStep);
915
916 // TODO: consider whether/how to reduce the proposed step
917 // to the latest minStep value - to reduce calculations
918
919#ifdef G4DEBUG_PATHFINDER
920 if( fVerboseLevel > 0)
921 {
922 G4cout.precision(8);
923 G4cout << "PathFinder::ComputeStep> long proposed step = "
924 << proposedStepLength
925 << " > safety = " << previousSafety
926 << " for nav " << num
927 << " . New safety = " << safety << " step= " << step
928 << G4endl;
929 }
930#endif
931 }
932 fCurrentStepSize[num] = step;
933
934 // Save safety value, must be done for all geometries "together"
935 // (even if not recomputed using call to ComputeStep)
936 // since they share the fPreSafetyLocation
937
938 fPreSafetyValues[num]= safety;
939 fCurrentPreStepSafety[num]= safety;
940
941 minSafety= std::min( safety, minSafety );
942
943#ifdef G4DEBUG_PATHFINDER
944 if( fVerboseLevel > 2 )
945 {
946 G4cout << "G4PathFinder::DoNextLinearStep : Navigator ["
947 << num << "] -- step size " << step << G4endl;
948 }
949#endif
950 }
951
952 // Only change these when safety is recalculated
953 // it is good/relevant only for safety calculations
954
955 fPreSafetyLocation= initialPosition;
956 fPreSafetyMinValue= minSafety;
957 } // end of else for if( proposedStepLength <= fullSafety)
958
959 // For use in Relocation, need PreStep point location, min-safety
960 //
961 fPreStepLocation= initialPosition;
962 fMinSafety_PreStepPt= minSafety;
963
964 fMinStep= minStep;
965
966 if( fMinStep == kInfinity )
967 {
968 minStep = proposedStepLength; // Use this below for endpoint !!
969 }
970 fTrueMinStep = minStep;
971
972 // Set the EndState
973
974 G4ThreeVector endPosition;
975
976 fEndState= initialState;
977 endPosition= initialPosition + minStep * initialDirection ;
978
979#ifdef G4DEBUG_PATHFINDER
980 if( fVerboseLevel > 1 )
981 {
982 G4cout << "G4PathFinder::DoNextLinearStep : "
983 << " initialPosition = " << initialPosition
984 << " and endPosition = " << endPosition<< G4endl;
985 }
986#endif
987
988 fEndState.SetPosition( endPosition );
989 fEndState.SetProperTimeOfFlight( -1.000 ); // Not defined YET
990
991 if( fNoActiveNavigators == 1 )
992 {
993 G4bool transportLimited = (fMinStep!= kInfinity);
994 fLimitTruth[IdTransport] = transportLimited;
995 fLimitedStep[IdTransport] = transportLimited ? kUnique : kDoNot;
996
997 // Set fNoGeometriesLimiting - as WhichLimited does
998 fNoGeometriesLimiting = transportLimited ? 1 : 0;
999 }
1000 else
1001 {
1002 WhichLimited();
1003 }
1004
1005#ifdef G4DEBUG_PATHFINDER
1006 if( fVerboseLevel > 2 )
1007 {
1008 G4cout << " G4PathFinder::DoNextLinearStep : exits returning "
1009 << minStep << G4endl;
1010 G4cout << " Endpoint values = " << fEndState << G4endl;
1011 G4cout << G4endl;
1012 }
1013#endif
1014
1015 return minStep;
1016}
1017
1019{
1020 // Flag which processes limited the step
1021
1022 G4int num=-1, last=-1;
1023 G4int noLimited=0;
1024 ELimited shared= kSharedOther;
1025
1026 const G4int IdTransport= 0; // Id of Mass Navigator !!
1027
1028 // Assume that [IdTransport] is Mass / Transport
1029 //
1030 G4bool transportLimited = (fCurrentStepSize[IdTransport] == fMinStep)
1031 && ( fMinStep!= kInfinity) ;
1032
1033 if( transportLimited ) {
1034 shared= kSharedTransport;
1035 }
1036
1037 for ( num= 0; num < fNoActiveNavigators; num++ )
1038 {
1039 G4bool limitedStep;
1040
1041 G4double step= fCurrentStepSize[num];
1042
1043 limitedStep = ( std::fabs(step - fMinStep) < kCarTolerance )
1044 && ( step != kInfinity);
1045
1046 fLimitTruth[ num ] = limitedStep;
1047 if( limitedStep )
1048 {
1049 noLimited++;
1050 fLimitedStep[num] = shared;
1051 last= num;
1052 }
1053 else
1054 {
1055 fLimitedStep[num] = kDoNot;
1056 }
1057 }
1058 fNoGeometriesLimiting= noLimited; // Save # processes limiting step
1059
1060 if( (last > -1) && (noLimited == 1 ) )
1061 {
1062 fLimitedStep[ last ] = kUnique;
1063 }
1064
1065#ifdef G4DEBUG_PATHFINDER
1066 if( fVerboseLevel > 1 )
1067 {
1068 PrintLimited(); // --> for tracing
1069 if( fVerboseLevel > 4 ) {
1070 G4cout << " G4PathFinder::WhichLimited - exiting. " << G4endl;
1071 }
1072 }
1073#endif
1074}
1075
1077{
1078 // Report results -- for checking
1079
1080 G4cout << "G4PathFinder::PrintLimited reports: " ;
1081 G4cout << " Minimum step (true)= " << fTrueMinStep
1082 << " reported min = " << fMinStep
1083 << G4endl;
1084 if( (fCurrentStepNo <= 2) || (fVerboseLevel>=2) )
1085 {
1086 G4cout << std::setw(5) << " Step#" << " "
1087 << std::setw(5) << " NavId" << " "
1088 << std::setw(12) << " step-size " << " "
1089 << std::setw(12) << " raw-size " << " "
1090 << std::setw(12) << " pre-safety " << " "
1091 << std::setw(15) << " Limited / flag" << " "
1092 << std::setw(15) << " World " << " "
1093 << G4endl;
1094 }
1095 G4int num;
1096 for ( num= 0; num < fNoActiveNavigators; num++ )
1097 {
1098 G4double rawStep = fCurrentStepSize[num];
1099 G4double stepLen = fCurrentStepSize[num];
1100 if( stepLen > fTrueMinStep )
1101 {
1102 stepLen = fTrueMinStep; // did not limit (went as far as asked)
1103 }
1104 G4int oldPrec= G4cout.precision(9);
1105
1106 G4cout << std::setw(5) << fCurrentStepNo << " "
1107 << std::setw(5) << num << " "
1108 << std::setw(12) << stepLen << " "
1109 << std::setw(12) << rawStep << " "
1110 << std::setw(12) << fCurrentPreStepSafety[num] << " "
1111 << std::setw(5) << (fLimitTruth[num] ? "YES" : " NO") << " ";
1112 G4String limitedStr= LimitedString(fLimitedStep[num]);
1113 G4cout << " " << std::setw(15) << limitedStr << " ";
1114 G4cout.precision(oldPrec);
1115
1116 G4Navigator *pNav= GetNavigator( num );
1117 G4String WorldName( "Not-Set" );
1118 if (pNav)
1119 {
1120 G4VPhysicalVolume *pWorld= pNav->GetWorldVolume();
1121 if( pWorld )
1122 {
1123 WorldName = pWorld->GetName();
1124 }
1125 }
1126 G4cout << " " << WorldName ;
1127 G4cout << G4endl;
1128 }
1129
1130 if( fVerboseLevel > 4 )
1131 {
1132 G4cout << " G4PathFinder::PrintLimited - exiting. " << G4endl;
1133 }
1134}
1135
1138 G4double proposedStepLength,
1139 G4VPhysicalVolume* pCurrentPhysicalVolume )
1140{
1141 const G4double toleratedRelativeError= 1.0e-10;
1142 G4double minStep= kInfinity, newSafety=0.0;
1143 G4int numNav;
1144 G4FieldTrack fieldTrack= initialState;
1145 G4ThreeVector startPoint= initialState.GetPosition();
1146
1147#ifdef G4DEBUG_PATHFINDER
1148 G4int prc= G4cout.precision(9);
1149 if( fVerboseLevel > 2 )
1150 {
1151 G4cout << " G4PathFinder::DoNextCurvedStep ****** " << G4endl;
1152 G4cout << " Initial value of field track is " << fieldTrack
1153 << " and proposed step= " << proposedStepLength << G4endl;
1154 }
1155#endif
1156
1157 fPreStepCenterRenewed= true; // Always update PreSafety with PreStep point
1158
1159 if( fNoActiveNavigators > 1 )
1160 {
1161 // Calculate the safety values before making the step
1162
1163 G4double minSafety= kInfinity, safety;
1164 for( numNav=0; numNav < fNoActiveNavigators; ++numNav )
1165 {
1166 safety= fpNavigator[numNav]->ComputeSafety( startPoint, false );
1167 fPreSafetyValues[numNav]= safety;
1168 fCurrentPreStepSafety[numNav]= safety;
1169 minSafety = std::min( safety, minSafety );
1170 }
1171
1172 // Save safety value, related position
1173
1174 fPreSafetyLocation= startPoint;
1175 fPreSafetyMinValue= minSafety;
1176 fPreStepLocation= startPoint;
1177 fMinSafety_PreStepPt= minSafety;
1178 }
1179
1180 // Allow Propagator In Field to do the hard work, calling G4MultiNavigator
1181 //
1182 minStep= fpFieldPropagator->ComputeStep( fieldTrack,
1183 proposedStepLength,
1184 newSafety,
1185 pCurrentPhysicalVolume );
1186
1187 // fieldTrack now contains the endpoint information
1188 //
1189 fEndState= fieldTrack;
1190 fMinStep= minStep;
1191 fTrueMinStep = std::min( minStep, proposedStepLength );
1192
1193 if( fNoActiveNavigators== 1 )
1194 {
1195 // Update the 'PreSafety' sphere - as any ComputeStep was called
1196 // (must be done anyway in field)
1197
1198 fPreSafetyValues[0]= newSafety;
1199 fPreSafetyLocation= startPoint;
1200 fPreSafetyMinValue= newSafety;
1201
1202 // Update the current 'PreStep' point's values - mandatory
1203 //
1204 fCurrentPreStepSafety[0]= newSafety;
1205 fPreStepLocation= startPoint;
1206 fMinSafety_PreStepPt= newSafety;
1207 }
1208
1209#ifdef G4DEBUG_PATHFINDER
1210 if( fVerboseLevel > 2 )
1211 {
1212 G4cout << "G4PathFinder::DoNextCurvedStep : " << G4endl
1213 << " initialState = " << initialState << G4endl
1214 << " and endState = " << fEndState << G4endl;
1215 G4cout << "G4PathFinder::DoNextCurvedStep : "
1216 << " minStep = " << minStep
1217 << " proposedStepLength " << proposedStepLength
1218 << " safety = " << newSafety << G4endl;
1219 }
1220#endif
1221 G4double currentStepSize; // = 0.0;
1222 if( minStep < proposedStepLength ) // if == , then a boundary found at end ??
1223 {
1224 // Recover the remaining information from MultiNavigator
1225 // especially regarding which Navigator limited the step
1226
1227 G4int noLimited= 0; // No geometries limiting step
1228 for( numNav=0; numNav < fNoActiveNavigators; ++numNav )
1229 {
1230 G4double finalStep, lastPreSafety=0.0, minStepLast;
1231 ELimited didLimit;
1232 G4bool limited;
1233
1234 finalStep= fpMultiNavigator->ObtainFinalStep( numNav, lastPreSafety,
1235 minStepLast, didLimit );
1236
1237 // Calculate the step for this geometry, using the
1238 // final step (the only one which can differ.)
1239
1240 currentStepSize = fTrueMinStep;
1241 G4double diffStep= 0.0;
1242 if( (minStepLast != kInfinity) )
1243 {
1244 diffStep = (finalStep-minStepLast);
1245 if ( std::abs(diffStep) <= toleratedRelativeError * finalStep )
1246 {
1247 diffStep = 0.0;
1248 }
1249 currentStepSize += diffStep;
1250 }
1251 fCurrentStepSize[numNav] = currentStepSize;
1252
1253 // TODO: could refine the way to obtain safeties for > 1 geometries
1254 // - for pre step safety
1255 // notify MultiNavigator about new set of sub-steps
1256 // allow it to return this value in ObtainFinalStep
1257 // instead of lastPreSafety (or as well?)
1258 // - for final step start (available)
1259 // get final Step start from MultiNavigator
1260 // and corresponding safety values
1261 // and/or ALSO calculate ComputeSafety at endpoint
1262 // endSafety= fpNavigator[numNav]->ComputeSafety( endPoint );
1263
1264 fLimitedStep[numNav] = didLimit;
1265 fLimitTruth[numNav] = limited = (didLimit != kDoNot );
1266 if( limited ) { noLimited++; }
1267
1268#ifdef G4DEBUG_PATHFINDER
1269 G4bool StepError= (currentStepSize < 0)
1270 || ( (minStepLast != kInfinity) && (diffStep < 0) ) ;
1271 if( StepError || (fVerboseLevel > 2) )
1272 {
1273 G4String limitedString= LimitedString( fLimitedStep[numNav] );
1274
1275 G4cout << " G4PathFinder::ComputeStep. Geometry " << numNav
1276 << " step= " << fCurrentStepSize[numNav]
1277 << " from final-step= " << finalStep
1278 << " fTrueMinStep= " << fTrueMinStep
1279 << " minStepLast= " << minStepLast
1280 << " limited = " << (fLimitTruth[numNav] ? "YES" : " NO")
1281 << " ";
1282 G4cout << " status = " << limitedString << " #= " << didLimit
1283 << G4endl;
1284
1285 if( StepError )
1286 {
1287 std::ostringstream message;
1288 message << "Incorrect calculation of step size for one navigator"
1289 << G4endl
1290 << " currentStepSize = " << currentStepSize
1291 << ", diffStep= " << diffStep << G4endl
1292 << "ERROR in computing step size for this navigator.";
1293 G4Exception("G4PathFinder::DoNextCurvedStep",
1294 "GeomNav0003", FatalException, message);
1295 }
1296 }
1297#endif
1298 } // for num Navigators
1299
1300 fNoGeometriesLimiting= noLimited; // Save # processes limiting step
1301 }
1302 else if ( (minStep == proposedStepLength)
1303 || (minStep == kInfinity)
1304 || ( std::abs(minStep-proposedStepLength)
1305 < toleratedRelativeError * proposedStepLength ) )
1306 {
1307 // In case the step was not limited, use default responses
1308 // --> all Navigators
1309 // Also avoid problems in case of PathFinder using safety to optimise
1310 // - it is possible that the Navigators were not called
1311 // if the safety was already satisfactory.
1312 // (In that case calling ObtainFinalStep gives invalid results.)
1313
1314 currentStepSize= minStep;
1315 for( numNav=0; numNav < fNoActiveNavigators; ++numNav )
1316 {
1317 fCurrentStepSize[numNav] = minStep;
1318 // Safety for endpoint ?? // Can eventuall improve it -- see TODO above
1319 fLimitedStep[numNav] = kDoNot;
1320 fLimitTruth[numNav] = false;
1321 }
1322 fNoGeometriesLimiting= 0; // Save # processes limiting step
1323 }
1324 else // (minStep > proposedStepLength) and not (minStep == kInfinity)
1325 {
1326 std::ostringstream message;
1327 message << "Incorrect calculation of step size for one navigator." << G4endl
1328 << " currentStepSize = " << minStep << " is larger than "
1329 << " proposed StepSize = " << proposedStepLength << ".";
1330 G4Exception("G4PathFinder::DoNextCurvedStep()",
1331 "GeomNav0003", FatalException, message);
1332 }
1333
1334#ifdef G4DEBUG_PATHFINDER
1335 if( fVerboseLevel > 2 )
1336 {
1337 G4cout << " Exiting G4PathFinder::DoNextCurvedStep " << G4endl;
1338 PrintLimited();
1339 }
1340 G4cout.precision(prc);
1341#endif
1342
1343 return minStep;
1344}
1345
1347{
1348 static G4String StrDoNot("DoNot"),
1349 StrUnique("Unique"),
1350 StrUndefined("Undefined"),
1351 StrSharedTransport("SharedTransport"),
1352 StrSharedOther("SharedOther");
1353
1354 G4String* limitedStr;
1355 switch ( lim )
1356 {
1357 case kDoNot: limitedStr= &StrDoNot; break;
1358 case kUnique: limitedStr = &StrUnique; break;
1359 case kSharedTransport: limitedStr= &StrSharedTransport; break;
1360 case kSharedOther: limitedStr = &StrSharedOther; break;
1361 default: limitedStr = &StrUndefined; break;
1362 }
1363 return *limitedStr;
1364}
1365
1367{
1368 fPreSafetyLocation= fSafetyLocation;
1369 fPreSafetyMinValue= fMinSafety_atSafLocation;
1370 for( register G4int nav=0; nav < fNoActiveNavigators; ++nav )
1371 {
1372 fPreSafetyValues[nav]= fNewSafetyComputed[nav];
1373 }
1374}
@ JustWarning
@ FatalException
ELimited
@ kDoNot
@ kUndefLimited
@ kUnique
@ kSharedOther
@ kSharedTransport
G4ReferenceCountedHandle< G4VTouchable > G4TouchableHandle
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
double mag2() const
double mag() const
const G4Field * GetDetectorField() const
G4ThreeVector GetMomentumDirection() const
G4double GetCharge() const
void SetProperTimeOfFlight(G4double nTOF)
G4ThreeVector GetPosition() const
void SetPosition(G4ThreeVector nPos)
G4double GetSurfaceTolerance() const
G4double GetRadialTolerance() const
static G4GeometryTolerance * GetInstance()
G4double ObtainFinalStep(G4int navigatorId, G4double &pNewSafety, G4double &minStepLast, ELimited &limitedStep)
virtual G4double ComputeSafety(const G4ThreeVector &globalpoint, const G4double pProposedMaxLength=DBL_MAX, const G4bool keepState=true)
G4VPhysicalVolume * GetWorldVolume() const
G4double ComputeSafety(const G4ThreeVector &globalPoint)
void EnableParallelNavigation(G4bool enableChoice=true)
G4Navigator * GetNavigator(G4int n) const
void ReLocate(const G4ThreeVector &position)
void ReportMove(const G4ThreeVector &OldV, const G4ThreeVector &NewV, const G4String &Quantity) const
void WhichLimited()
G4double DoNextLinearStep(const G4FieldTrack &FieldTrack, G4double proposedStepLength)
void PushPostSafetyToPreSafety()
G4double ComputeStep(const G4FieldTrack &pFieldTrack, G4double pCurrentProposedStepLength, G4int navigatorId, G4int stepNo, G4double &pNewSafety, ELimited &limitedStep, G4FieldTrack &EndState, G4VPhysicalVolume *currentVolume)
G4double DoNextCurvedStep(const G4FieldTrack &FieldTrack, G4double proposedStepLength, G4VPhysicalVolume *pCurrentPhysVolume)
void Locate(const G4ThreeVector &position, const G4ThreeVector &direction, G4bool relativeSearch=true)
void MovePoint()
G4String & LimitedString(ELimited lim)
void PrintLimited()
void PrepareNewTrack(const G4ThreeVector &position, const G4ThreeVector &direction, G4VPhysicalVolume *massStartVol=0)
static G4PathFinder * GetInstance()
Definition: G4PathFinder.cc:57
G4TouchableHandle CreateTouchableHandle(G4int navId) const
G4double ComputeStep(G4FieldTrack &pFieldTrack, G4double pCurrentProposedStepLength, G4double &pNewSafety, G4VPhysicalVolume *pPhysVol=0)
G4FieldManager * FindAndSetFieldManager(G4VPhysicalVolume *pCurrentPhysVol)
void SetNavigatorForPropagating(G4Navigator *SimpleOrMultiNavigator)
void InitialiseHelper()
void EnableParallelNavigation(G4bool parallel)
const G4NavigationHistory * GetHistory() const
void UpdateYourself(G4VPhysicalVolume *pPhysVol, const G4NavigationHistory *history=0)
std::vector< G4Navigator * >::iterator GetActiveNavigatorsIterator()
static G4TransportationManager * GetTransportationManager()
G4PropagatorInField * GetPropagatorInField() const
G4SafetyHelper * GetSafetyHelper() const
G4Navigator * GetNavigatorForTracking() const
const G4String & GetName() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
T sqr(const T &x)
Definition: templates.hh:145
#define position
Definition: xmlparse.cc:605