Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4QNGamma.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$
27//
28// ---------------- G4QNGamma class -----------------
29// by Mikhail Kossov, December 2003.
30// G4QNGamma class of the CHIPS Simulation Branch in GEANT4
31// ---------------------------------------------------------------
32// **************************************************************************
33// This Header is a part of the CHIPS Physics Package (author: M. Kosov)
34// **************************************************************************
35// Short description: This is a universal class for the incoherent (inelastic)
36// nuclear (n,gamma) interactions (neutron capture) in the CHIPS model.
37// @@ At present the gamma cascade is not simulated (one final photon)
38// ---------------------------------------------------------------------------
39//#define debug
40//#define pdebug
41
42#include "G4QNGamma.hh"
44
45
46// Initialization of static Material/Element/Isotope vectors
47std::vector<G4int> G4QNGamma::ElementZ; // Z of the element(i) in the Last Calc
48std::vector<G4double> G4QNGamma::ElProbInMat; // ProbabilitySum ofElements inMaterial
49std::vector<std::vector<G4int>*> G4QNGamma::ElIsoN;// # of isotope(j), # of Element(i)
50std::vector<std::vector<G4double>*>G4QNGamma::IsoProbInEl;//SumProbabIsotopes in Element I
51
52// Constructor
53G4QNGamma::G4QNGamma(const G4String& processName)
54 : G4VDiscreteProcess(processName, fHadronic)
55{
56 G4HadronicDeprecate("G4QNGamma");
57
58 EnMomConservation = G4LorentzVector(0.,0.,0.,0.);
59 nOfNeutrons = 0;
60#ifdef debug
61 G4cout<<"G4QNGamma::Constructor is called"<<G4endl;
62#endif
63 if (verboseLevel>0) G4cout << GetProcessName() << " process is created "<< G4endl;
64}
65
66// Destructor (standard procedure @@ to be moved to G4VQProcess)
68{
69 // The following is just a copy of what is done in PostStepDoIt every interaction !
70 // The correction is if(IPIE), so just for(...;ip<IPIE;...) does not work ! @@
71 G4int IPIE=IsoProbInEl.size(); // How many old elements?
72 if(IPIE) for(G4int ip=0; ip<IPIE; ++ip) // Clean up the SumProb's of Isotopes (SPI)
73 {
74 std::vector<G4double>* SPI=IsoProbInEl[ip]; // Pointer to the SPI vector
75 SPI->clear();
76 delete SPI;
77 std::vector<G4int>* IsN=ElIsoN[ip]; // Pointer to the N vector
78 IsN->clear();
79 delete IsN;
80 }
81 ElProbInMat.clear(); // Clean up the SumProb's of Elements (SPE)
82 ElementZ.clear(); // Clear the body vector for Z of Elements
83 IsoProbInEl.clear(); // Clear the body vector for SPI
84 ElIsoN.clear(); // Clear the body vector for N of Isotopes
85}
86
87
89{
90 return EnMomConservation;
91}
92
94{
95 return nOfNeutrons;
96}
97
98// output of the function must be in units of length! L=1/sig_V,sig_V=SUM(n(j,i)*sig(j,i)),
99// where n(i,j) is a number of nuclei of the isotop j of the element i in V=1(lengtUnit^3)
100// ********** All CHIPS cross sections are calculated in the surface units ************
101// @@ Can demand 3 internal functions when G4VQProcess is used @@ future plans
103{
104#ifdef debug
105 G4cout<<"G4QNGamma::GetMeanFreePath: Called Fc="<<*Fc<<G4endl;
106#endif
107 *Fc = NotForced;
108#ifdef debug
109 G4cout<<"G4QNGamma::GetMeanFreePath: Before GetDynPart"<<G4endl;
110#endif
111 const G4DynamicParticle* incidentParticle = aTrack.GetDynamicParticle();
112#ifdef debug
113 G4cout<<"G4QNGamma::GetMeanFreePath: Before GetDef"<<G4endl;
114#endif
115 G4ParticleDefinition* incidentParticleDefinition=incidentParticle->GetDefinition();
116 G4double Momentum = incidentParticle->GetTotalMomentum(); // 3-momentum of the Particle
117 if( !IsApplicable(*incidentParticleDefinition)) // @@ Unique for all QProcesses
118 {
119 G4cout<<"-W-G4QNGamma::GetMeanFreePath called for not implemented particle"<<G4endl;
120 return DBL_MAX;
121 }
122#ifdef debug
123 G4cout<<"G4QNGamma::GetMeanFreePath: BeforeGetMaterial P="<<Momentum<<G4endl;
124#endif
125 // @@ Can be additional condition internal function of G4VQProcess
126 if(Momentum > 500.) return DBL_MAX; // @@ Temporary cut (QInternal=MeV -> IU!)
127 // @@ This is a standard procedure, which can be moved to G4VQProcess (above is a funct)
128 const G4Material* material = aTrack.GetMaterial(); // Get the current material
129 const G4double* NOfNucPerVolume = material->GetVecNbOfAtomsPerVolume();
130 const G4ElementVector* theElementVector = material->GetElementVector();
131 G4int nE=material->GetNumberOfElements();
132#ifdef debug
133 G4cout<<"G4QNGamma::GetMeanFreePath:"<<nE<<" Elem's in theMaterial"<<G4endl;
134#endif
135 // @@ Can be internal function called by GetMeanFreePath (above Isotope LOOP)
136 G4VQCrossSection* CSmanager = 0; // @@ Reference modified in the function
137 G4QNeutronCaptureRatio* capMan = 0; // @@ Reference modified in the function
138 G4int pPDG =0; // @@ Reference modified in the function
139 G4double sigma =0.; // CS mean over isotopes @@ Reference modified in the function
140 if(incidentParticleDefinition == G4Neutron::Neutron())
141 {
143 capMan=G4QNeutronCaptureRatio::GetPointer(); // @@ can be CSmanager2
144#ifdef debug
145 G4cout<<"G4QNGamma::GetMeanFreePath: CSmanager is defined for neutrons"<<G4endl;
146#endif
147 pPDG=2112;
148 }
149 else
150 {
151 G4cout<<"-Warning-G4QNGamma::GetMeanFreePath:Particle "
152 <<incidentParticleDefinition->GetPDGEncoding()<<" isn't a neutron"<<G4endl;
153 return DBL_MAX; // can be returned in sigma
154 }
155 // @@ End of possible internal function
156 G4QIsotope* Isotopes = G4QIsotope::Get(); // Pointer to the G4QIsotopes singleton
157 G4int IPIE=IsoProbInEl.size(); // How many old elements?
158 if(IPIE) for(G4int ip=0; ip<IPIE; ++ip) // Clean up the SumProb's of Isotopes (SPI)
159 {
160 std::vector<G4double>* SPI=IsoProbInEl[ip]; // Pointer to the SPI vector
161 SPI->clear();
162 delete SPI;
163 std::vector<G4int>* IsN=ElIsoN[ip]; // Pointer to the N vector
164 IsN->clear();
165 delete IsN;
166 }
167 ElProbInMat.clear(); // Clean up the SumProb's of Elements (SPE)
168 ElementZ.clear(); // Clear the body vector for Z of Elements
169 IsoProbInEl.clear(); // Clear the body vector for SPI
170 ElIsoN.clear(); // Clear the body vector for N of Isotopes
171 for(G4int i=0; i<nE; ++i)
172 {
173 G4Element* pElement=(*theElementVector)[i]; // Pointer to the current element
174 G4int Z = static_cast<G4int>(pElement->GetZ()); // Z of the Element
175 ElementZ.push_back(Z); // Remember Z of the Element
176 G4int isoSize=0; // The default for the isoVectorLength is 0
177 G4int indEl=0; // Index of non-trivial element or 0(default)
178 G4IsotopeVector* isoVector=pElement->GetIsotopeVector(); // Get the predefined IsoVect
179 if(isoVector) isoSize=isoVector->size();// Get size of the existing isotopeVector
180#ifdef debug
181 G4cout<<"G4QNGamma::GetMeanFreePath: isovectorLength="<<isoSize<<G4endl; // Result
182#endif
183 if(isoSize) // The Element has non-trivial abundance set
184 {
185 indEl=pElement->GetIndex()+1; // Index of the non-trivial element
186 if(!Isotopes->IsDefined(Z,indEl)) // This index is not defined for this Z: define
187 {
188 std::vector<std::pair<G4int,G4double>*>* newAbund =
189 new std::vector<std::pair<G4int,G4double>*>;
190 G4double* abuVector=pElement->GetRelativeAbundanceVector();
191 for(G4int j=0; j<isoSize; j++) // Calculation of abundance vector for isotopes
192 {
193 G4int N=pElement->GetIsotope(j)->GetN()-Z; // N means A=N+Z !
194 if(pElement->GetIsotope(j)->GetZ()!=Z)G4cerr<<"G4QNGamma::GetMeanFreePath"
195 <<": Z="<<pElement->GetIsotope(j)->GetZ()<<"#"<<Z<<G4endl;
196 G4double abund=abuVector[j];
197 std::pair<G4int,G4double>* pr= new std::pair<G4int,G4double>(N,abund);
198#ifdef debug
199 G4cout<<"G4QNGamma::GetMeanFreePath: p#="<<j<<",N="<<N<<",ab="<<abund<<G4endl;
200#endif
201 newAbund->push_back(pr);
202 }
203#ifdef debug
204 G4cout<<"G4QNGamma::GetMeanFreePath: pairVectLength="<<newAbund->size()<<G4endl;
205#endif
206 indEl=G4QIsotope::Get()->InitElement(Z,indEl,newAbund); // definition of the newInd
207 for(G4int k=0; k<isoSize; k++) delete (*newAbund)[k]; // Cleaning temporary
208 delete newAbund; // Was "new" in the beginning of the name space
209 }
210 }
211 std::vector<std::pair<G4int,G4double>*>* cs= Isotopes->GetCSVector(Z,indEl);//CSPointer
212 std::vector<G4double>* SPI = new std::vector<G4double>; // Pointer to the SPI vector
213 IsoProbInEl.push_back(SPI);
214 std::vector<G4int>* IsN = new std::vector<G4int>; // Pointer to the N vector
215 ElIsoN.push_back(IsN);
216 G4int nIs=cs->size(); // A#Of Isotopes in the Element
217 G4double susi=0.; // sum of CS over isotopes
218#ifdef debug
219 G4cout<<"G4QNGamma::GetMeanFreePath: Before Loop nIs="<<nIs<<G4endl;
220#endif
221 if(nIs) for(G4int j=0; j<nIs; j++) // Calculate CS for eachIsotope of El
222 {
223 std::pair<G4int,G4double>* curIs=(*cs)[j]; // A pointer, which is used twice
224 G4int N=curIs->first; // #of Neuterons in the isotope j of El i
225 IsN->push_back(N); // Remember Min N for the Element
226#ifdef debug
227 G4cout<<"G4QNGam::GetMeanFrP: Before CS, P="<<Momentum<<",Z="<<Z<<",N="<<N<<G4endl;
228#endif
229 // @@ Can be a function, depanding on CSm1, CSm2, Momentum, Z, N, pPDG
230 G4double CSI=CSmanager->GetCrossSection(true, Momentum, Z, N, pPDG) *
231 capMan->GetRatio(Momentum, Z, N); // CS(j,i) for the isotope
232#ifdef debug
233 G4cout<<"GQC::GMF:X="<<CSI<<",M="<<Momentum<<",Z="<<Z<<",N="<<N<<",P="<<pPDG<<G4endl;
234#endif
235 curIs->second = CSI;
236 susi+=CSI; // Make a sum per isotopes
237 SPI->push_back(susi); // Remember summed cross-section
238 } // End of temporary initialization of the cross sections in the G4QIsotope singeltone
239 sigma+=Isotopes->GetMeanCrossSection(Z,indEl)*NOfNucPerVolume[i];//SUM(MeanCS*NOfNperV)
240 ElProbInMat.push_back(sigma);
241 } // End of LOOP over Elements
242#ifdef debug
243 G4cout<<"G4QNGam::GetMeanFrPa: Sigma="<<sigma<<G4endl;
244#endif
245 if(sigma > 0.) return 1./sigma; // Mean path [distance]
246 return DBL_MAX;
247}
248
249// Original in any G4QProcess inheriting G4Process
251{
252 if ( particle == *( G4Neutron::Neutron() ) ) return true;
253#ifdef debug
254 G4cout<<"***G4QNGamma::IsApplicable: PDG="<<particle.GetPDGEncoding()<<G4endl;
255#endif
256 return false;
257}
258
260{
261#ifdef debug
262 static const G4double mNeut= G4QPDGCode(2112).GetMass();
263#endif
264 static const G4LorentzVector vacuum4M(0.,0.,0.,0.);
265 //-------------------------------------------------------------------------------------
266 const G4DynamicParticle* projHadron = track.GetDynamicParticle();
267 const G4ParticleDefinition* particle=projHadron->GetDefinition();
268#ifdef debug
269 G4cout<<"G4QNGamma::PostStepDoIt: Before the GetMeanFreePath is called"<<G4endl;
270#endif
272 GetMeanFreePath(track, 1., &cond);
273#ifdef debug
274 G4cout<<"G4QNGamma::PostStepDoIt: After the GetMeanFreePath is called"<<G4endl;
275#endif
276 G4LorentzVector proj4M=projHadron->Get4Momentum(); // 4-momentum of the projectile (IU?)
277 G4double momentum = projHadron->GetTotalMomentum(); // 3-momentum of the Particle
278 G4double Momentum=proj4M.rho();
279 if(std::fabs(Momentum-momentum)>.001)
280 G4cerr<<"*G4QNGamma::PostStepDoIt: P="<<Momentum<<"#"<<momentum<<G4endl;
281#ifdef debug
282 G4double mp=proj4M.m(); // @@ must be just the neutron mass
283 if(std::fabs(mp-mNeut)>.001)G4cerr<<"*G4QNGamma::PostStDoIt: M="<<mp<<"#"<<mNeut<<G4endl;
284 G4cout<<"->G4QNGam::PostStDoIt:*called*,4M="<<proj4M<<",P="<<Momentum<<",m="<<mp<<G4endl;
285#endif
286 // The same cut function can be used as in MeanFreePath (500)
287 if (!IsApplicable(*particle) || Momentum > 500.) // Check applicability (@@ IU?)
288 {
289 G4cerr<<"G4QNGamma::PostStepDoIt: Only neutrons with P="<<Momentum<<" < 500"<<G4endl;
290 return 0;
291 }
292 const G4Material* material = track.GetMaterial(); // Get the current material
293 G4int Z=0;
294 const G4ElementVector* theElementVector = material->GetElementVector();
295 G4int nE=material->GetNumberOfElements();
296#ifdef debug
297 G4cout<<"G4QNGamma::PostStepDoIt: "<<nE<<" elements in the material."<<G4endl;
298#endif
299 G4int EPIM=ElProbInMat.size();
300#ifdef debug
301 G4cout<<"G4QNGam::PostStDoIt: m="<<EPIM<<",n="<<nE<<",T="<<ElProbInMat[EPIM-1]<<G4endl;
302#endif
303 G4int i=0;
304 if(EPIM>1)
305 {
306 G4double rnd = ElProbInMat[EPIM-1]*G4UniformRand();
307 for(i=0; i<nE; ++i)
308 {
309#ifdef debug
310 G4cout<<"G4QNGamma::PostStepDoIt:E["<<i<<"]="<<ElProbInMat[i]<<",r="<<rnd<<G4endl;
311#endif
312 if (rnd<ElProbInMat[i]) break;
313 }
314 if(i>=nE) i=nE-1; // Top limit for the Element
315 }
316 G4Element* pElement=(*theElementVector)[i];
317 Z=static_cast<G4int>(pElement->GetZ());
318#ifdef debug
319 G4cout<<"G4QNGamma::PostStepDoIt: i="<<i<<", Z(element)="<<Z<<G4endl;
320#endif
321 if(Z <= 0)
322 {
323 G4cerr<<"---Warning---G4QNGamma::PostStepDoIt: Element with Z="<<Z<<G4endl;
324 if(Z<0) return 0;
325 }
326 std::vector<G4double>* SPI = IsoProbInEl[i];// Vector of summedProbabilities for isotopes
327 std::vector<G4int>* IsN = ElIsoN[i]; // Vector of "#of neutrons" in the isotope El[i]
328 G4int nofIsot=SPI->size(); // #of isotopes in the element i
329#ifdef debug
330 G4cout<<"G4QNGam::PosStDoIt:n="<<nofIsot<<",T="<<(*SPI)[nofIsot-1]<<G4endl;
331#endif
332 G4int j=0;
333 if(nofIsot>1)
334 {
335 G4double rndI=(*SPI)[nofIsot-1]*G4UniformRand(); // Randomize the isotop of the Element
336 for(j=0; j<nofIsot; ++j)
337 {
338#ifdef debug
339 G4cout<<"G4QNGamma::PostStepDoIt: SP["<<j<<"]="<<(*SPI)[j]<<", r="<<rndI<<G4endl;
340#endif
341 if(rndI < (*SPI)[j]) break;
342 }
343 if(j>=nofIsot) j=nofIsot-1; // Top limit for the isotope
344 }
345 G4int N =(*IsN)[j]; // Randomized number of neutrons
346#ifdef debug
347 G4cout<<"G4QNGamma::PostStepDoIt: Z="<<Z<<", j="<<i<<", N(isotope)="<<N<<G4endl;
348#endif
349 G4double kinEnergy= projHadron->GetKineticEnergy();
350 G4ParticleMomentum dir = projHadron->GetMomentumDirection();
351 //if() //DoNothing Action insead of the reaction
352 //{
353 // aParticleChange.ProposeEnergy(kinEnergy);
354 // aParticleChange.ProposeLocalEnergyDeposit(0.);
355 // aParticleChange.ProposeMomentumDirection(dir);
356 // aParticleChange.ProposeTrackStatus(fAlive);
357 // return G4VDiscreteProcess::PostStepDoIt(track,step);
358 //}
359 if(N<0)
360 {
361 G4cerr<<"-Warning-G4QNGamma::PostStepDoIt: Isotope with Z="<<Z<<", 0>N="<<N<<G4endl;
362 return 0;
363 }
364 nOfNeutrons=N; // Remember it for the energy-momentum check
365#ifdef debug
366 G4cout<<"G4QNGamma::PostStepDoIt: N="<<N<<" for element with Z="<<Z<<G4endl;
367#endif
369 G4double weight = track.GetWeight();
370#ifdef debug
371 G4cout<<"G4QNGamma::PostStepDoIt: weight="<<weight<<G4endl;
372#endif
373 G4double localtime = track.GetGlobalTime();
374#ifdef debug
375 G4cout<<"G4QNGamma::PostStepDoIt: localtime="<<localtime<<G4endl;
376#endif
378 G4TouchableHandle trTouchable = track.GetTouchableHandle();
379#ifdef debug
380 G4cout<<"G4QNGamma::PostStepDoIt: position="<<position<<G4endl;
381#endif
382 G4int targPDG = 90000000 + Z*1000 + N; // PDG Code of the target nucleus
383 G4QPDGCode targQPDG(targPDG);
384 G4double tM = targQPDG.GetMass(); // Target mass
385#ifdef debug
386 G4cout<<"G4QNGamma::PostStepDoIt: n + targPDG="<<targPDG<<G4endl;
387#endif
388 // @@ All above is universal for all processes except for the additional condition (500)
389 G4LorentzVector tot4M=G4LorentzVector(0.,0.,0.,tM)+proj4M;
390 G4double totM2=tot4M.m2();
391 G4int tZ=Z;
392 G4int tN=N+1;
393 G4int resPDG = targPDG + 1; // Final ++N nucleus PDG
394 G4double rM=G4QPDGCode(resPDG).GetMass(); // Mass of the final nucleus
395 G4LorentzVector r4M=G4LorentzVector(0.,0.,0.,rM); // 4mom of the final nucleus
396 G4LorentzVector g4M=G4LorentzVector(0.,0.,0.,0.); // 4mom of the gamma
397#ifdef debug
398 G4cout<<"G4QNGamma::PostStepDoIt: tM="<<tM << ", rM="<<rM << ", Q="<<tM+mNeut-rM<<G4endl;
399#endif
400 if(!G4QHadron(tot4M).DecayIn2(r4M, g4M)) // The compoun decay din't succeed
401 {
402 //G4cerr<<"G4QNGamma::PostStDoIt: tM="<<std::sqrt(totM2)<<" < rM="<<rM<<G4endl;
403 //G4Exception("G4QNGamma::PostStepDoIt()", "HAD_CHPS_0001",
404 // FatalException, "Hadronize quasmon: Can't decay TotNuc->ResNuc+gam");
405 G4cerr<<"-Warning-G4QNGamma::PostStDoIt: tM="<<std::sqrt(totM2)<<" < rM="<<rM<<G4endl;
410 return G4VDiscreteProcess::PostStepDoIt(track,step);
411 }
412#ifdef debug
413 G4cout<<"G4QNGam::PStDoIt: RA="<<r4M.rho()<<r4M<<", Gamma="<<g4M.rho()<<g4M<<G4endl;
414#endif
415 EnMomConservation = tot4M - r4M - g4M; // EM conservation check 4mom
416 aParticleChange.ProposeEnergy(0.); // A standard procedure of killing proj.
417 aParticleChange.ProposeTrackStatus(fStopAndKill);// projectile neutron is killed
418 aParticleChange.SetNumberOfSecondaries(2); // Fix a#of secondaries
419 // Fill the gamma
420 G4ParticleDefinition* theDefinition = G4Gamma::Gamma();
421 G4DynamicParticle* theGam = new G4DynamicParticle(theDefinition, g4M);
422 G4Track* capGamma = new G4Track(theGam, localtime, position );
423 capGamma->SetWeight(weight);
424 capGamma->SetTouchableHandle(trTouchable);
426 // ----------------------------------------------------
427 // Fill the final nucleus
428 G4int tA=tZ+tN;
429 if (resPDG==90000001) theDefinition = G4Neutron::Neutron();
430 else if(resPDG==90001000) theDefinition = G4Proton::Proton();
431 else theDefinition = G4ParticleTable::GetParticleTable()->FindIon(tZ, tA, 0, tZ);
432 G4DynamicParticle* theReN = new G4DynamicParticle(theDefinition, r4M);
433 G4Track* scatReN = new G4Track(theReN, localtime, position );
434 scatReN->SetWeight(weight);
435 scatReN->SetTouchableHandle(trTouchable);
437
438 return G4VDiscreteProcess::PostStepDoIt(track, step);
439}
std::vector< G4Element * > G4ElementVector
G4ForceCondition
@ NotForced
#define G4HadronicDeprecate(name)
std::vector< G4Isotope * > G4IsotopeVector
CLHEP::HepLorentzVector G4LorentzVector
@ fHadronic
@ fAlive
@ fStopAndKill
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:53
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * GetDefinition() const
G4LorentzVector Get4Momentum() const
G4double GetKineticEnergy() const
G4double GetTotalMomentum() const
G4double * GetRelativeAbundanceVector() const
Definition: G4Element.hh:166
G4double GetZ() const
Definition: G4Element.hh:131
const G4Isotope * GetIsotope(G4int iso) const
Definition: G4Element.hh:169
size_t GetIndex() const
Definition: G4Element.hh:182
G4IsotopeVector * GetIsotopeVector() const
Definition: G4Element.hh:162
static G4Gamma * Gamma()
Definition: G4Gamma.cc:86
G4int GetZ() const
Definition: G4Isotope.hh:91
G4int GetN() const
Definition: G4Isotope.hh:94
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:189
size_t GetNumberOfElements() const
Definition: G4Material.hh:185
const G4double * GetVecNbOfAtomsPerVolume() const
Definition: G4Material.hh:205
static G4Neutron * Neutron()
Definition: G4Neutron.cc:104
void AddSecondary(G4Track *aSecondary)
void ProposeEnergy(G4double finalEnergy)
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
virtual void Initialize(const G4Track &)
G4ParticleDefinition * FindIon(G4int atomicNumber, G4int atomicMass, G4double excitationEnergy)
static G4ParticleTable * GetParticleTable()
static G4Proton * Proton()
Definition: G4Proton.cc:93
std::vector< std::pair< G4int, G4double > * > * GetCSVector(G4int Z, G4int index=0)
Definition: G4QIsotope.cc:1737
G4bool IsDefined(G4int Z, G4int Ind)
Definition: G4QIsotope.cc:1660
G4double GetMeanCrossSection(G4int Z, G4int index=0)
Definition: G4QIsotope.cc:1842
static G4QIsotope * Get()
Definition: G4QIsotope.cc:720
G4int InitElement(G4int Z, G4int index, std::vector< std::pair< G4int, G4double > * > *abund)
Definition: G4QIsotope.cc:1557
G4bool IsApplicable(const G4ParticleDefinition &particle)
Definition: G4QNGamma.cc:250
G4double GetMeanFreePath(const G4Track &aTrack, G4double previousStepSize, G4ForceCondition *condition)
Definition: G4QNGamma.cc:102
~G4QNGamma()
Definition: G4QNGamma.cc:67
G4int GetNumberOfNeutronsInTarget()
Definition: G4QNGamma.cc:93
G4QNGamma(const G4String &processName="CHIPS_N-Gamma")
Definition: G4QNGamma.cc:53
G4VParticleChange * PostStepDoIt(const G4Track &aTrack, const G4Step &aStep)
Definition: G4QNGamma.cc:259
G4LorentzVector GetEnegryMomentumConservation()
Definition: G4QNGamma.cc:88
G4double GetRatio(G4double pIU, G4int tgZ, G4int tgN)
static G4QNeutronCaptureRatio * GetPointer()
G4double GetMass()
Definition: G4QPDGCode.cc:693
Definition: G4Step.hh:78
G4double GetWeight() const
void SetWeight(G4double aValue)
const G4ThreeVector & GetPosition() const
void SetTouchableHandle(const G4TouchableHandle &apValue)
G4double GetGlobalTime() const
G4Material * GetMaterial() const
const G4DynamicParticle * GetDynamicParticle() const
const G4TouchableHandle & GetTouchableHandle() const
virtual G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)
void ProposeTrackStatus(G4TrackStatus status)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
void SetNumberOfSecondaries(G4int totSecondaries)
G4ParticleChange aParticleChange
Definition: G4VProcess.hh:289
G4int verboseLevel
Definition: G4VProcess.hh:368
const G4String & GetProcessName() const
Definition: G4VProcess.hh:379
virtual G4double GetCrossSection(G4bool, G4double, G4int, G4int, G4int pPDG=0)
#define DBL_MAX
Definition: templates.hh:83