Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/dna/management/src/G4ITStepProcessor.cc

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

Diff markup

Differences between /processes/electromagnetic/dna/management/src/G4ITStepProcessor.cc (Version 11.3.0) and /processes/electromagnetic/dna/management/src/G4ITStepProcessor.cc (Version 9.3)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 //                                                
 27 // Author: Mathieu Karamitros (kara (AT) cenbg    
 28 //                                                
 29 // History:                                       
 30 // -----------                                    
 31 // 10 Oct 2011 M.Karamitros created               
 32 //                                                
 33 // -------------------------------------------    
 34                                                   
 35 #include "G4ITStepProcessor.hh"                   
 36                                                   
 37 #include "G4ForceCondition.hh"                    
 38 #include "G4GPILSelection.hh"                     
 39 #include "G4GeometryTolerance.hh"                 
 40 #include "G4IT.hh"                                
 41 #include "G4ITNavigator.hh"             // Inc    
 42 #include "G4ITSteppingVerbose.hh"                 
 43 #include "G4ITTrackHolder.hh"                     
 44 #include "G4ITTrackingInteractivity.hh"           
 45 #include "G4ITTrackingManager.hh"                 
 46 #include "G4ITTransportation.hh"                  
 47 #include "G4ITTransportationManager.hh"           
 48 #include "G4ParticleTable.hh"                     
 49 #include "G4TrackingInformation.hh"               
 50 #include "G4UImanager.hh"                         
 51 #include "G4VITProcess.hh"                        
 52 #include "G4VITSteppingVerbose.hh"                
 53 #include "G4VProcess.hh"                          
 54                                                   
 55 #include <iomanip>              // Include fro    
 56 #include <vector>               // Include fro    
 57                                                   
 58 using namespace std;                              
 59                                                   
 60 static const std::size_t SizeOfSelectedDoItVec    
 61                                                   
 62 template<typename T>                              
 63   inline bool IsInf(T value)                      
 64   {                                               
 65     return std::numeric_limits<T>::has_infinit    
 66         && value == std::numeric_limits<T>::in    
 67   }                                               
 68                                                   
 69 //____________________________________________    
 70                                                   
 71 G4ITStepProcessor::G4ITStepProcessor()            
 72 {                                                 
 73   fpVerbose = nullptr;                            
 74   // fpUserSteppingAction = 0 ;                   
 75   fStoreTrajectory = 0;                           
 76   fpTrackingManager = nullptr;                    
 77   fpNavigator = nullptr;                          
 78   kCarTolerance = -1.;                            
 79   fInitialized = false;                           
 80   fPreviousTimeStep = DBL_MAX;                    
 81   fILTimeStep = DBL_MAX;                          
 82   fpTrackContainer = nullptr;                     
 83                                                   
 84   CleanProcessor();                               
 85   ResetSecondaries();                             
 86 }                                                 
 87                                                   
 88 //____________________________________________    
 89                                                   
 90 //G4ITStepProcessor::                             
 91 G4ITStepProcessorState::G4ITStepProcessorState    
 92     G4ITStepProcessorState_Lock(),                
 93     fSelectedAtRestDoItVector(G4VITProcess::Ge    
 94     fSelectedPostStepDoItVector(G4VITProcess::    
 95 {                                                 
 96   fPhysicalStep = -1.;                            
 97   fPreviousStepSize = -1.;                        
 98                                                   
 99   fSafety = -1.;                                  
100   fProposedSafety = -1.;                          
101   fEndpointSafety = -1;                           
102                                                   
103   fStepStatus = fUndefined;                       
104                                                   
105   fTouchableHandle = nullptr;                     
106 }                                                 
107                                                   
108 //____________________________________________    
109                                                   
110 //G4ITStepProcessor::                             
111 G4ITStepProcessorState::G4ITStepProcessorState    
112     G4ITStepProcessorState_Lock(),                
113     fSelectedAtRestDoItVector(right.fSelectedA    
114     fSelectedPostStepDoItVector(right.fSelecte    
115 {                                                 
116   fPhysicalStep = right.fPhysicalStep;            
117   fPreviousStepSize = right.fPreviousStepSize;    
118                                                   
119   fSafety = right.fSafety;                        
120   fProposedSafety = right.fProposedSafety;        
121   fEndpointSafety = right.fEndpointSafety;        
122                                                   
123   fStepStatus = right.fStepStatus;                
124                                                   
125   fTouchableHandle = right.fTouchableHandle;      
126 }                                                 
127                                                   
128 //____________________________________________    
129                                                   
130 //G4ITStepProcessor::                             
131 G4ITStepProcessorState&                           
132 //G4ITStepProcessor::                             
133 G4ITStepProcessorState::operator=(const G4ITSt    
134 {                                                 
135   if(this == &right) return *this;                
136                                                   
137   fSelectedAtRestDoItVector.clear();              
138   fSelectedAtRestDoItVector = right.fSelectedA    
139   fSelectedPostStepDoItVector.clear();            
140   fSelectedPostStepDoItVector = right.fSelecte    
141                                                   
142   fPhysicalStep = right.fPhysicalStep;            
143   fPreviousStepSize = right.fPreviousStepSize;    
144                                                   
145   fSafety = right.fSafety;                        
146   fProposedSafety = right.fProposedSafety;        
147   fEndpointSafety = right.fEndpointSafety;        
148                                                   
149   fStepStatus = right.fStepStatus;                
150                                                   
151   fTouchableHandle = right.fTouchableHandle;      
152   return *this;                                   
153 }                                                 
154                                                   
155 //____________________________________________    
156                                                   
157 //G4ITStepProcessor::                             
158 G4ITStepProcessorState::~G4ITStepProcessorStat    
159 {                                                 
160   ;                                               
161 }                                                 
162                                                   
163 //____________________________________________    
164                                                   
165 void G4ITStepProcessor::ClearProcessInfo()        
166 {                                                 
167   std::map<const G4ParticleDefinition*, Proces    
168                                                   
169   for(it = fProcessGeneralInfoMap.begin(); it     
170       it++)                                       
171   {                                               
172     if(it->second != nullptr)                     
173     {                                             
174       delete it->second;                          
175       it->second = 0;                             
176     }                                             
177   }                                               
178                                                   
179   fProcessGeneralInfoMap.clear();                 
180 }                                                 
181                                                   
182 //____________________________________________    
183                                                   
184 void G4ITStepProcessor::ForceReInitialization(    
185 {                                                 
186   fInitialized = false;                           
187   ClearProcessInfo();                             
188   Initialize();                                   
189 }                                                 
190                                                   
191 //____________________________________________    
192                                                   
193 void G4ITStepProcessor::Initialize()              
194 {                                                 
195   CleanProcessor();                               
196   if(fInitialized) return;                        
197   //    ActiveOnlyITProcess();                    
198                                                   
199   SetNavigator(G4ITTransportationManager::GetT    
200       ->GetNavigatorForTracking());               
201                                                   
202   fPhysIntLength = DBL_MAX;                       
203   kCarTolerance = 0.5                             
204       * G4GeometryTolerance::GetInstance()->Ge    
205                                                   
206   if(fpVerbose == nullptr)                        
207   {                                               
208     G4ITTrackingInteractivity* interactivity =    
209                                                   
210     if(interactivity != nullptr)                  
211     {                                             
212       fpVerbose = interactivity->GetSteppingVe    
213       fpVerbose->SetStepProcessor(this);          
214     }                                             
215   }                                               
216                                                   
217   fpTrackContainer = G4ITTrackHolder::Instance    
218                                                   
219   fInitialized = true;                            
220 }                                                 
221 //____________________________________________    
222                                                   
223 G4ITStepProcessor::~G4ITStepProcessor()           
224 {                                                 
225   if(fpStep != nullptr)                           
226   {                                               
227     fpStep->DeleteSecondaryVector();              
228     delete fpStep;                                
229   }                                               
230                                                   
231   delete fpSecondary;                             
232   ClearProcessInfo();                             
233   //G4ITTransportationManager::DeleteInstance(    
234                                                   
235   //    if(fpUserSteppingAction)             d    
236 }                                                 
237 //____________________________________________    
238 // should not be used                             
239 G4ITStepProcessor::G4ITStepProcessor(const G4I    
240 {                                                 
241   fpVerbose = rhs.fpVerbose;                      
242   fStoreTrajectory = rhs.fStoreTrajectory;        
243                                                   
244   //    fpUserSteppingAction = 0 ;                
245   fpTrackingManager = nullptr;                    
246   fpNavigator = nullptr;                          
247   fInitialized = false;                           
248                                                   
249   kCarTolerance = rhs.kCarTolerance;              
250   fInitialized = false;                           
251   fPreviousTimeStep = DBL_MAX;                    
252                                                   
253   CleanProcessor();                               
254   ResetSecondaries();                             
255   fpTrackContainer = nullptr;                     
256   fILTimeStep = DBL_MAX;                          
257 }                                                 
258                                                   
259 //____________________________________________    
260                                                   
261 void G4ITStepProcessor::ResetLeadingTracks()      
262 {                                                 
263   fLeadingTracks.Reset();                         
264 }                                                 
265                                                   
266 //____________________________________________    
267                                                   
268 void G4ITStepProcessor::PrepareLeadingTracks()    
269 {                                                 
270   fLeadingTracks.PrepareLeadingTracks();          
271 }                                                 
272                                                   
273 //____________________________________________    
274                                                   
275 G4ITStepProcessor& G4ITStepProcessor::operator    
276 {                                                 
277   if(this == &rhs) return *this; // handle sel    
278   //assignment operator                           
279   return *this;                                   
280 }                                                 
281                                                   
282 //____________________________________________    
283                                                   
284 void G4ITStepProcessor::ActiveOnlyITProcess()     
285 {                                                 
286   // Method not used for the time being           
287 #ifdef debug                                      
288   G4cout<<"G4ITStepProcessor::CloneProcesses:     
289 #endif                                            
290                                                   
291   G4ParticleTable* theParticleTable = G4Partic    
292   G4ParticleTable::G4PTblDicIterator* theParti    
293       ->GetIterator();                            
294                                                   
295   theParticleIterator->reset();                   
296   // TODO : Ne faire la boucle que sur les IT     
297   while((*theParticleIterator)())                 
298   {                                               
299     G4ParticleDefinition* particle = thePartic    
300     G4ProcessManager* pm = particle->GetProces    
301                                                   
302     if(pm == nullptr)                             
303     {                                             
304       G4cerr << "ERROR - G4ITStepProcessor::Ge    
305       << particle->GetParticleName() << ", PDG    
306       << particle->GetPDGEncoding() << G4endl;    
307       G4Exception("G4ITStepProcessor::GetProce    
308           FatalException, "Process Manager is     
309       return;                                     
310     }                                             
311                                                   
312     ActiveOnlyITProcess(pm);                      
313   }                                               
314 }                                                 
315                                                   
316 //____________________________________________    
317                                                   
318 void G4ITStepProcessor::ActiveOnlyITProcess(G4    
319 {                                                 
320   // Method not used for the time being           
321   G4ProcessVector* processVector = processMana    
322                                                   
323   G4VITProcess* itProcess = nullptr;              
324   for(G4int i = 0; i < (G4int)processVector->s    
325   {                                               
326     G4VProcess* base_process = (*processVector    
327     itProcess = dynamic_cast<G4VITProcess*>(ba    
328                                                   
329     if(itProcess == nullptr)                      
330     {                                             
331       processManager->SetProcessActivation(bas    
332     }                                             
333   }                                               
334 }                                                 
335                                                   
336 //____________________________________________    
337                                                   
338 void G4ITStepProcessor::SetupGeneralProcessInf    
339                                                   
340 {                                                 
341                                                   
342 #ifdef debug                                      
343   G4cout<<"G4ITStepProcessor::GetProcessNumber    
344 #endif                                            
345   if(pm == nullptr)                               
346   {                                               
347     G4cerr << "ERROR - G4SteppingManager::GetP    
348     << particle->GetParticleName() << ", PDG_c    
349     << particle->GetPDGEncoding() << G4endl;      
350     G4Exception("G4SteppingManager::GetProcess    
351         FatalException, "Process Manager is no    
352     return;                                       
353   }                                               
354                                                   
355   auto it =                                       
356   fProcessGeneralInfoMap.find(particle);          
357   if(it != fProcessGeneralInfoMap.end())          
358   {                                               
359     G4Exception("G4SteppingManager::SetupGener    
360         "ITStepProcessor0003",                    
361         FatalException, "Process info already     
362     return;                                       
363   }                                               
364                                                   
365   // here used as temporary                       
366   fpProcessInfo = new ProcessGeneralInfo();       
367                                                   
368   // AtRestDoits                                  
369   fpProcessInfo->MAXofAtRestLoops = pm->GetAtR    
370   fpProcessInfo->fpAtRestDoItVector = pm->GetA    
371   fpProcessInfo->fpAtRestGetPhysIntVector =       
372   pm->GetAtRestProcessVector(typeGPIL);           
373 #ifdef debug                                      
374   G4cout << "G4ITStepProcessor::GetProcessNumb    
375   << fpProcessInfo->MAXofAtRestLoops << G4endl    
376 #endif                                            
377                                                   
378   // AlongStepDoits                               
379   fpProcessInfo->MAXofAlongStepLoops =            
380   pm->GetAlongStepProcessVector()->entries();     
381   fpProcessInfo->fpAlongStepDoItVector =          
382   pm->GetAlongStepProcessVector(typeDoIt);        
383   fpProcessInfo->fpAlongStepGetPhysIntVector =    
384   pm->GetAlongStepProcessVector(typeGPIL);        
385 #ifdef debug                                      
386   G4cout << "G4ITStepProcessor::GetProcessNumb    
387   << fpProcessInfo->MAXofAlongStepLoops << G4e    
388 #endif                                            
389                                                   
390   // PostStepDoits                                
391   fpProcessInfo->MAXofPostStepLoops =             
392   pm->GetPostStepProcessVector()->entries();      
393   fpProcessInfo->fpPostStepDoItVector = pm->Ge    
394   fpProcessInfo->fpPostStepGetPhysIntVector =     
395   pm->GetPostStepProcessVector(typeGPIL);         
396 #ifdef debug                                      
397   G4cout << "G4ITStepProcessor::GetProcessNumb    
398   << fpProcessInfo->MAXofPostStepLoops << G4en    
399 #endif                                            
400                                                   
401   if (SizeOfSelectedDoItVector<fpProcessInfo->    
402       SizeOfSelectedDoItVector<fpProcessInfo->    
403       SizeOfSelectedDoItVector<fpProcessInfo->    
404   {                                               
405     G4cerr << "ERROR - G4ITStepProcessor::GetP    
406     << "        SizeOfSelectedDoItVector= " <<    
407     << " ; is smaller then one of MAXofAtRestL    
408     << fpProcessInfo->MAXofAtRestLoops << G4en    
409     << "        or MAXofAlongStepLoops= " << f    
410     << " or MAXofPostStepLoops= " << fpProcess    
411     G4Exception("G4ITStepProcessor::GetProcess    
412         "ITStepProcessor0004", FatalException,    
413         "The array size is smaller than the ac    
414   }                                               
415                                                   
416   if((fpProcessInfo->fpAtRestDoItVector == nul    
417       (fpProcessInfo->fpAlongStepDoItVector ==    
418       (fpProcessInfo->fpPostStepDoItVector ==     
419   {                                               
420     G4ExceptionDescription exceptionDescriptio    
421     exceptionDescription << "No DoIt process f    
422     G4Exception("G4ITStepProcessor::DoStepping    
423         FatalErrorInArgument,exceptionDescript    
424     return;                                       
425   }                                               
426                                                   
427   if((fpProcessInfo->fpAlongStepGetPhysIntVect    
428       && fpProcessInfo->MAXofAlongStepLoops>0)    
429   {                                               
430     fpProcessInfo->fpTransportation = dynamic_    
431     ((*fpProcessInfo->fpAlongStepGetPhysIntVec    
432         [G4int(fpProcessInfo->MAXofAlongStepLo    
433                                                   
434     if(fpProcessInfo->fpTransportation == null    
435     {                                             
436       G4ExceptionDescription exceptionDescript    
437       exceptionDescription << "No transportati    
438       G4Exception("G4ITStepProcessor::SetupGen    
439           "ITStepProcessor0006",                  
440           FatalErrorInArgument,exceptionDescri    
441     }                                             
442   }                                               
443   fProcessGeneralInfoMap[particle] = fpProcess    
444   //    fpProcessInfo = 0;                        
445 }                                                 
446                                                   
447 //____________________________________________    
448                                                   
449 void G4ITStepProcessor::SetTrack(G4Track* trac    
450 {                                                 
451   fpTrack = track;                                
452   if(fpTrack != nullptr)                          
453   {                                               
454     fpITrack = GetIT(fpTrack);                    
455     fpStep = const_cast<G4Step*>(fpTrack->GetS    
456                                                   
457     if(fpITrack != nullptr)                       
458     {                                             
459       fpTrackingInfo = fpITrack->GetTrackingIn    
460     }                                             
461     else                                          
462     {                                             
463       fpTrackingInfo = nullptr;                   
464       G4cerr << "Track ID : " << fpTrack->GetT    
465                                                   
466       G4ExceptionDescription errMsg;              
467       errMsg << "No IT pointer was attached to    
468       G4Exception("G4ITStepProcessor::SetTrack    
469                   "ITStepProcessor0007",          
470                   FatalErrorInArgument,           
471                   errMsg);                        
472     }                                             
473   }                                               
474   else                                            
475   {                                               
476     fpITrack = nullptr;                           
477     fpStep = nullptr;                             
478   }                                               
479 }                                                 
480 //____________________________________________    
481                                                   
482 void G4ITStepProcessor::GetProcessInfo()          
483 {                                                 
484   G4ParticleDefinition* particle = fpTrack->Ge    
485   auto it =                                       
486       fProcessGeneralInfoMap.find(particle);      
487                                                   
488   if(it == fProcessGeneralInfoMap.end())          
489   {                                               
490     SetupGeneralProcessInfo(particle,             
491                             fpTrack->GetDefini    
492     if(fpProcessInfo == nullptr)                  
493     {                                             
494       G4ExceptionDescription exceptionDescript    
495       G4Exception("G4ITStepProcessor::GetProce    
496                   "ITStepProcessor0008",          
497                   FatalErrorInArgument,           
498                   exceptionDescription);          
499       return;                                     
500     }                                             
501   }                                               
502   else                                            
503   {                                               
504     fpProcessInfo = it->second;                   
505   }                                               
506 }                                                 
507                                                   
508 //____________________________________________    
509                                                   
510 void G4ITStepProcessor::SetupMembers()            
511 {                                                 
512   fpSecondary = fpStep->GetfSecondary();          
513   fpPreStepPoint = fpStep->GetPreStepPoint();     
514   fpPostStepPoint = fpStep->GetPostStepPoint()    
515                                                   
516   fpState = (G4ITStepProcessorState*) fpITrack    
517       ->GetStepProcessorState();                  
518                                                   
519   GetProcessInfo();                               
520   ResetSecondaries();                             
521 }                                                 
522                                                   
523 //____________________________________________    
524                                                   
525 void G4ITStepProcessor::ResetSecondaries()        
526 {                                                 
527   // Reset the secondary particles                
528   fN2ndariesAtRestDoIt = 0;                       
529   fN2ndariesAlongStepDoIt = 0;                    
530   fN2ndariesPostStepDoIt = 0;                     
531 }                                                 
532                                                   
533 //____________________________________________    
534                                                   
535 void G4ITStepProcessor::GetAtRestIL()             
536 {                                                 
537   // Select the rest process which has the sho    
538   // it is invoked. In rest processes, GPIL()     
539   // returns the time before a process occurs.    
540   G4double lifeTime(DBL_MAX), shortestLifeTime    
541                                                   
542   fAtRestDoItProcTriggered = 0;                   
543   shortestLifeTime = DBL_MAX;                     
544                                                   
545   unsigned int NofInactiveProc=0;                 
546                                                   
547   for( G4int ri=0; ri < (G4int)fpProcessInfo->    
548   {                                               
549     fpCurrentProcess = dynamic_cast<G4VITProce    
550     if (fpCurrentProcess== nullptr)               
551     {                                             
552       (fpState->fSelectedAtRestDoItVector)[ri]    
553       NofInactiveProc++;                          
554       continue;                                   
555     } // NULL means the process is inactivated    
556                                                   
557     fCondition=NotForced;                         
558     fpCurrentProcess->SetProcessState(            
559         fpTrackingInfo->GetProcessState(fpCurr    
560                                                   
561     lifeTime = fpCurrentProcess->AtRestGPIL( *    
562     fpCurrentProcess->ResetProcessState();        
563                                                   
564     if(fCondition==Forced)                        
565     {                                             
566       (fpState->fSelectedAtRestDoItVector)[ri]    
567     }                                             
568     else                                          
569     {                                             
570       (fpState->fSelectedAtRestDoItVector)[ri]    
571       if(lifeTime < shortestLifeTime )            
572       {                                           
573         shortestLifeTime = lifeTime;              
574         fAtRestDoItProcTriggered = G4int(ri);     
575       }                                           
576     }                                             
577   }                                               
578                                                   
579   (fpState->fSelectedAtRestDoItVector)[fAtRest    
580                                                   
581 //  G4cout << " --> Selected at rest process :    
582 //         << (*fpProcessInfo->fpAtRestGetPhys    
583 //            ->GetProcessName()                  
584 //         << G4endl;                             
585                                                   
586   fTimeStep = shortestLifeTime;                   
587                                                   
588   // at least one process is necessary to dest    
589   // exit with warning                            
590   if(NofInactiveProc==fpProcessInfo->MAXofAtRe    
591   {                                               
592     G4cerr << "ERROR - G4ITStepProcessor::Invo    
593     << "        No AtRestDoIt process is activ    
594   }                                               
595 }                                                 
596                                                   
597 //____________________________________________    
598 G4double G4ITStepProcessor::ComputeInteraction    
599 {                                                 
600   G4TrackManyList* mainList = fpTrackContainer    
601   G4TrackManyList::iterator it = mainList ->be    
602   G4TrackManyList::iterator end = mainList ->e    
603                                                   
604   SetPreviousStepTime(previousTimeStep);          
605                                                   
606   fILTimeStep = DBL_MAX;                          
607                                                   
608   for (; it != end; )                             
609   {                                               
610     G4Track * track = *it;                        
611                                                   
612 #ifdef DEBUG                                      
613     G4cout << "*CIL* " << GetIT(track)->GetNam    
614         << " ID: " << track->GetTrackID()         
615         <<  " at time : " << track->GetGlobalT    
616         << G4endl;                                
617 #endif                                            
618                                                   
619     ++it;                                         
620     DefinePhysicalStepLength(track);              
621                                                   
622     ExtractILData();                              
623   }                                               
624                                                   
625   return fILTimeStep;                             
626 }                                                 
627                                                   
628 //____________________________________________    
629                                                   
630 void G4ITStepProcessor::ExtractILData()           
631 {                                                 
632   assert(fpTrack != 0);                           
633   if (fpTrack == nullptr)                         
634   {                                               
635     CleanProcessor();                             
636     return;                                       
637   }                                               
638                                                   
639   // assert(fpTrack->GetTrackStatus() != fStop    
640                                                   
641   if (fpTrack->GetTrackStatus() == fStopAndKil    
642   {                                               
643 //    trackContainer->GetMainList()->pop(fpTra    
644     fpTrackingManager->EndTracking(fpTrack);      
645     CleanProcessor();                             
646     return;                                       
647   }                                               
648                                                   
649   if (IsInf(fTimeStep))                           
650   {                                               
651     // G4cout << "!!!!!!!!!!!! IS INF " << tra    
652     CleanProcessor();                             
653     return;                                       
654   }                                               
655   if (fTimeStep < fILTimeStep - DBL_EPSILON)      
656   {                                               
657     // G4cout << "!!!!!!!!!!!! TEMPS DIFFERENT    
658     //    << track->GetTrackID() << G4endl;       
659                                                   
660     fLeadingTracks.Reset();                       
661                                                   
662     fILTimeStep = GetInteractionTime();           
663                                                   
664 //    G4cout << "Will set leading step to true    
665 //           << SP -> GetInteractionTime() <<     
666 //           << G4BestUnit(fILTimeStep, "Time"    
667 //           << G4endl;                           
668                                                   
669 //    GetIT(fpTrack)->GetTrackingInfo()->SetLe    
670     fLeadingTracks.Push(fpTrack);                 
671   }                                               
672   else if(fabs(fILTimeStep - fTimeStep) < DBL_    
673   {                                               
674                                                   
675     // G4cout << "!!!!!!!!!!!! MEME TEMPS " <<    
676     // G4cout << "Will set leading step to tru    
677     //        << SP -> GetInteractionTime() <<    
678     //        << fTimeStep << " the trackID is    
679 //    GetIT(fpTrack)->GetTrackingInfo()->SetLe    
680     fLeadingTracks.Push(fpTrack);                 
681   }                                               
682   // else                                         
683   // {                                            
684   //     G4cout << "!!!! Bigger time : " << "c    
685   //  << " proposedTime : " << SP -> GetIntera    
686   // }                                            
687                                                   
688   CleanProcessor();                               
689 }                                                 
690                                                   
691 //____________________________________________    
692                                                   
693 void G4ITStepProcessor::DefinePhysicalStepLeng    
694 {                                                 
695   SetTrack(track);                                
696   DoDefinePhysicalStepLength();                   
697 }                                                 
698                                                   
699 //____________________________________________    
700                                                   
701 void G4ITStepProcessor::SetInitialStep()          
702 {                                                 
703   // DEBUG                                        
704   //    G4cout << "SetInitialStep for : " << f    
705   //__________________________________________    
706   // Initialize geometry                          
707                                                   
708   if(!fpTrack->GetTouchableHandle())              
709   {                                               
710     //========================================    
711     // Create navigator state and Locate parti    
712     //========================================    
713     /*                                            
714      fpNavigator->NewNavigatorStateAndLocate(f    
715      fpTrack->GetMomentumDirection());            
716                                                   
717      fpITrack->GetTrackingInfo()->                
718      SetNavigatorState(fpNavigator->GetNavigat    
719      */                                           
720     fpNavigator->NewNavigatorState();             
721     fpITrack->GetTrackingInfo()->SetNavigatorS    
722         ->GetNavigatorState());                   
723                                                   
724     G4ThreeVector direction = fpTrack->GetMome    
725     fpNavigator->LocateGlobalPointAndSetup(fpT    
726                                            &di    
727                                            fal    
728                                            fal    
729                                                   
730     fpState->fTouchableHandle = fpNavigator->C    
731                                                   
732     fpTrack->SetTouchableHandle(fpState->fTouc    
733     fpTrack->SetNextTouchableHandle(fpState->f    
734   }                                               
735   else                                            
736   {                                               
737     fpState->fTouchableHandle = fpTrack->GetTo    
738     fpTrack->SetNextTouchableHandle(fpState->f    
739                                                   
740     //========================================    
741     // Create OR set navigator state              
742     //========================================    
743                                                   
744     if(fpITrack->GetTrackingInfo()->GetNavigat    
745     {                                             
746       fpNavigator->SetNavigatorState(fpITrack-    
747           ->GetNavigatorState());                 
748       fpITrack->GetTrackingInfo()->SetNavigato    
749           ->GetNavigatorState());                 
750     }                                             
751     else                                          
752     {                                             
753       fpNavigator->NewNavigatorState(*((G4Touc    
754           ->fTouchableHandle()));                 
755       fpITrack->GetTrackingInfo()->SetNavigato    
756           ->GetNavigatorState());                 
757     }                                             
758                                                   
759     G4VPhysicalVolume* oldTopVolume =             
760         fpTrack->GetTouchableHandle()->GetVolu    
761                                                   
762     //========================================    
763     // Locate particle in geometry                
764     //========================================    
765                                                   
766 //    G4VPhysicalVolume* newTopVolume =           
767 //        fpNavigator->LocateGlobalPointAndSet    
768 //            fpTrack->GetPosition(),             
769 //            &fpTrack->GetMomentumDirection()    
770 //            true, false);                       
771                                                   
772     G4VPhysicalVolume* newTopVolume =             
773         fpNavigator->ResetHierarchyAndLocate(f    
774                                              f    
775                                              *    
776                                                   
777                                                   
778     if(newTopVolume != oldTopVolume || oldTopV    
779         == 1)                                     
780     {                                             
781       fpState->fTouchableHandle = fpNavigator-    
782       fpTrack->SetTouchableHandle(fpState->fTo    
783       fpTrack->SetNextTouchableHandle(fpState-    
784     }                                             
785   }                                               
786                                                   
787   fpCurrentVolume = fpState->fTouchableHandle-    
788                                                   
789   //__________________________________________    
790   // If the primary track has 'Suspend' or 'Po    
791   // set the track state to 'Alive'.              
792   if((fpTrack->GetTrackStatus() == fSuspend) |    
793       == fPostponeToNextEvent))                   
794   {                                               
795     fpTrack->SetTrackStatus(fAlive);              
796   }                                               
797                                                   
798   //HoangTRAN: it's better to check the status    
799   if(fpTrack->GetTrackStatus() == fStopAndKill    
800                                                   
801   // If the primary track has 'zero' kinetic e    
802   // state to 'StopButAlive'.                     
803   if(fpTrack->GetKineticEnergy() <= 0.0)          
804   {                                               
805     fpTrack->SetTrackStatus(fStopButAlive);       
806   }                                               
807   //__________________________________________    
808   // Set vertex information of G4Track at here    
809   if(fpTrack->GetCurrentStepNumber() == 0)        
810   {                                               
811     fpTrack->SetVertexPosition(fpTrack->GetPos    
812     fpTrack->SetVertexMomentumDirection(fpTrac    
813     fpTrack->SetVertexKineticEnergy(fpTrack->G    
814     fpTrack->SetLogicalVolumeAtVertex(fpTrack-    
815   }                                               
816   //__________________________________________    
817   // If track is already outside the world bou    
818   if(fpCurrentVolume == nullptr)                  
819   {                                               
820     // If the track is a primary, stop process    
821     if(fpTrack->GetParentID() == 0)               
822     {                                             
823       G4cerr << "ERROR - G4ITStepProcessor::Se    
824       << fpTrack->GetPosition()                   
825       << " - is outside of the world volume."     
826       G4Exception("G4ITStepProcessor::SetIniti    
827           FatalException, "Primary vertex outs    
828     }                                             
829                                                   
830     fpTrack->SetTrackStatus( fStopAndKill );      
831     G4cout << "WARNING - G4ITStepProcessor::Se    
832     << "          Initial track position is ou    
833     << fpTrack->GetPosition() << G4endl;          
834   }                                               
835   else                                            
836   {                                               
837     // Initial set up for attribues of 'Step'     
838     fpStep->InitializeStep( fpTrack );            
839   }                                               
840                                                   
841   fpState->fStepStatus = fUndefined;              
842 }                                                 
843 //____________________________________________    
844                                                   
845 void G4ITStepProcessor::InitDefineStep()          
846 {                                                 
847                                                   
848   if(fpStep == nullptr)                           
849   {                                               
850     // Create new Step and give it to the trac    
851     fpStep = new G4Step();                        
852     fpTrack->SetStep(fpStep);                     
853     fpSecondary = fpStep->NewSecondaryVector()    
854                                                   
855     // Create new state and set it in the trac    
856     fpState = new G4ITStepProcessorState();       
857     fpITrack->GetTrackingInfo()->SetStepProces    
858                                                   
859     SetupMembers();                               
860     SetInitialStep();                             
861                                                   
862     fpTrackingManager->StartTracking(fpTrack);    
863   }                                               
864   else                                            
865   {                                               
866     SetupMembers();                               
867                                                   
868     fpState->fPreviousStepSize = fpTrack->GetS    
869     /***                                          
870      // Send G4Step information to Hit/Dig if     
871      fpCurrentVolume = fpStep->GetPreStepPoint    
872      StepControlFlag =  fpStep->GetControlFlag    
873      if( fpCurrentVolume != 0 && StepControlFl    
874      {                                            
875      fpSensitive = fpStep->GetPreStepPoint()->    
876      GetSensitiveDetector();                      
877                                                   
878      //            if( fSensitive != 0 ) {        
879      //              fSensitive->Hit(fStep);      
880      //            }                              
881      }                                            
882      ***/                                         
883     // Store last PostStepPoint to PreStepPoin    
884     // volume information of G4Track. Reset to    
885     fpStep->CopyPostToPreStepPoint();             
886     fpStep->ResetTotalEnergyDeposit();            
887                                                   
888     //JA Set the volume before it is used (in     
889     fpCurrentVolume = fpStep->GetPreStepPoint(    
890     /*                                            
891      G4cout << G4endl;                            
892      G4cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!" <    
893      G4cout << "PreStepPoint Volume : "           
894      << fpCurrentVolume->GetName() << G4endl;     
895      G4cout << "Track Touchable : "               
896      << fpTrack->GetTouchableHandle()->GetVolu    
897      G4cout << "Track NextTouchable : "           
898      << fpTrack->GetNextTouchableHandle()->Get    
899      << G4endl;                                   
900      */                                           
901     // Reset the step's auxiliary points vecto    
902     fpStep->SetPointerToVectorOfAuxiliaryPoint    
903                                                   
904     // Switch next touchable in track to curre    
905     fpTrack->SetTouchableHandle(fpTrack->GetNe    
906     fpState->fTouchableHandle = fpTrack->GetTo    
907     fpTrack->SetNextTouchableHandle(fpState->f    
908                                                   
909     //! ADDED BACK                                
910     /*                                            
911      G4VPhysicalVolume* oldTopVolume =            
912      fpTrack->GetTouchableHandle()->GetVolume(    
913      fpNavigator->SetNavigatorState(              
914      fpITrack->GetTrackingInfo()->GetNavigator    
915                                                   
916      G4VPhysicalVolume* newTopVolume = fpNavig    
917      fpTrack->GetPosition(), fpTrack->GetMomen    
918      *((G4TouchableHistory*) fpTrack->GetTouch    
919                                                   
920      //  G4VPhysicalVolume* newTopVolume=         
921      //     fpNavigator->LocateGlobalPointAndS    
922      //                                           
923      //                                           
924                                                   
925      //        G4cout << "New Top Volume : " <    
926                                                   
927      if (newTopVolume != oldTopVolume || oldTo    
928      == 1)                                        
929      {                                            
930      fpState->fTouchableHandle = fpNavigator->    
931      fpTrack->SetTouchableHandle(fpState->fTou    
932      fpTrack->SetNextTouchableHandle(fpState->    
933      }                                            
934                                                   
935      */                                           
936     //! ADDED BACK                                
937     //========================================    
938     // Only reset navigator state + reset volu    
939     // No need to relocate                        
940     //========================================    
941     fpNavigator->SetNavigatorState(fpITrack->G    
942         ->GetNavigatorState());                   
943   }                                               
944 }                                                 
945                                                   
946 //____________________________________________    
947                                                   
948 // -------------------------------------------    
949 //  Compute Interaction Length                    
950 // -------------------------------------------    
951 void G4ITStepProcessor::DoDefinePhysicalStepLe    
952 {                                                 
953                                                   
954   InitDefineStep();                               
955                                                   
956 #ifdef G4VERBOSE                                  
957   // !!!!! Verbose                                
958   if(fpVerbose != nullptr) fpVerbose->DPSLStar    
959 #endif                                            
960                                                   
961   G4TrackStatus trackStatus = fpTrack->GetTrac    
962                                                   
963   if(trackStatus == fStopAndKill)                 
964   {                                               
965     return;                                       
966   }                                               
967                                                   
968   if(trackStatus == fStopButAlive)                
969   {                                               
970     fpITrack->GetTrackingInfo()->SetNavigatorS    
971         ->GetNavigatorState());                   
972     fpNavigator->ResetNavigatorState();           
973     return GetAtRestIL();                         
974   }                                               
975                                                   
976   // Find minimum Step length and correspondin    
977   // demanded by active disc./cont. processes     
978                                                   
979   // ReSet the counter etc.                       
980   fpState->fPhysicalStep = DBL_MAX; // Initial    
981   fPhysIntLength = DBL_MAX; // Initialize by a    
982                                                   
983   G4double proposedTimeStep = DBL_MAX;            
984   G4VProcess* processWithPostStepGivenByTimeSt    
985                                                   
986   // GPIL for PostStep                            
987   fPostStepDoItProcTriggered = fpProcessInfo->    
988   fPostStepAtTimeDoItProcTriggered = fpProcess    
989                                                   
990   //  G4cout << "fpProcessInfo->MAXofPostStepL    
991   //         << fpProcessInfo->MAXofPostStepLo    
992   //         << " mol : " << fpITrack -> GetNa    
993   //         << " id : " << fpTrack->GetTrackI    
994   //         << G4endl;                           
995                                                   
996   for(std::size_t np = 0; np < fpProcessInfo->    
997   {                                               
998     fpCurrentProcess = dynamic_cast<G4VITProce    
999         ->fpPostStepGetPhysIntVector)[(G4int)n    
1000     if(fpCurrentProcess == nullptr)              
1001     {                                            
1002       (fpState->fSelectedPostStepDoItVector)[    
1003       continue;                                  
1004     } // NULL means the process is inactivate    
1005                                                  
1006     fCondition = NotForced;                      
1007     fpCurrentProcess->SetProcessState(fpTrack    
1008         ->GetProcessID()));                      
1009                                                  
1010     // G4cout << "Is going to call : "           
1011     //        << fpCurrentProcess -> GetProce    
1012     //        << G4endl;                         
1013     fPhysIntLength = fpCurrentProcess->PostSt    
1014                                                  
1015                                                  
1016                                                  
1017 #ifdef G4VERBOSE                                 
1018     // !!!!! Verbose                             
1019     if(fpVerbose != nullptr) fpVerbose->DPSLP    
1020 #endif                                           
1021                                                  
1022     fpCurrentProcess->ResetProcessState();       
1023     //fpCurrentProcess->SetProcessState(0);      
1024                                                  
1025     switch(fCondition)                           
1026     {                                            
1027       case ExclusivelyForced: // Will need sp    
1028         (fpState->fSelectedPostStepDoItVector    
1029         fpState->fStepStatus = fExclusivelyFo    
1030         fpStep->GetPostStepPoint()->SetProces    
1031         break;                                   
1032                                                  
1033       case Conditionally:                        
1034         //       (fpState->fSelectedPostStepD    
1035         G4Exception("G4ITStepProcessor::Defin    
1036                     "ITStepProcessor0008",       
1037                     FatalException,              
1038                     "This feature is no more     
1039         break;                                   
1040                                                  
1041       case Forced:                               
1042         (fpState->fSelectedPostStepDoItVector    
1043         break;                                   
1044                                                  
1045       case StronglyForced:                       
1046         (fpState->fSelectedPostStepDoItVector    
1047         break;                                   
1048                                                  
1049       default:                                   
1050         (fpState->fSelectedPostStepDoItVector    
1051         break;                                   
1052     }                                            
1053                                                  
1054     if(fCondition == ExclusivelyForced)          
1055     {                                            
1056       for(std::size_t nrest = np + 1; nrest <    
1057           ++nrest)                               
1058       {                                          
1059         (fpState->fSelectedPostStepDoItVector    
1060       }                                          
1061       return; // Please note the 'return' at     
1062     }                                            
1063                                                  
1064     if(fPhysIntLength < fpState->fPhysicalSte    
1065     {                                            
1066       // To avoid checking whether the proces    
1067       // proposing a time step, the returned     
1068       // negative (just for tagging)             
1069       if(fpCurrentProcess->ProposesTimeStep()    
1070       {                                          
1071         fPhysIntLength *= -1;                    
1072         if(fPhysIntLength < proposedTimeStep)    
1073         {                                        
1074           proposedTimeStep = fPhysIntLength;     
1075           fPostStepAtTimeDoItProcTriggered =     
1076           processWithPostStepGivenByTimeStep     
1077         }                                        
1078       }                                          
1079       else                                       
1080       {                                          
1081         fpState->fPhysicalStep = fPhysIntLeng    
1082         fpState->fStepStatus = fPostStepDoItP    
1083         fPostStepDoItProcTriggered = G4int(np    
1084         fpStep->GetPostStepPoint()->SetProces    
1085       }                                          
1086     }                                            
1087   }                                              
1088                                                  
1089   // GPIL for AlongStep                          
1090   fpState->fProposedSafety = DBL_MAX;            
1091   G4double safetyProposedToAndByProcess = fpS    
1092                                                  
1093   for(std::size_t kp = 0; kp < fpProcessInfo-    
1094   {                                              
1095     fpCurrentProcess = dynamic_cast<G4VITProc    
1096         ->fpAlongStepGetPhysIntVector)[(G4int    
1097     if(fpCurrentProcess == nullptr) continue;    
1098     // NULL means the process is inactivated     
1099                                                  
1100     fpCurrentProcess->SetProcessState(           
1101         fpTrackingInfo->GetProcessState(fpCur    
1102     fPhysIntLength =                             
1103         fpCurrentProcess->AlongStepGPIL(*fpTr    
1104                                         fpSta    
1105                                         fpSta    
1106                                         safet    
1107                                         &fGPI    
1108                                                  
1109 #ifdef G4VERBOSE                                 
1110     // !!!!! Verbose                             
1111     if(fpVerbose != nullptr) fpVerbose->DPSLA    
1112 #endif                                           
1113                                                  
1114     if(fPhysIntLength < fpState->fPhysicalSte    
1115     {                                            
1116       fpState->fPhysicalStep = fPhysIntLength    
1117       // Should save PS and TS in IT             
1118                                                  
1119       // Check if the process wants to be the    
1120       // multi-scattering proposes Step limit    
1121       if(fGPILSelection == CandidateForSelect    
1122       {                                          
1123         fpState->fStepStatus = fAlongStepDoIt    
1124         fpStep->GetPostStepPoint()->SetProces    
1125       }                                          
1126                                                  
1127       // Transportation is assumed to be the     
1128       if(kp == fpProcessInfo->MAXofAlongStepL    
1129       {                                          
1130         fpTransportation = dynamic_cast<G4ITT    
1131                                                  
1132         if(fpTransportation == nullptr)          
1133         {                                        
1134           G4ExceptionDescription exceptionDes    
1135           exceptionDescription << "No transpo    
1136           G4Exception("G4ITStepProcessor::DoD    
1137                       "ITStepProcessor0009",     
1138                       FatalErrorInArgument,      
1139                       exceptionDescription);     
1140         }                                        
1141                                                  
1142         fTimeStep = fpTransportation->GetInte    
1143                                                  
1144         if(fpTrack->GetNextVolume() != nullpt    
1145         else fpState->fStepStatus = fWorldBou    
1146       }                                          
1147     }                                            
1148     else                                         
1149     {                                            
1150       if(kp == fpProcessInfo->MAXofAlongStepL    
1151       {                                          
1152         fpTransportation = dynamic_cast<G4ITT    
1153                                                  
1154         if(fpTransportation == nullptr)          
1155         {                                        
1156           G4ExceptionDescription exceptionDes    
1157           exceptionDescription << "No transpo    
1158           G4Exception("G4ITStepProcessor::DoD    
1159                       "ITStepProcessor0010",     
1160                       FatalErrorInArgument,      
1161                       exceptionDescription);     
1162         }                                        
1163                                                  
1164         fTimeStep = fpTransportation->GetInte    
1165       }                                          
1166     }                                            
1167                                                  
1168     // Handle PostStep processes sending back    
1169     if(proposedTimeStep < fTimeStep)             
1170     {                                            
1171       if(fPostStepAtTimeDoItProcTriggered < f    
1172       {                                          
1173         if((fpState->fSelectedPostStepDoItVec    
1174         {                                        
1175           (fpState->fSelectedPostStepDoItVect    
1176               NotForced;                         
1177           // (fpState->fSelectedPostStepDoItV    
1178                                                  
1179           fpState->fStepStatus = fPostStepDoI    
1180           fpStep->GetPostStepPoint()->SetProc    
1181                                                  
1182           fTimeStep = proposedTimeStep;          
1183                                                  
1184           fpTransportation->ComputeStep(*fpTr    
1185                                         *fpSt    
1186                                         fTime    
1187                                         fpSta    
1188         }                                        
1189       }                                          
1190     }                                            
1191     else                                         
1192     {                                            
1193       if(fPostStepDoItProcTriggered < fpProce    
1194       {                                          
1195         if((fpState->fSelectedPostStepDoItVec    
1196         {                                        
1197           (fpState->fSelectedPostStepDoItVect    
1198               NotForced;                         
1199         }                                        
1200       }                                          
1201     }                                            
1202                                                  
1203 //  fpCurrentProcess->SetProcessState(0);        
1204     fpCurrentProcess->ResetProcessState();       
1205                                                  
1206     // Make sure to check the safety, even if    
1207     //  by this process.                         
1208     //                                           
1209     if(safetyProposedToAndByProcess < fpState    
1210     // proposedSafety keeps the smallest valu    
1211     fpState->fProposedSafety = safetyProposed    
1212     else                                         
1213     // safetyProposedToAndByProcess always pr    
1214     safetyProposedToAndByProcess = fpState->f    
1215                                                  
1216   }                                              
1217                                                  
1218   fpITrack->GetTrackingInfo()->SetNavigatorSt    
1219   fpNavigator->ResetNavigatorState();            
1220 }                                                
1221                                                  
1222 //___________________________________________    
1223