Geant4  v4-10.4-release
 모두 클래스 네임스페이스들 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 Friends 매크로 그룹들 페이지들
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 // $Id: G4NeutrinoElectronNcModel.cc 91806 2015-08-06 12:20:45Z gcosmo $
27 //
28 // Geant4 Header : G4NeutrinoElectronNcModel
29 //
30 // Author : V.Grichine 6.4.17
31 //
32 
34 #include "G4SystemOfUnits.hh"
35 #include "G4ParticleTable.hh"
36 #include "G4ParticleDefinition.hh"
37 #include "G4IonTable.hh"
38 #include "Randomize.hh"
39 #include "G4Electron.hh"
40 
41 using namespace std;
42 using namespace CLHEP;
43 
45  : G4HadronElastic(name)
46 {
47  SetMinEnergy( 0.0*GeV );
48  SetMaxEnergy( 100.*TeV );
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 //
const XML_Char * name
Definition: expat.h:151
void SetMinEnergy(G4double anEnergy)
std::vector< ExP01TrackerHit * > a
Definition: ExP01Classes.hh:33
void SetMaxEnergy(const G4double anEnergy)
Float_t y1[n_points_granero]
Definition: compare.C:5
void SetMomentumChange(const G4ThreeVector &aV)
G4double LowestEnergyLimit() const
Float_t x1[n_points_granero]
Definition: compare.C:5
double D(double temp)
const char * p
Definition: xmltok.h:285
G4double SampleElectronTkin(const G4HadProjectile *aParticle)
const G4String & GetParticleName() const
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
G4double GetTotalEnergy() const
G4double GetPDGMass() const
Float_t Z
void SetEnergyChange(G4double anEnergy)
static constexpr double TeV
Definition: G4SIunits.hh:218
std::complex< G4double > G4complex
Definition: G4Types.hh:81
double G4double
Definition: G4Types.hh:76
bool G4bool
Definition: G4Types.hh:79
G4NeutrinoElectronNcModel(const G4String &name="nu-e-elastic")
static constexpr double electron_mass_c2
#define G4UniformRand()
Definition: Randomize.hh:53
double energy
Definition: plottest35.C:25
double A(double temperature)
Float_t d
static constexpr double eV
Definition: G4SIunits.hh:215
static G4Electron * Electron()
Definition: G4Electron.cc:94
const G4LorentzVector & Get4Momentum() const
Hep3Vector unit() const
G4double G4ParticleHPJENDLHEData::G4double result
G4double GetKineticEnergy() const
static constexpr double twopi
Definition: SystemOfUnits.h:55
const G4ParticleDefinition * GetDefinition() const
int G4int
Definition: G4Types.hh:78
void SetLowestEnergyLimit(G4double value)
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
virtual void ModelDescription(std::ostream &) const
Hep3Vector vect() const
G4ParticleDefinition * theElectron
void SetLocalEnergyDeposit(G4double aE)
virtual G4bool IsApplicable(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
double B(double temperature)
static constexpr double GeV
Definition: G4SIunits.hh:217
G4int GetZ_asInt() const
Definition: G4Nucleus.hh:115