Geant4  v4-10.4-release
 모두 클래스 네임스페이스들 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 Friends 매크로 그룹들 페이지들
G4MuNeutrinoNucleusTotXsc.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 
29 #include "G4PhysicalConstants.hh"
30 #include "G4SystemOfUnits.hh"
31 #include "G4DynamicParticle.hh"
32 #include "G4ParticleTable.hh"
33 #include "G4IonTable.hh"
34 #include "G4HadTmpUtil.hh"
35 #include "G4NistManager.hh"
36 
37 #include "G4MuonMinus.hh"
38 #include "G4MuonPlus.hh"
39 
40 using namespace std;
41 using namespace CLHEP;
42 
44  : G4VCrossSectionDataSet("NuElectronTotXsc")
45 {
46  fCofXsc = 1.e-38*cm2/GeV;
47 
48  // G4cout<<"fCofXsc = "<<fCofXsc*GeV/cm2<<" cm2/GeV"<<G4endl;
49 
50  // PDG2016: sin^2 theta Weinberg
51 
52  fSin2tW = 0.23129; // 0.2312;
53 
54  // 9 <-> 6, 5/9 or 5/6 ?
55 
56  fCofS = 5.*fSin2tW*fSin2tW/9.;
57  fCofL = 1. - fSin2tW + fCofS;
58 
59  G4cout<<"fCosL = "<<fCofL<<", fCofS = "<<fCofS<<G4endl;
60 
61  fCutEnergy = 0.; // default value
62 
63  fBiasingFactor = 1.; // default as physics
64 
65  fIndex = 50;
66 
69 }
70 
72 {}
73 
75 
76 G4bool
78 {
79  G4bool result = false;
80  G4String pName = aPart->GetDefinition()->GetParticleName();
81 
82  if( pName == "nu_mu" || pName == "anti_nu_mu" )
83  {
84  result = true;
85  }
86  return result;
87 }
88 
90 //
91 //
92 
94  const G4Isotope*, const G4Element*, const G4Material* )
95 {
96  G4double ccnuXsc, ccanuXsc, ncXsc, totXsc(0.);
97 
98  G4double energy = aPart->GetTotalEnergy();
99  G4String pName = aPart->GetDefinition()->GetParticleName();
100 
101  G4int index = GetEnergyIndex(energy);
102 
103  ccnuXsc = GetNuMuTotCsXsc(index, energy);
104  ccanuXsc = GetANuMuTotCsXsc(index, energy);
105 
106  if( pName == "nu_mu")
107  {
108  ncXsc = fCofL*ccnuXsc + fCofS*ccanuXsc;
109  totXsc = ccnuXsc + ncXsc;
110  }
111  else if( pName == "anti_nu_mu")
112  {
113  ncXsc = fCofL*ccanuXsc + fCofS*ccnuXsc;
114  totXsc = ccanuXsc + ncXsc;
115  }
116  else return totXsc;
117 
118  // totXsc -= ncXsc; // to test experimentally available cc part
119 
120  totXsc *= fCofXsc; //*energy;
121  totXsc *= energy; // + 0.5*emass;
122  totXsc *= A; // incoherent sum over all isotope nucleons
123 
124  totXsc *= fBiasingFactor; // biasing up, if set >1
125 
126 
127  return totXsc;
128 }
129 
131 //
132 // Return index of nu/anu energy array corresponding to the neutrino energy
133 
135 {
136  G4int i, eIndex = 0;
137 
138  for( i = 0; i < fIndex; i++)
139  {
140  if( energy <= fNuMuEnergy[i]*GeV )
141  {
142  eIndex = i;
143  break;
144  }
145  }
146  if( i >= fIndex ) eIndex = i;
147  // G4cout<<"eIndex = "<<eIndex<<G4endl;
148  return eIndex;
149 }
150 
152 //
153 // nu_mu xsc for index-1, index linear over energy
154 
156 {
157  G4double xsc(0.);
158 
159  if( index <= 0 || energy < theMuonMinus->GetPDGMass() ) xsc = 0.;
160  else if (index >= fIndex) xsc = fNuMuTotXsc[fIndex-1];
161  else
162  {
163  G4double x1 = fNuMuEnergy[index-1]*GeV;
164  G4double x2 = fNuMuEnergy[index]*GeV;
165  G4double y1 = fNuMuTotXsc[index-1];
166  G4double y2 = fNuMuTotXsc[index];
167 
168  if(x1 >= x2) return fNuMuTotXsc[index];
169  else
170  {
171  G4double angle = (y2-y1)/(x2-x1);
172  xsc = y1 + (energy-x1)*angle;
173  }
174  }
175  return xsc;
176 }
177 
179 //
180 // anu_mu xsc for index-1, index linear over energy
181 
183 {
184  G4double xsc(0.);
185 
186  if( index <= 0 || energy < theMuonPlus->GetPDGMass() ) xsc = 0.;
187  else if (index >= fIndex) xsc = fANuMuTotXsc[fIndex-1];
188  else
189  {
190  G4double x1 = fNuMuEnergy[index-1]*GeV;
191  G4double x2 = fNuMuEnergy[index]*GeV;
192  G4double y1 = fANuMuTotXsc[index-1];
193  G4double y2 = fANuMuTotXsc[index];
194 
195  if( x1 >= x2 ) return fANuMuTotXsc[index];
196  else
197  {
198  G4double angle = (y2-y1)/(x2-x1);
199  xsc = y1 + (energy-x1)*angle;
200  }
201  }
202  return xsc;
203 }
204 
206 //
207 // return fNuMuTotXsc[index] if the index is in the array range
208 
210 {
211  if( index >= 0 && index < fIndex) return fNuMuTotXsc[index];
212  else
213  {
214  G4cout<<"Inproper index of fNuMuTotXsc array"<<G4endl;
215  return 0.;
216  }
217 }
218 
220 //
221 // return fANuMuTotXsc[index] if the index is in the array range
222 
224 {
225  if( index >= 0 && index < fIndex) return fANuMuTotXsc[index];
226  else
227  {
228  G4cout<<"Inproper index of fANuMuTotXsc array"<<G4endl;
229  return 0.;
230  }
231 }
232 
233 
235 //
236 // E_nu in GeV
237 
239 {
240  0.112103, 0.117359, 0.123119, 0.129443, 0.136404,
241  0.144084, 0.152576, 0.161991, 0.172458, 0.184126,
242  0.197171, 0.211801, 0.228261, 0.24684, 0.267887,
243  0.291816, 0.319125, 0.350417, 0.386422, 0.428032,
244  0.47634, 0.532692, 0.598756, 0.676612, 0.768868,
245  0.878812, 1.01062, 1.16963, 1.36271, 1.59876,
246  1.88943, 2.25002, 2.70086, 3.26916, 3.99166,
247  4.91843, 6.11836, 7.6872, 9.75942, 12.5259,
248  16.2605, 21.3615, 28.4141, 38.2903, 52.3062,
249  72.4763, 101.93, 145.6, 211.39, 312.172};
250 
252 //
253 // nu_mu CC xsc_tot/E_nu, in 10^-38 cm2/GeV
254 
256 {
257  0.0716001, 0.241013, 0.337793, 0.416033, 0.484616,
258  0.546945, 0.604661, 0.658623, 0.709277, 0.756815,
259  0.801263, 0.842519, 0.880396, 0.914642, 0.944968,
260  0.971069, 0.992655, 1.00947, 1.02133, 1.02812,
261  1.02987, 1.02671, 1.01892, 1.00689, 0.991167,
262  0.972618, 0.951518, 0.928806, 0.90521, 0.881404,
263  0.857978, 0.835424, 0.814112, 0.794314, 0.776204,
264  0.759884, 0.745394, 0.732719, 0.721809, 0.712164,
265  0.704299, 0.697804, 0.692491, 0.688137, 0.68448,
266  0.681232, 0.676128, 0.674154, 0.670553, 0.666034};
267 
268 
269 
271 //
272 // anu_mu CC xsc_tot/E_nu, in 10^-38 cm2/GeV
273 
275 {
276 0.0291812, 0.0979725, 0.136884, 0.16794, 0.194698,
277 0.218468, 0.23992, 0.259241, 0.27665, 0.292251,
278 0.30612, 0.318314, 0.328886, 0.337885, 0.345464,
279 0.351495, 0.356131, 0.359448, 0.361531, 0.362474,
280 0.362382, 0.361365, 0.359538, 0.357024, 0.353943,
281 0.350422, 0.346685, 0.342662, 0.338567, 0.334514,
282 0.330612, 0.326966, 0.323668, 0.320805, 0.318451,
283 0.316671, 0.315514, 0.315013, 0.315187, 0.316036,
284 0.317541, 0.319667, 0.322362, 0.325556, 0.329159,
285 0.332577, 0.337133, 0.341214, 0.345128, 0.347657};
virtual G4double GetIsoCrossSection(const G4DynamicParticle *aPart, G4int Z, G4int A, const G4Isotope *, const G4Element *, const G4Material *)
static const G4double fNuMuTotXsc[50]
G4ParticleDefinition * theMuonPlus
G4double GetANuMuTotCsArray(G4int index)
Float_t y1[n_points_granero]
Definition: compare.C:5
static const G4double fANuMuTotXsc[50]
Float_t x1[n_points_granero]
Definition: compare.C:5
#define G4endl
Definition: G4ios.hh:61
const G4String & GetParticleName() const
G4double GetANuMuTotCsXsc(G4int index, G4double energy)
static G4MuonMinus * MuonMinus()
Definition: G4MuonMinus.cc:100
G4double GetNuMuTotCsXsc(G4int index, G4double energy)
virtual G4bool IsElementApplicable(const G4DynamicParticle *, G4int Z, const G4Material *)
Float_t y2[n_points_geant4]
Definition: compare.C:26
G4int GetEnergyIndex(G4double energy)
double G4double
Definition: G4Types.hh:76
bool G4bool
Definition: G4Types.hh:79
G4ParticleDefinition * GetDefinition() const
static constexpr double cm2
Definition: G4SIunits.hh:120
G4ParticleDefinition * theMuonMinus
double energy
Definition: plottest35.C:25
double A(double temperature)
G4double GetNuMuTotCsArray(G4int index)
G4double G4ParticleHPJENDLHEData::G4double result
int G4int
Definition: G4Types.hh:78
static const G4double fNuMuEnergy[50]
static G4MuonPlus * MuonPlus()
Definition: G4MuonPlus.cc:99
G4GLOB_DLL std::ostream G4cout
G4double GetTotalEnergy() const
Float_t x2[n_points_geant4]
Definition: compare.C:26
static constexpr double GeV
Definition: G4SIunits.hh:217