Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4NeutrinoElectronNcModel Class Reference

#include <G4NeutrinoElectronNcModel.hh>

Inheritance diagram for G4NeutrinoElectronNcModel:

Public Member Functions

 G4NeutrinoElectronNcModel (const G4String &name="nu-e-elastic")
virtual ~G4NeutrinoElectronNcModel ()
virtual G4bool IsApplicable (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
virtual G4HadFinalStateApplyYourself (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
G4double SampleElectronTkin (const G4HadProjectile *aParticle)
void SetCutEnergy (G4double ec)
G4double GetCutEnergy ()
virtual void ModelDescription (std::ostream &) const
Public Member Functions inherited from G4HadronElastic
 G4HadronElastic (const G4String &name="hElasticLHEP")
 ~G4HadronElastic () override
G4double SampleInvariantT (const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A) override
G4double GetSlopeCof (const G4int pdg)
void SetLowestEnergyLimit (G4double value)
G4double LowestEnergyLimit () const
G4double ComputeMomentumCMS (const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
Public Member Functions inherited from G4HadronicInteraction
 G4HadronicInteraction (const G4String &modelName="HadronicModel")
virtual ~G4HadronicInteraction ()
G4double GetMinEnergy () const
G4double GetMinEnergy (const G4Material *aMaterial, const G4Element *anElement) const
void SetMinEnergy (G4double anEnergy)
void SetMinEnergy (G4double anEnergy, const G4Element *anElement)
void SetMinEnergy (G4double anEnergy, const G4Material *aMaterial)
G4double GetMaxEnergy () const
G4double GetMaxEnergy (const G4Material *aMaterial, const G4Element *anElement) const
void SetMaxEnergy (const G4double anEnergy)
void SetMaxEnergy (G4double anEnergy, const G4Element *anElement)
void SetMaxEnergy (G4double anEnergy, const G4Material *aMaterial)
G4int GetVerboseLevel () const
void SetVerboseLevel (G4int value)
const G4StringGetModelName () const
void DeActivateFor (const G4Material *aMaterial)
void ActivateFor (const G4Material *aMaterial)
void DeActivateFor (const G4Element *anElement)
void ActivateFor (const G4Element *anElement)
G4bool IsBlocked (const G4Material *aMaterial) const
G4bool IsBlocked (const G4Element *anElement) const
void SetRecoilEnergyThreshold (G4double val)
G4double GetRecoilEnergyThreshold () const
virtual const std::pair< G4double, G4doubleGetFatalEnergyCheckLevels () const
virtual std::pair< G4double, G4doubleGetEnergyMomentumCheckLevels () const
void SetEnergyMomentumCheckLevels (G4double relativeLevel, G4double absoluteLevel)
virtual void BuildPhysicsTable (const G4ParticleDefinition &)
virtual void InitialiseModel ()
 G4HadronicInteraction (const G4HadronicInteraction &right)=delete
const G4HadronicInteractionoperator= (const G4HadronicInteraction &right)=delete
G4bool operator== (const G4HadronicInteraction &right) const =delete
G4bool operator!= (const G4HadronicInteraction &right) const =delete

Additional Inherited Members

Protected Member Functions inherited from G4HadronicInteraction
void SetModelName (const G4String &nam)
G4bool IsBlocked () const
void Block ()
Protected Attributes inherited from G4HadronElastic
G4double pLocalTmax
G4int secID
Protected Attributes inherited from G4HadronicInteraction
G4HadFinalState theParticleChange
G4int verboseLevel
G4double theMinEnergy
G4double theMaxEnergy
G4bool isBlocked

Detailed Description

Definition at line 49 of file G4NeutrinoElectronNcModel.hh.

Constructor & Destructor Documentation

◆ G4NeutrinoElectronNcModel()

G4NeutrinoElectronNcModel::G4NeutrinoElectronNcModel ( const G4String & name = "nu-e-elastic")

Definition at line 45 of file G4NeutrinoElectronNcModel.cc.

46 : G4HadronElastic(name)
47{
48 secID = G4PhysicsModelCatalog::GetModelID( "model_" + name );
49
50 SetMinEnergy( 0.0*GeV );
52 SetLowestEnergyLimit(1.e-6*eV);
53
54 theElectron = G4Electron::Electron();
55 // PDG2016: sin^2 theta Weinberg
56
57 fSin2tW = 0.23129; // 0.2312;
58
59 fCutEnergy = 0.; // default value
60}
static G4Electron * Electron()
Definition G4Electron.cc:91
G4HadronElastic(const G4String &name="hElasticLHEP")
void SetLowestEnergyLimit(G4double value)
void SetMinEnergy(G4double anEnergy)
void SetMaxEnergy(const G4double anEnergy)
static G4HadronicParameters * Instance()
static G4int GetModelID(const G4int modelIndex)

◆ ~G4NeutrinoElectronNcModel()

G4NeutrinoElectronNcModel::~G4NeutrinoElectronNcModel ( )
virtual

Definition at line 63 of file G4NeutrinoElectronNcModel.cc.

64{}

Member Function Documentation

◆ ApplyYourself()

G4HadFinalState * G4NeutrinoElectronNcModel::ApplyYourself ( const G4HadProjectile & aTrack,
G4Nucleus & targetNucleus )
virtual

Reimplemented from G4HadronElastic.

Definition at line 100 of file G4NeutrinoElectronNcModel.cc.

102{
103 theParticleChange.Clear();
104
105 const G4HadProjectile* aParticle = &aTrack;
106 G4double nuTkin = aParticle->GetKineticEnergy();
107
108 if( nuTkin <= LowestEnergyLimit() )
109 {
110 theParticleChange.SetEnergyChange(nuTkin);
111 theParticleChange.SetMomentumChange(aTrack.Get4Momentum().vect().unit());
112 return &theParticleChange;
113 }
114 // sample and make final state in lab frame
115
116 G4double eTkin = SampleElectronTkin( aParticle );
117
118 if( eTkin > fCutEnergy )
119 {
120 G4double ePlab = sqrt( eTkin*(eTkin + 2.*electron_mass_c2) );
121
122 G4double cost2 = eTkin*(nuTkin + electron_mass_c2)*(nuTkin + electron_mass_c2);
123 cost2 /= nuTkin*nuTkin*(eTkin + 2.*electron_mass_c2);
124
125 if( cost2 > 1. ) cost2 = 1.;
126 if( cost2 < 0. ) cost2 = 0.;
127
128 G4double cost = sqrt(cost2);
129 G4double sint = std::sqrt( (1.0 - cost)*(1.0 + cost) );
130 G4double phi = G4UniformRand()*CLHEP::twopi;
131
132 G4ThreeVector eP( sint*std::cos(phi), sint*std::sin(phi), cost );
133 eP *= ePlab;
134 G4LorentzVector lvt2( eP, eTkin + electron_mass_c2 );
135 G4DynamicParticle * aSec = new G4DynamicParticle( theElectron, lvt2 );
136 theParticleChange.AddSecondary( aSec, secID );
137
138 G4LorentzVector lvp1 = aParticle->Get4Momentum();
139 G4LorentzVector lvt1(0.,0.,0.,electron_mass_c2);
140 G4LorentzVector lvsum = lvp1+lvt1;
141
142 G4LorentzVector lvp2 = lvsum-lvt2;
143 G4double nuTkin2 = lvp2.e()-aParticle->GetDefinition()->GetPDGMass();
144 theParticleChange.SetEnergyChange(nuTkin2);
145 theParticleChange.SetMomentumChange(lvp2.vect().unit());
146 }
147 else if( eTkin > 0.0 )
148 {
149 theParticleChange.SetLocalEnergyDeposit( eTkin );
150 nuTkin -= eTkin;
151
152 if( nuTkin > 0. )
153 {
154 theParticleChange.SetEnergyChange( nuTkin );
155 theParticleChange.SetMomentumChange( aTrack.Get4Momentum().vect().unit() );
156 }
157 }
158 else
159 {
160 theParticleChange.SetEnergyChange( nuTkin );
161 theParticleChange.SetMomentumChange( aTrack.Get4Momentum().vect().unit() );
162 }
163 return &theParticleChange;
164}
CLHEP::HepLorentzVector G4LorentzVector
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition G4Types.hh:83
#define G4UniformRand()
Definition Randomize.hh:52
Hep3Vector unit() const
Hep3Vector vect() const
const G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
const G4LorentzVector & Get4Momentum() const
G4double LowestEnergyLimit() const
G4double SampleElectronTkin(const G4HadProjectile *aParticle)

◆ GetCutEnergy()

G4double G4NeutrinoElectronNcModel::GetCutEnergy ( )
inline

Definition at line 68 of file G4NeutrinoElectronNcModel.hh.

68{return fCutEnergy;};

◆ IsApplicable()

G4bool G4NeutrinoElectronNcModel::IsApplicable ( const G4HadProjectile & aTrack,
G4Nucleus & targetNucleus )
virtual

Reimplemented from G4HadronicInteraction.

Definition at line 75 of file G4NeutrinoElectronNcModel.cc.

76{
77 G4bool result = false;
78 G4String pName = aTrack.GetDefinition()->GetParticleName();
79 G4double minEnergy = 0.;
81
82 if( fCutEnergy > 0. ) // min detected recoil electron energy
83 {
84 minEnergy = 0.5*(fCutEnergy+sqrt(fCutEnergy*(fCutEnergy+2.*electron_mass_c2)));
85 }
86 if( ( pName == "nu_e" || pName == "anti_nu_e" ||
87 pName == "nu_mu" || pName == "anti_nu_nu" ||
88 pName == "nu_tau" || pName == "anti_nu_tau" ) &&
89 energy > minEnergy )
90 {
91 result = true;
92 }
93 return result;
94}
bool G4bool
Definition G4Types.hh:86
G4double GetTotalEnergy() const
const G4String & GetParticleName() const
G4double energy(const ThreeVector &p, const G4double m)

◆ ModelDescription()

void G4NeutrinoElectronNcModel::ModelDescription ( std::ostream & outFile) const
virtual

Reimplemented from G4HadronElastic.

Definition at line 66 of file G4NeutrinoElectronNcModel.cc.

67{
68 outFile << "G4NeutrinoElectronNcModel is a neutrino-electron (neutral current) elastic scattering\n"
69 << "model which uses the standard model \n"
70 << "transfer parameterization. The model is fully relativistic\n";
71}

◆ SampleElectronTkin()

G4double G4NeutrinoElectronNcModel::SampleElectronTkin ( const G4HadProjectile * aParticle)

Definition at line 170 of file G4NeutrinoElectronNcModel.cc.

171{
172 G4double result = 0., xi, cofL, cofR, cofL2, cofR2, cofLR;
173
174 G4double energy = aParticle->GetTotalEnergy();
175 if( energy == 0.) return result; // vmg: < th?? as in xsc
176
177 G4String pName = aParticle->GetDefinition()->GetParticleName();
178
179 if( pName == "nu_e")
180 {
181 cofL = 0.5 + fSin2tW;
182 cofR = fSin2tW;
183 }
184 else if( pName == "anti_nu_e")
185 {
186 cofL = fSin2tW;
187 cofR = 0.5 + fSin2tW;
188 }
189 else if( pName == "nu_mu")
190 {
191 cofL = -0.5 + fSin2tW;
192 cofR = fSin2tW;
193 }
194 else if( pName == "anti_nu_mu")
195 {
196 cofL = fSin2tW;
197 cofR = -0.5 + fSin2tW;
198 }
199 else if( pName == "nu_tau") // vmg: nu_tau as nu_mu ???
200 {
201 cofL = -0.5 + fSin2tW;
202 cofR = fSin2tW;
203 }
204 else if( pName == "anti_nu_tau")
205 {
206 cofL = fSin2tW;
207 cofR = -0.5 + fSin2tW;
208 }
209 else
210 {
211 return result;
212 }
213 xi = 0.5*electron_mass_c2/energy;
214
215 cofL2 = cofL*cofL;
216 cofR2 = cofR*cofR;
217 cofLR = cofL*cofR;
218
219 // cofs of Tkin/Enu 3rd equation
220
221 G4double a = cofR2/3.;
222 G4double b = -(cofR2+cofLR*xi);
223 G4double c = cofL2+cofR2;
224
225 G4double xMax = 1./(1. + xi);
226 G4double xMax2 = xMax*xMax;
227 G4double xMax3 = xMax*xMax2;
228
229 G4double d = -( a*xMax3 + b*xMax2 + c*xMax );
230 d *= G4UniformRand();
231
232 // G4cout<<a<<" "<<b<<" "<<c<<" "<<d<<G4endl<<G4endl;
233
234 // cofs of the incomplete 3rd equation
235
236 G4double p = c/a;
237 p -= b*b/a/a/3.;
238 G4double q = d/a;
239 q -= b*c/a/a/3.;
240 q += 2*b*b*b/a/a/a/27.;
241
242
243 // cofs for the incomplete colutions
244
245 G4double D = p*p*p/3./3./3.;
246 D += q*q/2./2.;
247
248 // G4cout<<"D = "<<D<<G4endl;
249 // D = -D;
250 // G4complex A1 = G4complex(- q/2., std::sqrt(-D) );
251 // G4complex A = std::pow(A1,1./3.);
252
253 // G4complex B1 = G4complex(- q/2., -std::sqrt(-D) );
254 // G4complex B = std::pow(B1,1./3.);
255
256 G4double A1 = - q/2. + std::sqrt(D);
257 G4double A = std::pow(A1,1./3.);
258
259 G4double B1 = - q/2. - std::sqrt(D);
260 G4double B = std::pow(-B1,1./3.);
261 B = -B;
262
263 // roots of the incomplete 3rd equation
264
265 G4complex y1 = A + B;
266 // G4complex y2 = -0.5*(A + B) + 0.5*std::sqrt(3.)*(A - B)*G4complex(0.,1.);
267 // G4complex y3 = -0.5*(A + B) - 0.5*std::sqrt(3.)*(A - B)*G4complex(0.,1.);
268
269 G4complex x1 = y1 - b/a/3.;
270 // G4complex x2 = y2 - b/a/3.;
271 // G4complex x3 = y3 - b/a/3.;
272
273 // G4cout<<"re_x1 = "<<real(x1)<<"; re_x2 = "<<real(x2)<<"; re_x3 = "<<real(x3)<<G4endl;
274 // G4cout<<"im_x1 = "<<imag(x1)<<"; im_x2 = "<<imag(x2)<<"; im_x3 = "<<imag(x3)<<G4endl<<G4endl;
275
276 result = real(x1)*energy;
277
278 return result;
279}
G4double B(G4double temperature)
G4double D(G4double temp)
std::complex< G4double > G4complex
Definition G4Types.hh:88
const G4double A[17]

Referenced by ApplyYourself().

◆ SetCutEnergy()

void G4NeutrinoElectronNcModel::SetCutEnergy ( G4double ec)
inline

Definition at line 67 of file G4NeutrinoElectronNcModel.hh.

67{fCutEnergy=ec;};

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