18#include "BDSElectronOccupancy.hh"
19#include "BDSIonPhotonEmission.hh"
20#include "BDSLogicalVolumeLaser.hh"
22#include "BDSIonExcitationEngine.hh"
24#include "BDSGlobalConstants.hh"
25#include "BDSUserTrackInformation.hh"
28#include "G4IonTable.hh"
31#include "G4AffineTransform.hh"
32#include "G4Electron.hh"
33#include "G4DecayProducts.hh"
35#include "G4Hydrogen.hh"
36#include "G4LogicalVolume.hh"
37#include "G4ParticleTable.hh"
38#include "G4ProcessType.hh"
41#include "G4StepPoint.hh"
42#include "G4ThreeVector.hh"
44#include "G4VTouchable.hh"
45#include "Randomize.hh"
46#include "G4TransportationManager.hh"
47#include "G4VPhysicalVolume.hh"
49#include "CLHEP/Units/PhysicalConstants.h"
50#include "CLHEP/Units/SystemOfUnits.h"
54BDSIonPhotonEmission::BDSIonPhotonEmission(
const G4String& processName):
55 G4VDiscreteProcess(processName, G4ProcessType::fUserDefined)
58BDSIonPhotonEmission::~BDSIonPhotonEmission()
61G4double BDSIonPhotonEmission::GetMeanFreePath(
const G4Track& track,
65 const G4DynamicParticle* particle = track.GetDynamicParticle();
69 G4bool excited = trackInfo->GetElectronOccupancy()->StatePopulated(2,1,0.5);
76 G4double aMass = particle->GetMass();
77 G4double currentProperTime = particle->GetProperTime();
78 G4double excitedTime = trackInfo->GetElectronOccupancy()->GetTimeOfExcitation(2,1,0.5);
79 G4double timeOfFlight = currentProperTime-excitedTime;
84 G4double pathlength = DBL_MIN;
85 G4double aCtau = CLHEP::c_light * timeOfFlight;
87 const G4double highestValue = 20;
89 {pathlength = DBL_MIN;}
94 G4double rKineticEnergy = particle->GetKineticEnergy()/aMass;
95 if (rKineticEnergy > highestValue)
98 pathlength = (rKineticEnergy + 1.0) * aCtau;
100 else if (rKineticEnergy < DBL_MIN)
103 pathlength = DBL_MIN;
108 pathlength = (particle->GetTotalMomentum())/aMass*aCtau ;
115G4VParticleChange* BDSIonPhotonEmission::PostStepDoIt(
const G4Track& track,
118 aParticleChange.Initialize(track);
119 G4DynamicParticle* particle =
const_cast<G4DynamicParticle*
>(track.GetDynamicParticle());
124 trackInfo->GetElectronOccupancy()->RemoveElectrons(2,1,0.5,1);
125 trackInfo->GetElectronOccupancy()->AddElectrons(2,0,0.5,1);
128 G4ThreeVector ionBeta = particle->GetMomentum()/particle->GetTotalEnergy();
129 G4LorentzVector ion4Vector = particle->Get4Momentum();
130 ion4Vector.boost(-ionBeta);
132 excitationEngine->setIncomingIon(ion4Vector);
133 excitationEngine->PhotonEmission(ionBeta);
134 G4LorentzVector gammaLorentz = excitationEngine->GetEmittedGamma();
135 G4LorentzVector ionLorentz = excitationEngine->GetScatteredIonEmission();
137 G4DynamicParticle* gamma =
new G4DynamicParticle(G4Gamma::Gamma(),
138 gammaLorentz.vect().unit(),
140 aParticleChange.AddSecondary(gamma);
141 aParticleChange.ProposeEnergy(ionLorentz.e());
142 aParticleChange.ProposeMomentumDirection(ionLorentz.vect().unit());
170 delete excitationEngine;
171 return G4VDiscreteProcess::PostStepDoIt(track, step);