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
G4VDecayChannel.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//
27// $Id$
28//
29//
30// ------------------------------------------------------------
31// GEANT 4 class header file
32//
33// History: first implementation, based on object model of
34// 27 July 1996 H.Kurashige
35// 30 May 1997 H.Kurashige
36// 23 Mar. 2000 H.Weber : add GetAngularMomentum
37// ------------------------------------------------------------
38
40#include "G4SystemOfUnits.hh"
41#include "G4ParticleTable.hh"
42#include "G4DecayTable.hh"
43#include "G4DecayProducts.hh"
44#include "G4VDecayChannel.hh"
45
47
49 :kinematics_name(""),
50 rbranch(0.0),
51 numberOfDaughters(0),
52 parent_name(0), daughters_name(0),
53 particletable(0),
54 parent(0), daughters(0),
55 parent_mass(0.0), daughters_mass(0),
56 verboseLevel(1)
57{
58 // set pointer to G4ParticleTable (static and singleton object)
60}
61
62
64 :kinematics_name(aName),
65 rbranch(0.0),
66 numberOfDaughters(0),
67 parent_name(0), daughters_name(0),
68 particletable(0),
69 parent(0), daughters(0),
70 parent_mass(0.0), daughters_mass(0),
71 verboseLevel(Verbose)
72{
73 // set pointer to G4ParticleTable (static and singleton object)
75}
76
78 const G4String& theParentName,
79 G4double theBR,
80 G4int theNumberOfDaughters,
81 const G4String& theDaughterName1,
82 const G4String& theDaughterName2,
83 const G4String& theDaughterName3,
84 const G4String& theDaughterName4 )
85 :kinematics_name(aName),
86 rbranch(theBR),
87 numberOfDaughters(theNumberOfDaughters),
88 parent_name(0), daughters_name(0),
89 particletable(0),
90 parent(0), daughters(0),
91 parent_mass(0.0), daughters_mass(0),
92 verboseLevel(1)
93{
94 // set pointer to G4ParticleTable (static and singleton object)
96
97 // parent name
98 parent_name = new G4String(theParentName);
99
100 // cleate array
102 for (G4int index=0;index<numberOfDaughters;index++) daughters_name[index]=0;
103
104 // daughters' name
105 if (numberOfDaughters>0) daughters_name[0] = new G4String(theDaughterName1);
106 if (numberOfDaughters>1) daughters_name[1] = new G4String(theDaughterName2);
107 if (numberOfDaughters>2) daughters_name[2] = new G4String(theDaughterName3);
108 if (numberOfDaughters>3) daughters_name[3] = new G4String(theDaughterName4);
109}
110
111
112
114{
117 rbranch = right.rbranch;
118
119 // copy parent name
120 parent_name = new G4String(*right.parent_name);
121 parent = 0;
122 parent_mass = 0.0;
123
124 //create array
126
128 if ( numberOfDaughters >0 ) {
130 //copy daughters name
131 for (G4int index=0; index < numberOfDaughters; index++)
132 {
133 daughters_name[index] = new G4String(*right.daughters_name[index]);
134 }
135 }
136
137 //
138 daughters_mass = 0;
139 daughters = 0;
140
141 // particle table
143}
144
146{
147 if (this != &right) {
150 rbranch = right.rbranch;
151
152 // copy parent name
153 parent_name = new G4String(*right.parent_name);
154
155 // clear daughters_name array
157
158 // recreate array
160 if ( numberOfDaughters >0 ) {
163 //copy daughters name
164 for (G4int index=0; index < numberOfDaughters; index++) {
165 daughters_name[index] = new G4String(*right.daughters_name[index]);
166 }
167 }
168 }
169
170 //
171 parent = 0;
172 daughters = 0;
173 parent_mass = 0.0;
174 daughters_mass = 0;
175
176 // particle table
178
179 return *this;
180}
181
182
184{
186 if (parent_name != 0) delete parent_name;
187 parent_name = 0;
188 if (daughters_mass != 0) delete [] daughters_mass;
190}
191
193{
194 if ( daughters_name != 0) {
195 if (numberOfDaughters>0) {
196#ifdef G4VERBOSE
197 if (verboseLevel>1) {
198 G4cerr << "G4VDecayChannel::ClearDaughtersName "
199 << " for " << *parent_name << G4endl;
200 }
201#endif
202 for (G4int index=0; index < numberOfDaughters; index++) {
203 if (daughters_name[index] != 0) delete daughters_name[index];
204 }
205 }
206 delete [] daughters_name;
207 daughters_name = 0;
208 }
209 //
210 if (daughters != 0) delete [] daughters;
211 if (daughters_mass != 0) delete [] daughters_mass;
212 daughters = 0;
213 daughters_mass = 0;
214
216}
217
219{
220 if (size >0) {
221 // remove old contents
223 // cleate array
224 daughters_name = new G4String*[size];
225 for (G4int index=0;index<size;index++) daughters_name[index]=0;
226 numberOfDaughters = size;
227 }
228}
229
231 const G4String &particle_name)
232{
233 // check numberOfDaughters is positive
234 if (numberOfDaughters<=0) {
235#ifdef G4VERBOSE
236 if (verboseLevel>0) {
237 G4cerr << "G4VDecayChannel::SetDaughter: "
238 << "Number of daughters is not defined" << G4endl;
239 }
240#endif
241 return;
242 }
243
244 // check existence of daughters_name array
245 if (daughters_name == 0) {
246 // cleate array
248 for (G4int index=0;index<numberOfDaughters;index++) {
249 daughters_name[index]=0;
250 }
251 }
252
253 // check an index
254 if ( (anIndex<0) || (anIndex>=numberOfDaughters) ) {
255#ifdef G4VERBOSE
256 if (verboseLevel>0) {
257 G4cerr << "G4VDecayChannel::SetDaughter"
258 << "index out of range " << anIndex << G4endl;
259 }
260#endif
261 } else {
262 // delete the old name if it exists
263 if (daughters_name[anIndex]!=0) delete daughters_name[anIndex];
264 // fill the name
265 daughters_name[anIndex] = new G4String(particle_name);
266 // refill the array of daughters[] if it exists
267 if (daughters != 0) FillDaughters();
268#ifdef G4VERBOSE
269 if (verboseLevel>1) {
270 G4cout << "G4VDecayChannel::SetDaughter[" << anIndex <<"] :";
271 G4cout << daughters_name[anIndex] << ":" << *daughters_name[anIndex]<<G4endl;
272 }
273#endif
274 }
275}
276
278{
279 if (parent_type != 0) SetDaughter(anIndex, parent_type->GetParticleName());
280}
281
283{
284 G4int index;
285
286#ifdef G4VERBOSE
287 if (verboseLevel>1) G4cout << "G4VDecayChannel::FillDaughters()" <<G4endl;
288#endif
289 if (daughters != 0) {
290 delete [] daughters;
291 daughters = 0;
292 }
293
294 // parent mass
295 if (parent == 0) FillParent();
296 G4double parentmass = parent->GetPDGMass();
297
298 //
299 G4double sumofdaughtermass = 0.0;
300 if ((numberOfDaughters <=0) || (daughters_name == 0) ){
301#ifdef G4VERBOSE
302 if (verboseLevel>0) {
303 G4cerr << "G4VDecayChannel::FillDaughters "
304 << "[ " << parent->GetParticleName() << " ]"
305 << "numberOfDaughters is not defined yet";
306 }
307#endif
308 daughters = 0;
309 G4Exception("G4VDecayChannel::FillDaughters",
310 "PART011", FatalException,
311 "Can not fill daughters: numberOfDaughters is not defined yet");
312 }
313
314 //create and set the array of pointers to daughter particles
316 if (daughters_mass != 0) delete [] daughters_mass;
318 // loop over all daughters
319 for (index=0; index < numberOfDaughters; index++) {
320 if (daughters_name[index] == 0) {
321 // daughter name is not defined
322#ifdef G4VERBOSE
323 if (verboseLevel>0) {
324 G4cerr << "G4VDecayChannel::FillDaughters "
325 << "[ " << parent->GetParticleName() << " ]"
326 << index << "-th daughter is not defined yet" << G4endl;
327 }
328#endif
329 daughters[index] = 0;
330 G4Exception("G4VDecayChannel::FillDaughters",
331 "PART011", FatalException,
332 "Can not fill daughters: name of a daughter is not defined yet");
333 }
334 //search daughter particles in the particle table
336 if (daughters[index] == 0) {
337 // can not find the daughter particle
338#ifdef G4VERBOSE
339 if (verboseLevel>0) {
340 G4cerr << "G4VDecayChannel::FillDaughters "
341 << "[ " << parent->GetParticleName() << " ]"
342 << index << ":" << *daughters_name[index]
343 << " is not defined !!" << G4endl;
344 G4cerr << " The BR of this decay mode is set to zero " << G4endl;
345 }
346#endif
347 SetBR(0.0);
348 return;
349 }
350#ifdef G4VERBOSE
351 if (verboseLevel>1) {
352 G4cout << index << ":" << *daughters_name[index];
353 G4cout << ":" << daughters[index] << G4endl;
354 }
355#endif
356 daughters_mass[index] = daughters[index]->GetPDGMass();
357 sumofdaughtermass += daughters[index]->GetPDGMass();
358 } // end loop over all daughters
359
360 // check sum of daghter mass
361 G4double widthMass = parent->GetPDGWidth();
362 if ( (parent->GetParticleType() != "nucleus") &&
363 (sumofdaughtermass > parentmass + 5*widthMass) ){
364 // !!! illegal mass !!!
365#ifdef G4VERBOSE
366 if (GetVerboseLevel()>0) {
367 G4cerr << "G4VDecayChannel::FillDaughters "
368 << "[ " << parent->GetParticleName() << " ]"
369 << " Energy/Momentum conserevation breaks " <<G4endl;
370 if (GetVerboseLevel()>1) {
371 G4cerr << " parent:" << *parent_name
372 << " mass:" << parentmass/GeV << "[GeV/c/c]" <<G4endl;
373 for (index=0; index < numberOfDaughters; index++){
374 G4cerr << " daughter " << index << ":" << *daughters_name[index]
375 << " mass:" << daughters[index]->GetPDGMass()/GeV
376 << "[GeV/c/c]" <<G4endl;
377 }
378 }
379 }
380#endif
381 }
382}
383
384
386{
387 if (parent_name == 0) {
388 // parent name is not defined
389#ifdef G4VERBOSE
390 if (verboseLevel>0) {
391 G4cerr << "G4VDecayChannel::FillParent "
392 << ": parent name is not defined !!" << G4endl;
393 }
394#endif
395 parent = 0;
396 G4Exception("G4VDecayChannel::FillParent()",
397 "PART012", FatalException,
398 "Can not fill parent: parent name is not defined yet");
399 }
400 // search parent particle in the particle table
402 if (parent == 0) {
403 // parent particle does not exist
404#ifdef G4VERBOSE
405 if (verboseLevel>0) {
406 G4cerr << "G4VDecayChannel::FillParent "
407 << *parent_name << " does not exist !!" << G4endl;
408 }
409#endif
410 G4Exception("G4VDecayChannel::FillParent()",
411 "PART012", FatalException,
412 "Can not fill parent: parent does not exist");
413 }
415}
416
418{
419 if (parent_type != 0) SetParent(parent_type->GetParticleName());
420}
421
423{
424 // determine angular momentum
425
426 // fill pointers to daughter particles if not yet set
427 if (daughters == 0) FillDaughters();
428
429 const G4int PiSpin = parent->GetPDGiSpin();
430 const G4int PParity = parent->GetPDGiParity();
431 if (2==numberOfDaughters) { // up to now we can only handle two particle decays
432 const G4int D1iSpin = daughters[0]->GetPDGiSpin();
433 const G4int D1Parity = daughters[0]->GetPDGiParity();
434 const G4int D2iSpin = daughters[1]->GetPDGiSpin();
435 const G4int D2Parity = daughters[1]->GetPDGiParity();
436 const G4int MiniSpin = std::abs (D1iSpin - D2iSpin);
437 const G4int MaxiSpin = D1iSpin + D2iSpin;
438 const G4int lMax = (PiSpin+D1iSpin+D2iSpin)/2; // l is allways int
439 G4int lMin;
440#ifdef G4VERBOSE
441 if (verboseLevel>1) {
442 G4cout << "iSpin: " << PiSpin << " -> " << D1iSpin << " + " << D2iSpin << G4endl;
443 G4cout << "2*jmin, 2*jmax, lmax " << MiniSpin << " " << MaxiSpin << " " << lMax << G4endl;
444 }
445#endif
446 for (G4int j=MiniSpin; j<=MaxiSpin; j+=2){ // loop over all possible spin couplings
447 lMin = std::abs(PiSpin-j)/2;
448#ifdef G4VERBOSE
449 if (verboseLevel>1)
450 G4cout << "-> checking 2*j=" << j << G4endl;
451#endif
452 for (G4int l=lMin; l<=lMax; l++) {
453#ifdef G4VERBOSE
454 if (verboseLevel>1)
455 G4cout << " checking l=" << l << G4endl;
456#endif
457 if (l%2==0) {
458 if (PParity == D1Parity*D2Parity) { // check parity for this l
459 return l;
460 }
461 } else {
462 if (PParity == -1*D1Parity*D2Parity) { // check parity for this l
463 return l;
464 }
465 }
466 }
467 }
468 } else {
469 G4Exception("G4VDecayChannel::GetAngularMomentum",
470 "PART111", JustWarning,
471 "Sorry, can't handle 3 particle decays (up to now)");
472 return 0;
473 }
474 G4Exception ("G4VDecayChannel::GetAngularMomentum",
475 "PART111", JustWarning,
476 "Can't find angular momentum for this decay");
477 return 0;
478}
479
481{
482 G4cout << " BR: " << rbranch << " [" << kinematics_name << "]";
483 G4cout << " : " ;
484 for (G4int index=0; index < numberOfDaughters; index++)
485 {
486 if(daughters_name[index] != 0) {
487 G4cout << " " << *(daughters_name[index]);
488 } else {
489 G4cout << " not defined ";
490 }
491 }
492 G4cout << G4endl;
493}
494
495const G4String& G4VDecayChannel::GetNoName() const
496{
497 return noName;
498}
@ JustWarning
@ FatalException
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
const G4String & GetParticleType() const
G4double GetPDGWidth() const
const G4String & GetParticleName() const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
virtual ~G4VDecayChannel()
G4String * parent_name
void SetBR(G4double value)
G4String ** daughters_name
G4int GetVerboseLevel() const
G4double * daughters_mass
void SetNumberOfDaughters(G4int value)
static const G4String noName
void SetDaughter(G4int anIndex, const G4ParticleDefinition *particle_type)
G4ParticleDefinition * parent
G4VDecayChannel & operator=(const G4VDecayChannel &)
G4int GetAngularMomentum()
G4ParticleDefinition ** daughters
G4ParticleTable * particletable
G4String kinematics_name
void SetParent(const G4ParticleDefinition *particle_type)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41