Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Protected Member Functions
G4ePolarizedIonisation Class Reference

#include <G4ePolarizedIonisation.hh>

Inheritance diagram for G4ePolarizedIonisation:
G4VEnergyLossProcess G4VContinuousDiscreteProcess G4VProcess

Public Member Functions

 G4ePolarizedIonisation (const G4String &name="pol-eIoni")
 
virtual ~G4ePolarizedIonisation ()
 
G4bool IsApplicable (const G4ParticleDefinition &p)
 
virtual void PrintInfo ()
 
- Public Member Functions inherited from G4VEnergyLossProcess
 G4VEnergyLossProcess (const G4String &name="EnergyLoss", G4ProcessType type=fElectromagnetic)
 
virtual ~G4VEnergyLossProcess ()
 
void PreparePhysicsTable (const G4ParticleDefinition &)
 
void BuildPhysicsTable (const G4ParticleDefinition &)
 
G4PhysicsTableBuildDEDXTable (G4EmTableType tType=fRestricted)
 
G4PhysicsTableBuildLambdaTable (G4EmTableType tType=fRestricted)
 
void PrintInfoDefinition (const G4ParticleDefinition &part)
 
void StartTracking (G4Track *)
 
G4double AlongStepGetPhysicalInteractionLength (const G4Track &, G4double previousStepSize, G4double currentMinimumStep, G4double &currentSafety, G4GPILSelection *selection)
 
G4double PostStepGetPhysicalInteractionLength (const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
 
G4VParticleChangeAlongStepDoIt (const G4Track &, const G4Step &)
 
G4double SampleSubCutSecondaries (std::vector< G4Track * > &, const G4Step &, G4VEmModel *model, G4int matIdx)
 
G4VParticleChangePostStepDoIt (const G4Track &, const G4Step &)
 
G4bool StorePhysicsTable (const G4ParticleDefinition *, const G4String &directory, G4bool ascii=false)
 
G4bool RetrievePhysicsTable (const G4ParticleDefinition *, const G4String &directory, G4bool ascii)
 
G4double GetDEDXDispersion (const G4MaterialCutsCouple *couple, const G4DynamicParticle *dp, G4double length)
 
G4double CrossSectionPerVolume (G4double kineticEnergy, const G4MaterialCutsCouple *couple)
 
G4double MeanFreePath (const G4Track &track)
 
G4double ContinuousStepLimit (const G4Track &track, G4double previousStepSize, G4double currentMinimumStep, G4double &currentSafety)
 
G4VEmModelSelectModelForMaterial (G4double kinEnergy, size_t &idx) const
 
void AddEmModel (G4int, G4VEmModel *, G4VEmFluctuationModel *fluc=0, const G4Region *region=0)
 
void UpdateEmModel (const G4String &, G4double, G4double)
 
void SetEmModel (G4VEmModel *, G4int index=1)
 
G4VEmModelEmModel (G4int index=1) const
 
G4VEmModelGetModelByIndex (G4int idx=0, G4bool ver=false) const
 
G4int NumberOfModels () const
 
void SetFluctModel (G4VEmFluctuationModel *)
 
G4VEmFluctuationModelFluctModel ()
 
void SetBaseParticle (const G4ParticleDefinition *p)
 
const G4ParticleDefinitionParticle () const
 
const G4ParticleDefinitionBaseParticle () const
 
const G4ParticleDefinitionSecondaryParticle () const
 
void ActivateSubCutoff (G4bool val, const G4Region *region=0)
 
void SetCrossSectionBiasingFactor (G4double f, G4bool flag=true)
 
void ActivateForcedInteraction (G4double length=0.0, const G4String &region="", G4bool flag=true)
 
void ActivateSecondaryBiasing (const G4String &region, G4double factor, G4double energyLimit)
 
void AddCollaborativeProcess (G4VEnergyLossProcess *)
 
void SetLossFluctuations (G4bool val)
 
void SetRandomStep (G4bool val)
 
void SetIntegral (G4bool val)
 
G4bool IsIntegral () const
 
void SetIonisation (G4bool val)
 
G4bool IsIonisationProcess () const
 
void SetLinearLossLimit (G4double val)
 
void SetMinSubRange (G4double val)
 
void SetLambdaFactor (G4double val)
 
void SetStepFunction (G4double v1, G4double v2)
 
void SetLowestEnergyLimit (G4double)
 
G4int NumberOfSubCutoffRegions () const
 
void SetDEDXTable (G4PhysicsTable *p, G4EmTableType tType)
 
void SetCSDARangeTable (G4PhysicsTable *pRange)
 
void SetRangeTableForLoss (G4PhysicsTable *p)
 
void SetSecondaryRangeTable (G4PhysicsTable *p)
 
void SetInverseRangeTable (G4PhysicsTable *p)
 
void SetLambdaTable (G4PhysicsTable *p)
 
void SetSubLambdaTable (G4PhysicsTable *p)
 
void SetDEDXBinning (G4int nbins)
 
void SetLambdaBinning (G4int nbins)
 
void SetDEDXBinningForCSDARange (G4int nbins)
 
void SetMinKinEnergy (G4double e)
 
G4double MinKinEnergy () const
 
void SetMaxKinEnergy (G4double e)
 
G4double MaxKinEnergy () const
 
void SetMaxKinEnergyForCSDARange (G4double e)
 
G4double CrossSectionBiasingFactor () const
 
G4double GetDEDX (G4double &kineticEnergy, const G4MaterialCutsCouple *)
 
G4double GetDEDXForSubsec (G4double &kineticEnergy, const G4MaterialCutsCouple *)
 
G4double GetRange (G4double &kineticEnergy, const G4MaterialCutsCouple *)
 
G4double GetCSDARange (G4double &kineticEnergy, const G4MaterialCutsCouple *)
 
G4double GetRangeForLoss (G4double &kineticEnergy, const G4MaterialCutsCouple *)
 
G4double GetKineticEnergy (G4double &range, const G4MaterialCutsCouple *)
 
G4double GetLambda (G4double &kineticEnergy, const G4MaterialCutsCouple *)
 
G4bool TablesAreBuilt () const
 
G4PhysicsTableDEDXTable () const
 
G4PhysicsTableDEDXTableForSubsec () const
 
G4PhysicsTableDEDXunRestrictedTable () const
 
G4PhysicsTableIonisationTable () const
 
G4PhysicsTableIonisationTableForSubsec () const
 
G4PhysicsTableCSDARangeTable () const
 
G4PhysicsTableSecondaryRangeTable () const
 
G4PhysicsTableRangeTableForLoss () const
 
G4PhysicsTableInverseRangeTable () const
 
G4PhysicsTableLambdaTable () const
 
G4PhysicsTableSubLambdaTable () const
 
const G4ElementGetCurrentElement () const
 
void SetDynamicMassCharge (G4double massratio, G4double charge2ratio)
 
- Public Member Functions inherited from G4VContinuousDiscreteProcess
 G4VContinuousDiscreteProcess (const G4String &, G4ProcessType aType=fNotDefined)
 
 G4VContinuousDiscreteProcess (G4VContinuousDiscreteProcess &)
 
virtual ~G4VContinuousDiscreteProcess ()
 
virtual G4double AtRestGetPhysicalInteractionLength (const G4Track &, G4ForceCondition *)
 
virtual G4VParticleChangeAtRestDoIt (const G4Track &, const G4Step &)
 
- Public Member Functions inherited from G4VProcess
 G4VProcess (const G4String &aName="NoName", G4ProcessType aType=fNotDefined)
 
 G4VProcess (const G4VProcess &right)
 
virtual ~G4VProcess ()
 
G4int operator== (const G4VProcess &right) const
 
G4int operator!= (const G4VProcess &right) const
 
G4double GetCurrentInteractionLength () const
 
void SetPILfactor (G4double value)
 
G4double GetPILfactor () const
 
G4double AlongStepGPIL (const G4Track &track, G4double previousStepSize, G4double currentMinimumStep, G4double &proposedSafety, G4GPILSelection *selection)
 
G4double AtRestGPIL (const G4Track &track, G4ForceCondition *condition)
 
G4double PostStepGPIL (const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
 
const G4StringGetPhysicsTableFileName (const G4ParticleDefinition *, const G4String &directory, const G4String &tableName, G4bool ascii=false)
 
const G4StringGetProcessName () const
 
G4ProcessType GetProcessType () const
 
void SetProcessType (G4ProcessType)
 
G4int GetProcessSubType () const
 
void SetProcessSubType (G4int)
 
virtual void EndTracking ()
 
virtual void SetProcessManager (const G4ProcessManager *)
 
virtual const G4ProcessManagerGetProcessManager ()
 
virtual void ResetNumberOfInteractionLengthLeft ()
 
G4double GetNumberOfInteractionLengthLeft () const
 
G4double GetTotalNumberOfInteractionLengthTraversed () const
 
G4bool isAtRestDoItIsEnabled () const
 
G4bool isAlongStepDoItIsEnabled () const
 
G4bool isPostStepDoItIsEnabled () const
 
virtual void DumpInfo () const
 
void SetVerboseLevel (G4int value)
 
G4int GetVerboseLevel () const
 
virtual void SetMasterProcess (G4VProcess *masterP)
 
const G4VProcessGetMasterProcess () const
 
virtual void BuildWorkerPhysicsTable (const G4ParticleDefinition &part)
 
virtual void PrepareWorkerPhysicsTable (const G4ParticleDefinition &)
 

Protected Member Functions

virtual void InitialiseEnergyLossProcess (const G4ParticleDefinition *, const G4ParticleDefinition *)
 
virtual G4double MinPrimaryEnergy (const G4ParticleDefinition *, const G4Material *, G4double cut)
 
G4double PostStepGetPhysicalInteractionLength (const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
 
G4double GetMeanFreePath (const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
 
virtual void BuildPhysicsTable (const G4ParticleDefinition &)
 
G4double ComputeAsymmetry (G4double energy, const G4MaterialCutsCouple *couple, const G4ParticleDefinition &particle, G4double cut, G4double &tasm)
 
const G4ParticleDefinitionDefineBaseParticle (const G4ParticleDefinition *p)
 
- Protected Member Functions inherited from G4VEnergyLossProcess
G4double GetMeanFreePath (const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
 
G4double GetContinuousStepLimit (const G4Track &track, G4double previousStepSize, G4double currentMinimumStep, G4double &currentSafety)
 
G4PhysicsVectorLambdaPhysicsVector (const G4MaterialCutsCouple *, G4double cut)
 
size_t CurrentMaterialCutsCoupleIndex () const
 
void SelectModel (G4double kinEnergy)
 
void SetParticle (const G4ParticleDefinition *p)
 
void SetSecondaryParticle (const G4ParticleDefinition *p)
 
- Protected Member Functions inherited from G4VContinuousDiscreteProcess
void SetGPILSelection (G4GPILSelection selection)
 
G4GPILSelection GetGPILSelection () const
 
- Protected Member Functions inherited from G4VProcess
void SubtractNumberOfInteractionLengthLeft (G4double previousStepSize)
 
void ClearNumberOfInteractionLengthLeft ()
 

Additional Inherited Members

- Static Public Member Functions inherited from G4VProcess
static const G4StringGetProcessTypeName (G4ProcessType)
 
- Protected Attributes inherited from G4VEnergyLossProcess
G4ParticleChangeForLoss fParticleChange
 
- Protected Attributes inherited from G4VProcess
const G4ProcessManageraProcessManager
 
G4VParticleChangepParticleChange
 
G4ParticleChange aParticleChange
 
G4double theNumberOfInteractionLengthLeft
 
G4double currentInteractionLength
 
G4double theInitialNumberOfInteractionLength
 
G4String theProcessName
 
G4String thePhysicsTableFileName
 
G4ProcessType theProcessType
 
G4int theProcessSubType
 
G4double thePILfactor
 
G4bool enableAtRestDoIt
 
G4bool enableAlongStepDoIt
 
G4bool enablePostStepDoIt
 
G4int verboseLevel
 

Detailed Description

Definition at line 66 of file G4ePolarizedIonisation.hh.

Constructor & Destructor Documentation

G4ePolarizedIonisation::G4ePolarizedIonisation ( const G4String name = "pol-eIoni")

Definition at line 67 of file G4ePolarizedIonisation.cc.

References fIonisation, G4VProcess::SetProcessSubType(), and G4VProcess::verboseLevel.

68  : G4VEnergyLossProcess(name),
69  theElectron(G4Electron::Electron()),
70  isElectron(true),
71  isInitialised(false),
72  theAsymmetryTable(NULL),
73  theTransverseAsymmetryTable(NULL)
74 {
75  verboseLevel=0;
76  // SetDEDXBinning(120);
77  // SetLambdaBinning(120);
78  // numBinAsymmetryTable=78;
79 
80  // SetMinKinEnergy(0.1*keV);
81  // SetMaxKinEnergy(100.0*TeV);
82  // PrintInfoDefinition();
84  flucModel = 0;
85  emModel = 0;
86 }
G4VEnergyLossProcess(const G4String &name="EnergyLoss", G4ProcessType type=fElectromagnetic)
G4int verboseLevel
Definition: G4VProcess.hh:368
void SetProcessSubType(G4int)
Definition: G4VProcess.hh:432
static G4Electron * Electron()
Definition: G4Electron.cc:94
G4ePolarizedIonisation::~G4ePolarizedIonisation ( )
virtual

Definition at line 90 of file G4ePolarizedIonisation.cc.

91 {
92  delete theAsymmetryTable;
93  delete theTransverseAsymmetryTable;
94 }

Member Function Documentation

void G4ePolarizedIonisation::BuildPhysicsTable ( const G4ParticleDefinition part)
protectedvirtual

Reimplemented from G4VProcess.

Definition at line 239 of file G4ePolarizedIonisation.cc.

References G4VEnergyLossProcess::BuildPhysicsTable(), G4PhysicsTable::clearAndDestroy(), ComputeAsymmetry(), G4PhysicsVector::Energy(), G4ProductionCutsTable::GetEnergyCutsVector(), G4ProductionCutsTable::GetMaterialCutsCouple(), G4ProductionCutsTable::GetProductionCutsTable(), G4ProductionCutsTable::GetTableSize(), G4PhysicsVector::GetVectorLength(), G4PhysicsTable::insertAt(), G4VEnergyLossProcess::LambdaPhysicsVector(), and G4PhysicsVector::PutValue().

240 {
241  // *** build DEDX and (unpolarized) cross section tables
243  // G4PhysicsTable* pt =
244  // BuildDEDXTable();
245 
246 
247  // *** build asymmetry-table
248  if (theAsymmetryTable) {
249  theAsymmetryTable->clearAndDestroy(); delete theAsymmetryTable;}
250  if (theTransverseAsymmetryTable) {
251  theTransverseAsymmetryTable->clearAndDestroy(); delete theTransverseAsymmetryTable;}
252 
253  const G4ProductionCutsTable* theCoupleTable=
255  size_t numOfCouples = theCoupleTable->GetTableSize();
256 
257  theAsymmetryTable = new G4PhysicsTable(numOfCouples);
258  theTransverseAsymmetryTable = new G4PhysicsTable(numOfCouples);
259 
260  for (size_t j=0 ; j < numOfCouples; j++ ) {
261  // get cut value
262  const G4MaterialCutsCouple* couple = theCoupleTable->GetMaterialCutsCouple(j);
263 
264  G4double cut = (*theCoupleTable->GetEnergyCutsVector(1))[j];
265 
266  //create physics vectors then fill it (same parameters as lambda vector)
267  G4PhysicsVector * ptrVectorA = LambdaPhysicsVector(couple,cut);
268  G4PhysicsVector * ptrVectorB = LambdaPhysicsVector(couple,cut);
269  size_t bins = ptrVectorA->GetVectorLength();
270 
271  for (size_t i = 0 ; i < bins ; i++ ) {
272  G4double lowEdgeEnergy = ptrVectorA->Energy(i);
273  G4double tasm=0.;
274  G4double asym = ComputeAsymmetry(lowEdgeEnergy, couple, part, cut, tasm);
275  ptrVectorA->PutValue(i,asym);
276  ptrVectorB->PutValue(i,tasm);
277  }
278  theAsymmetryTable->insertAt( j , ptrVectorA ) ;
279  theTransverseAsymmetryTable->insertAt( j , ptrVectorB ) ;
280  }
281 
282 }
const std::vector< G4double > * GetEnergyCutsVector(size_t pcIdx) const
void BuildPhysicsTable(const G4ParticleDefinition &)
G4double ComputeAsymmetry(G4double energy, const G4MaterialCutsCouple *couple, const G4ParticleDefinition &particle, G4double cut, G4double &tasm)
size_t GetVectorLength() const
G4PhysicsVector * LambdaPhysicsVector(const G4MaterialCutsCouple *, G4double cut)
void PutValue(size_t index, G4double theValue)
G4double Energy(size_t index) const
static G4ProductionCutsTable * GetProductionCutsTable()
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
void insertAt(size_t, G4PhysicsVector *)
double G4double
Definition: G4Types.hh:76
void clearAndDestroy()
G4double G4ePolarizedIonisation::ComputeAsymmetry ( G4double  energy,
const G4MaterialCutsCouple couple,
const G4ParticleDefinition particle,
G4double  cut,
G4double tasm 
)
protected

Definition at line 285 of file G4ePolarizedIonisation.cc.

References G4VEmModel::CrossSection(), G4cout, G4PolarizedMollerBhabhaModel::SetBeamPolarization(), and G4PolarizedMollerBhabhaModel::SetTargetPolarization().

Referenced by BuildPhysicsTable().

290 {
291  G4double lAsymmetry = 0.0;
292  tAsymmetry = 0.0;
293  if (isElectron) {lAsymmetry = tAsymmetry = -1.0;}
294 
295  // calculate polarized cross section
296  theTargetPolarization=G4ThreeVector(0.,0.,1.);
297  emModel->SetTargetPolarization(theTargetPolarization);
298  emModel->SetBeamPolarization(theTargetPolarization);
299  G4double sigma2=emModel->CrossSection(couple,&aParticle,energy,cut,energy);
300 
301  // calculate transversely polarized cross section
302  theTargetPolarization=G4ThreeVector(1.,0.,0.);
303  emModel->SetTargetPolarization(theTargetPolarization);
304  emModel->SetBeamPolarization(theTargetPolarization);
305  G4double sigma3=emModel->CrossSection(couple,&aParticle,energy,cut,energy);
306 
307  // calculate unpolarized cross section
308  theTargetPolarization=G4ThreeVector();
309  emModel->SetTargetPolarization(theTargetPolarization);
310  emModel->SetBeamPolarization(theTargetPolarization);
311  G4double sigma0=emModel->CrossSection(couple,&aParticle,energy,cut,energy);
312  // determine assymmetries
313  if (sigma0>0.) {
314  lAsymmetry=sigma2/sigma0-1.;
315  tAsymmetry=sigma3/sigma0-1.;
316  }
317  if (std::fabs(lAsymmetry)>1.) {
318  G4cout<<" energy="<<energy<<"\n";
319  G4cout<<"WARNING lAsymmetry= "<<lAsymmetry<<" ("<<std::fabs(lAsymmetry)-1.<<")\n";
320  }
321  if (std::fabs(tAsymmetry)>1.) {
322  G4cout<<" energy="<<energy<<"\n";
323  G4cout<<"WARNING tAsymmetry= "<<tAsymmetry<<" ("<<std::fabs(tAsymmetry)-1.<<")\n";
324  }
325 // else {
326 // G4cout<<" tAsymmetry= "<<tAsymmetry<<" ("<<std::fabs(tAsymmetry)-1.<<")\n";
327 // }
328  return lAsymmetry;
329 }
CLHEP::Hep3Vector G4ThreeVector
double precision function energy(A, Z)
Definition: dpm25nuc6.f:4106
G4GLOB_DLL std::ostream G4cout
G4double CrossSection(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.hh:467
void SetTargetPolarization(const G4ThreeVector &pTarget)
double G4double
Definition: G4Types.hh:76
void SetBeamPolarization(const G4ThreeVector &pBeam)
const G4ParticleDefinition* G4ePolarizedIonisation::DefineBaseParticle ( const G4ParticleDefinition p)
protected
G4double G4ePolarizedIonisation::GetMeanFreePath ( const G4Track track,
G4double  previousStepSize,
G4ForceCondition condition 
)
protectedvirtual

Implements G4VContinuousDiscreteProcess.

Definition at line 133 of file G4ePolarizedIonisation.cc.

References G4VEnergyLossProcess::CurrentMaterialCutsCoupleIndex(), DBL_MAX, G4cout, G4endl, G4Track::GetDynamicParticle(), G4PolarizationManager::GetInstance(), G4DynamicParticle::GetKineticEnergy(), G4VPhysicalVolume::GetLogicalVolume(), G4VEnergyLossProcess::GetMeanFreePath(), G4DynamicParticle::GetMomentumDirection(), G4PolarizationHelper::GetParticleFrameX(), G4PolarizationHelper::GetParticleFrameY(), G4Track::GetPolarization(), G4Track::GetVolume(), G4PolarizationManager::GetVolumePolarization(), G4PolarizationManager::IsPolarized(), G4StokesVector::IsZero(), CLHEP::Hep3Vector::x(), CLHEP::Hep3Vector::y(), and CLHEP::Hep3Vector::z().

136 {
137  // *** get unploarised mean free path from lambda table ***
138  G4double mfp = G4VEnergyLossProcess::GetMeanFreePath(track, step, cond);
139 
140 
141  // *** get asymmetry, if target is polarized ***
142  G4VPhysicalVolume* aPVolume = track.GetVolume();
143  G4LogicalVolume* aLVolume = aPVolume->GetLogicalVolume();
144 
146  G4bool volumeIsPolarized = polarizationManger->IsPolarized(aLVolume);
147  const G4StokesVector ePolarization = track.GetPolarization();
148 
149  if (mfp != DBL_MAX && volumeIsPolarized && !ePolarization.IsZero()) {
150  const G4DynamicParticle* aDynamicElectron = track.GetDynamicParticle();
151  G4double eEnergy = aDynamicElectron->GetKineticEnergy();
152  const G4ParticleMomentum eDirection0 = aDynamicElectron->GetMomentumDirection();
153 
154  G4StokesVector volumePolarization = polarizationManger->GetVolumePolarization(aLVolume);
155 
156  G4bool isOutRange;
157  size_t idx = CurrentMaterialCutsCoupleIndex();
158  G4double lAsymmetry = (*theAsymmetryTable)(idx)->
159  GetValue(eEnergy, isOutRange);
160  G4double tAsymmetry = (*theTransverseAsymmetryTable)(idx)->
161  GetValue(eEnergy, isOutRange);
162 
163  // calculate longitudinal spin component
164  G4double polZZ = ePolarization.z()*
165  volumePolarization*eDirection0;
166  // calculate transvers spin components
167  G4double polXX = ePolarization.x()*
168  volumePolarization*G4PolarizationHelper::GetParticleFrameX(eDirection0);
169  G4double polYY = ePolarization.y()*
170  volumePolarization*G4PolarizationHelper::GetParticleFrameY(eDirection0);
171 
172 
173  G4double impact = 1. + polZZ*lAsymmetry + (polXX + polYY)*tAsymmetry;
174  // determine polarization dependent mean free path
175  mfp /= impact;
176  if (mfp <=0.) {
177  G4cout <<"PV impact ( "<<polXX<<" , "<<polYY<<" , "<<polZZ<<" )"<<G4endl;
178  G4cout << " impact on MFP is "<< impact <<G4endl;
179  G4cout<<" lAsymmetry= "<<lAsymmetry<<" ("<<std::fabs(lAsymmetry)-1.<<")\n";
180  G4cout<<" tAsymmetry= "<<tAsymmetry<<" ("<<std::fabs(tAsymmetry)-1.<<")\n";
181  }
182  }
183 
184  return mfp;
185 }
const G4ThreeVector & GetPolarization() const
G4double GetKineticEnergy() const
double x() const
const G4DynamicParticle * GetDynamicParticle() const
static G4PolarizationManager * GetInstance()
G4double GetMeanFreePath(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
double z() const
G4bool IsZero() const
G4GLOB_DLL std::ostream G4cout
bool G4bool
Definition: G4Types.hh:79
const G4ThreeVector & GetMomentumDirection() const
G4LogicalVolume * GetLogicalVolume() const
double y() const
bool IsPolarized(G4LogicalVolume *lVol) const
G4VPhysicalVolume * GetVolume() const
static G4ThreeVector GetParticleFrameY(const G4ThreeVector &)
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
#define DBL_MAX
Definition: templates.hh:83
static G4ThreeVector GetParticleFrameX(const G4ThreeVector &)
const G4ThreeVector & GetVolumePolarization(G4LogicalVolume *lVol) const
size_t CurrentMaterialCutsCoupleIndex() const
void G4ePolarizedIonisation::InitialiseEnergyLossProcess ( const G4ParticleDefinition part,
const G4ParticleDefinition  
)
protectedvirtual

Implements G4VEnergyLossProcess.

Definition at line 98 of file G4ePolarizedIonisation.cc.

References G4VEnergyLossProcess::AddEmModel(), G4VEnergyLossProcess::MaxKinEnergy(), G4VEnergyLossProcess::MinKinEnergy(), G4Positron::Positron(), G4VEmModel::SetHighEnergyLimit(), G4VEmModel::SetLowEnergyLimit(), and G4VEnergyLossProcess::SetSecondaryParticle().

101 {
102  if(!isInitialised) {
103 
104  if(part == G4Positron::Positron()) isElectron = false;
105  SetSecondaryParticle(theElectron);
106 
107 
108 
109  flucModel = new G4UniversalFluctuation();
110  //flucModel = new G4BohrFluctuations();
111 
112  // G4VEmModel* em = new G4MollerBhabhaModel();
113  emModel = new G4PolarizedMollerBhabhaModel;
114  emModel->SetLowEnergyLimit(MinKinEnergy());
115  emModel->SetHighEnergyLimit(MaxKinEnergy());
116  AddEmModel(1, emModel, flucModel);
117 
118  isInitialised = true;
119  }
120 }
void SetHighEnergyLimit(G4double)
Definition: G4VEmModel.hh:683
void AddEmModel(G4int, G4VEmModel *, G4VEmFluctuationModel *fluc=0, const G4Region *region=0)
void SetSecondaryParticle(const G4ParticleDefinition *p)
static G4Positron * Positron()
Definition: G4Positron.cc:94
G4double MinKinEnergy() const
G4double MaxKinEnergy() const
void SetLowEnergyLimit(G4double)
Definition: G4VEmModel.hh:690
G4bool G4ePolarizedIonisation::IsApplicable ( const G4ParticleDefinition p)
inlinevirtual

Implements G4VEnergyLossProcess.

Definition at line 146 of file G4ePolarizedIonisation.hh.

References G4Electron::Electron(), and G4Positron::Positron().

147 {
148  return (&p == G4Electron::Electron() || &p == G4Positron::Positron());
149 }
static G4Positron * Positron()
Definition: G4Positron.cc:94
static G4Electron * Electron()
Definition: G4Electron.cc:94
G4double G4ePolarizedIonisation::MinPrimaryEnergy ( const G4ParticleDefinition ,
const G4Material ,
G4double  cut 
)
inlineprotectedvirtual

Reimplemented from G4VEnergyLossProcess.

Definition at line 135 of file G4ePolarizedIonisation.hh.

References test::x.

138 {
139  G4double x = cut;
140  if(isElectron) x += cut;
141  return x;
142 }
double G4double
Definition: G4Types.hh:76
G4double G4ePolarizedIonisation::PostStepGetPhysicalInteractionLength ( const G4Track track,
G4double  previousStepSize,
G4ForceCondition condition 
)
protectedvirtual

Reimplemented from G4VContinuousDiscreteProcess.

Definition at line 187 of file G4ePolarizedIonisation.cc.

References G4VEnergyLossProcess::CurrentMaterialCutsCoupleIndex(), DBL_MAX, G4cout, G4endl, G4Track::GetDynamicParticle(), G4PolarizationManager::GetInstance(), G4DynamicParticle::GetKineticEnergy(), G4VPhysicalVolume::GetLogicalVolume(), G4DynamicParticle::GetMomentumDirection(), G4PolarizationHelper::GetParticleFrameX(), G4PolarizationHelper::GetParticleFrameY(), G4Track::GetPolarization(), G4Track::GetVolume(), G4PolarizationManager::GetVolumePolarization(), G4PolarizationManager::IsPolarized(), G4StokesVector::IsZero(), G4VEnergyLossProcess::PostStepGetPhysicalInteractionLength(), CLHEP::Hep3Vector::x(), CLHEP::Hep3Vector::y(), and CLHEP::Hep3Vector::z().

190 {
191  // *** get unploarised mean free path from lambda table ***
193 
194 
195  // *** get asymmetry, if target is polarized ***
196  G4VPhysicalVolume* aPVolume = track.GetVolume();
197  G4LogicalVolume* aLVolume = aPVolume->GetLogicalVolume();
198 
200  G4bool volumeIsPolarized = polarizationManger->IsPolarized(aLVolume);
201  const G4StokesVector ePolarization = track.GetPolarization();
202 
203  if (mfp != DBL_MAX && volumeIsPolarized && !ePolarization.IsZero()) {
204  const G4DynamicParticle* aDynamicElectron = track.GetDynamicParticle();
205  G4double eEnergy = aDynamicElectron->GetKineticEnergy();
206  const G4ParticleMomentum eDirection0 = aDynamicElectron->GetMomentumDirection();
207 
208  G4StokesVector volumePolarization = polarizationManger->GetVolumePolarization(aLVolume);
209 
210  size_t idx = CurrentMaterialCutsCoupleIndex();
211  G4double lAsymmetry = (*theAsymmetryTable)(idx)->Value(eEnergy);
212  G4double tAsymmetry = (*theTransverseAsymmetryTable)(idx)->Value(eEnergy);
213 
214  // calculate longitudinal spin component
215  G4double polZZ = ePolarization.z()*
216  volumePolarization*eDirection0;
217  // calculate transvers spin components
218  G4double polXX = ePolarization.x()*
219  volumePolarization*G4PolarizationHelper::GetParticleFrameX(eDirection0);
220  G4double polYY = ePolarization.y()*
221  volumePolarization*G4PolarizationHelper::GetParticleFrameY(eDirection0);
222 
223 
224  G4double impact = 1. + polZZ*lAsymmetry + (polXX + polYY)*tAsymmetry;
225  // determine polarization dependent mean free path
226  mfp /= impact;
227  if (mfp <=0.) {
228  G4cout <<"PV impact ( "<<polXX<<" , "<<polYY<<" , "<<polZZ<<" )"<<G4endl;
229  G4cout << " impact on MFP is "<< impact <<G4endl;
230  G4cout<<" lAsymmetry= "<<lAsymmetry<<" ("<<std::fabs(lAsymmetry)-1.<<")\n";
231  G4cout<<" tAsymmetry= "<<tAsymmetry<<" ("<<std::fabs(tAsymmetry)-1.<<")\n";
232  }
233  }
234 
235  return mfp;
236 }
const G4ThreeVector & GetPolarization() const
G4double GetKineticEnergy() const
double x() const
const G4DynamicParticle * GetDynamicParticle() const
static G4PolarizationManager * GetInstance()
G4double PostStepGetPhysicalInteractionLength(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
double z() const
G4bool IsZero() const
G4GLOB_DLL std::ostream G4cout
bool G4bool
Definition: G4Types.hh:79
const G4ThreeVector & GetMomentumDirection() const
G4LogicalVolume * GetLogicalVolume() const
double y() const
bool IsPolarized(G4LogicalVolume *lVol) const
G4VPhysicalVolume * GetVolume() const
static G4ThreeVector GetParticleFrameY(const G4ThreeVector &)
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
#define DBL_MAX
Definition: templates.hh:83
static G4ThreeVector GetParticleFrameX(const G4ThreeVector &)
const G4ThreeVector & GetVolumePolarization(G4LogicalVolume *lVol) const
size_t CurrentMaterialCutsCoupleIndex() const
void G4ePolarizedIonisation::PrintInfo ( )
virtual

Implements G4VEnergyLossProcess.

Definition at line 124 of file G4ePolarizedIonisation.cc.

References G4cout, and G4endl.

125 {
126  G4cout << " Delta cross sections from Moller+Bhabha, "
127  << "good description from 1 KeV to 100 GeV."
128  << G4endl;
129 }
G4GLOB_DLL std::ostream G4cout
#define G4endl
Definition: G4ios.hh:61

The documentation for this class was generated from the following files: