65 G4cout<<
"\n ExExChProcessChanneling::Constructor:";
66 G4cout<<
"Geometry surface tolerance is: ";
161 G4cout <<
"ChannelingProcess::UpdatePositionMomentumDensity::";
174 if(
GetInfo(aTrack)->GetPositionChanneledInitial().x() ==
DBL_MAX ||
195 if(
GetInfo(aTrack)->HasBeenUnderCoherentEffect() == 1){
218 if(
GetInfo(aTrack)->GetMomentumChanneledInitial().x() ==
DBL_MAX){
227 GetInfo(aTrack)->GetMomentumChanneled());
234 GetInfo(aTrack)->GetMomentumChanneled().y(),0.);
247 if(
GetInfo(aTrack)->HasBeenUnderCoherentEffect() == 1){
252 if(
GetInfo(aTrack)->HasBeenUnderCoherentEffect() == 1){
275 G4double vLowerBoundPositive = 0.01;
278 if(vNucleiDensity < vLowerBoundNegative)
279 {vNucleiDensity = vLowerBoundNegative;}
280 if(vElectronDensity < vLowerBoundNegative)
281 {vElectronDensity = vLowerBoundNegative;}
284 if(vNucleiDensity < vLowerBoundPositive)
285 {vNucleiDensity = vLowerBoundPositive;}
286 if(vElectronDensity < vLowerBoundPositive)
287 {vElectronDensity = vLowerBoundPositive;}
319 double vPotentialEnergyX = 0.;
320 double vPotentialEnergyY = 0.;
333 if(vPotentialEnergyX<=vTransverseEnergyX &&
334 vPotentialEnergyY<=vTransverseEnergyY){
337 }
while(bExit ==
false);
339 vTransverseEnergyX-=vPotentialEnergyX;
340 vTransverseEnergyY-=vPotentialEnergyY;
342 G4double vChAngleX = std::pow(+ 2. * std::fabs(vTransverseEnergyX)
343 / vTotalEnergy , 0.5);
344 G4double vChAngleY = std::pow(+ 2. * std::fabs(vTransverseEnergyY)
345 / vTotalEnergy , 0.5);
356 ProjectMomentumVectorFromLatticeToWorld(vNewMomentum,vPosition);
370 GetCurvatureRadius().x();
384 vVrAngle = - std::fabs(vRadiusX)/vRadiusX *
385 std::pow(+ 2. * std::fabs(vTransverseEnergy) / vTotalEnergy , 0.5);
399 if(std::fabs(vAngleRatio)<1.5){
400 vVrAngle *= (-(std::fabs(vAngleRatio) - 1.5)/3.);
405 G4double vPhi = vVrAngle * std::cos(vOmega);
406 G4double vTheta = vVrAngle * std::sin(vOmega);
413 return vNewMomentum.unit();
459 ProjectMomentumVectorFromWorldToLattice(
465 if((vMomentumPre.x())!=0.){
466 vDeltaProportion = std::fabs(vMomentumPre.unit().x());
468 G4double vDeltaPosition = vDeltaProportion*
471 return std::abs(vDeltaPosition);
489 && vStep == vStepPost &&
521 vStep == vStepPost &&
557 if(vTransverseEnergy <= vEnergyMax){
568 vPositionInTheCrystal).x());
569 if(vTransverseEnergy <= vEnergyMax){
578 if(bTangentToPlane ==
true &&
579 bNotBoundary ==
true &&
580 GetInfo(aTrack)->HasBeenUnderCoherentEffect() != 2){
612 if((std::fabs(vMFPVR) < vMFP) && (std::fabs(vMFPVR) > (0.5 * vMFPosc))){
664 G4bool bIsUnderCoherentEffect =
false;
669 if(bIsUnderCoherentEffect){
670 if(
GetInfo(aTrack)->HasBeenUnderCoherentEffect() == 1){
678 GetLatticeDirection(vPosition).unit());
680 else if(
GetInfo(aTrack)->HasBeenUnderCoherentEffect() == 2){
695 if( (bIsUnderCoherentEffect ==
false && (
HasLattice(aTrack) ==
true) )
699 if(
GetInfo(aTrack)->HasBeenUnderCoherentEffect() == 1){
728 return vTransverseEnergy;
746 (vMom.z() * vMom.z()) / vTotalEnergy);
748 return vKineticEnergy;
767 return vPotentialEnergy;
782 G4double vPositionX = vPosition.x();
790 return vEnergyVariation;
806 ProjectMomentumVectorFromWorldToLattice(aTrack.
GetMomentum(),
830 return vEnergyVariation;
858 return vCriticalEnergy;
883 return vCriticalEnergy;
897 G4double vCriticalAngle = std::pow( 2.0 *
900 / vTotalEnergy ) , 0.5);
901 return vCriticalAngle;
917 return vOscillationPeriod;
933 return vCriticalRadius;
947 G4double vCentreX = vInterplanarPeriodHalf;
957 vCentreX *= (1. - 0.5 * vTotalEnergy /
958 vPotentialWellDepth /
960 vInterplanarPeriodHalf );
1037 GetPhysicalVolume()) &&
1051 GetPostStepPoint()->GetPhysicalVolume()) &&
1079 ProjectMomentumVectorFromWorldToLattice(aTrack.
GetStep()->
1080 GetPreStepPoint()->GetMomentum(),vPositionPre);
1084 GetPostStepPoint(),aTrack);
1086 ProjectMomentumVectorFromWorldToLattice(aTrack.
GetStep()->
1087 GetPostStepPoint()->GetMomentum(),vPositionPost);
1089 if(vMomentumPost.x()<0. &&
1090 vMomentumPre.x()>0. &&
1094 if(vMomentumPost.x()>0. &&
1095 vMomentumPre.x()<0. &&
XLatticeManager3 * fLatticeManager
G4double GetTotalEnergy() const
G4double condition(const G4ErrorSymMatrix &m)
G4ThreeVector ComputeCentrifugalEnergy(const G4Track &, G4ThreeVector)
G4double ComputeCriticalEnergyMinimum(const G4Track &)
XVCrystalCharacteristic * fElectronDensity
G4double GetXHalfLength() const
G4bool HasLattice(const G4Track &)
G4double ComputeCriticalRadius(const G4Track &)
static XLatticeManager3 * GetXLatticeManager()
G4double ComputeDistanceWhereParticleTangentToBentPlane(const G4Track &)
void SetMomentumChanneledInitial(G4ThreeVector)
G4ThreeVector GetLatticeAngles()
virtual ~ExExChProcessChanneling()
CLHEP::Hep3Vector G4ThreeVector
G4ThreeVector ComputeChannelingOutgoingMomentum(const G4Track &)
XVCrystalCharacteristic * GetNucleiDensity()
G4bool ParticleIsNegative(const G4Track &)
G4StepStatus GetStepStatus() const
G4double GetSurfaceTolerance() const
G4ThreeVector ComputeMomentum(const G4Track &, G4StepPoint *)
G4bool IsUnderCoherentEffect(const G4Track &)
ExExChProcessChanneling(const G4String &processName="ExExChProcessChanneling")
G4ThreeVector GetCurvatureRadius()
G4ThreeVector ComputeKineticEnergy(const G4Track &)
G4String fFileCharacteristicsName
G4ThreeVector GetMomentum() const
void UpdateDensity(const G4Track &)
const G4VTouchable * GetTouchable() const
G4ThreeVector GetPositionChanneledInitial()
const G4Step * GetStep() const
G4double GetNucleiDensity()
G4double GetZHalfLength() const
XVCrystalIntegratedDensity * GetIntegratedDensityNuclei(G4int)
XVCrystalIntegratedDensity * GetIntegratedDensityElectron(G4int)
virtual G4double GetMinimum(XPhysicalLattice *)
G4ThreeVector ComputePotentialEnergy(const G4Track &)
G4ThreeVector ComputeCentrifugalEnergyMaximumVariation(const G4Track &)
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
XCrystalIntegratedDensityHub * fIntegratedDensity
G4VUserTrackInformation * GetUserInformation() const
G4bool HasBeenInitialized(XPhysicalLattice *)
G4StepPoint * GetPreStepPoint() const
void SetXPhysicalLattice(XPhysicalLattice *)
G4ThreeVector ComputeVolumeReflectionOutgoingMomentum(const G4Track &)
G4double ComputeCriticalEnergyMaximum(const G4Track &)
void SetMomentumChanneled(G4ThreeVector)
G4bool ParticleIsNotOnBoundary(const G4Track &)
G4GLOB_DLL std::ostream G4cout
XVCrystalCharacteristic * GetElectronDensity()
G4StepPoint * CheckStepPointLatticeForVolume(G4StepPoint *, const G4Track &)
G4VPhysicalVolume * GetPhysicalVolume() const
const G4ThreeVector & GetPosition() const
void SetPositionChanneled(G4ThreeVector)
G4bool HasLatticeOnBoundary(const G4Track &)
XVCrystalCharacteristic * GetElectricField()
XVCrystalCharacteristic * fNucleiDensity
XPhysicalLattice * GetXPhysicalLattice(const G4Track &)
void SetPotential(XVCrystalCharacteristic *)
const G4ParticleDefinition * GetParticleDefinition() const
G4double GetYHalfLength() const
G4double GetStartPhiAngle() const
void SetElectronDensity(G4double)
const G4String & GetProcessName() const
G4StepPoint * CheckStepPointLatticeForPosition(G4StepPoint *, const G4Track &)
XVCrystalCharacteristic * fElectricField
G4ThreeVector GetEC(G4ThreeVector, XPhysicalLattice *)
void SetIntegratedDensity(XCrystalIntegratedDensityHub *)
G4ThreeVector ComputeTransverseEnergy(const G4Track &)
G4ParticleDefinition * GetParticleDefinition(const G4Track &aTrack)
G4ThreeVector GetMomentum() const
G4bool ParticleIsNotOnBoundaryPost(const G4Track &)
virtual void Initialize(const G4Track &)
G4ThreeVector ComputePotentialWellCentre(const G4Track &)
void SetElectricField(XVCrystalCharacteristic *)
void UpdateParameters(const G4Track &)
void InitializePhysicalLattice(XPhysicalLattice *)
G4LogicalVolume * GetLogicalVolume() const
XPhysicalLattice * GetXPhysicalLattice(G4VPhysicalVolume *)
G4bool HasLatticeOnBoundaryPre(const G4Track &)
virtual G4double GetMaximum(XPhysicalLattice *)
XVCrystalCharacteristic * GetPotential()
G4double ComputeOscillationPeriod(const G4Track &)
G4double GetChannelingMeanFreePath(const G4Track &)
virtual G4double GetMeanFreePath(const G4Track &, G4double, G4ForceCondition *)
G4StepPoint * GetPostStepPoint() const
XCrystalIntegratedDensityHub * GetIntegratedDensity()
void SetNucleiDensity(XVCrystalCharacteristic *)
G4bool HasLatticeOnBoundaryPost(const G4Track &)
void SetCoherentEffect(G4int flag)
G4ParticleChange aParticleChange
ExExChParticleUserInfo * GetInfo(const G4Track &)
void SetElectronDensity(XVCrystalCharacteristic *)
G4ThreeVector ComputePositionInTheCrystal(G4StepPoint *, const G4Track &)
virtual G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)
G4double ComputeCriticalAngle(const G4Track &)
const G4AffineTransform & GetTopTransform() const
const G4NavigationHistory * GetHistory() const
void ComputeCrystalCharacteristic(const G4Track &)
void UpdateMomentum(const G4Track &)
void ReadFromFiles(const G4String &)
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
void StoreDensityPreviousStep()
G4bool ParticleIsTangentToBentPlane(const G4Track &)
G4double GetPDGCharge() const
void ResetDensity(const G4Track &)
G4double ComputeInterplanarPeriod()
void SetPositionChanneledInitial(G4ThreeVector)
G4bool ParticleIsNotOnBoundaryPre(const G4Track &)
virtual G4bool IsApplicable(const G4ParticleDefinition &)
void UpdatePosition(const G4Track &)
XVCrystalCharacteristic * fPotentialEnergy
static G4GeometryTolerance * GetInstance()
G4ThreeVector GetPositionChanneled()
G4VSolid * GetSolid() const
void SetNucleiDensity(G4double)
virtual void ReadFromECHARM(const G4String &, G4double=1)=0
G4ThreeVector GetMomentumChanneled()
bool HasLattice(G4VPhysicalVolume *)