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
G4ITStepProcessor.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// $Id: G4ITStepProcessor.cc 65022 2012-11-12 16:43:12Z gcosmo $
27//
28// Author: Mathieu Karamitros (kara (AT) cenbg . in2p3 . fr)
29//
30// History:
31// -----------
32// 10 Oct 2011 M.Karamitros created
33//
34// -------------------------------------------------------------------
35
36#include "G4ITStepProcessor.hh"
37#include "G4UImanager.hh"
38#include "G4ForceCondition.hh"
39#include "G4GPILSelection.hh"
41// #include "G4VSensitiveDetector.hh" // Include from 'hits/digi'
43#include "G4ParticleTable.hh"
46#include "G4IT.hh"
47#include "G4ITNavigator.hh" // Include from 'geometry'
48
49#include "G4VITProcess.hh"
50#include "G4VProcess.hh"
51#include "G4ITTransportation.hh"
52
53#include <iomanip> // Include from 'system'
54#include <vector> // Include from 'system'
55
56using namespace std;
57
58static const size_t SizeOfSelectedDoItVector=100;
59static const size_t& gMaxNProcesses(G4VITProcess::GetMaxProcessIndex());
60
61//____________________________________________________________________________________
62
64{
65 verboseLevel = 0 ;
66 // fpUserSteppingAction = 0 ;
67 fStoreTrajectory = 0;
68 fpTrackingManager = 0;
69 fpNavigator = 0;
70 kCarTolerance = -1.;
71 fInitialized = false;
72 fPreviousTimeStep = DBL_MAX;
75}
76
77G4ITStepProcessor::G4ITStepProcessorState::G4ITStepProcessorState() :
79 fSelectedAtRestDoItVector (gMaxNProcesses,0),
80 fSelectedPostStepDoItVector (gMaxNProcesses,0)
81{
82 fPhysicalStep = -1.;
83 fPreviousStepSize = -1.;
84
85 fSafety = -1.;
86 proposedSafety = -1.;
87 endpointSafety = -1;
88
89 fStepStatus = fUndefined;
90
91 fTouchableHandle = 0;
92}
93
94// should not be used
95G4ITStepProcessor::G4ITStepProcessorState::G4ITStepProcessorState(const G4ITStepProcessorState& ) :
97 fSelectedAtRestDoItVector (gMaxNProcesses,0),
98 fSelectedPostStepDoItVector (gMaxNProcesses,0)
99{
100 fPhysicalStep = -1.;
101 fPreviousStepSize = -1.;
102
103 fSafety = -1.;
104 proposedSafety = -1.;
105 endpointSafety = -1;
106
107 fStepStatus = fUndefined;
108
109 fTouchableHandle = 0;
110}
111
112// should not be used
113G4ITStepProcessor::G4ITStepProcessorState& G4ITStepProcessor::G4ITStepProcessorState::operator=(const G4ITStepProcessorState& rhs)
114{
115 if(this == &rhs) return *this;
116
117 fSelectedAtRestDoItVector.clear();
118 fSelectedAtRestDoItVector.resize(gMaxNProcesses,0);
119 fSelectedPostStepDoItVector.clear();
120 fSelectedPostStepDoItVector.resize(gMaxNProcesses,0);
121
122 fPhysicalStep = -1.;
123 fPreviousStepSize = -1.;
124
125 fSafety = -1.;
126 proposedSafety = -1.;
127 endpointSafety = -1;
128
129 fStepStatus = fUndefined;
130
131 fTouchableHandle = 0;
132 return *this;
133}
134//____________________________________________________________________________________
135
136G4ITStepProcessor::G4ITStepProcessorState::~G4ITStepProcessorState()
137{;}
138//____________________________________________________________________________________
139
141{
142 std::map<const G4ParticleDefinition*, ProcessGeneralInfo*> ::iterator it;
143
144 for(it = fProcessGeneralInfoMap.begin();it != fProcessGeneralInfoMap.end();it++)
145 {
146 if(it->second)
147 {
148 delete it->second;
149 it->second = 0;
150 }
151 }
152
153 fProcessGeneralInfoMap.clear();
154}
155
156//____________________________________________________________________________________
157
159{
160 fInitialized = false;
162 Initialize();
163}
164
165//____________________________________________________________________________________
166
168{
170 if(fInitialized) return;
171 // ActiveOnlyITProcess();
172
174 ->GetNavigatorForTracking());
175
176 fPhysIntLength = DBL_MAX;
178
179 fInitialized = true;
180}
181//______________________________________________________________________________
182
184{
185 if(fpStep)
186 {
187 fpStep->DeleteSecondaryVector();
188 delete fpStep;
189 }
190
191 if(fpSecondary) delete fpSecondary;
194
195 // if(fpUserSteppingAction) delete fpUserSteppingAction;
196}
197//______________________________________________________________________________
198// should not be used
200{
201 verboseLevel = rhs.verboseLevel ;
202 fStoreTrajectory = rhs.fStoreTrajectory ;
203
204 // fpUserSteppingAction = 0 ;
205 fpTrackingManager = 0;
206 fpNavigator = 0;
207 fInitialized = false;
208
209 kCarTolerance = rhs.kCarTolerance;
210 fInitialized = false;
211 fPreviousTimeStep = DBL_MAX;
212
215}
216//______________________________________________________________________________
217
219{
220 if (this == &rhs) return *this; // handle self assignment
221 //assignment operator
222 return *this;
223}
224// ******************************************************************
225
227{
228 // Method not used for the time being
229#ifdef debug
230 G4cout<<"G4ITStepProcessor::CloneProcesses: is called"<<G4endl;
231#endif
232
234 G4ParticleTable::G4PTblDicIterator* theParticleIterator = theParticleTable->GetIterator();
235
236 theParticleIterator->reset();
237 // TODO : Ne faire la boucle que sur les IT **** !!!
238 while( (*theParticleIterator)() )
239 {
240 G4ParticleDefinition* particle = theParticleIterator->value();
241 G4ProcessManager* pm= particle->GetProcessManager();
242
243 if(!pm)
244 {
245 G4cerr << "ERROR - G4ITStepProcessor::GetProcessNumber()" << G4endl
246 << " ProcessManager is NULL for particle = "
247 << particle->GetParticleName() << ", PDG_code = "
248 << particle->GetPDGEncoding() << G4endl;
249 G4Exception("G4ITStepProcessor::GetProcessNumber()", "ITStepProcessor0001",
250 FatalException, "Process Manager is not found.");
251 return;
252 }
253
255 }
256}
257// ******************************************************************
258
260{
261 // Method not used for the time being
262 G4ProcessVector* processVector = processManager->GetProcessList();
263
264 G4VITProcess* itProcess = 0 ;
265 for(int i = 0 ; i < processVector->size() ; i++)
266 {
267 G4VProcess* base_process = (*processVector)[i];
268 itProcess = dynamic_cast<G4VITProcess*>(base_process);
269
270 if(!itProcess)
271 {
272 processManager->SetProcessActivation(base_process, false);
273 }
274 }
275}
276// ******************************************************************
279{
280
281#ifdef debug
282 G4cout<<"G4ITStepProcessor::GetProcessNumber: is called track"<<G4endl;
283#endif
284 if(!pm)
285 {
286 G4cerr << "ERROR - G4SteppingManager::GetProcessNumber()" << G4endl
287 << " ProcessManager is NULL for particle = "
288 << particle->GetParticleName() << ", PDG_code = "
289 << particle->GetPDGEncoding() << G4endl;
290 G4Exception("G4SteppingManager::GetProcessNumber()", "ITStepProcessor0002",
291 FatalException, "Process Manager is not found.");
292 return;
293 }
294
295 std::map<const G4ParticleDefinition*, ProcessGeneralInfo*>::iterator it = fProcessGeneralInfoMap.find(particle);
296 if(it != fProcessGeneralInfoMap.end())
297 {
298 G4Exception("G4SteppingManager::SetupGeneralProcessInfo()", "ITStepProcessor0003",
299 FatalException, "Process info already registered.");
300 return;
301 }
302
303 // here used as temporary
304 fpProcessInfo = new ProcessGeneralInfo();
305
306 // AtRestDoits
307 fpProcessInfo->MAXofAtRestLoops = pm->GetAtRestProcessVector()->entries();
308 fpProcessInfo->fpAtRestDoItVector = pm->GetAtRestProcessVector(typeDoIt);
309 fpProcessInfo->fpAtRestGetPhysIntVector = pm->GetAtRestProcessVector(typeGPIL);
310#ifdef debug
311 G4cout << "G4ITStepProcessor::GetProcessNumber: #ofAtRest="
312 << fpProcessInfo->MAXofAtRestLoops << G4endl;
313#endif
314
315 // AlongStepDoits
316 fpProcessInfo->MAXofAlongStepLoops = pm->GetAlongStepProcessVector()->entries();
317 fpProcessInfo->fpAlongStepDoItVector = pm->GetAlongStepProcessVector(typeDoIt);
318 fpProcessInfo->fpAlongStepGetPhysIntVector = pm->GetAlongStepProcessVector(typeGPIL);
319#ifdef debug
320 G4cout << "G4ITStepProcessor::GetProcessNumber:#ofAlongStp="
321 << fpProcessInfo->MAXofAlongStepLoops << G4endl;
322#endif
323
324 // PostStepDoits
325 fpProcessInfo->MAXofPostStepLoops = pm->GetPostStepProcessVector()->entries();
326 fpProcessInfo->fpPostStepDoItVector = pm->GetPostStepProcessVector(typeDoIt);
327 fpProcessInfo->fpPostStepGetPhysIntVector = pm->GetPostStepProcessVector(typeGPIL);
328#ifdef debug
329 G4cout << "G4ITStepProcessor::GetProcessNumber: #ofPostStep="
330 << fpProcessInfo->MAXofPostStepLoops << G4endl;
331#endif
332
333 if (SizeOfSelectedDoItVector<fpProcessInfo->MAXofAtRestLoops ||
334 SizeOfSelectedDoItVector<fpProcessInfo->MAXofAlongStepLoops ||
335 SizeOfSelectedDoItVector<fpProcessInfo->MAXofPostStepLoops )
336 {
337 G4cerr << "ERROR - G4ITStepProcessor::GetProcessNumber()" << G4endl
338 << " SizeOfSelectedDoItVector= " << SizeOfSelectedDoItVector
339 << " ; is smaller then one of MAXofAtRestLoops= "
340 << fpProcessInfo->MAXofAtRestLoops << G4endl
341 << " or MAXofAlongStepLoops= " << fpProcessInfo->MAXofAlongStepLoops
342 << " or MAXofPostStepLoops= " << fpProcessInfo->MAXofPostStepLoops << G4endl;
343 G4Exception("G4ITStepProcessor::GetProcessNumber()",
344 "ITStepProcessor0004", FatalException,
345 "The array size is smaller than the actual No of processes.");
346 }
347
348 if(!fpProcessInfo->fpAtRestDoItVector &&
349 !fpProcessInfo->fpAlongStepDoItVector &&
350 !fpProcessInfo->fpPostStepDoItVector)
351 {
352 G4ExceptionDescription exceptionDescription ;
353 exceptionDescription << "No DoIt process found " ;
354 G4Exception("G4ITStepProcessor::DoStepping","ITStepProcessor0005",
355 FatalErrorInArgument,exceptionDescription);
356 return ;
357 }
358
359 if(fpProcessInfo->fpAlongStepGetPhysIntVector && fpProcessInfo->MAXofAlongStepLoops>0)
360 {
361 fpProcessInfo->fpTransportation = dynamic_cast<G4ITTransportation*>
362 ((*fpProcessInfo->fpAlongStepGetPhysIntVector)[fpProcessInfo->MAXofAlongStepLoops-1]);
363
364 if(fpProcessInfo->fpTransportation == 0)
365 {
366 G4ExceptionDescription exceptionDescription ;
367 exceptionDescription << "No transportation process found " ;
368 G4Exception("G4ITStepProcessor::SetupGeneralProcessInfo","ITStepProcessor0006",
369 FatalErrorInArgument,exceptionDescription);
370 }
371 }
372 fProcessGeneralInfoMap[particle] = fpProcessInfo;
373 // fpProcessInfo = 0;
374}
375
376// ******************************************************************
377
379{
380 fpTrack = track ;
381 if(fpTrack)
382 {
383 fpITrack = GetIT(fpTrack) ;
384 fpStep = const_cast<G4Step*>(fpTrack -> GetStep());
385
386 if(fpITrack)
387 {
388 fpTrackingInfo = fpITrack->GetTrackingInfo() ;
389 }
390 else
391 {
392 fpTrackingInfo = 0;
393 G4cerr << "Track ID : " << fpTrack->GetTrackID() << G4endl;
394
395 G4ExceptionDescription exceptionDescription ("No IT pointer was attached to the track you try to process.");
396 G4Exception("G4ITStepProcessor::SetTrack","ITStepProcessor0007",
397 FatalErrorInArgument,exceptionDescription);
398 }
399 }
400 else
401 {
402 fpITrack = 0;
403 fpStep = 0 ;
404 }
405}
406//______________________________________________________________________________
407
409{
410 G4ParticleDefinition* particle = fpTrack->GetDefinition();
411 std::map<const G4ParticleDefinition*, ProcessGeneralInfo*>::iterator it = fProcessGeneralInfoMap.find(particle);
412
413 if(it == fProcessGeneralInfoMap.end())
414 {
416 if(fpProcessInfo == 0)
417 {
418 G4ExceptionDescription exceptionDescription ("...");
419 G4Exception("G4ITStepProcessor::GetProcessNumber","ITStepProcessor0008",
420 FatalErrorInArgument,exceptionDescription);
421 return;
422 }
423 }
424 else
425 {
426 fpProcessInfo = it->second;
427 }
428}
429//______________________________________________________________________________
430
432{
433 fpSecondary = fpStep->GetfSecondary();
434 fpPreStepPoint = fpStep->GetPreStepPoint();
435 fpPostStepPoint = fpStep->GetPostStepPoint();
436
437 fpState = (G4ITStepProcessorState*) fpITrack->GetTrackingInfo()->GetStepProcessorState();
438
441}
442//______________________________________________________________________________
443
445{
446 // Reset the secondary particles
447 fN2ndariesAtRestDoIt = 0;
448 fN2ndariesAlongStepDoIt = 0;
449 fN2ndariesPostStepDoIt = 0;
450}
451//______________________________________________________________________________
452
454{
455 // Select the rest process which has the shortest time before
456 // it is invoked. In rest processes, GPIL()
457 // returns the time before a process occurs.
458 G4double lifeTime (DBL_MAX), shortestLifeTime (DBL_MAX);
459
460 fAtRestDoItProcTriggered = 0;
461 shortestLifeTime = DBL_MAX;
462
463 unsigned int NofInactiveProc=0;
464
465 for( size_t ri=0 ; ri < fpProcessInfo->MAXofAtRestLoops ; ri++ )
466 {
467 fpCurrentProcess = (G4VITProcess*) (*fpProcessInfo->fpAtRestGetPhysIntVector)[ri];
468 if (fpCurrentProcess== 0)
469 {
470 (fpState->fSelectedAtRestDoItVector)[ri] = InActivated;
471 NofInactiveProc++;
472 continue;
473 } // NULL means the process is inactivated by a user on fly.
474
475 fCondition=NotForced;
476 fpCurrentProcess->SetProcessState(fpTrackingInfo->GetProcessState(fpCurrentProcess->GetProcessID()));
477 lifeTime = fpCurrentProcess->AtRestGPIL( *fpTrack, &fCondition );
478 fpCurrentProcess->SetProcessState(0);
479
480 if(fCondition==Forced)
481 {
482 (fpState->fSelectedAtRestDoItVector)[ri] = Forced;
483 }
484 else
485 {
486 (fpState->fSelectedAtRestDoItVector)[ri] = InActivated;
487 if(lifeTime < shortestLifeTime )
488 {
489 shortestLifeTime = lifeTime;
490 fAtRestDoItProcTriggered = G4int(ri);
491 (fpState->fSelectedAtRestDoItVector)[fAtRestDoItProcTriggered] = NotForced;
492 }
493 }
494 }
495
496 fTimeStep = shortestLifeTime ;
497
498 // at least one process is necessary to destroy the particle
499 // exit with warning
500 if(NofInactiveProc==fpProcessInfo->MAXofAtRestLoops)
501 {
502 G4cerr << "ERROR - G4ITStepProcessor::InvokeAtRestDoItProcs()" << G4endl
503 << " No AtRestDoIt process is active!" << G4endl;
504 }
505}
506//___________________________________________________________________________
507
509{
510 SetTrack(track);
512}
513//______________________________________________________________________________
514
515
517{
518 // DEBUG
519 // G4cout << "SetInitialStep for : " << fpITrack-> GetName() << G4endl;
520 //________________________________________________________
521 // Initialize geometry
522
523
524 if ( ! fpTrack->GetTouchableHandle())
525 {
526 G4ThreeVector direction= fpTrack->GetMomentumDirection();
527 fpNavigator->LocateGlobalPointAndSetup( fpTrack->GetPosition(),
528 &direction, false, false );
529 fpState->fTouchableHandle = fpNavigator->CreateTouchableHistory();
530
531 fpTrack->SetTouchableHandle( fpState->fTouchableHandle );
532 fpTrack->SetNextTouchableHandle( fpState->fTouchableHandle );
533 }
534 else
535 {
536 fpState->fTouchableHandle = fpTrack->GetTouchableHandle();
537 fpTrack->SetNextTouchableHandle( fpState->fTouchableHandle );
538 G4VPhysicalVolume* oldTopVolume= fpTrack->GetTouchableHandle()->GetVolume();
539 G4VPhysicalVolume* newTopVolume=
540 fpNavigator->ResetHierarchyAndLocate( fpTrack->GetPosition(),
541 fpTrack->GetMomentumDirection(),
542 *((G4TouchableHistory*)fpTrack->GetTouchableHandle()()) );
543 if(newTopVolume != oldTopVolume || oldTopVolume->GetRegularStructureId() == 1 )
544 {
545 fpState->fTouchableHandle = fpNavigator->CreateTouchableHistory();
546 fpTrack->SetTouchableHandle( fpState->fTouchableHandle );
547 fpTrack->SetNextTouchableHandle( fpState->fTouchableHandle );
548 }
549 }
550
551 fpCurrentVolume = fpState->fTouchableHandle->GetVolume();
552
553 //________________________________________________________
554 // If the primary track has 'Suspend' or 'PostponeToNextEvent' state,
555 // set the track state to 'Alive'.
556 if( (fpTrack->GetTrackStatus()==fSuspend) ||
558 {
559 fpTrack->SetTrackStatus(fAlive);
560 }
561
562 // If the primary track has 'zero' kinetic energy, set the track
563 // state to 'StopButAlive'.
564 if(fpTrack->GetKineticEnergy() <= 0.0)
565 {
566 fpTrack->SetTrackStatus( fStopButAlive );
567 }
568 //________________________________________________________
569 // Set vertex information of G4Track at here
570 if ( fpTrack->GetCurrentStepNumber() == 0 )
571 {
572 fpTrack->SetVertexPosition( fpTrack->GetPosition() );
574 fpTrack->SetVertexKineticEnergy( fpTrack->GetKineticEnergy() );
575 fpTrack->SetLogicalVolumeAtVertex( fpTrack->GetVolume()->GetLogicalVolume() );
576 }
577 //________________________________________________________
578 // If track is already outside the world boundary, kill it
579 if( fpCurrentVolume==0 )
580 {
581 // If the track is a primary, stop processing
582 if(fpTrack->GetParentID()==0)
583 {
584 G4cerr << "ERROR - G4ITStepProcessor::SetInitialStep()" << G4endl
585 << " Primary particle starting at - "
586 << fpTrack->GetPosition()
587 << " - is outside of the world volume." << G4endl;
588 G4Exception("G4ITStepProcessor::SetInitialStep()", "ITStepProcessor0011",
589 FatalException, "Primary vertex outside of the world!");
590 }
591
592 fpTrack->SetTrackStatus( fStopAndKill );
593 G4cout << "WARNING - G4ITStepProcessor::SetInitialStep()" << G4endl
594 << " Initial track position is outside world! - "
595 << fpTrack->GetPosition() << G4endl;
596 }
597 else{
598 // Initial set up for attribues of 'Step'
599 fpStep->InitializeStep( fpTrack );
600 }
601
602
603 if( fpTrack->GetTrackStatus() == fStopAndKill ) return ;
604
605 fpTrackingManager->StartTracking(fpTrack);
606
607 fpState->fStepStatus = fUndefined;
608}
609//______________________________________________________________________________
610
612{
613
614 if(!fpStep)
615 {
616
617 // Create new Step and give it to the track
618 fpStep = new G4Step();
619 fpTrack->SetStep(fpStep);
620 fpSecondary = fpStep->NewSecondaryVector();
621
622 // Create new state and set it in the trackingInfo
623 fpState = new G4ITStepProcessorState();
625
626 SetupMembers();
627 fpNavigator->NewNavigatorState();
628
630 }
631 else
632 {
633 SetupMembers();
634
635 fpState->fPreviousStepSize = fpTrack->GetStepLength();
636/***
637 // Send G4Step information to Hit/Dig if the volume is sensitive
638 fpCurrentVolume = fpStep->GetPreStepPoint()->GetPhysicalVolume();
639 StepControlFlag = fpStep->GetControlFlag();
640 if( fpCurrentVolume != 0 && StepControlFlag != AvoidHitInvocation)
641 {
642 fpSensitive = fpStep->GetPreStepPoint()->
643 GetSensitiveDetector();
644
645 // if( fSensitive != 0 ) {
646 // fSensitive->Hit(fStep);
647 // }
648 }
649***/
650 // Store last PostStepPoint to PreStepPoint, and swap current and next
651 // volume information of G4Track. Reset total energy deposit in one Step.
652 fpStep->CopyPostToPreStepPoint();
653 fpStep->ResetTotalEnergyDeposit();
654
655 //JA Set the volume before it is used (in DefineStepLength() for User Limit)
656 fpCurrentVolume = fpStep->GetPreStepPoint()->GetPhysicalVolume();
657/*
658 G4cout << G4endl;
659 G4cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!" << G4endl;
660 G4cout << "PreStepPoint Volume : " << fpCurrentVolume->GetName() << G4endl;
661 G4cout << "Track Touchable : " << fpTrack->GetTouchableHandle()->GetVolume()->GetName() << G4endl;
662 G4cout << "Track NextTouchable : " << fpTrack->GetNextTouchableHandle()->GetVolume()->GetName() << G4endl;
663*/
664 // Reset the step's auxiliary points vector pointer
666
667 // Switch next touchable in track to current one
668 fpTrack->SetTouchableHandle(fpTrack->GetNextTouchableHandle());
669 fpState->fTouchableHandle = fpTrack->GetTouchableHandle();
670 fpTrack->SetNextTouchableHandle( fpState->fTouchableHandle );
671 G4VPhysicalVolume* oldTopVolume= fpTrack->GetTouchableHandle()->GetVolume();
672 fpNavigator->SetNavigatorState(fpITrack->GetTrackingInfo()->GetNavigatorState());
673
674 G4VPhysicalVolume* newTopVolume=
675 fpNavigator->ResetHierarchyAndLocate( fpTrack->GetPosition(),
676 fpTrack->GetMomentumDirection(),
677 *((G4TouchableHistory*)fpTrack->GetTouchableHandle()()) );
678
679 // G4cout << "New Top Volume : " << newTopVolume->GetName() << G4endl;
680
681 if(newTopVolume != oldTopVolume || oldTopVolume->GetRegularStructureId() == 1 )
682 {
683 fpState->fTouchableHandle = fpNavigator->CreateTouchableHistory();
684 fpTrack->SetTouchableHandle( fpState->fTouchableHandle );
685 fpTrack->SetNextTouchableHandle( fpState->fTouchableHandle );
686 }
687
688 fpNavigator->SetNavigatorState(fpITrack->GetTrackingInfo()->GetNavigatorState());
689 }
690}
691
692//______________________________________________________________________________
693
694
695// ************************************************************************
696// Compute Interaction Length
697// ************************************************************************
699{
700
702
703 G4TrackStatus trackStatus = fpTrack -> GetTrackStatus() ;
704
705 if(trackStatus == fStopAndKill)
706 {
707 return ;
708 }
709
710 if(trackStatus == fStopButAlive)
711 {
712 fpITrack->GetTrackingInfo()->SetNavigatorState(fpNavigator->GetNavigatorState());
713 fpNavigator->SetNavigatorState(0);
714 return GetAtRestIL() ;
715 }
716
717
718 // Find minimum Step length and corresponding time
719 // demanded by active disc./cont. processes
720
721 // ReSet the counter etc.
722 fpState->fPhysicalStep = DBL_MAX; // Initialize by a huge number
723 fPhysIntLength = DBL_MAX; // Initialize by a huge number
724
725 double proposedTimeStep = DBL_MAX;
726 G4VProcess* processWithPostStepGivenByTimeStep(0);
727
728 // GPIL for PostStep
729 fPostStepDoItProcTriggered = fpProcessInfo->MAXofPostStepLoops;
730 fPostStepAtTimeDoItProcTriggered = fpProcessInfo->MAXofPostStepLoops;
731
732 // G4cout << "fpProcessInfo->MAXofPostStepLoops : " << fpProcessInfo->MAXofPostStepLoops
733 // << " mol : " << fpITrack -> GetName() << " id : " << fpTrack->GetTrackID()
734 // << G4endl;
735
736 for(size_t np=0; np < fpProcessInfo->MAXofPostStepLoops; np++)
737 {
738 fpCurrentProcess = (G4VITProcess*) (*fpProcessInfo->fpPostStepGetPhysIntVector)[np];
739 if (fpCurrentProcess== 0)
740 {
741 (fpState->fSelectedPostStepDoItVector)[np] = InActivated;
742 continue;
743 } // NULL means the process is inactivated by a user on fly.
744
745 fCondition=NotForced;
746 fpCurrentProcess->SetProcessState(fpTrackingInfo->GetProcessState(fpCurrentProcess->GetProcessID()));
747
748 // G4cout << "Is going to call : " << fpCurrentProcess -> GetProcessName() << G4endl;
749 fPhysIntLength = fpCurrentProcess->
750 PostStepGPIL( *fpTrack,
751 fpState->fPreviousStepSize,
752 &fCondition );
753 fpCurrentProcess->SetProcessState(0);
754
755 switch (fCondition)
756 {
757 case ExclusivelyForced: // Will need special treatment
758 (fpState->fSelectedPostStepDoItVector)[np] = ExclusivelyForced;
759 fpState->fStepStatus = fExclusivelyForcedProc;
760 fpStep->GetPostStepPoint()
761 ->SetProcessDefinedStep(fpCurrentProcess);
762 break;
763
764 case Conditionally:
765 // (fpState->fSelectedPostStepDoItVector)[np] = Conditionally;
766 G4Exception("G4ITStepProcessor::DefinePhysicalStepLength()", "ITStepProcessor0008",
767 FatalException, "This feature is no more supported");
768 break;
769
770 case Forced:
771 (fpState->fSelectedPostStepDoItVector)[np] = Forced;
772 break;
773
774 case StronglyForced:
775 (fpState->fSelectedPostStepDoItVector)[np] = StronglyForced;
776 break;
777
778 default:
779 (fpState->fSelectedPostStepDoItVector)[np] = InActivated;
780 break;
781 }
782
783 if (fCondition==ExclusivelyForced)
784 {
785 for(size_t nrest=np+1; nrest < fpProcessInfo->MAXofPostStepLoops; nrest++)
786 {
787 (fpState->fSelectedPostStepDoItVector)[nrest] = InActivated;
788 }
789 return; // Please note the 'return' at here !!!
790 }
791 else
792 {
793 if(fPhysIntLength < fpState->fPhysicalStep )
794 {
795 // To avoid checking whether the process is actually
796 // proposing a time step, the returned time steps are
797 // negative (just for tagging)
798 if(fpCurrentProcess->ProposesTimeStep())
799 {
800 fPhysIntLength *= -1;
801 if(fPhysIntLength < proposedTimeStep)
802 {
803 proposedTimeStep = fPhysIntLength;
804 fPostStepAtTimeDoItProcTriggered = np;
805 processWithPostStepGivenByTimeStep = fpCurrentProcess;
806 }
807 }
808 else
809 {
810 fpState->fPhysicalStep = fPhysIntLength;
811 fpState->fStepStatus = fPostStepDoItProc;
812 fPostStepDoItProcTriggered = G4int(np);
813 fpStep->GetPostStepPoint()
814 ->SetProcessDefinedStep(fpCurrentProcess);
815 }
816 }
817 }
818 }
819
820 // GPIL for AlongStep
821 fpState->proposedSafety = DBL_MAX;
822 G4double safetyProposedToAndByProcess = fpState->proposedSafety;
823
824 for(size_t kp=0; kp < fpProcessInfo->MAXofAlongStepLoops; kp++)
825 {
826 fpCurrentProcess = (G4VITProcess*) (*fpProcessInfo->fpAlongStepGetPhysIntVector)[kp];
827 if (fpCurrentProcess== 0) continue;
828 // NULL means the process is inactivated by a user on fly.
829
830 fpCurrentProcess->SetProcessState(fpTrackingInfo->GetProcessState(fpCurrentProcess->GetProcessID()));
831 fPhysIntLength = fpCurrentProcess-> AlongStepGPIL( *fpTrack,
832 fpState->fPreviousStepSize,
833 fpState->fPhysicalStep,
834 safetyProposedToAndByProcess,
835 &fGPILSelection );
836
837 if(fPhysIntLength < fpState->fPhysicalStep)
838 {
839 fpState->fPhysicalStep = fPhysIntLength;
840 // Should save PS and TS in IT
841
842 // Check if the process wants to be the GPIL winner. For example,
843 // multi-scattering proposes Step limit, but won't be the winner.
844 if(fGPILSelection==CandidateForSelection)
845 {
846 fpState->fStepStatus = fAlongStepDoItProc;
847 fpStep->GetPostStepPoint()
848 ->SetProcessDefinedStep(fpCurrentProcess);
849 }
850
851 // Transportation is assumed to be the last process in the vector
852 if(kp == fpProcessInfo->MAXofAlongStepLoops-1)
853 {
854 fpTransportation = dynamic_cast<G4ITTransportation*>(fpCurrentProcess);
855
856 if(! fpTransportation)
857 {
858 G4ExceptionDescription exceptionDescription ;
859 exceptionDescription << "No transportation process found " ;
860 G4Exception("G4ITStepProcessor::DoDefinePhysicalStepLength","ITStepProcessor0009",
861 FatalErrorInArgument,exceptionDescription);
862 }
863
864 fTimeStep = fpTransportation->GetInteractionTimeLeft();
865
866
867 if (fpTrack->GetNextVolume() != 0)
868 fpState->fStepStatus = fGeomBoundary;
869 else
870 fpState->fStepStatus = fWorldBoundary;
871 }
872 }
873 else
874 {
875 if(kp == fpProcessInfo->MAXofAlongStepLoops-1)
876 {
877 fpTransportation = dynamic_cast<G4ITTransportation*>(fpCurrentProcess);
878
879 if(! fpTransportation)
880 {
881 G4ExceptionDescription exceptionDescription ;
882 exceptionDescription << "No transportation process found " ;
883 G4Exception("G4ITStepProcessor::DoDefinePhysicalStepLength","ITStepProcessor0010",
884 FatalErrorInArgument,exceptionDescription);
885 }
886
887 fTimeStep = fpTransportation->GetInteractionTimeLeft();
888 }
889 }
890
891 if(proposedTimeStep < fTimeStep)
892 {
893 if(fPostStepAtTimeDoItProcTriggered<fpProcessInfo->MAXofPostStepLoops)
894 {
895 if ((fpState->fSelectedPostStepDoItVector)[fPostStepAtTimeDoItProcTriggered] ==
897 {
898 (fpState->fSelectedPostStepDoItVector)[fPostStepAtTimeDoItProcTriggered] = NotForced;
899 // (fpState->fSelectedPostStepDoItVector)[fPostStepDoItProcTriggered] = InActivated;
900
901 fpState->fStepStatus = fPostStepDoItProc;
902 fpStep->GetPostStepPoint()->SetProcessDefinedStep(processWithPostStepGivenByTimeStep);
903
904 fTimeStep = proposedTimeStep;
905
906 fpTransportation->ComputeStep(*fpTrack,*fpStep,fTimeStep,fpState->fPhysicalStep);
907 }
908 }
909 }
910 else
911 {
912 if (fPostStepDoItProcTriggered<fpProcessInfo->MAXofPostStepLoops)
913 {
914 if ((fpState->fSelectedPostStepDoItVector)[fPostStepDoItProcTriggered] ==
916 {
917 (fpState->fSelectedPostStepDoItVector)[fPostStepDoItProcTriggered] =
918 NotForced;
919 }
920 }
921 }
922
923 fpCurrentProcess->SetProcessState(0);
924
925 // Make sure to check the safety, even if Step is not limited
926 // by this process. J. Apostolakis, June 20, 1998
927 //
928 if (safetyProposedToAndByProcess < fpState->proposedSafety)
929 // proposedSafety keeps the smallest value:
930 fpState->proposedSafety = safetyProposedToAndByProcess;
931 else
932 // safetyProposedToAndByProcess always proposes a valid safety:
933 safetyProposedToAndByProcess = fpState->proposedSafety;
934
935 }
936
937 fpITrack->GetTrackingInfo()->SetNavigatorState(fpNavigator->GetNavigatorState());
938 fpNavigator->SetNavigatorState(0);
939}
940
941//______________________________________________________________________________
@ FatalException
@ FatalErrorInArgument
@ InActivated
@ StronglyForced
@ NotForced
@ Conditionally
@ ExclusivelyForced
@ Forced
@ CandidateForSelection
G4IT * GetIT(const G4Track *track)
Definition: G4IT.cc:48
@ typeGPIL
@ typeDoIt
@ fGeomBoundary
Definition: G4StepStatus.hh:54
@ fWorldBoundary
Definition: G4StepStatus.hh:52
@ fUndefined
Definition: G4StepStatus.hh:66
@ fPostStepDoItProc
Definition: G4StepStatus.hh:60
@ fAlongStepDoItProc
Definition: G4StepStatus.hh:58
@ fExclusivelyForcedProc
Definition: G4StepStatus.hh:64
G4TrackStatus
@ fSuspend
@ fAlive
@ fStopAndKill
@ fStopButAlive
@ fPostponeToNextEvent
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
G4double GetSurfaceTolerance() const
static G4GeometryTolerance * GetInstance()
void SetNavigatorState(G4ITNavigatorState_Lock *)
G4ITNavigatorState_Lock * GetNavigatorState()
virtual G4VPhysicalVolume * LocateGlobalPointAndSetup(const G4ThreeVector &point, const G4ThreeVector *direction=0, const G4bool pRelativeSearch=true, const G4bool ignoreDirection=true)
G4TouchableHistory * CreateTouchableHistory() const
void NewNavigatorState()
virtual G4VPhysicalVolume * ResetHierarchyAndLocate(const G4ThreeVector &point, const G4ThreeVector &direction, const G4TouchableHistory &h)
void SetNavigator(G4ITNavigator *value)
void SetTrack(G4Track *)
G4ITStepProcessor & operator=(const G4ITStepProcessor &other)
void DefinePhysicalStepLength(G4Track *)
void SetupGeneralProcessInfo(G4ParticleDefinition *, G4ProcessManager *)
virtual void Initialize()
virtual void StartTracking(G4Track *)
static G4ITTransportationManager * GetTransportationManager()
virtual void ComputeStep(const G4Track &, const G4Step &, const double timeStep, double &spaceStep)
G4TrackingInformation * GetTrackingInfo()
Definition: G4IT.hh:134
G4ProcessManager * GetProcessManager() const
const G4String & GetParticleName() const
G4PTblDicIterator * GetIterator()
static G4ParticleTable * GetParticleTable()
G4VProcess * SetProcessActivation(G4VProcess *aProcess, G4bool fActive)
G4ProcessVector * GetAlongStepProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
G4ProcessVector * GetProcessList() const
G4ProcessVector * GetPostStepProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
G4ProcessVector * GetAtRestProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
G4int size() const
G4int entries() const
void SetProcessDefinedStep(const G4VProcess *aValue)
G4VPhysicalVolume * GetPhysicalVolume() const
Definition: G4Step.hh:78
void DeleteSecondaryVector()
void InitializeStep(G4Track *aValue)
void ResetTotalEnergyDeposit()
G4TrackVector * GetfSecondary()
void CopyPostToPreStepPoint()
G4StepPoint * GetPreStepPoint() const
void SetPointerToVectorOfAuxiliaryPoints(std::vector< G4ThreeVector > *theNewVectorPointer)
Definition: G4Step.hh:237
G4TrackVector * NewSecondaryVector()
G4StepPoint * GetPostStepPoint() const
G4TrackStatus GetTrackStatus() const
void SetTrackStatus(const G4TrackStatus aTrackStatus)
G4int GetTrackID() const
void SetStep(const G4Step *aValue)
G4VPhysicalVolume * GetVolume() const
void SetVertexPosition(const G4ThreeVector &aValue)
const G4TouchableHandle & GetNextTouchableHandle() const
void SetVertexMomentumDirection(const G4ThreeVector &aValue)
G4VPhysicalVolume * GetNextVolume() const
void SetNextTouchableHandle(const G4TouchableHandle &apValue)
const G4ThreeVector & GetPosition() const
void SetTouchableHandle(const G4TouchableHandle &apValue)
G4int GetCurrentStepNumber() const
G4ParticleDefinition * GetDefinition() const
const G4TouchableHandle & GetTouchableHandle() const
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
G4double GetStepLength() const
void SetVertexKineticEnergy(const G4double aValue)
G4int GetParentID() const
void SetLogicalVolumeAtVertex(const G4LogicalVolume *)
G4ProcessState_Lock * GetProcessState(size_t index)
void SetStepProcessorState(G4ITStepProcessorState_Lock *)
void SetNavigatorState(G4ITNavigatorState_Lock *)
G4ITStepProcessorState_Lock * GetStepProcessorState()
G4ITNavigatorState_Lock * GetNavigatorState() const
G4bool ProposesTimeStep() const
size_t GetProcessID() const
Definition: G4VITProcess.hh:80
void SetProcessState(G4ProcessState_Lock *aProcInfo)
Definition: G4VITProcess.hh:90
G4double GetInteractionTimeLeft()
static const size_t & GetMaxProcessIndex()
G4LogicalVolume * GetLogicalVolume() const
virtual G4int GetRegularStructureId() const =0
G4double AtRestGPIL(const G4Track &track, G4ForceCondition *condition)
Definition: G4VProcess.hh:461
virtual G4VPhysicalVolume * GetVolume(G4int depth=0) const
Definition: G4VTouchable.cc:44
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76
#define DBL_MAX
Definition: templates.hh:83