65 #define State(theXInfo) (GetState<G4ITBrownianState>()->theXInfo) 75 #define RED "\033[0;31m" 76 #define LIGHT_RED "\33[1;31m" 77 #define GREEN "\033[32;40m" 78 #define GREEN_ON_BLUE "\033[1;32;44m" 79 #define RESET_COLOR "\033[0m" 84 #define GREEN_ON_BLUE "" 85 #define RESET_COLOR "" 117 #define State(theXInfo) (GetState<G4ITTransportationState>()->theXInfo) 165 if(
this == &rhs)
return *
this;
206 const double timeStep,
222 if(
GetIT(track)->GetTrackingInfo()->IsLeadingStep())
225 ->GetProcessDefinedStep());
226 bool makeException =
true;
234 exceptionDescription <<
"ComputeStep is called while the track has" 235 "the minimum interaction time";
236 exceptionDescription <<
" so it should not recompute a timeStep ";
237 G4Exception(
"G4DNABrownianTransportation::ComputeStep",
239 exceptionDescription);
243 State(fGeometryLimitedStep) =
false;
253 track.GetMaterial()->GetTemperature());
255 static double sqrt_2 = sqrt(2.);
256 double sqrt_Dt = sqrt(diffCoeff*timeStep);
257 double sqrt_2Dt = sqrt_2*sqrt_Dt;
262 State(fGeometryLimitedStep) =
true;
264 spaceStep =
State(fEndPointDistance);
273 spaceStep = sqrt(x*x + y*y + z*z);
275 if(spaceStep >=
State(fEndPointDistance))
279 State(fGeometryLimitedStep) =
true;
294 <<
"G4ITBrownianTransportation::ComputeStep() : " 295 <<
"Step was limited to boundary" 321 double invErfc =
InvErfc(value);
322 spaceStep = invErfc*2*sqrt_Dt;
327 State(fGeometryLimitedStep) =
false;
348 double min_randomNumber =
Erfc(
State(fEndPointDistance)/2*sqrt_Dt);
349 double value = min_randomNumber+(1-min_randomNumber)*
G4UniformRand();
350 double invErfc =
InvErfc(value);
351 spaceStep = invErfc*2*sqrt_Dt;
352 if(spaceStep >=
State(fEndPointDistance))
355 State(fGeometryLimitedStep) =
true;
361 State(fGeometryLimitedStep) =
false;
368 State(fGeometryLimitedStep) =
true;
370 spaceStep =
State(fEndPointDistance);
387 State(fTransportEndPosition)= spaceStep*
389 track.GetMomentumDirection()
390 + track.GetPosition();
395 State(fGeometryLimitedStep) =
false;
397 State(fTransportEndPosition)= spaceStep*step.GetPostStepPoint()->
398 GetMomentumDirection() + track.GetPosition();
405 State(fTransportEndPosition) = track.GetPosition();
406 State(fGeometryLimitedStep) =
false;
409 State(fCandidateEndGlobalTime) = step.GetPreStepPoint()->GetGlobalTime()
411 State(fEndGlobalTimeComputed) =
true;
418 <<
"G4ITBrownianTransportation::ComputeStep() : " 419 <<
" trackID : " << track.GetTrackID() <<
" : Molecule name: " 421 <<
"Initial position:" <<
G4BestUnit(track.GetPosition(),
"Length")
423 <<
"Initial direction:" << track.GetMomentumDirection() <<
G4endl 424 <<
"Final position:" <<
G4BestUnit(
State(fTransportEndPosition),
"Length")
426 <<
"Initial magnitude:" <<
G4BestUnit(track.GetPosition().mag(),
"Length")
428 <<
"Final magnitude:" <<
G4BestUnit(
State(fTransportEndPosition).mag(),
"Length")
430 <<
"Diffusion length : " 432 <<
" within time step : " <<
G4BestUnit(timeStep,
"Time")
435 <<
"State(fGeometryLimitedStep)=" <<
State(fGeometryLimitedStep) <<
G4endl 436 <<
"End point distance was: " <<
G4BestUnit(
State(fEndPointDistance),
"Length")
461 <<
" trackID : " << track.GetTrackID() <<
" Molecule name: " 463 G4cout <<
"Diffusion length : " 465 <<
" within time step : " <<
G4BestUnit(step.GetDeltaTime(),
"Time")
466 <<
"\t Current global time : " 487 <<
"G4DNABrownianTransportation::Diffusion :" << setw(8)
488 <<
GetIT(track)->
GetName() <<
"\t trackID:" << track.GetTrackID()
489 <<
"\t" <<
" Global Time = " 508 G4double waterDensity = (*fpWaterDensity)[material->GetIndex()];
510 if (waterDensity == 0.0)
524 G4cout <<
"A track is outside water material : trackID = " 529 G4cout <<
"Step Number :" << track.GetCurrentStepNumber() <<
G4endl;
541 mem_diff = mem_intermediaire-mem_first;
542 G4cout <<
"\t\t\t >> || MEM || In G4DNABrownianTransportation::Diffusion " 543 "after dealing with waterDensity for "<< track.GetTrackID()
544 <<
", diff is : " << mem_diff <<
G4endl;
548 State(fMomentumChanged) =
true;
553 mem_diff = mem_intermediaire-mem_first;
554 G4cout <<
"\t\t\t >> || MEM || In G4DNABrownianTransportation::" 555 "After proposing new direction to fParticleChange for " 556 << track.GetTrackID() <<
", diff is : " << mem_diff <<
G4endl;
574 track.GetStep()->GetPreStepPoint()->GetPosition(),
575 track.GetMomentumDirection(),
586 G4GPILSelection* selection)
591 G4cout <<
" G4DNABrownianTransportation::AlongStepGetPhysicalInteractionLength - track ID: " 592 << track.GetTrackID() <<
G4endl;
593 G4cout <<
"In volume : " << track.GetVolume()->GetName()
600 track, previousStepSize, currentMinimumStep, currentSafety,
603 if(geometryStepLength==0)
606 if(
State(fGeometryLimitedStep))
612 State(fCurrentTouchableHandle)->GetHistory());
616 track.GetPosition(), track.GetMomentumDirection(),
624 State(fCurrentTouchableHandle) = newTouchable;
639 track, previousStepSize, currentMinimumStep, currentSafety,
684 if (
State(fGeometryLimitedStep))
695 / (diffusionCoefficient);
700 / (diffusionCoefficient);
717 State(fTransportEndPosition) = geometryStepLength*
718 track.GetMomentumDirection() + track.GetPosition();
747 State(fCandidateEndGlobalTime) =
750 State(fEndGlobalTimeComputed) =
true;
757 geometryStepLength = 2
762 State(fTransportEndPosition) = geometryStepLength*
763 track.GetMomentumDirection() + track.GetPosition();
771 <<
"G4DNABrownianTransportation::AlongStepGetPhysicalInteractionLength = " 774 << track.GetTrackID()
783 return geometryStepLength;
795 MemStat mem_first, mem_second, mem_diff;
802 if (
GetIT(track)->GetTrackingInfo()->IsLeadingStep()
816 spaceStep =
State(fEndPointDistance);
817 State(fGeometryLimitedStep) =
true;
822 GetDiffusionCoefficient();
829 spaceStep = sqrt(x * x + y * y + z * z);
831 if(spaceStep >=
State(fEndPointDistance))
833 State(fGeometryLimitedStep) =
true;
837 && spaceStep >=
State(fEndPointDistance))
839 spaceStep =
State(fEndPointDistance);
844 State(fGeometryLimitedStep) =
false;
853 State(fTransportEndPosition) = track.GetPosition()
854 + spaceStep * track.GetMomentumDirection();
860 <<
"G4DNABrownianTransportation::AlongStepDoIt: " 861 "GeometryLimitedStep = " 862 <<
State(fGeometryLimitedStep)
876 mem_diff = mem_intermediaire-mem_first;
877 G4cout <<
"\t\t\t >> || MEM || After calling G4ITTransportation::" 878 "AlongStepDoIt for "<< track.GetTrackID() <<
", diff is : " 882 if(track.GetStepLength() != 0
927 mem_diff = mem_intermediaire-mem_first;
928 G4cout <<
"\t\t\t >> || MEM || After calling G4DNABrownianTransportation::" 929 "Diffusion for "<< track.GetTrackID() <<
", diff is : " virtual void UpdateYourself(G4VPhysicalVolume *pPhysVol, const G4NavigationHistory *history=0)
virtual void Transport(const G4Track &, G4ParticleChangeForTransport &)=0
ThreeVector shoot(const G4int Ap, const G4int Af)
G4Material * FindOrBuildMaterial(const G4String &name, G4bool isotopes=true, G4bool warning=false)
G4ParticleChangeForTransport fParticleChange
G4DNABrownianTransportation & operator=(const G4DNABrownianTransportation &other)
std::ostringstream G4ExceptionDescription
static G4VScheduler * Instance()
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
virtual G4VParticleChange * AlongStepDoIt(const G4Track &track, const G4Step &)
G4double CheckNextStep(const G4ThreeVector &position, const G4ThreeVector &direction, const G4double currentMaxStep, G4double &newSafety)
static double inverseErf(double t)
virtual G4VParticleChange * PostStepDoIt(const G4Track &track, const G4Step &)
virtual void StartTracking(G4Track *aTrack)
G4ThreeVector G4RandomDirection()
virtual G4VParticleChange * AlongStepDoIt(const G4Track &track, const G4Step &stepData)
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
virtual const G4String & GetName() const =0
virtual G4double AlongStepGetPhysicalInteractionLength(const G4Track &track, G4double, G4double currentMinimumStep, G4double ¤tSafety, G4GPILSelection *selection)
G4bool ProposesTimeStep() const
static double InvErfc(double x)
static G4NistManager * Instance()
G4int GetProcessSubType() const
G4double fInternalMinTimeStep
G4ITNavigator * fLinearNavigator
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
G4bool fUseMaximumTimeBeforeReachingBoundary
static double Erfc(double x)
virtual void StartTracking(G4Track *aTrack)
G4double ComputeGeomLimit(const G4Track &track, G4double &presafety, G4double limit)
const G4String & GetProcessName() const
G4IT * GetIT(const G4Track *track)
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
const G4String & GetName() const
G4bool fPathLengthWasCorrected
virtual void ResetTrackState()
G4bool fComputeLastPosition
G4bool fTimeStepReachedLimit
void SetInstantiateProcessState(G4bool flag)
void SetProcessSubType(G4int)
G4shared_ptr< G4ProcessState > fpState
G4Molecule * GetMolecule(const G4Track &track)
virtual G4VPhysicalVolume * GetVolume(G4int depth=0) const
G4ITSafetyHelper * fpSafetyHelper
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4TrackingInformation * GetTrackingInfo()
static G4DNAMolecularMaterial * Instance()
virtual void ComputeStep(const G4Track &, const G4Step &, const double, double &)
G4bool fUseSchedulerMinTimeSteps
void Diffusion(const G4Track &track)
static double erf(double x)
virtual G4VParticleChange * PostStepDoIt(const G4Track &track, const G4Step &)
static const double picosecond
static double InvErf(double x)
virtual ~G4DNABrownianTransportation()
G4double * theInteractionTimeLeft
G4BrownianAction * fpBrownianAction
const std::vector< G4double > * fpWaterDensity
virtual G4double AlongStepGetPhysicalInteractionLength(const G4Track &, G4double, G4double, G4double &, G4GPILSelection *)
G4double GetDiffusionCoefficient() const
virtual void LoadTrackState(G4TrackStateManager &manager)
virtual double GetLimitingTimeStep() const
G4VPhysicalVolume * GetWorldVolume()
G4DNABrownianTransportation(const G4String &aName="DNABrownianTransportation", G4int verbosityLevel=0)