18#include "BDSAuxiliaryNavigator.hh"
19#include "BDSComptonEngine.hh"
20#include "BDSComptonScatteringEngine.hh"
21#include "BDSGlobalConstants.hh"
22#include "BDSLaserComptonScattering.hh"
23#include "BDSLogicalVolumeLaser.hh"
28#include "G4AffineTransform.hh"
30#include "G4LogicalVolume.hh"
31#include "G4ParticleTable.hh"
32#include "G4ProcessType.hh"
34#include "G4StepPoint.hh"
35#include "G4ThreeVector.hh"
37#include "G4VPhysicalVolume.hh"
38#include "G4VTouchable.hh"
39#include "Randomize.hh"
40#include "G4RunManager.hh"
42#include "CLHEP/Units/PhysicalConstants.h"
43#include "CLHEP/Units/SystemOfUnits.h"
48BDSLaserComptonScattering::BDSLaserComptonScattering(
const G4String& processName):
49 G4VDiscreteProcess(processName, G4ProcessType::fElectromagnetic),
54BDSLaserComptonScattering::~BDSLaserComptonScattering()
59G4double BDSLaserComptonScattering::GetMeanFreePath(
const G4Track& track,
61 G4ForceCondition* forceCondition)
64 G4LogicalVolume* lv = track.GetVolume()->GetLogicalVolume();
65 if (!lv->IsExtended())
66 {
return std::numeric_limits<double>::max();}
70 {
return std::numeric_limits<double>::max();}
75 *forceCondition = Forced;
79G4VParticleChange* BDSLaserComptonScattering::PostStepDoIt(
const G4Track& track,
84 aParticleChange.Initialize(track);
86 G4LogicalVolume* lv = track.GetVolume()->GetLogicalVolume();
87 if (!lv->IsExtended())
88 {
return pParticleChange;}
92 {
return pParticleChange;}
99 const G4DynamicParticle* particle = track.GetDynamicParticle();
100 G4ThreeVector particlePositionPostStepGlobal = track.GetPosition();
101 G4ThreeVector particleMomentumDirectionGlobal = track.GetMomentumDirection();
102 G4int partID = particle->GetParticleDefinition()->GetPDGEncoding();
104 G4double particleEnergy = particle->GetTotalEnergy();
105 G4ThreeVector particleMomentum = particle->GetMomentum();
106 G4ThreeVector particleBeta = particleMomentum/particleEnergy;
107 G4double particleGamma = particleEnergy/CLHEP::electron_mass_c2;
108 G4LorentzVector particle4VectorMomentum = particle->Get4Momentum();
110 const G4RotationMatrix* rot = track.GetTouchable()->GetRotation();
111 const G4AffineTransform transform = track.GetTouchable()->GetHistory()->GetTopTransform();
112 G4ThreeVector particlePositionLocal = transform.TransformPoint(particlePositionPostStepGlobal);
113 G4ThreeVector particleDirectionMomentumLocal = transform.TransformPoint(particleMomentumDirectionGlobal).unit();
116 G4ThreeVector photonUnit(0,0,1);
117 photonUnit.transform(*rot);
118 G4double photonE = (CLHEP::h_Planck*CLHEP::c_light)/laser->
Wavelength();
119 G4ThreeVector photonVector = photonUnit*photonE;
120 G4LorentzVector photonLorentz = G4LorentzVector(photonVector,photonE);
123 photonLorentz.boost(particleBeta);
124 particle4VectorMomentum.boost(-particleBeta);
126 G4double photonEnergy = photonLorentz.e();
128 G4double crossSection = comptonEngine->CrossSection(photonEnergy,partID);
130 G4double particleTimePostStepGlobal = track.GetGlobalTime();
131 G4double particleTimePreStepGlobal = step.GetPreStepPoint()->GetGlobalTime();
132 G4double photonFlux = ((laser->Intensity(particlePositionLocal)/photonEnergy)
133 * laser->TemporalProfileGaussian(particleTimePostStepGlobal,particlePositionLocal.z()));
136 G4double particleStepTime = (particleTimePostStepGlobal - particleTimePreStepGlobal)*particleGamma;
138 G4double scatteringProb = 1.0-std::exp((-crossSection*photonFlux*particleStepTime));
140 G4double scaleFactor = g->ScaleFactorLaser();
141 G4double randomNumber = G4UniformRand();
144 if((scaleFactor*scatteringProb)>randomNumber)
146 G4double initialWeight=aParticleChange.GetParentWeight();
147 aParticleChange.ProposeParentWeight(initialWeight*1.0/scaleFactor);
148 aParticleChange.SetNumberOfSecondaries(1);
149 comptonEngine->setIncomingElectron(particle4VectorMomentum);
150 comptonEngine->setIncomingGamma(photonLorentz);
151 comptonEngine->PerformCompton(particleBeta,partID);
152 G4LorentzVector scatteredGamma = comptonEngine->GetScatteredGamma();
154 G4DynamicParticle* gamma =
new G4DynamicParticle(G4Gamma::Gamma(),
155 scatteredGamma.vect().unit(),
157 G4LorentzVector scatteredElectron = comptonEngine->GetScatteredElectron();
158 G4LorentzVector electronLorentz = G4LorentzVector(scatteredElectron.vect().unit(),scatteredElectron.e());
159 aParticleChange.AddSecondary(gamma);
160 aParticleChange.ProposeEnergy(electronLorentz.e());
161 aParticleChange.ProposeMomentumDirection(electronLorentz.getX(),electronLorentz.getY(),electronLorentz.getZ());
162 aParticleChange.ProposeParentWeight(initialWeight);
163 return G4VDiscreteProcess::PostStepDoIt(track, step);
166 {
return G4VDiscreteProcess::PostStepDoIt(track, step);}
Extra G4Navigator to get coordinate transforms.
A class that holds global options and constants.
static BDSGlobalConstants * Instance()
Access method.
Class to provide laser intensity at any point.
G4double Wavelength() const
Accessor.
G4double Sigma0() const
Accessor.
Extended logical volume with laser definition.
const BDSLaser * Laser() const
Access the laser.