Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4NuElNucleusNcModel.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// $Id: G4NuElNucleusNcModel.cc 91806 2015-08-06 12:20:45Z gcosmo $
27//
28// Geant4 Header : G4NuElNucleusNcModel
29//
30// Author : V.Grichine 12.2.19
31//
32
35
36// #include "G4NuMuResQX.hh"
37
38#include "G4SystemOfUnits.hh"
39#include "G4ParticleTable.hh"
41#include "G4IonTable.hh"
42#include "Randomize.hh"
43#include "G4RandomDirection.hh"
44
45// #include "G4Integrator.hh"
46#include "G4DataVector.hh"
47#include "G4PhysicsTable.hh"
48#include "G4KineticTrack.hh"
51#include "G4Fragment.hh"
53
54
55#include "G4NeutrinoE.hh"
56// #include "G4AntiNeutrinoMu.hh"
57#include "G4Nucleus.hh"
58#include "G4LorentzVector.hh"
59
60using namespace std;
61using namespace CLHEP;
62
63#ifdef G4MULTITHREADED
64 G4Mutex G4NuElNucleusNcModel::numuNucleusModel = G4MUTEX_INITIALIZER;
65#endif
66
67
70{
71 SetMinEnergy( 0.0*GeV );
72 SetMaxEnergy( 100.*TeV );
73 SetMinEnergy(1.e-6*eV);
74
75 theNuE = G4NeutrinoE::NeutrinoE();
76
77 fMnumu = 0.;
78 fData = fMaster = false;
80
81}
82
83
85{}
86
87
88void G4NuElNucleusNcModel::ModelDescription(std::ostream& outFile) const
89{
90
91 outFile << "G4NuElNucleusNcModel is a neutrino-nucleus (neutral current) scattering\n"
92 << "model which uses the standard model \n"
93 << "transfer parameterization. The model is fully relativistic\n";
94
95}
96
97/////////////////////////////////////////////////////////
98//
99// Read data from G4PARTICLEXSDATA (locally PARTICLEXSDATA)
100
102{
103 G4String pName = "nu_e";
104
105 G4int nSize(0), i(0), j(0), k(0);
106
107 if(!fData)
108 {
109#ifdef G4MULTITHREADED
110 G4MUTEXLOCK(&numuNucleusModel);
111 if(!fData)
112 {
113#endif
114 fMaster = true;
115#ifdef G4MULTITHREADED
116 }
117 G4MUTEXUNLOCK(&numuNucleusModel);
118#endif
119 }
120
121 if(fMaster)
122 {
123 const char* path = G4FindDataDir("G4PARTICLEXSDATA");
124 std::ostringstream ost1, ost2, ost3, ost4;
125 ost1 << path << "/" << "neutrino" << "/" << pName << "/xarraynckr";
126
127 std::ifstream filein1( ost1.str().c_str() );
128
129 // filein.open("$PARTICLEXSDATA/");
130
131 filein1>>nSize;
132
133 for( k = 0; k < fNbin; ++k )
134 {
135 for( i = 0; i <= fNbin; ++i )
136 {
137 filein1 >> fNuMuXarrayKR[k][i];
138 // G4cout<< fNuMuXarrayKR[k][i] << " ";
139 }
140 }
141 // G4cout<<G4endl<<G4endl;
142
143 ost2 << path << "/" << "neutrino" << "/" << pName << "/xdistrnckr";
144 std::ifstream filein2( ost2.str().c_str() );
145
146 filein2>>nSize;
147
148 for( k = 0; k < fNbin; ++k )
149 {
150 for( i = 0; i < fNbin; ++i )
151 {
152 filein2 >> fNuMuXdistrKR[k][i];
153 // G4cout<< fNuMuXdistrKR[k][i] << " ";
154 }
155 }
156 // G4cout<<G4endl<<G4endl;
157
158 ost3 << path << "/" << "neutrino" << "/" << pName << "/q2arraynckr";
159 std::ifstream filein3( ost3.str().c_str() );
160
161 filein3>>nSize;
162
163 for( k = 0; k < fNbin; ++k )
164 {
165 for( i = 0; i <= fNbin; ++i )
166 {
167 for( j = 0; j <= fNbin; ++j )
168 {
169 filein3 >> fNuMuQarrayKR[k][i][j];
170 // G4cout<< fNuMuQarrayKR[k][i][j] << " ";
171 }
172 }
173 }
174 // G4cout<<G4endl<<G4endl;
175
176 ost4 << path << "/" << "neutrino" << "/" << pName << "/q2distrnckr";
177 std::ifstream filein4( ost4.str().c_str() );
178
179 filein4>>nSize;
180
181 for( k = 0; k < fNbin; ++k )
182 {
183 for( i = 0; i <= fNbin; ++i )
184 {
185 for( j = 0; j < fNbin; ++j )
186 {
187 filein4 >> fNuMuQdistrKR[k][i][j];
188 // G4cout<< fNuMuQdistrKR[k][i][j] << " ";
189 }
190 }
191 }
192 fData = true;
193 }
194}
195
196/////////////////////////////////////////////////////////
197
199 G4Nucleus & )
200{
201 G4bool result = false;
202 G4String pName = aPart.GetDefinition()->GetParticleName();
203 G4double energy = aPart.GetTotalEnergy();
205
206 if( pName == "nu_e"
207 &&
208 energy > fMinNuEnergy )
209 {
210 result = true;
211 }
212
213 return result;
214}
215
216/////////////////////////////////////////// ClusterDecay ////////////////////////////////////////////////////////////
217//
218//
219
221 const G4HadProjectile& aTrack, G4Nucleus& targetNucleus)
222{
224 fProton = f2p2h = fBreak = false;
225 const G4HadProjectile* aParticle = &aTrack;
226 G4double energy = aParticle->GetTotalEnergy();
227
228 G4String pName = aParticle->GetDefinition()->GetParticleName();
229
230 if( energy < fMinNuEnergy )
231 {
234 return &theParticleChange;
235 }
236 SampleLVkr( aTrack, targetNucleus);
237
238 if( fBreak == true || fEmu < fMnumu ) // ~5*10^-6
239 {
240 // G4cout<<"ni, ";
243 return &theParticleChange;
244 }
245
246 // LVs of initial state
247
248 G4LorentzVector lvp1 = aParticle->Get4Momentum();
249 G4LorentzVector lvt1( 0., 0., 0., fM1 );
251
252 // 1-pi by fQtransfer && nu-energy
253 G4LorentzVector lvpip1( 0., 0., 0., mPip );
254 G4LorentzVector lvsum, lv2, lvX;
255 G4ThreeVector eP;
256 G4double cost(1.), sint(0.), phi(0.), muMom(0.), massX2(0.);
257 G4DynamicParticle* aLept = nullptr; // lepton lv
258
259 G4int Z = targetNucleus.GetZ_asInt();
260 G4int A = targetNucleus.GetA_asInt();
261 G4double mTarg = targetNucleus.AtomicMass(A,Z);
262 G4int pdgP(0), qB(0);
263 // G4double mSum = G4ParticleTable::GetParticleTable()->FindParticle(2212)->GetPDGMass() + mPip;
264
265 G4int iPi = GetOnePionIndex(energy);
266 G4double p1pi = GetNuMuOnePionProb( iPi, energy);
267
268 if( p1pi > G4UniformRand() && fCosTheta > 0.9 ) // && fQtransfer < 0.95*GeV ) // mu- & coherent pion + nucleus
269 {
270 // lvsum = lvp1 + lvpip1;
271 lvsum = lvp1 + lvt1;
272 // cost = fCosThetaPi;
273 cost = fCosTheta;
274 sint = std::sqrt( (1.0 - cost)*(1.0 + cost) );
275 phi = G4UniformRand()*CLHEP::twopi;
276 eP = G4ThreeVector( sint*std::cos(phi), sint*std::sin(phi), cost );
277
278 // muMom = sqrt(fEmuPi*fEmuPi-fMnumu*fMnumu);
279 muMom = sqrt(fEmu*fEmu-fMnumu*fMnumu);
280
281 eP *= muMom;
282
283 // lv2 = G4LorentzVector( eP, fEmuPi );
284 lv2 = G4LorentzVector( eP, fEmu );
285 lv2 = fLVl;
286
287 lvX = lvsum - lv2;
288 lvX = fLVh;
289 massX2 = lvX.m2();
290 G4double massX = lvX.m();
291 G4double massR = fLVt.m();
292
293 // if ( massX2 <= 0. ) // vmg: very rarely ~ (1-4)e-6 due to big Q2/x, to be improved
294 if ( massX2 <= fM1*fM1 ) // 9-3-20 vmg: very rarely ~ (1-4)e-6 due to big Q2/x, to be improved
295 if ( lvX.e() <= fM1 ) // 9-3-20 vmg: very rarely ~ (1-4)e-6 due to big Q2/x, to be improved
296 {
299 return &theParticleChange;
300 }
301 fW2 = massX2;
302
303 if( pName == "nu_e" ) aLept = new G4DynamicParticle( theNuE, lv2 );
304 // else if( pName == "anti_nu_mu") aLept = new G4DynamicParticle( theANuMu, lv2 );
305 else
306 {
309 return &theParticleChange;
310 }
311
312 pdgP = 111;
313
314 G4double eCut; // = fMpi + 0.5*(fMpi*fMpi - massX2)/mTarg; // massX -> fMpi
315
316 if( A > 1 )
317 {
318 eCut = (fMpi + mTarg)*(fMpi + mTarg) - (massX + massR)*(massX + massR);
319 eCut /= 2.*massR;
320 eCut += massX;
321 }
322 else eCut = fM1 + fMpi;
323
324 if ( lvX.e() > eCut ) // && sqrt( GetW2() ) < 1.4*GeV ) //
325 {
326 CoherentPion( lvX, pdgP, targetNucleus);
327 }
328 else
329 {
332 return &theParticleChange;
333 }
335
336 return &theParticleChange;
337 }
338 else // lepton part in lab
339 {
340 lvsum = lvp1 + lvt1;
341 cost = fCosTheta;
342 sint = std::sqrt( (1.0 - cost)*(1.0 + cost) );
343 phi = G4UniformRand()*CLHEP::twopi;
344 eP = G4ThreeVector( sint*std::cos(phi), sint*std::sin(phi), cost );
345
346 muMom = sqrt(fEmu*fEmu-fMnumu*fMnumu);
347
348 eP *= muMom;
349
350 lv2 = G4LorentzVector( eP, fEmu );
351
352 lvX = lvsum - lv2;
353
354 massX2 = lvX.m2();
355
356 if ( massX2 <= 0. ) // vmg: very rarely ~ (1-4)e-6 due to big Q2/x, to be improved
357 {
360 return &theParticleChange;
361 }
362 fW2 = massX2;
363
364 aLept = new G4DynamicParticle( theNuE, lv2 );
365
367 }
368
369 // hadron part
370
371 fRecoil = nullptr;
372 fCascade = false;
373 fString = false;
374
375 if( A == 1 )
376 {
377 qB = 1;
378
379 // if( G4UniformRand() > 0.1 ) // > 0.9999 ) // > 0.0001 ) //
380 {
381 ClusterDecay( lvX, qB );
382 }
383 return &theParticleChange;
384 }
385 G4Nucleus recoil;
386 G4double rM(0.), ratio = G4double(Z)/G4double(A);
387
388 if( ratio > G4UniformRand() ) // proton is excited
389 {
390 fProton = true;
391 recoil = G4Nucleus(A-1,Z-1);
392 fRecoil = &recoil;
393 rM = recoil.AtomicMass(A-1,Z-1);
394
397 }
398 else // excited neutron
399 {
400 fProton = false;
401 recoil = G4Nucleus(A-1,Z);
402 fRecoil = &recoil;
403 rM = recoil.AtomicMass(A-1,Z);
404
407 }
408 // G4int index = GetEnergyIndex(energy);
409 G4int nepdg = aParticle->GetDefinition()->GetPDGEncoding();
410 G4double qeTotRat; // = GetNuMuQeTotRat(index, energy);
411 qeTotRat = CalculateQEratioA( Z, A, energy, nepdg);
412
413 G4ThreeVector dX = (lvX.vect()).unit();
414 G4double eX = lvX.e(); // excited nucleon
415 G4double mX = sqrt(massX2);
416
417 if( qeTotRat > G4UniformRand() || mX <= fMt ) // || eX <= 1232.*MeV) // QE
418 {
419 fString = false;
420
421 if( fProton )
422 {
423 fPDGencoding = 2212;
424 fMr = proton_mass_c2;
425 recoil = G4Nucleus(A-1,Z-1);
426 fRecoil = &recoil;
427 rM = recoil.AtomicMass(A-1,Z-1);
428 }
429 else
430 {
431 fPDGencoding = 2112;
433 FindParticle(fPDGencoding)->GetPDGMass(); // 939.5654133*MeV;
434 recoil = G4Nucleus(A-1,Z);
435 fRecoil = &recoil;
436 rM = recoil.AtomicMass(A-1,Z);
437 }
438 G4double eTh = fMr+0.5*(fMr*fMr-mX*mX)/rM;
439
440 if(eX <= eTh) // vmg, very rarely out of kinematics
441 {
444 return &theParticleChange;
445 }
446 FinalBarion( lvX, 0, fPDGencoding ); // p(n)+deexcited recoil
447 }
448 else // if ( eX < 9500000.*GeV ) // < 25.*GeV) // < 95.*GeV ) // < 2.5*GeV ) //cluster decay
449 {
450 if ( fProton && pName == "nu_e" ) qB = 1;
451 else if( !fProton && pName == "nu_e" ) qB = 0;
452
453 ClusterDecay( lvX, qB );
454 }
455 return &theParticleChange;
456}
457
458
459/////////////////////////////////////////////////////////////////////
460////////////////////////////////////////////////////////////////////
461///////////////////////////////////////////////////////////////////
462
463/////////////////////////////////////////////////
464//
465// sample x, then Q2
466
468{
469 fBreak = false;
470 G4int A = targetNucleus.GetA_asInt(), iTer(0), iTerMax(100);
471 G4int Z = targetNucleus.GetZ_asInt();
472 G4double e3(0.), pMu2(0.), pX2(0.), nMom(0.), rM(0.), hM(0.), tM = targetNucleus.AtomicMass(A,Z);
473 G4double cost(1.), sint(0.), phi(0.), muMom(0.);
474 G4ThreeVector eP, bst;
475 const G4HadProjectile* aParticle = &aTrack;
476 G4LorentzVector lvp1 = aParticle->Get4Momentum();
477 nMom = NucleonMomentum( targetNucleus );
478
479 if( A == 1 || nMom == 0. ) // hydrogen, no Fermi motion ???
480 {
481 fNuEnergy = aParticle->GetTotalEnergy();
482 iTer = 0;
483
484 do
485 {
489
490 if( fXsample > 0. )
491 {
492 fW2 = fM1*fM1 - fQ2 + fQ2/fXsample; // sample excited hadron mass
494 }
495 else
496 {
497 fW2 = fM1*fM1;
498 fEmu = fNuEnergy;
499 }
500 e3 = fNuEnergy + fM1 - fEmu;
501
502 // if( e3 < sqrt(fW2) ) G4cout<<"energyX = "<<e3/GeV<<", fW = "<<sqrt(fW2)/GeV<<G4endl; // vmg ~10^-5 for NC
503
504 pMu2 = fEmu*fEmu - fMnumu*fMnumu;
505 pX2 = e3*e3 - fW2;
506
507 fCosTheta = fNuEnergy*fNuEnergy + pMu2 - pX2;
508 fCosTheta /= 2.*fNuEnergy*sqrt(pMu2);
509 iTer++;
510 }
511 while( ( abs(fCosTheta) > 1. || fEmu < fMnumu ) && iTer < iTerMax );
512
513 if( iTer >= iTerMax ) { fBreak = true; return; }
514
515 if( abs(fCosTheta) > 1.) // vmg: due to big Q2/x values. To be improved ...
516 {
517 G4cout<<"H2: fCosTheta = "<<fCosTheta<<", fEmu = "<<fEmu<<G4endl;
518 // fCosTheta = -1. + 2.*G4UniformRand();
519 if(fCosTheta < -1.) fCosTheta = -1.;
520 if(fCosTheta > 1.) fCosTheta = 1.;
521 }
522 // LVs
523
524 G4LorentzVector lvt1 = G4LorentzVector( 0., 0., 0., fM1 );
525 G4LorentzVector lvsum = lvp1 + lvt1;
526
527 cost = fCosTheta;
528 sint = std::sqrt( (1.0 - cost)*(1.0 + cost) );
529 phi = G4UniformRand()*CLHEP::twopi;
530 eP = G4ThreeVector( sint*std::cos(phi), sint*std::sin(phi), cost );
531 muMom = sqrt(fEmu*fEmu-fMnumu*fMnumu);
532 eP *= muMom;
533 fLVl = G4LorentzVector( eP, fEmu );
534
535 fLVh = lvsum - fLVl;
536 fLVt = G4LorentzVector( 0., 0., 0., 0. ); // no recoil
537 }
538 else // Fermi motion, Q2 in nucleon rest frame
539 {
540 G4ThreeVector nMomDir = nMom*G4RandomDirection();
541
542 if( !f2p2h ) // 1p1h
543 {
544 G4Nucleus recoil(A-1,Z);
545 rM = sqrt( recoil.AtomicMass(A-1,Z)*recoil.AtomicMass(A-1,Z) + nMom*nMom );
546 hM = tM - rM;
547
548 fLVt = G4LorentzVector( nMomDir, sqrt( rM*rM+nMom*nMom ) );
549 fLVh = G4LorentzVector(-nMomDir, sqrt( hM*hM+nMom*nMom ) );
550 }
551 else // 2p2h
552 {
553 G4Nucleus recoil(A-2,Z-1);
554 rM = recoil.AtomicMass(A-2,Z-1)+sqrt(nMom*nMom+fM1*fM1);
555 hM = tM - rM;
556
557 fLVt = G4LorentzVector( nMomDir, sqrt( rM*rM+nMom*nMom ) );
558 fLVh = G4LorentzVector(-nMomDir, sqrt( hM*hM+nMom*nMom ) );
559 }
560 // G4cout<<hM<<", ";
561 // bst = fLVh.boostVector(); // 9-3-20
562
563 // lvp1.boost(-bst); // 9-3-20 -> nucleon rest system, where Q2 transfer is ???
564
565 fNuEnergy = lvp1.e();
566 iTer = 0;
567
568 do
569 {
573
574 if( fXsample > 0. )
575 {
576 fW2 = fM1*fM1 - fQ2 + fQ2/fXsample; // sample excited hadron mass
578 }
579 else
580 {
581 fW2 = fM1*fM1;
582 fEmu = fNuEnergy;
583 }
584
585 // if(fEmu < 0.) G4cout<<"fEmu = "<<fEmu<<" hM = "<<hM<<G4endl;
586
587 e3 = fNuEnergy + fM1 - fEmu;
588
589 // if( e3 < sqrt(fW2) ) G4cout<<"energyX = "<<e3/GeV<<", fW = "<<sqrt(fW2)/GeV<<G4endl;
590
591 pMu2 = fEmu*fEmu - fMnumu*fMnumu;
592 pX2 = e3*e3 - fW2;
593
594 fCosTheta = fNuEnergy*fNuEnergy + pMu2 - pX2;
595 fCosTheta /= 2.*fNuEnergy*sqrt(pMu2);
596 iTer++;
597 }
598 while( ( abs(fCosTheta) > 1. || fEmu < fMnumu ) && iTer < iTerMax );
599
600 if( iTer >= iTerMax ) { fBreak = true; return; }
601
602 if( abs(fCosTheta) > 1.) // vmg: due to big Q2/x values. To be improved ...
603 {
604 G4cout<<"FM: fCosTheta = "<<fCosTheta<<", fEmu = "<<fEmu<<G4endl;
605 // fCosTheta = -1. + 2.*G4UniformRand();
606 if(fCosTheta < -1.) fCosTheta = -1.;
607 if(fCosTheta > 1.) fCosTheta = 1.;
608 }
609 // LVs
610 G4LorentzVector lvt1 = G4LorentzVector( 0., 0., 0., fM1 );
611 G4LorentzVector lvsum = lvp1 + lvt1;
612
613 cost = fCosTheta;
614 sint = std::sqrt( (1.0 - cost)*(1.0 + cost) );
615 phi = G4UniformRand()*CLHEP::twopi;
616 eP = G4ThreeVector( sint*std::cos(phi), sint*std::sin(phi), cost );
617 muMom = sqrt(fEmu*fEmu-fMnumu*fMnumu);
618 eP *= muMom;
619 fLVl = G4LorentzVector( eP, fEmu );
620 fLVh = lvsum - fLVl;
621 // back to lab system
622 // fLVl.boost(bst); // 9-3-20
623 // fLVh.boost(bst); // 9-3-20
624 }
625 //G4cout<<iTer<<", "<<fBreak<<"; ";
626}
627
628//
629//
630///////////////////////////
const char * G4FindDataDir(const char *)
CLHEP::HepLorentzVector G4LorentzVector
G4ThreeVector G4RandomDirection()
#define G4MUTEX_INITIALIZER
Definition: G4Threading.hh:85
#define G4MUTEXLOCK(mutex)
Definition: G4Threading.hh:251
#define G4MUTEXUNLOCK(mutex)
Definition: G4Threading.hh:254
std::mutex G4Mutex
Definition: G4Threading.hh:81
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:52
Hep3Vector unit() const
Hep3Vector vect() const
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
void SetEnergyChange(G4double anEnergy)
void SetMomentumChange(const G4ThreeVector &aV)
const G4ParticleDefinition * GetDefinition() const
const G4LorentzVector & Get4Momentum() const
G4double GetTotalEnergy() const
void SetMinEnergy(G4double anEnergy)
void SetMaxEnergy(const G4double anEnergy)
static G4NeutrinoE * NeutrinoE()
Definition: G4NeutrinoE.cc:84
void CoherentPion(G4LorentzVector &lvP, G4int pdgP, G4Nucleus &targetNucleus)
static G4double fNuMuQarrayKR[50][51][51]
static G4double fNuMuXarrayKR[50][51]
G4double NucleonMomentum(G4Nucleus &targetNucleus)
G4int GetOnePionIndex(G4double energy)
G4double SampleXkr(G4double energy)
G4double SampleQkr(G4double energy, G4double xx)
G4double GetNuMuOnePionProb(G4int index, G4double energy)
static G4double fNuMuXdistrKR[50][50]
static G4double fNuMuQdistrKR[50][51][50]
G4double CalculateQEratioA(G4int Z, G4int A, G4double energy, G4int nepdg)
void ClusterDecay(G4LorentzVector &lvX, G4int qX)
void FinalBarion(G4LorentzVector &lvB, G4int qB, G4int pdgB)
void SampleLVkr(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
virtual void ModelDescription(std::ostream &) const
virtual G4bool IsApplicable(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
G4NuElNucleusNcModel(const G4String &name="NuElNuclNcModel")
G4int GetA_asInt() const
Definition: G4Nucleus.hh:99
G4int GetZ_asInt() const
Definition: G4Nucleus.hh:105
G4double AtomicMass(const G4double A, const G4double Z, const G4int numberOfLambdas=0) const
Definition: G4Nucleus.cc:357
const G4String & GetParticleName() const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
Definition: DoubConv.h:17