19#include "BDSElectronOccupancy.hh"
20#include "BDSIonPhotonEmission.hh"
21#include "BDSLogicalVolumeLaser.hh"
23#include "BDSIonExcitationEngine.hh"
25#include "BDSGlobalConstants.hh"
26#include "BDSUserTrackInformation.hh"
29#include "G4IonTable.hh"
32#include "G4AffineTransform.hh"
33#include "G4Electron.hh"
34#include "G4DecayProducts.hh"
36#include "G4Hydrogen.hh"
37#include "G4LogicalVolume.hh"
38#include "G4ParticleTable.hh"
39#include "G4ProcessType.hh"
42#include "G4StepPoint.hh"
43#include "G4ThreeVector.hh"
45#include "G4VTouchable.hh"
46#include "Randomize.hh"
47#include "G4TransportationManager.hh"
48#include "G4VPhysicalVolume.hh"
50#include "CLHEP/Units/PhysicalConstants.h"
51#include "CLHEP/Units/SystemOfUnits.h"
55BDSIonPhotonEmission::BDSIonPhotonEmission(
const G4String& processName):
56 G4VDiscreteProcess(processName, G4ProcessType::fUserDefined)
59BDSIonPhotonEmission::~BDSIonPhotonEmission()
62G4double BDSIonPhotonEmission::GetMeanFreePath(
const G4Track& track,
66 const G4DynamicParticle* particle = track.GetDynamicParticle();
70 G4bool excited = trackInfo->GetElectronOccupancy()->StatePopulated(2,1,0.5);
77 G4double aMass = particle->GetMass();
78 G4double currentProperTime = particle->GetProperTime();
79 G4double excitedTime = trackInfo->GetElectronOccupancy()->GetTimeOfExcitation(2,1,0.5);
80 G4double timeOfFlight = currentProperTime-excitedTime;
85 G4double pathlength = DBL_MIN;
86 G4double aCtau = CLHEP::c_light * timeOfFlight;
88 const G4double highestValue = 20;
90 {pathlength = DBL_MIN;}
95 G4double rKineticEnergy = particle->GetKineticEnergy()/aMass;
96 if (rKineticEnergy > highestValue)
99 pathlength = (rKineticEnergy + 1.0) * aCtau;
101 else if (rKineticEnergy < DBL_MIN)
104 pathlength = DBL_MIN;
109 pathlength = (particle->GetTotalMomentum())/aMass*aCtau ;
116G4VParticleChange* BDSIonPhotonEmission::PostStepDoIt(
const G4Track& track,
119 aParticleChange.Initialize(track);
120 G4DynamicParticle* particle =
const_cast<G4DynamicParticle*
>(track.GetDynamicParticle());
125 trackInfo->GetElectronOccupancy()->RemoveElectrons(2,1,0.5,1);
126 trackInfo->GetElectronOccupancy()->AddElectrons(2,0,0.5,1);
129 G4ThreeVector ionBeta = particle->GetMomentum()/particle->GetTotalEnergy();
130 G4LorentzVector ion4Vector = particle->Get4Momentum();
131 ion4Vector.boost(-ionBeta);
133 excitationEngine->setIncomingIon(ion4Vector);
134 excitationEngine->PhotonEmission(ionBeta);
135 G4LorentzVector gammaLorentz = excitationEngine->GetEmittedGamma();
136 G4LorentzVector ionLorentz = excitationEngine->GetScatteredIonEmission();
138 G4DynamicParticle* gamma =
new G4DynamicParticle(G4Gamma::Gamma(),
139 gammaLorentz.vect().unit(),
141 aParticleChange.AddSecondary(gamma);
142 aParticleChange.ProposeEnergy(ionLorentz.e());
143 aParticleChange.ProposeMomentumDirection(ionLorentz.vect().unit());
171 delete excitationEngine;
172 return G4VDiscreteProcess::PostStepDoIt(track, step);