Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4VDecayChannel Class Referenceabstract

#include <G4VDecayChannel.hh>

+ Inheritance diagram for G4VDecayChannel:

Public Member Functions

 G4VDecayChannel (const G4String &aName, G4int Verbose=1)
 
 G4VDecayChannel (const G4String &aName, const G4String &theParentName, G4double theBR, G4int theNumberOfDaughters, const G4String &theDaughterName1, const G4String &theDaughterName2="", const G4String &theDaughterName3="", const G4String &theDaughterName4="", const G4String &theDaughterName5="")
 
virtual ~G4VDecayChannel ()
 
G4bool operator== (const G4VDecayChannel &r) const
 
G4bool operator!= (const G4VDecayChannel &r) const
 
G4bool operator< (const G4VDecayChannel &right) const
 
virtual G4DecayProductsDecayIt (G4double parentMass=-1.0)=0
 
const G4StringGetKinematicsName () const
 
G4double GetBR () const
 
G4int GetNumberOfDaughters () const
 
G4ParticleDefinitionGetParent ()
 
G4ParticleDefinitionGetDaughter (G4int anIndex)
 
G4int GetAngularMomentum ()
 
const G4StringGetParentName () const
 
const G4StringGetDaughterName (G4int anIndex) const
 
G4double GetParentMass () const
 
G4double GetDaughterMass (G4int anIndex) const
 
void SetParent (const G4ParticleDefinition *particle_type)
 
void SetParent (const G4String &particle_name)
 
void SetBR (G4double value)
 
void SetNumberOfDaughters (G4int value)
 
void SetDaughter (G4int anIndex, const G4ParticleDefinition *particle_type)
 
void SetDaughter (G4int anIndex, const G4String &particle_name)
 
void SetVerboseLevel (G4int value)
 
G4int GetVerboseLevel () const
 
void DumpInfo ()
 
G4double GetRangeMass () const
 
void SetRangeMass (G4double val)
 
virtual G4bool IsOKWithParentMass (G4double parentMass)
 
void SetPolarization (const G4ThreeVector &)
 
const G4ThreeVectorGetPolarization () const
 

Protected Member Functions

 G4VDecayChannel ()
 
 G4VDecayChannel (const G4VDecayChannel &)
 
G4VDecayChanneloperator= (const G4VDecayChannel &)
 
void ClearDaughtersName ()
 
void CheckAndFillDaughters ()
 
void CheckAndFillParent ()
 
G4double DynamicalMass (G4double massPDG, G4double width, G4double maxDev=1.0) const
 

Protected Attributes

G4String kinematics_name = ""
 
G4double rbranch = 0.0
 
G4Stringparent_name = nullptr
 
G4String ** daughters_name = nullptr
 
G4double rangeMass = 2.5
 
G4ThreeVector parent_polarization
 
G4ParticleTableparticletable = nullptr
 
G4ParticleDefinitionG4MT_parent = nullptr
 
G4ParticleDefinition ** G4MT_daughters = nullptr
 
G4double G4MT_parent_mass = 0.0
 
G4doubleG4MT_daughters_mass = nullptr
 
G4doubleG4MT_daughters_width = nullptr
 
G4Mutex daughtersMutex
 
G4Mutex parentMutex
 
G4int numberOfDaughters = 0
 
G4int verboseLevel = 1
 

Static Protected Attributes

static const G4String noName = " "
 

Detailed Description

Definition at line 49 of file G4VDecayChannel.hh.

Constructor & Destructor Documentation

◆ G4VDecayChannel() [1/4]

G4VDecayChannel::G4VDecayChannel ( const G4String & aName,
G4int Verbose = 1 )

Definition at line 49 of file G4VDecayChannel.cc.

50 : kinematics_name(aName), verboseLevel(verbose)
51{
52 // set pointer to G4ParticleTable (static and singleton object)
54}
static G4ParticleTable * GetParticleTable()
G4ParticleTable * particletable

◆ G4VDecayChannel() [2/4]

G4VDecayChannel::G4VDecayChannel ( const G4String & aName,
const G4String & theParentName,
G4double theBR,
G4int theNumberOfDaughters,
const G4String & theDaughterName1,
const G4String & theDaughterName2 = "",
const G4String & theDaughterName3 = "",
const G4String & theDaughterName4 = "",
const G4String & theDaughterName5 = "" )

Definition at line 56 of file G4VDecayChannel.cc.

61 : kinematics_name(aName), rbranch(theBR), numberOfDaughters(theNumberOfDaughters)
62{
63 // set pointer to G4ParticleTable (static and singleton object)
65
66 // parent name
67 parent_name = new G4String(theParentName);
68
69 // cleate array
71 for (G4int index = 0; index < numberOfDaughters; ++index) {
72 daughters_name[index] = nullptr;
73 }
74
75 // daughters' name
76 if (numberOfDaughters > 0) daughters_name[0] = new G4String(theDaughterName1);
77 if (numberOfDaughters > 1) daughters_name[1] = new G4String(theDaughterName2);
78 if (numberOfDaughters > 2) daughters_name[2] = new G4String(theDaughterName3);
79 if (numberOfDaughters > 3) daughters_name[3] = new G4String(theDaughterName4);
80 if (numberOfDaughters > 4) daughters_name[4] = new G4String(theDaughterName5);
81
82 if (rbranch < 0.)
83 rbranch = 0.0;
84 else if (rbranch > 1.0)
85 rbranch = 1.0;
86}
int G4int
Definition G4Types.hh:85
G4String ** daughters_name

◆ ~G4VDecayChannel()

G4VDecayChannel::~G4VDecayChannel ( )
virtual

Definition at line 154 of file G4VDecayChannel.cc.

155{
157 delete parent_name;
158 parent_name = nullptr;
159 delete[] G4MT_daughters_mass;
160 G4MT_daughters_mass = nullptr;
161 delete[] G4MT_daughters_width;
162 G4MT_daughters_width = nullptr;
165}
#define G4MUTEXDESTROY(mutex)
G4double * G4MT_daughters_mass
G4double * G4MT_daughters_width

◆ G4VDecayChannel() [3/4]

G4VDecayChannel::G4VDecayChannel ( )
protected

Definition at line 43 of file G4VDecayChannel.cc.

44{
45 // set pointer to G4ParticleTable (static and singleton object)
47}

◆ G4VDecayChannel() [4/4]

G4VDecayChannel::G4VDecayChannel ( const G4VDecayChannel & right)
protected

Definition at line 88 of file G4VDecayChannel.cc.

89{
92 rbranch = right.rbranch;
93 rangeMass = right.rangeMass;
94
95 // copy parent name
96 parent_name = new G4String(*right.parent_name);
97
98 // create array
100
101 daughters_name = nullptr;
102 if (numberOfDaughters > 0) {
104 // copy daughters name
105 for (G4int index = 0; index < numberOfDaughters; ++index) {
106 daughters_name[index] = new G4String(*right.daughters_name[index]);
107 }
108 }
109
110 // particle table
112
114
117}
#define G4MUTEXINIT(mutex)
G4ThreeVector parent_polarization

Member Function Documentation

◆ CheckAndFillDaughters()

◆ CheckAndFillParent()

◆ ClearDaughtersName()

void G4VDecayChannel::ClearDaughtersName ( )
protected

Definition at line 167 of file G4VDecayChannel.cc.

168{
170 if (daughters_name != nullptr) {
171 if (numberOfDaughters > 0) {
172#ifdef G4VERBOSE
173 if (verboseLevel > 1) {
174 G4cout << "G4VDecayChannel::ClearDaughtersName() "
175 << " for " << *parent_name << G4endl;
176 }
177#endif
178 for (G4int index = 0; index < numberOfDaughters; ++index) {
179 delete daughters_name[index];
180 }
181 }
182 delete[] daughters_name;
183 daughters_name = nullptr;
184 }
185
186 delete[] G4MT_daughters;
187 delete[] G4MT_daughters_mass;
188 delete[] G4MT_daughters_width;
189 G4MT_daughters_width = nullptr;
190 G4MT_daughters = nullptr;
191 G4MT_daughters_mass = nullptr;
192
194}
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout

Referenced by G4DalitzDecayChannel::operator=(), G4KL3DecayChannel::operator=(), G4MuonDecayChannel::operator=(), G4MuonDecayChannelWithSpin::operator=(), G4MuonRadiativeDecayChannelWithSpin::operator=(), G4NeutronBetaDecayChannel::operator=(), G4PionRadiativeDecayChannel::operator=(), G4TauLeptonicDecayChannel::operator=(), operator=(), SetNumberOfDaughters(), and ~G4VDecayChannel().

◆ DecayIt()

◆ DumpInfo()

void G4VDecayChannel::DumpInfo ( )

Definition at line 484 of file G4VDecayChannel.cc.

485{
486 G4cout << " BR: " << rbranch << " [" << kinematics_name << "]";
487 G4cout << " : ";
488 for (G4int index = 0; index < numberOfDaughters; ++index) {
489 if (daughters_name[index] != nullptr) {
490 G4cout << " " << *(daughters_name[index]);
491 }
492 else {
493 G4cout << " not defined ";
494 }
495 }
496 G4cout << G4endl;
497}

Referenced by G4GeneralPhaseSpaceDecay::DecayIt(), G4PhaseSpaceDecayChannel::DecayIt(), and G4KL3DecayChannel::G4KL3DecayChannel().

◆ DynamicalMass()

G4double G4VDecayChannel::DynamicalMass ( G4double massPDG,
G4double width,
G4double maxDev = 1.0 ) const
protected

Definition at line 504 of file G4VDecayChannel.cc.

505{
506 if (width <= 0.0) return massPDG;
507 if (maxDev > rangeMass) maxDev = rangeMass;
508 if (maxDev <= -1. * rangeMass) return massPDG; // cannot calculate
509
510 G4double x = G4UniformRand() * (maxDev + rangeMass) - rangeMass;
512 const std::size_t MAX_LOOP = 10000;
513 for (std::size_t loop_counter = 0; loop_counter < MAX_LOOP; ++loop_counter) {
514 if (y * (width * width * x * x + massPDG * massPDG * width * width)
515 <= massPDG * massPDG * width * width)
516 break;
517 x = G4UniformRand() * (maxDev + rangeMass) - rangeMass;
518 y = G4UniformRand();
519 }
520 G4double mass = massPDG + x * width;
521 return mass;
522}
double G4double
Definition G4Types.hh:83
#define G4UniformRand()
Definition Randomize.hh:52

◆ GetAngularMomentum()

G4int G4VDecayChannel::GetAngularMomentum ( )

Definition at line 428 of file G4VDecayChannel.cc.

429{
430 // determine angular momentum
431
432 // fill pointers to daughter particles if not yet set
434
435 const G4int PiSpin = G4MT_parent->GetPDGiSpin();
436 const G4int PParity = G4MT_parent->GetPDGiParity();
437 if (2 == numberOfDaughters) // up to now we can only handle two particle decays
438 {
439 const G4int D1iSpin = G4MT_daughters[0]->GetPDGiSpin();
440 const G4int D1Parity = G4MT_daughters[0]->GetPDGiParity();
441 const G4int D2iSpin = G4MT_daughters[1]->GetPDGiSpin();
442 const G4int D2Parity = G4MT_daughters[1]->GetPDGiParity();
443 const G4int MiniSpin = std::abs(D1iSpin - D2iSpin);
444 const G4int MaxiSpin = D1iSpin + D2iSpin;
445 const G4int lMax = (PiSpin + D1iSpin + D2iSpin) / 2; // l is always int
446 G4int lMin;
447#ifdef G4VERBOSE
448 if (verboseLevel > 1) {
449 G4cout << "iSpin: " << PiSpin << " -> " << D1iSpin << " + " << D2iSpin << G4endl;
450 G4cout << "2*jmin, 2*jmax, lmax " << MiniSpin << " " << MaxiSpin << " " << lMax << G4endl;
451 }
452#endif
453 for (G4int j = MiniSpin; j <= MaxiSpin; j += 2) // loop over all possible
454 { // spin couplings
455 lMin = std::abs(PiSpin - j) / 2;
456#ifdef G4VERBOSE
457 if (verboseLevel > 1) G4cout << "-> checking 2*j=" << j << G4endl;
458#endif
459 for (G4int l = lMin; l <= lMax; ++l) {
460#ifdef G4VERBOSE
461 if (verboseLevel > 1) G4cout << " checking l=" << l << G4endl;
462#endif
463 if (l % 2 == 0) {
464 if (PParity == D1Parity * D2Parity) // check parity for this l
465 return l;
466 }
467 else {
468 if (PParity == -1 * D1Parity * D2Parity) // check parity for this l
469 return l;
470 }
471 }
472 }
473 }
474 else {
475 G4Exception("G4VDecayChannel::GetAngularMomentum()", "PART111", JustWarning,
476 "Sorry, can't handle 3 particle decays (up to now)");
477 return 0;
478 }
479 G4Exception("G4VDecayChannel::GetAngularMomentum()", "PART111", JustWarning,
480 "Can't find angular momentum for this decay");
481 return 0;
482}
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)

◆ GetBR()

◆ GetDaughter()

G4ParticleDefinition * G4VDecayChannel::GetDaughter ( G4int anIndex)
inline

Definition at line 199 of file G4VDecayChannel.hh.

200{
201 // pointers to daughter particles are filled, if they are not set yet
203
204 // get the pointer to a daughter particle
205 if ((anIndex >= 0) && (anIndex < numberOfDaughters)) {
206 return G4MT_daughters[anIndex];
207 }
208
209 if (verboseLevel > 0)
210 G4cout << "G4VDecayChannel::GetDaughter index out of range " << anIndex << G4endl;
211 return nullptr;
212}

Referenced by G4IonTable::CreateIon(), G4KineticTrack::Decay(), G4KineticTrack::G4KineticTrack(), G4TextPPReporter::GeneratePropertyTable(), G4NuclearDecay::GetDaughterNucleus(), G4MTRunManagerKernel::SetUpDecayChannels(), and G4TaskRunManagerKernel::SetUpDecayChannels().

◆ GetDaughterMass()

G4double G4VDecayChannel::GetDaughterMass ( G4int anIndex) const
inline

Definition at line 227 of file G4VDecayChannel.hh.

228{
229 if ((anIndex >= 0) && (anIndex < numberOfDaughters)) {
230 return G4MT_daughters_mass[anIndex];
231 }
232
233 if (verboseLevel > 0) {
234 G4cout << "G4VDecayChannel::GetDaughterMass ";
235 G4cout << "index out of range " << anIndex << G4endl;
236 }
237 return 0.0;
238}

◆ GetDaughterName()

const G4String & G4VDecayChannel::GetDaughterName ( G4int anIndex) const
inline

Definition at line 214 of file G4VDecayChannel.hh.

215{
216 if ((anIndex >= 0) && (anIndex < numberOfDaughters)) {
217 return *daughters_name[anIndex];
218 }
219
220 if (verboseLevel > 0) {
221 G4cout << "G4VDecayChannel::GetDaughterName ";
222 G4cout << "index out of range " << anIndex << G4endl;
223 }
224 return GetNoName();
225}

Referenced by G4KineticTrack::Decay(), G4Decay::DecayIt(), G4AlphaDecay::DumpNuclearInfo(), G4ECDecay::DumpNuclearInfo(), G4NeutronDecay::DumpNuclearInfo(), G4ProtonDecay::DumpNuclearInfo(), and G4TritonDecay::DumpNuclearInfo().

◆ GetKinematicsName()

const G4String & G4VDecayChannel::GetKinematicsName ( ) const
inline

Definition at line 270 of file G4VDecayChannel.hh.

271{
272 return kinematics_name;
273}

Referenced by G4TextPPReporter::GeneratePropertyTable().

◆ GetNumberOfDaughters()

◆ GetParent()

G4ParticleDefinition * G4VDecayChannel::GetParent ( )
inline

Definition at line 240 of file G4VDecayChannel.hh.

241{
242 // the pointer to the parent particle is filled, if it is not set yet
244 // get the pointer to the parent particle
245 return G4MT_parent;
246}

Referenced by G4DecayTable::Insert().

◆ GetParentMass()

G4double G4VDecayChannel::GetParentMass ( ) const
inline

Definition at line 253 of file G4VDecayChannel.hh.

254{
255 return G4MT_parent_mass;
256}

◆ GetParentName()

◆ GetPolarization()

const G4ThreeVector & G4VDecayChannel::GetPolarization ( ) const
inline

Definition at line 305 of file G4VDecayChannel.hh.

306{
307 return parent_polarization;
308}

◆ GetRangeMass()

G4double G4VDecayChannel::GetRangeMass ( ) const
inline

Definition at line 290 of file G4VDecayChannel.hh.

291{
292 return rangeMass;
293}

◆ GetVerboseLevel()

◆ IsOKWithParentMass()

G4bool G4VDecayChannel::IsOKWithParentMass ( G4double parentMass)
virtual

Reimplemented in G4NuclearDecay, and G4PhaseSpaceDecayChannel.

Definition at line 524 of file G4VDecayChannel.cc.

525{
526 G4double sumOfDaughterMassMin = 0.0;
529 // skip one body decay
530 if (numberOfDaughters == 1) return true;
531
532 for (G4int index = 0; index < numberOfDaughters; ++index) {
533 sumOfDaughterMassMin += G4MT_daughters_mass[index] - rangeMass * G4MT_daughters_width[index];
534 }
535 return (parentMass >= sumOfDaughterMassMin);
536}

Referenced by G4Decay::DecayIt(), and G4PhaseSpaceDecayChannel::IsOKWithParentMass().

◆ operator!=()

G4bool G4VDecayChannel::operator!= ( const G4VDecayChannel & r) const
inline

Definition at line 64 of file G4VDecayChannel.hh.

64{ return (this != &r); }

◆ operator<()

G4bool G4VDecayChannel::operator< ( const G4VDecayChannel & right) const
inline

Definition at line 194 of file G4VDecayChannel.hh.

195{
196 return (this->rbranch < right.rbranch);
197}

◆ operator=()

G4VDecayChannel & G4VDecayChannel::operator= ( const G4VDecayChannel & right)
protected

Definition at line 119 of file G4VDecayChannel.cc.

120{
121 if (this != &right) {
124 rbranch = right.rbranch;
125 rangeMass = right.rangeMass;
127 // copy parent name
128 delete parent_name;
129 parent_name = new G4String(*right.parent_name);
130
131 // clear daughters_name array
133
134 // recreate array
136 if (numberOfDaughters > 0) {
138 // copy daughters name
139 for (G4int index = 0; index < numberOfDaughters; ++index) {
140 daughters_name[index] = new G4String(*right.daughters_name[index]);
141 }
142 }
143 }
144
145 // particle table
147
150
151 return *this;
152}

◆ operator==()

G4bool G4VDecayChannel::operator== ( const G4VDecayChannel & r) const
inline

Definition at line 63 of file G4VDecayChannel.hh.

63{ return (this == &r); }

◆ SetBR()

◆ SetDaughter() [1/2]

◆ SetDaughter() [2/2]

void G4VDecayChannel::SetDaughter ( G4int anIndex,
const G4String & particle_name )

Definition at line 210 of file G4VDecayChannel.cc.

211{
212 // check numberOfDaughters is positive
213 if (numberOfDaughters <= 0) {
214#ifdef G4VERBOSE
215 if (verboseLevel > 0) {
216 G4cout << "G4VDecayChannel::SetDaughter() - "
217 << "Number of daughters is not defined" << G4endl;
218 }
219#endif
220 return;
221 }
222
223 // An analysis of this code, shows that this method is called
224 // only in the constructor of derived classes.
225 // The general idea of this method is probably to support
226 // the possibility to re-define daughters on the fly, however
227 // this design is extremely problematic for MT mode, we thus
228 // require (as practically happens) that the method is called only
229 // at construction, i.e. when G4MT_daughters == 0
230 // moreover this method can be called only after SetNumberOfDaugthers()
231 // has been called (see previous if), in such a case daughters_name != nullptr
232 //
233 if (daughters_name == nullptr) {
234 G4Exception("G4VDecayChannel::SetDaughter()", "PART112", FatalException,
235 "Trying to add a daughter without specifying number of secondaries!");
236 return;
237 }
238 if (G4MT_daughters != nullptr) {
239 G4Exception("G4VDecayChannel::SetDaughter()", "PART111", FatalException,
240 "Trying to modify a daughter of a decay channel, \
241 but decay channel already has daughters.");
242 return;
243 }
244
245 // check an index
246 if ((anIndex < 0) || (anIndex >= numberOfDaughters)) {
247#ifdef G4VERBOSE
248 if (verboseLevel > 0) {
249 G4cout << "G4VDecayChannel::SetDaughter() - "
250 << "index out of range " << anIndex << G4endl;
251 }
252#endif
253 }
254 else {
255 // fill the name
256 daughters_name[anIndex] = new G4String(particle_name);
257#ifdef G4VERBOSE
258 if (verboseLevel > 1) {
259 G4cout << "G4VDecayChannel::SetDaughter[" << anIndex << "] :";
260 G4cout << daughters_name[anIndex] << ":" << *daughters_name[anIndex] << G4endl;
261 }
262#endif
263 }
264}
@ FatalException

◆ SetNumberOfDaughters()

◆ SetParent() [1/2]

◆ SetParent() [2/2]

void G4VDecayChannel::SetParent ( const G4String & particle_name)
inline

Definition at line 258 of file G4VDecayChannel.hh.

259{
260 delete parent_name;
261 parent_name = new G4String(particle_name);
262 G4MT_parent = nullptr;
263}

◆ SetPolarization()

void G4VDecayChannel::SetPolarization ( const G4ThreeVector & polar)
inline

Definition at line 300 of file G4VDecayChannel.hh.

301{
302 parent_polarization = polar;
303}

Referenced by G4DecayWithSpin::AtRestDoIt(), and G4DecayWithSpin::PostStepDoIt().

◆ SetRangeMass()

void G4VDecayChannel::SetRangeMass ( G4double val)
inline

Definition at line 295 of file G4VDecayChannel.hh.

296{
297 if (val >= 0.) rangeMass = val;
298}

◆ SetVerboseLevel()

void G4VDecayChannel::SetVerboseLevel ( G4int value)
inline

Definition at line 280 of file G4VDecayChannel.hh.

281{
282 verboseLevel = value;
283}

Referenced by G4Decay::DecayIt().

Member Data Documentation

◆ daughters_name

◆ daughtersMutex

G4Mutex G4VDecayChannel::daughtersMutex
protected

◆ G4MT_daughters

◆ G4MT_daughters_mass

G4double* G4VDecayChannel::G4MT_daughters_mass = nullptr
protected

◆ G4MT_daughters_width

G4double* G4VDecayChannel::G4MT_daughters_width = nullptr
protected

Definition at line 167 of file G4VDecayChannel.hh.

Referenced by ClearDaughtersName(), IsOKWithParentMass(), and ~G4VDecayChannel().

◆ G4MT_parent

◆ G4MT_parent_mass

G4double G4VDecayChannel::G4MT_parent_mass = 0.0
protected

Definition at line 165 of file G4VDecayChannel.hh.

Referenced by G4PhaseSpaceDecayChannel::DecayIt(), and GetParentMass().

◆ kinematics_name

◆ noName

const G4String G4VDecayChannel::noName = " "
staticprotected

Definition at line 161 of file G4VDecayChannel.hh.

◆ numberOfDaughters

◆ parent_name

◆ parent_polarization

◆ parentMutex

G4Mutex G4VDecayChannel::parentMutex
protected

◆ particletable

G4ParticleTable* G4VDecayChannel::particletable = nullptr
protected

◆ rangeMass

G4double G4VDecayChannel::rangeMass = 2.5
protected

◆ rbranch

◆ verboseLevel


The documentation for this class was generated from the following files: