Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4PolarizedMollerBhabhaModel.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// $Id$
27// -------------------------------------------------------------------
28//
29// GEANT4 Class file
30//
31// File name: G4PolarizedMollerBhabhaModel
32//
33// Author: A.Schaelicke on base of Vladimir Ivanchenko code
34//
35// Creation date: 10.11.2005
36//
37// Modifications:
38//
39// 20-08-05, modified interface (A.Schaelicke)
40//
41// Class Description:
42//
43// Implementation of energy loss and delta-electron production by e+/e-
44// (including polarization effects)
45//
46// -------------------------------------------------------------------
47//
48//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
49//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
50
53#include "G4Electron.hh"
54#include "G4Positron.hh"
56#include "Randomize.hh"
57
62
63//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
64
66 const G4String& nam)
67 : G4MollerBhabhaModel(p,nam)
68{
69
70 // G4cout<<" particle==electron "<<(p==theElectron)<<G4endl;
71 isElectron=(p==theElectron); // necessary due to wrong order in G4MollerBhabhaModel constructor!
72
73 if (p==0) {
74
75 }
76 if (!isElectron) {
77 G4cout<<" buildBhabha cross section "<<isElectron<<G4endl;
78 crossSectionCalculator = new G4PolarizedBhabhaCrossSection();
79 } else {
80 G4cout<<" buildMoller cross section "<<isElectron<<G4endl;
81 crossSectionCalculator = new G4PolarizedMollerCrossSection();
82 }
83}
84
85//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
86
88{
89 if (crossSectionCalculator) {
90 delete crossSectionCalculator;
91 }
92}
93
94
95//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
96
98 const G4ParticleDefinition* pd,
99 G4double kinEnergy,
100 G4double cut,
101 G4double emax)
102{
103 G4double xs =
105 cut,emax);
106// G4cout<<"calc eIoni xsec "<<xs<<G4endl;
107// G4cout<<" "<<kinEnergy<<" "<<cut<<" "<<emax<<G4endl;
108 G4double factor=1.;
109 if (xs!=0) {
110 // G4cout<<"calc asym"<<G4endl;
111 G4double tmax = MaxSecondaryEnergy(pd, kinEnergy);
112 tmax = std::min(emax, tmax);
113
114 if (std::fabs(cut/emax-1.)<1.e-10) return xs;
115
116 if(cut < tmax) {
117
118 G4double xmin = cut/kinEnergy;
119 G4double xmax = tmax/kinEnergy;
120// G4cout<<"calc asym "<<xmin<<","<<xmax<<G4endl;
121 G4double gam = kinEnergy/electron_mass_c2 + 1.0;
122
123 G4double crossPol=crossSectionCalculator->
124 TotalXSection(xmin,xmax,gam,
125 theBeamPolarization,
126 theTargetPolarization);
127 G4double crossUnpol=crossSectionCalculator->
128 TotalXSection(xmin,xmax,gam,
131 if (crossUnpol>0.) factor=crossPol/crossUnpol;
132 // G4cout<<" factor="<<factor<<G4endl;
133 }
134 }
135 return xs*factor;
136}
137
138//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
139
140void G4PolarizedMollerBhabhaModel::SampleSecondaries(std::vector<G4DynamicParticle*>* vdp,
141 const G4MaterialCutsCouple* ,
142 const G4DynamicParticle* dp,
143 G4double tmin,
144 G4double maxEnergy)
145{
146 // *** obtain and save target and beam polarization ***
148
149 const G4Track * aTrack = fParticleChange->GetCurrentTrack();
150
151 // obtain polarization of the beam
152 theBeamPolarization = dp->GetPolarization();
153
154 // obtain polarization of the media
155 G4VPhysicalVolume* aPVolume = aTrack->GetVolume();
156 G4LogicalVolume* aLVolume = aPVolume->GetLogicalVolume();
157 const G4bool targetIsPolarized = polarizationManger->IsPolarized(aLVolume);
158 theTargetPolarization = polarizationManger->GetVolumePolarization(aLVolume);
159
160 // transfer target polarization in interaction frame
161 if (targetIsPolarized)
162 theTargetPolarization.rotateUz(dp->GetMomentumDirection());
163
164
165
166
167 G4double tmax = std::min(maxEnergy, MaxSecondaryKinEnergy(dp));
168 if(tmin >= tmax) return;
169 // if(tmin > tmax) tmin = tmax;
170
171 G4double polL = theBeamPolarization.z()*theTargetPolarization.z();
172 polL=std::fabs(polL);
173 G4double polT = theBeamPolarization.x()*theTargetPolarization.x() +
174 theBeamPolarization.y()*theTargetPolarization.y();
175 polT=std::fabs(polT);
176
177 G4double kineticEnergy = dp->GetKineticEnergy();
178 G4double energy = kineticEnergy + electron_mass_c2;
179 G4double totalMomentum = std::sqrt(kineticEnergy*(energy + electron_mass_c2));
180 G4double xmin = tmin/kineticEnergy;
181 G4double xmax = tmax/kineticEnergy;
182 G4double gam = energy/electron_mass_c2;
183 G4double gamma2 = gam*gam;
184 G4double gmo = gam - 1.;
185 G4double gmo2 = gmo*gmo;
186 G4double gmo3 = gmo2*gmo;
187 G4double gpo = gam + 1.;
188 G4double gpo2 = gpo*gpo;
189 G4double gpo3 = gpo2*gpo;
190 G4double x, y, q, grej, grej2;
191 G4double z = 0.;
192 G4double xs = 0., phi =0.;
193 G4ThreeVector direction = dp->GetMomentumDirection();
194
195 //(Polarized) Moller (e-e-) scattering
196 if (isElectron) {
197 // *** dice according to polarized cross section
198 G4double G = ((2.0*gam - 1.0)/gamma2)*(1. - polT - polL*gam);
199 G4double H = (sqr(gam - 1.0)/gamma2)*(1. + polT + polL*((gam + 3.)/(gam - 1.)));
200
201 y = 1.0 - xmax;
202 grej = 1.0 - G*xmax + xmax*xmax*(H + (1.0 - G*y)/(y*y));
203 grej2 = 1.0 - G*xmin + xmin*xmin*(H + (1.0 - G*y)/(y*y));
204 if (grej2 > grej) grej = grej2;
205 G4double prefM = gamma2*classic_electr_radius*classic_electr_radius/(gmo2*(gam + 1.0));
206 grej *= prefM;
207 do {
208 q = G4UniformRand();
209 x = xmin*xmax/(xmin*(1.0 - q) + xmax*q);
210 if (crossSectionCalculator) {
211 crossSectionCalculator->Initialize(x,gam,phi,theBeamPolarization,
212 theTargetPolarization,1);
213 xs=crossSectionCalculator->XSection(G4StokesVector::ZERO,
215 z=xs*sqr(x)*4.;
216 if (grej < z) {
217 G4cout<<"WARNING : error in Moller rejection routine! \n"
218 <<" z = "<<z<<" grej="<<grej<<"\n";
219 }
220 } else {
221 G4cout<<"No calculator in Moller scattering"<<G4endl;
222 }
223 } while(grej * G4UniformRand() > z);
224 //Bhabha (e+e-) scattering
225 } else {
226 // *** dice according to polarized cross section
227 y = xmax*xmax;
228 grej = 0.;
229 grej += y*y*gmo3*(1. + (polL + polT)*(gam + 3.)/gmo);
230 grej += -2.*xmin*xmin*xmin*gam*gmo2*(1. - (polL + polT)*(gam + 3.)/gmo);
231 grej += y*y*gmo*(3.*gamma2 + 6.*gam + 4.)*(1. + (polL*(3.*gam + 1.)*(gamma2 + gam + 1.) + polT*((gam + 2.)*gamma2 + 1.))/(gmo*(3.*gam*(gam + 2.) + 4.)));
232 grej /= gpo3;
233 grej += -xmin*(2.*gamma2 + 4.*gam + 1.)*(1. - gam*(polL*(2.*gam + 1.) + polT)/(2.*gam*(gam + 2.) + 1.))/gpo2;
234 grej += gamma2/(gamma2 - 1.);
235 G4double prefB = classic_electr_radius*classic_electr_radius/(gam - 1.0);
236 grej *= prefB;
237
238 do {
239 q = G4UniformRand();
240 x = xmin*xmax/(xmin*(1.0 - q) + xmax*q);
241 if (crossSectionCalculator) {
242 crossSectionCalculator->Initialize(x,gam,phi,theBeamPolarization,
243 theTargetPolarization,1);
244 xs=crossSectionCalculator->XSection(G4StokesVector::ZERO,
246 z=xs*sqr(x)*4.;
247 } else {
248 G4cout<<"No calculator in Bhabha scattering"<<G4endl;
249 }
250
251 if(z > grej) {
252 G4cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<G4endl;
253 G4cout << "G4PolarizedMollerBhabhaModel::SampleSecondaries Warning! "<<G4endl
254 << "Majorant " << grej << " < "
255 << z << " for x= " << x<<G4endl
256 << " e+e- (Bhabha) scattering"<<" at KinEnergy "<<kineticEnergy<<G4endl;
257 G4cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<G4endl;
258 }
259 } while(grej * G4UniformRand() > z);
260 }
261 //
262 //
263 // polar asymmetries (due to transverse polarizations)
264 //
265 //
266 if (crossSectionCalculator) {
267 // grej*=1./(sqr(x)*sqr(gamma2-1))*sqr(gam*(1+gam));
268 grej=xs*2.;
269 do {
270 phi = twopi * G4UniformRand() ;
271 crossSectionCalculator->Initialize(x,gam,phi,theBeamPolarization,
272 theTargetPolarization,1);
273 xs=crossSectionCalculator->XSection(G4StokesVector::ZERO,
275 if(xs > grej) {
276 if (isElectron){
277 G4cout << "G4PolarizedMollerBhabhaModel::SampleSecondaries Warning! "<<G4endl
278 << "Majorant " << grej << " < "
279 << xs << " for phi= " << phi<<G4endl
280 << " e-e- (Moller) scattering"<< G4endl
281 <<"PHI DICING"<<G4endl;
282 } else {
283 G4cout << "G4PolarizedMollerBhabhaModel::SampleSecondaries Warning! "<<G4endl
284 << "Majorant " << grej << " < "
285 << xs << " for phi= " << phi<<G4endl
286 << " e+e- (Bhabha) scattering"<< G4endl
287 <<"PHI DICING"<<G4endl;
288 }
289 }
290 } while(grej * G4UniformRand() > xs);
291 }
292
293 // fix kinematics of delta electron
294 G4double deltaKinEnergy = x * kineticEnergy;
295 G4double deltaMomentum =
296 std::sqrt(deltaKinEnergy * (deltaKinEnergy + 2.0*electron_mass_c2));
297 G4double cost = deltaKinEnergy * (energy + electron_mass_c2) /
298 (deltaMomentum * totalMomentum);
299 G4double sint = 1.0 - cost*cost;
300 if(sint > 0.0) sint = std::sqrt(sint);
301
302
303 G4ThreeVector deltaDirection(-sint*std::cos(phi),-sint*std::sin(phi), cost) ;
304 deltaDirection.rotateUz(direction);
305
306 // primary change
307 kineticEnergy -= deltaKinEnergy;
309
310 if(kineticEnergy > DBL_MIN) {
311 G4ThreeVector dir = totalMomentum*direction - deltaMomentum*deltaDirection;
312 direction = dir.unit();
314 }
315
316 // create G4DynamicParticle object for delta ray
317 G4DynamicParticle* delta = new G4DynamicParticle(theElectron,deltaDirection,deltaKinEnergy);
318 vdp->push_back(delta);
319
320 // get interaction frame
321 G4ThreeVector nInteractionFrame =
322 G4PolarizationHelper::GetFrame(direction,deltaDirection);
323
324 if (crossSectionCalculator) {
325 // calculate mean final state polarizations
326
327 theBeamPolarization.InvRotateAz(nInteractionFrame,direction);
328 theTargetPolarization.InvRotateAz(nInteractionFrame,direction);
329 crossSectionCalculator->Initialize(x,gam,phi,theBeamPolarization,
330 theTargetPolarization,2);
331
332 // electron/positron
333 fPositronPolarization=crossSectionCalculator->GetPol2();
334 fPositronPolarization.RotateAz(nInteractionFrame,direction);
335
336 fParticleChange->ProposePolarization(fPositronPolarization);
337
338 // electron
339 fElectronPolarization=crossSectionCalculator->GetPol3();
340 fElectronPolarization.RotateAz(nInteractionFrame,deltaDirection);
341 delta->SetPolarization(fElectronPolarization.x(),
342 fElectronPolarization.y(),
343 fElectronPolarization.z());
344 }
345 else {
346 fPositronPolarization=G4ThreeVector();
347 fElectronPolarization=G4ThreeVector();
348 }
349}
350
351//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:64
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:53
double z() const
Hep3Vector unit() const
double x() const
double y() const
Hep3Vector & rotateUz(const Hep3Vector &)
Definition: ThreeVector.cc:72
const G4ThreeVector & GetMomentumDirection() const
void SetPolarization(G4double polX, G4double polY, G4double polZ)
G4double GetKineticEnergy() const
const G4ThreeVector & GetPolarization() const
G4ParticleChangeForLoss * fParticleChange
G4ParticleDefinition * theElectron
virtual G4double ComputeCrossSectionPerElectron(const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy)
virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition *, G4double kinEnergy)
void SetProposedKineticEnergy(G4double proposedKinEnergy)
const G4Track * GetCurrentTrack() const
void ProposePolarization(const G4ThreeVector &dir)
void SetProposedMomentumDirection(const G4ThreeVector &dir)
static G4ThreeVector GetFrame(const G4ThreeVector &, const G4ThreeVector &)
bool IsPolarized(G4LogicalVolume *lVol) const
static G4PolarizationManager * GetInstance()
const G4ThreeVector & GetVolumePolarization(G4LogicalVolume *lVol) const
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
G4PolarizedMollerBhabhaModel(const G4ParticleDefinition *p=0, const G4String &nam="PolarizedMollerBhabha")
virtual G4double ComputeCrossSectionPerElectron(const G4ParticleDefinition *, G4double kinEnergy, G4double cut, G4double emax)
static const G4StokesVector ZERO
void InvRotateAz(G4ThreeVector nInteractionFrame, G4ThreeVector particleDirection)
void RotateAz(G4ThreeVector nInteractionFrame, G4ThreeVector particleDirection)
G4VPhysicalVolume * GetVolume() const
G4double MaxSecondaryKinEnergy(const G4DynamicParticle *dynParticle)
Definition: G4VEmModel.hh:399
G4LogicalVolume * GetLogicalVolume() const
virtual G4double XSection(const G4StokesVector &pol2, const G4StokesVector &pol3)=0
virtual G4StokesVector GetPol3()
virtual G4StokesVector GetPol2()
virtual void Initialize(G4double, G4double, G4double, const G4StokesVector &p0, const G4StokesVector &p1, G4int flag=0)
T sqr(const T &x)
Definition: templates.hh:145
#define DBL_MIN
Definition: templates.hh:75