155 if(PositKinEnergy == 0.0)
158 G4double sinTeta = std::sqrt((1.0 - cosTeta) * (1.0 + cosTeta));
160 G4ThreeVector dir(sinTeta * std::cos(phi), sinTeta * std::sin(phi),
182 if(fVerboseLevel >= 1)
184 G4cout <<
"G4PolarizedComptonModel::SampleSecondaries in "
189 if(targetIsPolarized)
195 G4double polarization = fBeamPolarization.
p3() * fTargetPolarization.
p3();
197 G4double gamam1 = PositKinEnergy / electron_mass_c2;
198 G4double gama = gamam1 + 1., gamap1 = gamam1 + 2.;
199 G4double sqgrate = std::sqrt(gamam1 / gamap1) / 2.,
200 sqg2m1 = std::sqrt(gamam1 * gamap1);
203 G4double epsilmin = 0.5 - sqgrate, epsilmax = 0.5 + sqgrate;
204 G4double epsilqot = epsilmax / epsilmin;
210 G4double gmax = 1. + std::fabs(polarization);
212 fCrossSectionCalculator->
Initialize(epsilmin, gama, 0., fBeamPolarization,
213 fTargetPolarization);
217 ed <<
"ERROR in PolarizedAnnihilationPS::PostStepDoIt\n"
218 <<
"epsilmin DiceRoutine not appropriate ! "
220 G4Exception(
"G4PolarizedAnnihilationModel::SampleSecondaries",
"pol006",
224 fCrossSectionCalculator->
Initialize(epsilmax, gama, 0., fBeamPolarization,
225 fTargetPolarization);
229 ed <<
"ERROR in PolarizedAnnihilationPS::PostStepDoIt\n"
230 <<
"epsilmax DiceRoutine not appropriate ! "
232 G4Exception(
"G4PolarizedAnnihilationModel::SampleSecondaries",
"pol007",
244 fCrossSectionCalculator->
Initialize(epsil, gama, 0., fBeamPolarization,
245 fTargetPolarization, 1);
250 if(treject > gmax || treject < 0.)
253 ed <<
"ERROR in PolarizedAnnihilationPS::PostStepDoIt\n"
255 <<
") rejection does not work properly: " << treject <<
G4endl;
256 G4Exception(
"G4PolarizedAnnihilationModel::SampleSecondaries",
"pol008",
260 if(treject > trejectmax)
261 trejectmax = treject;
265 ed <<
"WARNING in PolarizedAnnihilationPS::PostStepDoIt\n"
266 <<
"eps dicing very inefficient =" << trejectmax / gmax <<
", "
267 << treject / gmax <<
". For secondary energy = " << epsil <<
" "
269 G4Exception(
"G4PolarizedAnnihilationModel::SampleSecondaries",
"pol009",
278 G4double cost = (epsil * gamap1 - 1.) / (epsil * sqg2m1);
279 G4double sint = std::sqrt((1. + cost) * (1. - cost));
282 std::sqrt(
sqr(fBeamPolarization.
p1()) +
sqr(fBeamPolarization.
p2()));
284 std::sqrt(
sqr(fTargetPolarization.
p1()) +
sqr(fTargetPolarization.
p2()));
289 fCrossSectionCalculator->
Initialize(epsil, gama, 0., fBeamPolarization,
290 fTargetPolarization, 2);
293 gdiced += fCrossSectionCalculator->
getVar(3) * fBeamPolarization.
p3() *
294 fTargetPolarization.
p3();
296 (std::fabs(fCrossSectionCalculator->
getVar(1)) +
297 std::fabs(fCrossSectionCalculator->
getVar(2))) *
298 beamTrans * targetTrans;
299 gdiced += 1. * std::fabs(fCrossSectionCalculator->
getVar(4)) *
300 (std::fabs(fBeamPolarization.
p3()) * targetTrans +
301 std::fabs(fTargetPolarization.
p3()) * beamTrans);
304 gdist += fCrossSectionCalculator->
getVar(3) * fBeamPolarization.
p3() *
305 fTargetPolarization.
p3();
306 gdist += fCrossSectionCalculator->
getVar(1) *
307 (std::cos(phi) * fBeamPolarization.
p1() +
308 std::sin(phi) * fBeamPolarization.
p2()) *
309 (std::cos(phi) * fTargetPolarization.
p1() +
310 std::sin(phi) * fTargetPolarization.
p2());
311 gdist += fCrossSectionCalculator->
getVar(2) *
312 (std::cos(phi) * fBeamPolarization.
p2() -
313 std::sin(phi) * fBeamPolarization.
p1()) *
314 (std::cos(phi) * fTargetPolarization.
p2() -
315 std::sin(phi) * fTargetPolarization.
p1());
317 fCrossSectionCalculator->
getVar(4) *
318 (std::cos(phi) * fBeamPolarization.
p3() * fTargetPolarization.
p1() +
319 std::cos(phi) * fBeamPolarization.
p1() * fTargetPolarization.
p3() +
320 std::sin(phi) * fBeamPolarization.
p3() * fTargetPolarization.
p2() +
321 std::sin(phi) * fBeamPolarization.
p2() * fTargetPolarization.
p3());
323 treject = gdist / gdiced;
324 if(treject > 1. + 1.e-10 || treject < 0)
327 ed <<
"!!!ERROR in PolarizedAnnihilationPS::PostStepDoIt\n"
328 <<
" phi rejection does not work properly: " << treject <<
G4endl;
332 G4Exception(
"G4PolarizedAnnihilationModel::SampleSecondaries",
"pol009",
339 ed <<
"!!!ERROR in PolarizedAnnihilationPS::PostStepDoIt\n"
340 <<
" phi rejection does not work properly: " << treject <<
"\n";
341 G4cout <<
" gdiced=" << gdiced <<
" gdist=" << gdist <<
"\n";
343 G4Exception(
"G4PolarizedAnnihilationModel::SampleSecondaries",
"pol010",
350 G4double dirx = sint * std::cos(phi);
351 G4double diry = sint * std::sin(phi);
355 G4double TotalAvailableEnergy = PositKinEnergy + 2 * electron_mass_c2;
356 G4double Phot1Energy = epsil * TotalAvailableEnergy;
357 G4double Phot2Energy = (1. - epsil) * TotalAvailableEnergy;
367 fBeamPolarization.
InvRotateAz(nInteractionFrame, PositDirection);
368 fTargetPolarization.
InvRotateAz(nInteractionFrame, PositDirection);
372 fCrossSectionCalculator->
Initialize(epsil, gama, phi, fBeamPolarization,
373 fTargetPolarization, 2);
375 Phot1Direction.
rotateUz(PositDirection);
379 fFinalGamma1Polarization = fCrossSectionCalculator->
GetPol2();
384 ed <<
"ERROR: PolarizedAnnihilation Polarization Vector at epsil = "
385 << epsil <<
" is too large!!! \n"
386 <<
"annihi pol1= " << fFinalGamma1Polarization <<
", (" << n1 <<
")\n";
387 fFinalGamma1Polarization *= 1. / std::sqrt(n1);
388 G4Exception(
"G4PolarizedAnnihilationModel::SampleSecondaries",
"pol011",
394 fFinalGamma1Polarization.
RotateAz(nInteractionFrame, Phot1Direction);
396 fFinalGamma1Polarization.
p2(),
397 fFinalGamma1Polarization.
p3());
399 fvect->push_back(aParticle1);
403 G4double Eratio = Phot1Energy / Phot2Energy;
405 std::sqrt(PositKinEnergy * (PositKinEnergy + 2. * electron_mass_c2));
407 (PositP - dirz * Phot1Energy) / Phot2Energy);
408 Phot2Direction.
rotateUz(PositDirection);
414 fFinalGamma2Polarization = fCrossSectionCalculator->
GetPol3();
419 ed <<
"ERROR: PolarizedAnnihilation Polarization Vector at epsil = "
420 << epsil <<
" is too large!!! \n";
421 ed <<
"annihi pol2= " << fFinalGamma2Polarization <<
", (" << n2 <<
")\n";
423 G4Exception(
"G4PolarizedAnnihilationModel::SampleSecondaries",
"pol012",
425 fFinalGamma2Polarization *= 1. / std::sqrt(n2);
428 fFinalGamma2Polarization.
RotateAz(nInteractionFrame, Phot2Direction);
430 fFinalGamma2Polarization.
p2(),
431 fFinalGamma2Polarization.
p3());
433 fvect->push_back(aParticle2);