Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ParticleDefinition.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 implementation file
32//
33// History: first implementation, based on object model of
34// 2nd December 1995, G.Cosmo
35// ---------------- G4ParticleDefinition -----------------
36// first implementation by Makoto Asai, 29 January 1996
37// revised by G.Cosmo, 29 February 1996
38// revised by H.Kurashige, 19 April 1996
39// Code uses operators (+=, *=, ++, -> etc.) correctly, P. Urban, 26/6/96
40// revised by H.Kurashige, 4 July 1996
41// revised by H.Kurashige, 16 Feb 1997
42// revised by H.Kurashige, 10 Nov 1997
43// remove new/delete G4ProcessManager by H.Kurashige 06 June 1998
44// added Resonance flag and ApplyCuts flag H.Kurashige 27 June 1998
45// modify FillQuarkContents() for quarks/diquarks H.Kurashige 30 June 1998
46// modify encoding rule H.Kurashige 23 Oct. 98
47// modify FillQuarkContents() for deltas 25 Nov.,98 H.Kurashige
48//
49// modify FillQuarkContents() to use G4PDGCodeChecker 17 Aug. 99 H.Kurashige
50// --------------------------------------------------------------
51
52
55#include "G4SystemOfUnits.hh"
56#include "G4ParticleTable.hh"
57#include "G4IonTable.hh"
58#include "G4DecayTable.hh"
59#include "G4PDGCodeChecker.hh"
60#include "G4StateManager.hh"
61
63 const G4String& aName,
64 G4double mass,
65 G4double width,
66 G4double charge,
67 G4int iSpin,
68 G4int iParity,
69 G4int iConjugation,
70 G4int iIsospin,
71 G4int iIsospin3,
72 G4int gParity,
73 const G4String& pType,
74 G4int lepton,
75 G4int baryon,
77 G4bool stable,
78 G4double lifetime,
79 G4DecayTable *decaytable,
80 G4bool shortlived,
81 const G4String& subType,
82 G4int anti_encoding,
83 G4double magneticMoment)
84
85 : theParticleName(aName),
86 thePDGMass(mass),
87 thePDGWidth(width),
88 thePDGCharge(charge),
89 thePDGiSpin(iSpin),
90 thePDGSpin(iSpin*0.5),
91 thePDGiParity(iParity),
92 thePDGiConjugation(iConjugation),
93 thePDGiGParity(gParity),
94 thePDGiIsospin(iIsospin),
95 thePDGiIsospin3(iIsospin3),
96 thePDGIsospin(iIsospin*0.5),
97 thePDGIsospin3(iIsospin3*0.5),
98 thePDGMagneticMoment(magneticMoment),
99 theLeptonNumber(lepton),
100 theBaryonNumber(baryon),
101 theParticleType(pType),
102 theParticleSubType(subType),
103 thePDGEncoding(encoding),
104 theAntiPDGEncoding(-1*encoding),
105 fShortLivedFlag(shortlived),
106 thePDGStable(stable),
107 thePDGLifeTime(lifetime),
108 theDecayTable(decaytable),
109 theProcessManager(0),
110 theAtomicNumber(0),
111 theAtomicMass(0),
112 verboseLevel(1),
113 fApplyCutsFlag(false)
114{
115 static G4String nucleus("nucleus");
116 theParticleTable = G4ParticleTable::GetParticleTable();
117
118 //set verboseLevel equal to ParticleTable
119 verboseLevel = theParticleTable->GetVerboseLevel();
120
121 if (anti_encoding !=0) theAntiPDGEncoding = anti_encoding;
122
123 // check quark contents
124 if (this->FillQuarkContents() != thePDGEncoding) {
125#ifdef G4VERBOSE
126 if (verboseLevel>0) {
127 // Using G4cerr expecting that it is available in construction of static objects
128 G4cerr << "Particle " << aName << " has a strange PDGEncoding " <<G4endl;
129 }
130#endif
131 G4Exception( "G4ParticleDefintion::G4ParticleDefintion",
132 "PART102", JustWarning,
133 "Strange PDGEncoding ");
134 }
135
136 // check initialization is in Pre_Init state except for ions
138
139 if ( !fShortLivedFlag && (theParticleType!=nucleus) && (currentState!=G4State_PreInit)){
140#ifdef G4VERBOSE
141 if (GetVerboseLevel()>0) {
142 G4cerr << "G4ParticleDefintion (other than ions and shortlived) should be created in Pre_Init state "
143 << aName << G4endl;
144 }
145#endif
146 G4Exception( "G4ParticleDefintion::G4ParticleDefintion",
147 "PART101", JustWarning,
148 "G4ParticleDefinition should be created in PreInit state");
149 }
150
151
152 if (theParticleTable->GetIonTable()->IsIon(this)) {
155 }
156
157 if (theParticleTable->GetIonTable()->IsAntiIon(this)) {
158 SetAtomicNumber( std::abs(G4int(GetPDGCharge()/eplus)) );
159 SetAtomicMass( std::abs(GetBaryonNumber()) );
160 }
161
162 // check name and register this particle into ParticleTable
163 theParticleTable->Insert(this);
164
165}
166
168{
169 G4Exception("G4ParticleDefinition::G4ParticleDefinition()",
170 "PART001", FatalException,
171 "Illegal call of copy Constructor for G4ParticleDefinition ");
172}
173
175{
176 G4Exception("G4ParticleDefinition::G4ParticleDefinition()",
177 "PART001", FatalException,
178 "Illegal call of default Constructor for G4ParticleDefinition ");
179}
180
181
183{
184 if (G4ParticleTable::GetParticleTable()->GetReadiness()) {
186 G4ApplicationState currentState = pStateManager->GetCurrentState();
187 if (currentState != G4State_PreInit) {
188 G4String msg = "Request of deletion for ";
189 msg += GetParticleName();
190 msg += " has No effects because readyToUse is true.";
191 G4Exception("G4ParticleDefinition::~G4ParticleDefinition()",
192 "PART117", JustWarning, msg);
193 return ;
194 } else {
195#ifdef G4VERBOSE
196 if (verboseLevel>0){
198 << " will be deleted " << G4endl;
199 }
200#endif
201 }
202 }
203
204 if (theDecayTable!= 0) delete theDecayTable;
205}
206
207
208const G4ParticleDefinition & G4ParticleDefinition::operator=(const G4ParticleDefinition &right)
209{
210 if (this != &right) {
211 }
212 return *this;
213}
214
216{
217 return (this->theParticleName == right.theParticleName);
218}
219
221{
222 return (this->theParticleName != right.theParticleName);
223}
224
225
226
228 // calculate quark and anti-quark contents
229 // return value is PDG encoding for this particle.
230 // It means error if the return value is differnt from
231 // this->thePDGEncoding.
232{
233 G4int flavor;
234 for (flavor= 0; flavor<NumberOfQuarkFlavor; flavor++){
235 theQuarkContent[flavor] = 0;
236 theAntiQuarkContent[flavor] = 0;
237 }
238
239 G4PDGCodeChecker checker;
240 checker.SetVerboseLevel(verboseLevel);
241
242 G4int temp = checker.CheckPDGCode(thePDGEncoding, theParticleType);
243
244 if ( temp != 0) {
245 for (flavor= 0; flavor<NumberOfQuarkFlavor; flavor++){
246 theQuarkContent[flavor] = checker.GetQuarkContent(flavor);
247 theAntiQuarkContent[flavor] = checker.GetAntiQuarkContent(flavor);
248 }
249 if ((theParticleType == "meson")||(theParticleType == "baryon")) {
250 // check charge
251 if (!checker.CheckCharge(thePDGCharge) ){
252 temp = 0;
253 G4Exception( "G4ParticleDefintion::G4ParticleDefintion",
254 "PART103", JustWarning,
255 "Inconsistent charge against PDG code ");
256#ifdef G4VERBOSE
257 if (verboseLevel>0) {
258 G4cerr << "G4ParticleDefinition::FillQuarkContents : "
259 << " illegal charge (" << thePDGCharge/eplus
260 << " PDG code=" << thePDGEncoding <<G4endl;
261 }
262#endif
263 }
264 // check spin
265 if (checker.GetSpin() != thePDGiSpin) {
266 temp=0;
267 G4Exception( "G4ParticleDefintion::G4ParticleDefintion",
268 "PART104", JustWarning,
269 "Inconsistent spin against PDG code ");
270#ifdef G4VERBOSE
271 if (verboseLevel>0) {
272 G4cerr << "G4ParticleDefinition::FillQuarkContents : "
273 << " illegal SPIN (" << thePDGiSpin << "/2"
274 << " PDG code=" << thePDGEncoding <<G4endl;
275 }
276#endif
277 }
278 }
279 }
280 return temp;
281}
282
284{
285 G4cout << G4endl;
286 G4cout << "--- G4ParticleDefinition ---" << G4endl;
287 G4cout << " Particle Name : " << theParticleName << G4endl;
288 G4cout << " PDG particle code : " << thePDGEncoding;
289 G4cout << " [PDG anti-particle code: " << this->GetAntiPDGEncoding() << "]"<< G4endl;
290 G4cout << " Mass [GeV/c2] : " << thePDGMass/GeV ;
291 G4cout << " Width : " << thePDGWidth/GeV << G4endl;
292 G4cout << " Lifetime [nsec] : " << thePDGLifeTime/ns << G4endl;
293 G4cout << " Charge [e]: " << thePDGCharge/eplus << G4endl;
294 G4cout << " Spin : " << thePDGiSpin << "/2" << G4endl;
295 G4cout << " Parity : " << thePDGiParity << G4endl;
296 G4cout << " Charge conjugation : " << thePDGiConjugation << G4endl;
297 G4cout << " Isospin : (I,Iz): (" << thePDGiIsospin <<"/2";
298 G4cout << " , " << thePDGiIsospin3 << "/2 ) " << G4endl;
299 G4cout << " GParity : " << thePDGiGParity << G4endl;
300 if (thePDGMagneticMoment != 0.0) {
301 G4cout << " MagneticMoment [MeV/T] : " << thePDGMagneticMoment/MeV*tesla << G4endl;
302 }
303 G4cout << " Quark contents (d,u,s,c,b,t) : " << theQuarkContent[0];
304 G4cout << ", " << theQuarkContent[1];
305 G4cout << ", " << theQuarkContent[2];
306 G4cout << ", " << theQuarkContent[3];
307 G4cout << ", " << theQuarkContent[4];
308 G4cout << ", " << theQuarkContent[5] << G4endl;
309 G4cout << " AntiQuark contents : " << theAntiQuarkContent[0];
310 G4cout << ", " << theAntiQuarkContent[1];
311 G4cout << ", " << theAntiQuarkContent[2];
312 G4cout << ", " << theAntiQuarkContent[3];
313 G4cout << ", " << theAntiQuarkContent[4];
314 G4cout << ", " << theAntiQuarkContent[5] << G4endl;
315 G4cout << " Lepton number : " << theLeptonNumber;
316 G4cout << " Baryon number : " << theBaryonNumber << G4endl;
317 G4cout << " Particle type : " << theParticleType ;
318 G4cout << " [" << theParticleSubType << "]" << G4endl;
319
320 if ( (theParticleTable->GetIonTable()->IsIon(this))
321 || (theParticleTable->GetIonTable()->IsAntiIon(this)) ) {
322 G4cout << " Atomic Number : " << GetAtomicNumber();
323 G4cout << " Atomic Mass : " << GetAtomicMass() << G4endl;
324 }
325 if ( fShortLivedFlag ){
326 G4cout << " ShortLived : ON" << G4endl;
327 }
328
329 if ( thePDGStable ){
330 G4cout << " Stable : stable" << G4endl;
331 } else {
332 if( theDecayTable != 0 ){
333 theDecayTable->DumpInfo();
334 } else {
335 G4cout << "Decay Table is not defined !!" <<G4endl;
336 }
337 }
338
339}
340
342{
343 if(theParticleName=="gamma"
344 || theParticleName=="e-"
345 || theParticleName=="e+"
346 || theParticleName=="proton")
347 { fApplyCutsFlag = flg; }
348 else
349 {
350 G4cerr
351 << "G4ParticleDefinition::SetApplyCutsFlag() for " << theParticleName
352 << G4endl;
353 G4cerr
354 << "becomes obsolete. Production threshold is applied only for "
355 << "gamma, e- ,e+ and proton." << G4endl;
356 }
357}
G4ApplicationState
@ G4State_PreInit
@ JustWarning
@ FatalException
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
void DumpInfo() const
static G4bool IsIon(const G4ParticleDefinition *)
Definition: G4IonTable.cc:594
static G4bool IsAntiIon(const G4ParticleDefinition *)
Definition: G4IonTable.cc:619
G4int GetSpin() const
G4int GetQuarkContent(G4int flavor) const
G4bool CheckCharge(G4double charge) const
G4int GetAntiQuarkContent(G4int flavor) const
void SetVerboseLevel(G4int verbose)
G4int CheckPDGCode(G4int code, G4String type)
G4int GetAtomicNumber() const
G4int theAntiQuarkContent[NumberOfQuarkFlavor]
G4int GetVerboseLevel() const
G4int operator==(const G4ParticleDefinition &right) const
G4int operator!=(const G4ParticleDefinition &right) const
G4int GetAtomicMass() const
G4double GetPDGCharge() const
G4int theQuarkContent[NumberOfQuarkFlavor]
void SetAtomicMass(G4int)
const G4String & GetParticleName() const
void SetAtomicNumber(G4int)
G4int GetVerboseLevel() const
static G4ParticleTable * GetParticleTable()
G4ParticleDefinition * Insert(G4ParticleDefinition *particle)
G4IonTable * GetIonTable()
G4ApplicationState GetCurrentState() const
static G4StateManager * GetStateManager()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
#define ns
Definition: xmlparse.cc:597