75 theTargetPolarization(0.,0.,0.),
76 theAsymmetryTable(nullptr),
77 theTransverseAsymmetryTable(nullptr)
167 G4cout <<
"G4ePolarizedIonisation::MeanFreePath: "
189 std::max(nLength - step/curLength, 0.0);
194 G4cout <<
"G4ePolarizedIonisation::PostStepGetPhysicalInteractionLength: "
216 if (volumeIsPolarized && !volPolarization.
IsZero()) {
225 G4cout <<
"G4ePolarizedIonisation::ComputeSaturationFactor: " <<
G4endl;
229 G4cout <<
" MaterialPol. " << volPolarization <<
G4endl;
238 if(midx < theAsymmetryTable->size()) {
239 aVector = (*theAsymmetryTable)(midx);
241 if(midx < theTransverseAsymmetryTable->size()) {
242 bVector = (*theTransverseAsymmetryTable)(midx);
244 if(aVector && bVector) {
247 G4double polZZ = polarization.z()*(volPolarization*direction0);
253 factor /= (1. + polZZ*lAsymmetry + (polXX + polYY)*tAsymmetry);
256 G4cout <<
" Asymmetry: " << lAsymmetry <<
", " << tAsymmetry <<
G4endl;
257 G4cout <<
" PolProduct: " << polXX <<
", " << polYY <<
", " << polZZ <<
G4endl;
262 ed <<
"Problem with asymmetry tables: material index " << midx
263 <<
" is out of range or tables are not filled";
264 G4Exception(
"G4ePolarizedIonisation::ComputeSaturationFactor",
"em0048",
281 if(masterProcess && masterProcess !=
this) { master =
false; }
301 for (
size_t j=0 ; j < numOfCouples; j++ ) {
312 for (
size_t i = 0 ; i < bins ; i++ ) {
335 if (
isElectron) { lAsymmetry = tAsymmetry = -1.0; }
356 lAsymmetry=sigma2/sigma0 - 1.;
357 tAsymmetry=sigma3/sigma0 - 1.;
359 if (std::fabs(lAsymmetry)>1.) {
360 G4cout<<
"G4ePolarizedIonisation::ComputeAsymmetry WARNING: E(MeV)= "
361 << energy <<
" lAsymmetry= "<<lAsymmetry
362 <<
" ("<<std::fabs(lAsymmetry)-1.<<
")\n";
364 if (std::fabs(tAsymmetry)>1.) {
365 G4cout<<
" energy="<<energy<<
"\n";
366 G4cout<<
"G4ePolarizedIonisation::ComputeAsymmetry WARNING: E(MeV)= "
367 << energy <<
" tAsymmetry= "<<tAsymmetry
368 <<
" ("<<std::fabs(tAsymmetry)-1.<<
")\n";
const G4VProcess * GetMasterProcess() const
virtual G4double MinPrimaryEnergy(const G4ParticleDefinition *, const G4Material *, G4double cut)
const G4ThreeVector & GetPolarization() const
const std::vector< G4double > * GetEnergyCutsVector(size_t pcIdx) const
G4double MaxKinEnergy() const
G4bool isElectron(G4int ityp)
G4ePolarizedIonisation(const G4String &name="pol-eIoni")
std::ostringstream G4ExceptionDescription
G4double GetKineticEnergy() const
CLHEP::Hep3Vector G4ThreeVector
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
const G4DynamicParticle * GetDynamicParticle() const
G4double ComputeAsymmetry(G4double energy, const G4MaterialCutsCouple *couple, const G4ParticleDefinition &particle, G4double cut, G4double &tasm)
virtual ~G4ePolarizedIonisation()
G4ThreeVector theTargetPolarization
static G4PolarizationManager * GetInstance()
virtual G4double GetMeanFreePath(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
G4double theNumberOfInteractionLengthLeft
virtual G4double PostStepGetPhysicalInteractionLength(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
size_t GetVectorLength() const
void SetFluctModel(G4VEmFluctuationModel *)
G4PhysicsVector * LambdaPhysicsVector(const G4MaterialCutsCouple *, G4double cut)
G4PolarizedMollerBhabhaModel * emModel
virtual G4double PostStepGetPhysicalInteractionLength(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
static G4PhysicsTable * PreparePhysicsTable(G4PhysicsTable *physTable)
void SetHighEnergyLimit(G4double)
G4VEmFluctuationModel * FluctModel()
G4GLOB_DLL std::ostream G4cout
virtual void InitialiseEnergyLossProcess(const G4ParticleDefinition *, const G4ParticleDefinition *)
size_t GetTableSize() const
const G4String & GetName() const
void BuildAsymmetryTables(const G4ParticleDefinition &part)
const G4ThreeVector & GetMomentumDirection() const
G4double CrossSection(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
G4double currentInteractionLength
void PutValue(size_t index, G4double theValue)
G4PhysicsTable * theAsymmetryTable
void SetProcessSubType(G4int)
void AddEmModel(G4int, G4VEmModel *, G4VEmFluctuationModel *fluc=0, const G4Region *region=0)
G4double MinKinEnergy() const
G4double Energy(size_t index) const
G4double Value(G4double theEnergy, size_t &lastidx) const
G4double ComputeSaturationFactor(const G4Track &aTrack)
void SetSecondaryParticle(const G4ParticleDefinition *p)
G4Material * GetMaterial() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
static G4ProductionCutsTable * GetProductionCutsTable()
static G4Positron * Positron()
static const G4double factor
G4LogicalVolume * GetLogicalVolume() const
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4double energy(const ThreeVector &p, const G4double m)
virtual G4double GetMeanFreePath(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
const G4double x[NPOINTSGL]
static G4EmParameters * Instance()
bool IsPolarized(G4LogicalVolume *lVol) const
void SetTargetPolarization(const G4ThreeVector &pTarget)
void SetEmModel(G4VEmModel *, G4int index=1)
G4VPhysicalVolume * GetVolume() const
static G4ThreeVector GetParticleFrameY(const G4ThreeVector &)
void insertAt(size_t, G4PhysicsVector *)
static G4Electron * Electron()
G4ParticleDefinition * theElectron
const G4String & GetName() const
void SetBeamPolarization(const G4ThreeVector &pBeam)
void SetLowEnergyLimit(G4double)
G4ThreeVector G4ParticleMomentum
static G4ThreeVector GetParticleFrameX(const G4ThreeVector &)
const G4ThreeVector & GetVolumePolarization(G4LogicalVolume *lVol) const
virtual G4bool IsApplicable(const G4ParticleDefinition &p)
G4VEmFluctuationModel * flucModel
G4PhysicsTable * theTransverseAsymmetryTable
size_t CurrentMaterialCutsCoupleIndex() const