ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4NeutrinoElectronNcModel.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4NeutrinoElectronNcModel.cc
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"
35 #include "G4ParticleDefinition.hh"
36 #include "G4IonTable.hh"
37 #include "Randomize.hh"
38 #include "G4Electron.hh"
39 #include "G4HadronicParameters.hh"
40 
41 using namespace std;
42 using namespace CLHEP;
43 
45  : G4HadronElastic(name)
46 {
47  SetMinEnergy( 0.0*GeV );
50 
52  // PDG2016: sin^2 theta Weinberg
53 
54  fSin2tW = 0.23129; // 0.2312;
55 
56  fCutEnergy = 0.; // default value
57 
58 }
59 
60 
62 {}
63 
64 
65 void G4NeutrinoElectronNcModel::ModelDescription(std::ostream& outFile) const
66 {
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 }
73 
75 
77  G4Nucleus & targetNucleus)
78 {
79  G4bool result = false;
80  G4String pName = aTrack.GetDefinition()->GetParticleName();
81  G4double minEnergy = 0., energy = aTrack.GetTotalEnergy();
82 
83  if( fCutEnergy > 0. ) // min detected recoil electron energy
84  {
85  minEnergy = 0.5*(fCutEnergy+sqrt(fCutEnergy*(fCutEnergy+2.*electron_mass_c2)));
86  }
87  if( ( pName == "nu_e" || pName == "anti_nu_e" ||
88  pName == "nu_mu" || pName == "anti_nu_nu" ||
89  pName == "nu_tau" || pName == "anti_nu_tau" ) &&
90  energy > minEnergy )
91  {
92  result = true;
93  }
94  G4int Z = targetNucleus.GetZ_asInt();
95  Z *= 1;
96 
97  return result;
98 }
99 
101 //
102 //
103 
105  const G4HadProjectile& aTrack, G4Nucleus& targetNucleus)
106 {
108 
109  const G4HadProjectile* aParticle = &aTrack;
110  G4double nuTkin = aParticle->GetKineticEnergy();
111 
112  if( nuTkin <= LowestEnergyLimit() )
113  {
116  return &theParticleChange;
117  }
118  // sample and make final state in lab frame
119 
120  G4double eTkin = SampleElectronTkin( aParticle );
121 
122  if( eTkin > fCutEnergy )
123  {
124  G4double ePlab = sqrt( eTkin*(eTkin + 2.*electron_mass_c2) );
125 
126  G4double cost2 = eTkin*(nuTkin + electron_mass_c2)*(nuTkin + electron_mass_c2);
127  cost2 /= nuTkin*nuTkin*(eTkin + 2.*electron_mass_c2);
128 
129  if( cost2 > 1. ) cost2 = 1.;
130  if( cost2 < 0. ) cost2 = 0.;
131 
132  G4double cost = sqrt(cost2);
133  G4double sint = std::sqrt( (1.0 - cost)*(1.0 + cost) );
135 
136  G4ThreeVector eP( sint*std::cos(phi), sint*std::sin(phi), cost );
137  eP *= ePlab;
138  G4LorentzVector lvt2( eP, eTkin + electron_mass_c2 );
139  G4DynamicParticle * aSec = new G4DynamicParticle( theElectron, lvt2 );
141 
142  G4LorentzVector lvp1 = aParticle->Get4Momentum();
143  G4LorentzVector lvt1(0.,0.,0.,electron_mass_c2);
144  G4LorentzVector lvsum = lvp1+lvt1;
145 
146  G4LorentzVector lvp2 = lvsum-lvt2;
147  G4double nuTkin2 = lvp2.e()-aParticle->GetDefinition()->GetPDGMass();
150  }
151  else if( eTkin > 0.0 )
152  {
154  nuTkin -= eTkin;
155 
156  if( nuTkin > 0. )
157  {
160  }
161  }
162  else
163  {
166  }
167  G4int Z = targetNucleus.GetZ_asInt();
168  Z *= 1;
169 
170  return &theParticleChange;
171 }
172 
174 //
175 // sample recoil electron energy in lab frame
176 
178 {
179  G4double result = 0., xi, cofL, cofR, cofL2, cofR2, cofLR;
180 
181  G4double energy = aParticle->GetTotalEnergy();
182  if( energy == 0.) return result; // vmg: < th?? as in xsc
183 
184  G4String pName = aParticle->GetDefinition()->GetParticleName();
185 
186  if( pName == "nu_e")
187  {
188  cofL = 0.5 + fSin2tW;
189  cofR = fSin2tW;
190  }
191  else if( pName == "anti_nu_e")
192  {
193  cofL = fSin2tW;
194  cofR = 0.5 + fSin2tW;
195  }
196  else if( pName == "nu_mu")
197  {
198  cofL = -0.5 + fSin2tW;
199  cofR = fSin2tW;
200  }
201  else if( pName == "anti_nu_mu")
202  {
203  cofL = fSin2tW;
204  cofR = -0.5 + fSin2tW;
205  }
206  else if( pName == "nu_tau") // vmg: nu_tau as nu_mu ???
207  {
208  cofL = -0.5 + fSin2tW;
209  cofR = fSin2tW;
210  }
211  else if( pName == "anti_nu_tau")
212  {
213  cofL = fSin2tW;
214  cofR = -0.5 + fSin2tW;
215  }
216  else
217  {
218  return result;
219  }
220  xi = 0.5*electron_mass_c2/energy;
221 
222  cofL2 = cofL*cofL;
223  cofR2 = cofR*cofR;
224  cofLR = cofL*cofR;
225 
226  // cofs of Tkin/Enu 3rd equation
227 
228  G4double a = cofR2/3.;
229  G4double b = -(cofR2+cofLR*xi);
230  G4double c = cofL2+cofR2;
231 
232  G4double xMax = 1./(1. + xi);
233  G4double xMax2 = xMax*xMax;
234  G4double xMax3 = xMax*xMax2;
235 
236  G4double d = -( a*xMax3 + b*xMax2 + c*xMax );
237  d *= G4UniformRand();
238 
239  // G4cout<<a<<" "<<b<<" "<<c<<" "<<d<<G4endl<<G4endl;
240 
241  // cofs of the incomplete 3rd equation
242 
243  G4double p = c/a;
244  p -= b*b/a/a/3.;
245  G4double q = d/a;
246  q -= b*c/a/a/3.;
247  q += 2*b*b*b/a/a/a/27.;
248 
249 
250  // cofs for the incomplete colutions
251 
252  G4double D = p*p*p/3./3./3.;
253  D += q*q/2./2.;
254 
255  // G4cout<<"D = "<<D<<G4endl;
256  // D = -D;
257  // G4complex A1 = G4complex(- q/2., std::sqrt(-D) );
258  // G4complex A = std::pow(A1,1./3.);
259 
260  // G4complex B1 = G4complex(- q/2., -std::sqrt(-D) );
261  // G4complex B = std::pow(B1,1./3.);
262 
263  G4double A1 = - q/2. + std::sqrt(D);
264  G4double A = std::pow(A1,1./3.);
265 
266  G4double B1 = - q/2. - std::sqrt(D);
267  G4double B = std::pow(-B1,1./3.);
268  B = -B;
269 
270  // roots of the incomplete 3rd equation
271 
272  G4complex y1 = A + B;
273  // G4complex y2 = -0.5*(A + B) + 0.5*std::sqrt(3.)*(A - B)*G4complex(0.,1.);
274  // G4complex y3 = -0.5*(A + B) - 0.5*std::sqrt(3.)*(A - B)*G4complex(0.,1.);
275 
276  G4complex x1 = y1 - b/a/3.;
277  // G4complex x2 = y2 - b/a/3.;
278  // G4complex x3 = y3 - b/a/3.;
279 
280  // G4cout<<"re_x1 = "<<real(x1)<<"; re_x2 = "<<real(x2)<<"; re_x3 = "<<real(x3)<<G4endl;
281  // G4cout<<"im_x1 = "<<imag(x1)<<"; im_x2 = "<<imag(x2)<<"; im_x3 = "<<imag(x3)<<G4endl<<G4endl;
282 
283  result = real(x1)*energy;
284 
285  return result;
286 }
287 
288 //
289 //