Geant4-11
G4NeutrinoElectronNcModel.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//
27// Geant4 Header : G4NeutrinoElectronNcModel
28//
29// Author : V.Grichine 6.4.17
30//
31
33#include "G4SystemOfUnits.hh"
34#include "G4ParticleTable.hh"
36#include "G4IonTable.hh"
37#include "Randomize.hh"
38#include "G4Electron.hh"
41
42using namespace std;
43using namespace CLHEP;
44
47{
49
50 SetMinEnergy( 0.0*GeV );
53
55 // PDG2016: sin^2 theta Weinberg
56
57 fSin2tW = 0.23129; // 0.2312;
58
59 fCutEnergy = 0.; // default value
60}
61
62
64{}
65
66void G4NeutrinoElectronNcModel::ModelDescription(std::ostream& outFile) const
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}
72
74
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}
95
97//
98//
99
101 const G4HadProjectile& aTrack, G4Nucleus&)
102{
104
105 const G4HadProjectile* aParticle = &aTrack;
106 G4double nuTkin = aParticle->GetKineticEnergy();
107
108 if( nuTkin <= LowestEnergyLimit() )
109 {
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) );
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 );
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();
146 }
147 else if( eTkin > 0.0 )
148 {
150 nuTkin -= eTkin;
151
152 if( nuTkin > 0. )
153 {
156 }
157 }
158 else
159 {
162 }
163 return &theParticleChange;
164}
165
167//
168// sample recoil electron energy in lab frame
169
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}
280
281//
282//
G4double B(G4double temperature)
G4double D(G4double temp)
static constexpr double eV
Definition: G4SIunits.hh:201
static constexpr double GeV
Definition: G4SIunits.hh:203
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
std::complex< G4double > G4complex
Definition: G4Types.hh:88
const G4double A[17]
#define G4UniformRand()
Definition: Randomize.hh:52
Hep3Vector unit() const
Hep3Vector vect() const
static G4Electron * Electron()
Definition: G4Electron.cc:93
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
void SetEnergyChange(G4double anEnergy)
void SetMomentumChange(const G4ThreeVector &aV)
void SetLocalEnergyDeposit(G4double aE)
const G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
const G4LorentzVector & Get4Momentum() const
G4double GetTotalEnergy() const
G4double LowestEnergyLimit() const
void SetLowestEnergyLimit(G4double value)
void SetMinEnergy(G4double anEnergy)
void SetMaxEnergy(const G4double anEnergy)
static G4HadronicParameters * Instance()
G4NeutrinoElectronNcModel(const G4String &name="nu-e-elastic")
virtual void ModelDescription(std::ostream &) const
G4ParticleDefinition * theElectron
G4double SampleElectronTkin(const G4HadProjectile *aParticle)
virtual G4bool IsApplicable(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
const G4String & GetParticleName() const
static G4int GetModelID(const G4int modelIndex)
Definition: DoubConv.h:17
static constexpr double twopi
Definition: SystemOfUnits.h:56
G4double energy(const ThreeVector &p, const G4double m)
const char * name(G4int ptype)
float electron_mass_c2
Definition: hepunit.py:273