Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/dna/management/src/G4ITStepProcessor2.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/G4ITStepProcessor2.cc (Version 11.3.0) and /processes/electromagnetic/dna/management/src/G4ITStepProcessor2.cc (Version 8.1.p2)


  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 #include "G4LossTableManager.hh"                  
 37 #include "G4EnergyLossTables.hh"                  
 38 #include "G4ProductionCuts.hh"                    
 39 #include "G4ProductionCutsTable.hh"               
 40 #include "G4VITProcess.hh"                        
 41 #include "G4TrackingInformation.hh"               
 42 #include "G4IT.hh"                                
 43 #include "G4ITTrackingManager.hh"                 
 44 #include "G4ITTransportation.hh"                  
 45                                                   
 46 #include "G4ITNavigator.hh"             // Inc    
 47                                                   
 48 #include "G4ITSteppingVerbose.hh"                 
 49 #include "G4VITSteppingVerbose.hh"                
 50                                                   
 51 #include "G4ITTrackHolder.hh"                     
 52 #include "G4ITReaction.hh"                        
 53                                                   
 54                                                   
 55 //#define DEBUG_MEM 1                             
 56                                                   
 57 #ifdef DEBUG_MEM                                  
 58 #include "G4MemStat.hh"                           
 59 using namespace G4MemStat;                        
 60 using G4MemStat::MemStat;                         
 61 #endif                                            
 62                                                   
 63 void G4ITStepProcessor::DealWithSecondaries(G4    
 64 {                                                 
 65   // Now Store the secondaries from ParticleCh    
 66   G4Track* tempSecondaryTrack;                    
 67                                                   
 68   for(G4int DSecLoop = 0; DSecLoop < fpParticl    
 69       DSecLoop++)                                 
 70   {                                               
 71     tempSecondaryTrack = fpParticleChange->Get    
 72                                                   
 73     if(tempSecondaryTrack->GetDefinition()->Ge    
 74     {                                             
 75       ApplyProductionCut(tempSecondaryTrack);     
 76     }                                             
 77                                                   
 78     // Set parentID                               
 79     tempSecondaryTrack->SetParentID(fpTrack->G    
 80                                                   
 81     // Set the process pointer which created t    
 82     tempSecondaryTrack->SetCreatorProcess(fpCu    
 83                                                   
 84     // If this 2ndry particle has 'zero' kinet    
 85     // it invokes a rest process at the beginn    
 86     if(tempSecondaryTrack->GetKineticEnergy()     
 87     {                                             
 88       G4ProcessManager* pm = tempSecondaryTrac    
 89       if (pm->GetAtRestProcessVector()->entrie    
 90       {                                           
 91         tempSecondaryTrack->SetTrackStatus( fS    
 92         fpSecondary->push_back( tempSecondaryT    
 93         fN2ndariesAtRestDoIt++;                   
 94       }                                           
 95       else                                        
 96       {                                           
 97         delete tempSecondaryTrack;                
 98       }                                           
 99     }                                             
100     else                                          
101     {                                             
102       fpSecondary->push_back( tempSecondaryTra    
103       counter++;                                  
104     }                                             
105   } //end of loop on secondary                    
106 }                                                 
107                                                   
108 //____________________________________________    
109                                                   
110 void G4ITStepProcessor::DoIt(double timeStep)     
111                                                   
112 // Call the process having the min step length    
113                                                   
114 // If the track is "leading the step" (ie one     
115 // as the one having the minimum time step ove    
116 // it will undergo its selected processes. Oth    
117 // on the given time step.                        
118                                                   
119 {                                                 
120   if(fpVerbose != nullptr) fpVerbose->DoItStar    
121                                                   
122   G4TrackManyList* mainList = fpTrackContainer    
123   G4TrackManyList::iterator it = mainList->end    
124   it--;                                           
125   std::size_t initialSize = mainList->size();     
126                                                   
127 //    G4cout << "initialSize = " << initialSiz    
128                                                   
129   for(std::size_t i = 0 ; i < initialSize ; ++    
130   {                                               
131                                                   
132 //      G4cout << "i = " << i << G4endl;          
133                                                   
134     G4Track* track = *it;                         
135     if (track == nullptr)                         
136     {                                             
137       G4ExceptionDescription exceptionDescript    
138       exceptionDescription << "No track was po    
139       G4Exception("G4ITStepProcessor::DoIt", "    
140                   FatalException, exceptionDes    
141     }                                             
142     // G4TrackManyList::iterator next_it (it);    
143     // next_it--;                                 
144     // it = next_it;                              
145                                                   
146     it--;                                         
147     // Must be called before EndTracking(track    
148     // Otherwise the iterator will point to th    
149                                                   
150     if(track->GetTrackStatus() == fStopAndKill    
151     {                                             
152       fpTrackingManager->EndTracking(track);      
153 //      G4cout << GetIT(track)->GetName() << G    
154 //      G4cout << " ************************ C    
155       continue;                                   
156     }                                             
157                                                   
158 #if defined (DEBUG_MEM) && defined (DEBUG_MEM_    
159     MemStat mem_first, mem_second, mem_diff;      
160     mem_first = MemoryUsage();                    
161 #endif                                            
162                                                   
163     Stepping(track, timeStep);                    
164                                                   
165 #if defined (DEBUG_MEM) && defined (DEBUG_MEM_    
166     MemStat mem_intermediaire = MemoryUsage();    
167     mem_diff = mem_intermediaire-mem_first;       
168     G4cout << "\t\t >> || MEM || In DoIT with     
169         << track->GetTrackID() << ", diff is :    
170 #endif                                            
171                                                   
172     ExtractDoItData();                            
173                                                   
174 #if defined (DEBUG_MEM) && defined (DEBUG_MEM_    
175     mem_second = MemoryUsage();                   
176     mem_diff = mem_second-mem_first;              
177     G4cout << "\t >> || MEM || In DoIT with tr    
178         << track->GetTrackID()                    
179         << ", diff is : " << mem_diff << G4end    
180 #endif                                            
181   }                                               
182                                                   
183                                                   
184   fpTrackContainer->MergeSecondariesWithMainLi    
185   fpTrackContainer->KillTracks(); // (18-06-15    
186   fLeadingTracks.Reset();                         
187 }                                                 
188                                                   
189 //____________________________________________    
190                                                   
191 void G4ITStepProcessor::ExtractDoItData()         
192 {                                                 
193   if (fpTrack == nullptr)                         
194   {                                               
195     CleanProcessor();                             
196     return;                                       
197   }                                               
198                                                   
199   G4TrackStatus status = fpTrack->GetTrackStat    
200                                                   
201   switch (status)                                 
202   {                                               
203     case fAlive:                                  
204     case fStopButAlive:                           
205     case fSuspend:                                
206     case fPostponeToNextEvent:                    
207     default:                                      
208       PushSecondaries();                          
209       break;                                      
210                                                   
211     case fStopAndKill:                            
212       G4ITReactionSet::Instance()->RemoveReact    
213       PushSecondaries();                          
214 //      G4TrackList::Pop(fpTrack);                
215       fpTrackingManager->EndTracking(fpTrack);    
216 //      fTrackContainer->PushToKill(fpTrack);     
217       break;                                      
218                                                   
219     case fKillTrackAndSecondaries:                
220       G4ITReactionSet::Instance()->RemoveReact    
221       if (fpSecondary != nullptr)                 
222       {                                           
223         for (auto & i : *fpSecondary)             
224         {                                         
225           delete i;                               
226         }                                         
227         fpSecondary->clear();                     
228       }                                           
229 //      G4TrackList::Pop(fpTrack);                
230       fpTrackingManager->EndTracking(fpTrack);    
231 //      fTrackContainer->PushToKill(fpTrack);     
232       break;                                      
233   }                                               
234                                                   
235   CleanProcessor();                               
236 }                                                 
237                                                   
238 //____________________________________________    
239                                                   
240 void G4ITStepProcessor::PushSecondaries()         
241 {                                                 
242   if ((fpSecondary == nullptr) || fpSecondary-    
243   {                                               
244     // DEBUG                                      
245     //      G4cout << "NO SECONDARIES !!! " <<    
246     return;                                       
247   }                                               
248                                                   
249   // DEBUG                                        
250   //    G4cout << "There are secondaries : "<<    
251                                                   
252   auto secondaries_i = fpSecondary->begin();      
253                                                   
254   for (; secondaries_i != fpSecondary->end();     
255   {                                               
256     G4Track* secondary = *secondaries_i;          
257     fpTrackContainer->_PushTrack(secondary);      
258   }                                               
259 }                                                 
260                                                   
261 //____________________________________________    
262                                                   
263 void G4ITStepProcessor::Stepping(G4Track* trac    
264 {                                                 
265                                                   
266 #ifdef DEBUG_MEM                                  
267   MemStat mem_first, mem_second, mem_diff;        
268 #endif                                            
269                                                   
270 #ifdef DEBUG_MEM                                  
271   mem_first = MemoryUsage();                      
272 #endif                                            
273                                                   
274   CleanProcessor();                               
275                                                   
276 #ifdef DEBUG_MEM                                  
277   MemStat mem_intermediaire = MemoryUsage();      
278   mem_diff = mem_intermediaire-mem_first;         
279   G4cout << "\t\t\t >> || MEM || After CleanPr    
280 #endif                                            
281                                                   
282   if(track == nullptr) return; // maybe put an    
283   fTimeStep = timeStep;                           
284   SetTrack(track);                                
285   DoStepping();                                   
286 }                                                 
287 //____________________________________________    
288                                                   
289 // *******************************************    
290 //  Stepping                                      
291 // *******************************************    
292 void G4ITStepProcessor::DoStepping()              
293 {                                                 
294   SetupMembers();                                 
295                                                   
296 #ifdef DEBUG_MEM                                  
297   MemStat mem_first, mem_second, mem_diff;        
298 #endif                                            
299                                                   
300 #ifdef DEBUG_MEM                                  
301   mem_first = MemoryUsage();                      
302 #endif                                            
303                                                   
304 #ifdef G4VERBOSE                                  
305     if(fpVerbose != nullptr) fpVerbose->PreSte    
306 #endif                                            
307                                                   
308   if(fpProcessInfo == nullptr)                    
309   {                                               
310     G4ExceptionDescription exceptionDescriptio    
311     exceptionDescription << "No process info f    
312                          << fpTrack->GetDefini    
313     G4Exception("G4ITStepProcessor::DoStepping    
314                 "ITStepProcessor0012",            
315                 FatalErrorInArgument,             
316                 exceptionDescription);            
317     return;                                       
318   }                                               
319 //  else if(fpTrack->GetTrackStatus() == fStop    
320 //  {                                             
321 //    fpState->fStepStatus = fUndefined;          
322 //    return;                                     
323 //  }                                             
324                                                   
325   if(fpProcessInfo->MAXofPostStepLoops == 0 &&    
326       fpProcessInfo->MAXofAlongStepLoops == 0     
327      && fpProcessInfo->MAXofAtRestLoops == 0)     
328   {/*                                             
329     G4ExceptionDescription exceptionDescriptio    
330     exceptionDescription << "No process was fo    
331                          << fpTrack->GetDefini    
332     G4Exception("G4ITStepProcessor::DoStepping    
333                 "ITStepProcessorNoProcess",       
334                 JustWarning,                      
335                 exceptionDescription);            
336                                                   
337     fpTrack->SetTrackStatus(fStopAndKill);        
338     fpState->fStepStatus = fUndefined;*/          
339     return;                                       
340   }                                               
341                                                   
342   //--------                                      
343   // Prelude                                      
344   //--------                                      
345 #ifdef G4VERBOSE                                  
346   // !!!!! Verbose                                
347   if(fpVerbose != nullptr) fpVerbose->NewStep(    
348 #endif                                            
349                                                   
350   //---------------------------------             
351   // AtRestStep, AlongStep and PostStep Proces    
352   //---------------------------------             
353                                                   
354   fpNavigator->SetNavigatorState(fpITrack->Get    
355 //        fpNavigator->ResetHierarchyAndLocate    
356 //                                                
357 //                                                
358 //        fpNavigator->SetNavigatorState(fpITr    
359   // We reset the navigator state before check    
360   // in case a AtRest processe would use a nav    
361                                                   
362 #ifdef DEBUG_MEM                                  
363   MemStat mem_intermediaire = MemoryUsage();      
364   mem_diff = mem_intermediaire-mem_first;         
365   G4cout << "\t\t\t >> || MEM || G4ITStepProce    
366 #endif                                            
367                                                   
368   if(fpTrack->GetTrackStatus() == fStopButAliv    
369   {                                               
370     if(fpProcessInfo->MAXofAtRestLoops > 0 &&     
371         != nullptr) // second condition to mak    
372     {                                             
373       //-----------------                         
374       // AtRestStepDoIt                           
375       //-----------------                         
376       InvokeAtRestDoItProcs();                    
377       fpState->fStepStatus = fAtRestDoItProc;     
378       fpStep->GetPostStepPoint()->SetStepStatu    
379                                                   
380 #ifdef G4VERBOSE                                  
381             // !!!!! Verbose                      
382       if(fpVerbose != nullptr) fpVerbose->AtRe    
383 #endif                                            
384                                                   
385     }                                             
386     // Make sure the track is killed              
387     // fpTrack->SetTrackStatus(fStopAndKill);     
388   }                                               
389   else // if(fTimeStep > 0.) // Bye, because P    
390   {                                               
391     if(fpITrack == nullptr)                       
392     {                                             
393       G4ExceptionDescription exceptionDescript    
394       exceptionDescription << " !!! TrackID :     
395                            << G4endl<< " !!! T    
396       << " !!! Particle Name : "<< fpTrack ->     
397       << "No G4ITStepProcessor::fpITrack found    
398                                                   
399       G4Exception("G4ITStepProcessor::DoSteppi    
400                   "ITStepProcessor0013",          
401                   FatalErrorInArgument,           
402                   exceptionDescription);          
403       return; // to make coverity happy           
404     }                                             
405                                                   
406     if(!fpITrack->GetTrackingInfo()->IsLeading    
407     {                                             
408       // In case the track has NOT the minimum    
409       // Given the final step time, the transp    
410       // will compute the final position of th    
411       fpState->fStepStatus = fPostStepDoItProc    
412       fpStep->GetPostStepPoint()->SetProcessDe    
413       FindTransportationStep();                   
414     }                                             
415                                                   
416 #ifdef DEBUG_MEM                                  
417     mem_intermediaire = MemoryUsage();            
418     mem_diff = mem_intermediaire-mem_first;       
419     G4cout << "\t\t\t >> || MEM || G4ITStepPro    
420 #endif                                            
421                                                   
422     // Store the Step length (geometrical leng    
423     fpTrack->SetStepLength(fpState->fPhysicalS    
424     fpStep->SetStepLength(fpState->fPhysicalSt    
425                                                   
426     G4double GeomStepLength = fpState->fPhysic    
427                                                   
428     // Store StepStatus to PostStepPoint          
429     fpStep->GetPostStepPoint()->SetStepStatus(    
430                                                   
431     // Invoke AlongStepDoIt                       
432     InvokeAlongStepDoItProcs();                   
433                                                   
434 #ifdef DEBUG_MEM                                  
435     mem_intermediaire = MemoryUsage();            
436     mem_diff = mem_intermediaire-mem_first;       
437     G4cout << "\t\t\t >> || MEM || G4ITStepPro    
438 #endif                                            
439                                                   
440 #ifdef G4VERBOSE                                  
441     // !!!!! Verbose                              
442     if(fpVerbose != nullptr) fpVerbose->AlongS    
443 #endif                                            
444                                                   
445     // Update track by taking into account all    
446     // fpStep->UpdateTrack(); // done in Invok    
447                                                   
448     // Update safety after invocation of all A    
449     fpState->fEndpointSafOrigin = fpPostStepPo    
450                                                   
451     fpState->fEndpointSafety =                    
452         std::max(fpState->fProposedSafety - Ge    
453                                                   
454     fpStep->GetPostStepPoint()->SetSafety(fpSt    
455                                                   
456     if(GetIT(fpTrack)->GetTrackingInfo()->IsLe    
457     {                                             
458       // Invoke PostStepDoIt including G4ITTra    
459       InvokePostStepDoItProcs();                  
460                                                   
461 #ifdef DEBUG_MEM                                  
462       mem_intermediaire = MemoryUsage();          
463       mem_diff = mem_intermediaire-mem_first;     
464       G4cout << "\t\t\t >> || MEM || G4ITStepP    
465 #endif                                            
466 #ifdef G4VERBOSE                                  
467     // !!!!! Verbose                              
468     if(fpVerbose != nullptr) fpVerbose->StepIn    
469 #endif                                            
470     }                                             
471     else                                          
472     {                                             
473       // Only invoke transportation and all ot    
474       InvokeTransportationProc();                 
475       fpStep->GetPostStepPoint()->SetProcessDe    
476                                                   
477 #ifdef DEBUG_MEM                                  
478       mem_intermediaire = MemoryUsage();          
479       mem_diff = mem_intermediaire-mem_first;     
480       G4cout << "\t\t\t >> || MEM || G4ITStepP    
481 #endif                                            
482     }                                             
483                                                   
484 #ifdef G4VERBOSE                                  
485     // !!!!! Verbose                              
486     if(fpVerbose != nullptr) fpVerbose->PostSt    
487 #endif                                            
488   }                                               
489                                                   
490   fpNavigator->ResetNavigatorState();             
491                                                   
492 #ifdef DEBUG_MEM                                  
493   mem_intermediaire = MemoryUsage();              
494   mem_diff = mem_intermediaire-mem_first;         
495   G4cout << "\t\t\t >> || MEM || G4ITStepProce    
496 #endif                                            
497                                                   
498   //-------                                       
499   // Finale                                       
500   //-------                                       
501                                                   
502   // Update 'TrackLength' and remeber the Step    
503   fpTrack->AddTrackLength(fpStep->GetStepLengt    
504   fpTrack->IncrementCurrentStepNumber();          
505                                                   
506 //#ifdef G4VERBOSE                                
507 // //    !!!!! Verbose                            
508 //  if(fpVerbose) fpVerbose->StepInfo();          
509 //#endif                                          
510                                                   
511 #ifdef G4VERBOSE                                  
512     if(fpVerbose != nullptr) fpVerbose->PostSt    
513 #endif                                            
514                                                   
515 //    G4cout << " G4ITStepProcessor::DoSteppin    
516                                                   
517   // Send G4Step information to Hit/Dig if the    
518   /***                                            
519    fpCurrentVolume = fpStep->GetPreStepPoint()    
520    StepControlFlag =  fpStep->GetControlFlag()    
521                                                   
522    if( fpCurrentVolume != 0 && StepControlFlag    
523    {                                              
524    fpSensitive = fpStep->GetPreStepPoint()->      
525    GetSensitiveDetector();                        
526    if( fpSensitive != 0 )                         
527    {                                              
528    fpSensitive->Hit(fpStep);                      
529    }                                              
530    }                                              
531                                                   
532    User intervention process.                     
533    if( fpUserSteppingAction != 0 )                
534    {                                              
535    fpUserSteppingAction->UserSteppingAction(fp    
536    }                                              
537    G4UserSteppingAction* regionalAction           
538    = fpStep->GetPreStepPoint()->GetPhysicalVol    
539    ->GetRegionalSteppingAction();                 
540    if( regionalAction ) regionalAction->UserSt    
541    ***/                                           
542   fpTrackingManager->AppendStep(fpTrack, fpSte    
543   // Stepping process finish. Return the value    
544                                                   
545 #ifdef DEBUG_MEM                                  
546   MemStat mem_intermediaire = MemoryUsage();      
547   mem_diff = mem_intermediaire-mem_first;         
548   G4cout << "\t\t\t >> || MEM || End of DoStep    
549 #endif                                            
550                                                   
551   //    return fpState->fStepStatus;              
552 }                                                 
553                                                   
554 //____________________________________________    
555                                                   
556 // *******************************************    
557 //  AtRestDoIt                                    
558 // *******************************************    
559                                                   
560 void G4ITStepProcessor::InvokeAtRestDoItProcs(    
561 {                                                 
562   fpStep->SetStepLength(0.);  //the particle h    
563   fpTrack->SetStepLength(0.);                     
564                                                   
565   G4SelectedAtRestDoItVector& selectedAtRestDo    
566       fpState->fSelectedAtRestDoItVector;         
567                                                   
568   // invoke selected process                      
569   for(std::size_t np = 0; np < fpProcessInfo->    
570   {                                               
571     //                                            
572     // Note: DoItVector has inverse order agai    
573     //       and SelectedAtRestDoItVector.        
574     //                                            
575     if(selectedAtRestDoItVector[fpProcessInfo-    
576     {                                             
577       fpCurrentProcess =                          
578           (G4VITProcess*) (*fpProcessInfo->fpA    
579                                                   
580 //      G4cout << " Invoke : "                    
581 //             << fpCurrentProcess->GetProcess    
582 //             << G4endl;                         
583                                                   
584       //  if(fpVerbose)                           
585       //  {                                       
586       //    fpVerbose->AtRestDoItOneByOne();      
587       //  }                                       
588                                                   
589       fpCurrentProcess->SetProcessState(fpTrac    
590           ->GetProcessID()));                     
591       fpParticleChange = fpCurrentProcess->AtR    
592       fpCurrentProcess->ResetProcessState();      
593                                                   
594       // Set the current process as a process     
595       fpStep->GetPostStepPoint()->SetProcessDe    
596                                                   
597       // Update Step                              
598       fpParticleChange->UpdateStepForAtRest(fp    
599                                                   
600       // Now Store the secondaries from Partic    
601       DealWithSecondaries(fN2ndariesAtRestDoIt    
602                                                   
603       // Set the track status according to wha    
604       // if kinetic energy >0, otherwise set      
605       fpTrack->SetTrackStatus(fpParticleChange    
606                                                   
607       // clear ParticleChange                     
608       fpParticleChange->Clear();                  
609                                                   
610     } //if(fSelectedAtRestDoItVector[np] != In    
611   } //for(std::size_t np=0; np < MAXofAtRestLo    
612   fpStep->UpdateTrack();                          
613                                                   
614   // Modification par rapport au transport sta    
615   // fStopAndKill doit etre propose par le mod    
616   // sinon d autres processus AtRest seront ap    
617   // au pas suivant                               
618   // fpTrack->SetTrackStatus(fStopAndKill);       
619 }                                                 
620                                                   
621 //____________________________________________    
622                                                   
623 // *******************************************    
624 //  AlongStepDoIt                                 
625 // *******************************************    
626                                                   
627 void G4ITStepProcessor::InvokeAlongStepDoItPro    
628 {                                                 
629                                                   
630 #ifdef DEBUG_MEM                                  
631   MemStat mem_first, mem_second, mem_diff;        
632 #endif                                            
633                                                   
634 #ifdef DEBUG_MEM                                  
635   mem_first = MemoryUsage();                      
636 #endif                                            
637                                                   
638   // If the current Step is defined by a 'Excl    
639   // PostStepDoIt, then don't invoke any Along    
640   if(fpState->fStepStatus == fExclusivelyForce    
641   {                                               
642     return;               // Take note 'return    
643   }                                               
644                                                   
645   // Invoke the all active continuous processe    
646   for(std::size_t ci = 0; ci < fpProcessInfo->    
647   {                                               
648     fpCurrentProcess =                            
649         (G4VITProcess*) (*fpProcessInfo->fpAlo    
650     if(fpCurrentProcess == nullptr) continue;     
651     // NULL means the process is inactivated b    
652                                                   
653     fpCurrentProcess->SetProcessState(fpTracki    
654         ->GetProcessID()));                       
655     fpParticleChange = fpCurrentProcess->Along    
656                                                   
657 #ifdef DEBUG_MEM                                  
658     MemStat mem_intermediaire = MemoryUsage();    
659     mem_diff = mem_intermediaire-mem_first;       
660     G4cout << "\t\t\t >> || MEM || After calli    
661 #endif                                            
662                                                   
663 //        fpCurrentProcess->SetProcessState(0)    
664     fpCurrentProcess->ResetProcessState();        
665     // Update the PostStepPoint of Step accord    
666                                                   
667     fpParticleChange->UpdateStepForAlongStep(f    
668                                                   
669 #ifdef G4VERBOSE                                  
670     // !!!!! Verbose                              
671     if(fpVerbose != nullptr) fpVerbose->AlongS    
672 #endif                                            
673                                                   
674     // Now Store the secondaries from Particle    
675     DealWithSecondaries(fN2ndariesAlongStepDoI    
676                                                   
677     // Set the track status according to what     
678     // if kinetic energy >0, otherwise set  fS    
679     fpTrack->SetTrackStatus(fpParticleChange->    
680                                                   
681     // clear ParticleChange                       
682     fpParticleChange->Clear();                    
683   }                                               
684                                                   
685 #ifdef DEBUG_MEM                                  
686   MemStat mem_intermediaire = MemoryUsage();      
687   mem_diff = mem_intermediaire-mem_first;         
688   G4cout << "\t\t\t >> || MEM || After looping    
689 #endif                                            
690                                                   
691   fpStep->UpdateTrack();                          
692                                                   
693   G4TrackStatus fNewStatus = fpTrack->GetTrack    
694                                                   
695   if(fNewStatus == fAlive && fpTrack->GetKinet    
696   {                                               
697     //        G4cout << "G4ITStepProcessor::In    
698     if(fpProcessInfo->MAXofAtRestLoops>0) fNew    
699     else fNewStatus = fStopAndKill;               
700     fpTrack->SetTrackStatus( fNewStatus );        
701   }                                               
702                                                   
703 }                                                 
704                                                   
705 //____________________________________________    
706                                                   
707 // *******************************************    
708 //  PostStepDoIt                                  
709 // *******************************************    
710                                                   
711 void G4ITStepProcessor::InvokePostStepDoItProc    
712 {                                                 
713   std::size_t _MAXofPostStepLoops = fpProcessI    
714   G4SelectedPostStepDoItVector& selectedPostSt    
715       ->fSelectedPostStepDoItVector;              
716   G4StepStatus& stepStatus = fpState->fStepSta    
717                                                   
718   // Invoke the specified discrete processes      
719   for(std::size_t np = 0; np < _MAXofPostStepL    
720   {                                               
721     //                                            
722     // Note: DoItVector has inverse order agai    
723     //       and SelectedPostStepDoItVector.      
724     //                                            
725     G4int Cond = selectedPostStepDoItVector[_M    
726                                             -     
727     if(Cond != InActivated)                       
728     {                                             
729       if(((Cond == NotForced) && (stepStatus =    
730           ((Cond == Forced) && (stepStatus !=     
731          ||                                       
732          // ((Cond == Conditionally) && (stepS    
733          ((Cond == ExclusivelyForced) && (step    
734          || ((Cond == StronglyForced)))           
735       {                                           
736                                                   
737         InvokePSDIP(np);                          
738       }                                           
739     } //if(*fSelectedPostStepDoItVector(np)...    
740                                                   
741     // Exit from PostStepLoop if the track has    
742     // but extra treatment for processes with     
743     if(fpTrack->GetTrackStatus() == fStopAndKi    
744     {                                             
745       for(std::size_t np1 = np + 1; np1 < _MAX    
746       {                                           
747         G4int Cond2 = selectedPostStepDoItVect    
748                                                   
749         if(Cond2 == StronglyForced)               
750         {                                         
751           InvokePSDIP(np1);                       
752         }                                         
753       }                                           
754       break;                                      
755     }                                             
756   } //for(std::size_t np=0; np < MAXofPostStep    
757 }                                                 
758                                                   
759 //____________________________________________    
760                                                   
761 void G4ITStepProcessor::InvokePSDIP(std::size_    
762 {                                                 
763   fpCurrentProcess = (G4VITProcess*) (*fpProce    
764                                                   
765   fpCurrentProcess->SetProcessState(fpTracking    
766       ->GetProcessID()));                         
767   fpParticleChange = fpCurrentProcess->PostSte    
768 //    fpCurrentProcess->SetProcessState(0);       
769   fpCurrentProcess->ResetProcessState();          
770                                                   
771   // Update PostStepPoint of Step according to    
772   fpParticleChange->UpdateStepForPostStep(fpSt    
773                                                   
774 #ifdef G4VERBOSE                                  
775   // !!!!! Verbose                                
776   if(fpVerbose != nullptr) fpVerbose->PostStep    
777 #endif                                            
778                                                   
779   // Update G4Track according to ParticleChang    
780   fpStep->UpdateTrack();                          
781                                                   
782   // Update safety after each invocation of Po    
783   fpStep->GetPostStepPoint()->SetSafety(Calcul    
784                                                   
785   // Now Store the secondaries from ParticleCh    
786   DealWithSecondaries(fN2ndariesPostStepDoIt);    
787                                                   
788   // Set the track status according to what th    
789   fpTrack->SetTrackStatus(fpParticleChange->Ge    
790                                                   
791   // clear ParticleChange                         
792   fpParticleChange->Clear();                      
793 }                                                 
794                                                   
795 //____________________________________________    
796                                                   
797 // *******************************************    
798 //  Transport on a given time                     
799 // *******************************************    
800                                                   
801 void G4ITStepProcessor::FindTransportationStep    
802 {                                                 
803   double physicalStep(0.);                        
804                                                   
805   fpTransportation = fpProcessInfo->fpTranspor    
806   // dynamic_cast<G4ITTransportation*>((fpProc    
807                                                   
808   if(fpTrack == nullptr)                          
809   {                                               
810     G4ExceptionDescription exceptionDescriptio    
811     exceptionDescription << "No G4ITStepProces    
812     G4Exception("G4ITStepProcessor::FindTransp    
813                 "ITStepProcessor0013",            
814                 FatalErrorInArgument,             
815                 exceptionDescription);            
816     return;                                       
817                                                   
818   }                                               
819   if(fpITrack == nullptr)                         
820   {                                               
821     G4ExceptionDescription exceptionDescriptio    
822     exceptionDescription << "No G4ITStepProces    
823     G4Exception("G4ITStepProcessor::FindTransp    
824                 "ITStepProcessor0014",            
825                 FatalErrorInArgument,             
826                 exceptionDescription);            
827     return;                                       
828   }                                               
829   if((fpITrack->GetTrack()) == nullptr)           
830   {                                               
831     G4ExceptionDescription exceptionDescriptio    
832     exceptionDescription << "No G4ITStepProces    
833     G4Exception("G4ITStepProcessor::FindTransp    
834                 "ITStepProcessor0015",            
835                 FatalErrorInArgument,             
836                 exceptionDescription);            
837     return;                                       
838   }                                               
839                                                   
840   if(fpTransportation != nullptr)                 
841   {                                               
842     fpTransportation->SetProcessState(fpTracki    
843         ->GetProcessID()));                       
844     fpTransportation->ComputeStep(*fpTrack, *f    
845                                                   
846 //        fpTransportation->SetProcessState(0)    
847     fpTransportation->ResetProcessState();        
848   }                                               
849                                                   
850   if(physicalStep >= DBL_MAX)                     
851   {                                               
852 //    G4cout << "---- 2) Setting stop and kill    
853     fpTrack -> SetTrackStatus(fStopAndKill);      
854     return;                                       
855   }                                               
856                                                   
857   fpState->fPhysicalStep = physicalStep;          
858 }                                                 
859                                                   
860 //____________________________________________    
861                                                   
862 void G4ITStepProcessor::InvokeTransportationPr    
863 {                                                 
864   std::size_t _MAXofPostStepLoops = fpProcessI    
865   G4SelectedPostStepDoItVector& selectedPostSt    
866       ->fSelectedPostStepDoItVector;              
867   G4StepStatus& stepStatus = fpState->fStepSta    
868                                                   
869   // Invoke the specified discrete processes      
870   for(std::size_t np = 0; np < _MAXofPostStepL    
871   {                                               
872     //                                            
873     // Note: DoItVector has inverse order agai    
874     //       and SelectedPostStepDoItVector.      
875     //                                            
876     G4int Cond = selectedPostStepDoItVector[_M    
877     if(Cond != InActivated)                       
878     {                                             
879       if(((Cond == Forced) && (stepStatus != f    
880       // ((Cond == Conditionally) && (stepStat    
881       ((Cond == ExclusivelyForced) && (stepSta    
882          || ((Cond == StronglyForced)))           
883       {                                           
884                                                   
885         InvokePSDIP(np);                          
886       }                                           
887     } //if(Cond != InActivated)                   
888                                                   
889     // Exit from PostStepLoop if the track has    
890     // but extra treatment for processes with     
891     if(fpTrack->GetTrackStatus() == fStopAndKi    
892     {                                             
893       for(std::size_t np1 = np + 1; np1 < _MAX    
894       {                                           
895         G4int Cond2 = selectedPostStepDoItVect    
896         if(Cond2 == StronglyForced)               
897         {                                         
898           InvokePSDIP(np1);                       
899         }                                         
900       }                                           
901       break;                                      
902     }                                             
903   }                                               
904 }                                                 
905                                                   
906 //____________________________________________    
907                                                   
908 // *******************************************    
909 //  Apply cuts                                    
910 // *******************************************    
911                                                   
912 void G4ITStepProcessor::ApplyProductionCut(G4T    
913 {                                                 
914   G4bool tBelowCutEnergyAndSafety = false;        
915   G4int tPtclIdx = G4ProductionCuts::GetIndex(    
916   if(tPtclIdx < 0)                                
917   {                                               
918     return;                                       
919   }                                               
920   G4ProductionCutsTable* tCutsTbl =               
921       G4ProductionCutsTable::GetProductionCuts    
922   G4int tCoupleIdx = tCutsTbl->GetCoupleIndex(    
923       ->GetMaterialCutsCouple());                 
924   G4double tProdThreshold =                       
925       (*(tCutsTbl->GetEnergyCutsVector(tPtclId    
926   if(aSecondary->GetKineticEnergy() < tProdThr    
927   {                                               
928     tBelowCutEnergyAndSafety = true;              
929     if(std::abs(aSecondary->GetDynamicParticle    
930     {                                             
931       G4double currentRange                       
932       = G4LossTableManager::Instance()->GetRan    
933           aSecondary->GetKineticEnergy(),         
934           fpPreStepPoint->GetMaterialCutsCoupl    
935       tBelowCutEnergyAndSafety = (currentRange    
936     }                                             
937   }                                               
938                                                   
939   if(tBelowCutEnergyAndSafety)                    
940   {                                               
941     if(!(aSecondary->IsGoodForTracking()))        
942     {                                             
943       // Add kinetic energy to the total energ    
944       fpStep->AddTotalEnergyDeposit(aSecondary    
945       aSecondary->SetKineticEnergy(0.0);          
946     }                                             
947   }                                               
948 }                                                 
949