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
G4QPDGCode.hh
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// ---------------- G4QPDGCode ----------------
30// by Mikhail Kossov, Sept 1999.
31// class header for Hadron definition in CHIPS Model
32// ------------------------------------------------------------
33// Short description: The PDG Code is made on the basis of the Quark
34// Content (G4QuarkContent) of the hadronic state (including nuclear
35// fragments). The PDG code of the ground state (e.g. pi, N, etc.) is
36// calculated. It includes a complicated algortithm of the G.S. mass
37// calculation for nuclear fragments (now it is synchronised with the
38// G4 nuclear massess).
39// -------------------------------------------------------------------
40
41#ifndef G4QPDGCode_h
42#define G4QPDGCode_h 1
43
44#include <iostream>
45#include "globals.hh"
46// Geant4 particles for consistency of masses only
47// Leptons
48#include "G4MuonPlus.hh"
49#include "G4MuonMinus.hh"
50#include "G4TauMinus.hh"
51#include "G4TauPlus.hh"
52#include "G4Electron.hh"
53#include "G4Positron.hh"
54#include "G4NeutrinoTau.hh"
55#include "G4AntiNeutrinoTau.hh"
56#include "G4NeutrinoMu.hh"
57#include "G4AntiNeutrinoMu.hh"
58#include "G4NeutrinoE.hh"
59#include "G4AntiNeutrinoE.hh"
60// Mesons
61#include "G4PionPlus.hh"
62#include "G4PionMinus.hh"
63#include "G4PionZero.hh"
64#include "G4Eta.hh"
65#include "G4EtaPrime.hh"
66
67#include "G4KaonPlus.hh"
68#include "G4KaonMinus.hh"
69#include "G4KaonZero.hh"
70#include "G4AntiKaonZero.hh"
71#include "G4KaonZeroLong.hh"
72#include "G4KaonZeroShort.hh"
73
74#include "G4DMesonPlus.hh"
75#include "G4DMesonMinus.hh"
76#include "G4DMesonZero.hh"
77#include "G4AntiDMesonZero.hh"
78#include "G4DsMesonPlus.hh"
79#include "G4DsMesonMinus.hh"
80#include "G4JPsi.hh"
81
82#include "G4BMesonPlus.hh"
83#include "G4BMesonMinus.hh"
84#include "G4BMesonZero.hh"
85#include "G4AntiBMesonZero.hh"
86#include "G4BsMesonZero.hh"
87#include "G4AntiBsMesonZero.hh"
88
89
90// Barions
91#include "G4Proton.hh"
92#include "G4AntiProton.hh"
93#include "G4Neutron.hh"
94#include "G4AntiNeutron.hh"
95
96#include "G4Lambda.hh"
97#include "G4SigmaPlus.hh"
98#include "G4SigmaZero.hh"
99#include "G4SigmaMinus.hh"
100#include "G4XiMinus.hh"
101#include "G4XiZero.hh"
102#include "G4OmegaMinus.hh"
103
104#include "G4AntiLambda.hh"
105#include "G4AntiSigmaPlus.hh"
106#include "G4AntiSigmaZero.hh"
107#include "G4AntiSigmaMinus.hh"
108#include "G4AntiXiMinus.hh"
109#include "G4AntiXiZero.hh"
110#include "G4AntiOmegaMinus.hh"
111
112#include "G4LambdacPlus.hh"
113#include "G4SigmacPlusPlus.hh"
114#include "G4SigmacPlus.hh"
115#include "G4SigmacZero.hh"
116#include "G4XicPlus.hh"
117#include "G4XicZero.hh"
118#include "G4OmegacZero.hh"
119
120#include "G4AntiLambdacPlus.hh"
122#include "G4AntiSigmacPlus.hh"
123#include "G4AntiSigmacZero.hh"
124#include "G4AntiXicPlus.hh"
125#include "G4AntiXicZero.hh"
126#include "G4AntiOmegacZero.hh"
127
128// Nuclei
129#include "G4Alpha.hh"
130#include "G4Deuteron.hh"
131#include "G4He3.hh"
132#include "G4Triton.hh"
133
134//ions
135#include "G4GenericIon.hh"
136#include "G4NucleiProperties.hh"
137// --- End of consistency headers ---
138
139#include "G4QContent.hh"
140
142{
143public:
144 // Constructors
145 G4QPDGCode(G4int PDGCode = 0); // Construction by PDGCode
146 G4QPDGCode(G4bool f, G4int QCode); // Construction by QCode, f-verb
147 G4QPDGCode(G4QContent QCont); // Construction by Quark Content
148 G4QPDGCode(const G4QPDGCode& rhs); // Copy Constructor by value
149 G4QPDGCode(G4QPDGCode* rhs); // Copy Constructor by pointer
150
151 ~G4QPDGCode(); // Public Destructor
152
153 // Operators
154 const G4QPDGCode& operator=(const G4QPDGCode& rhs);
155 G4bool operator==(const G4QPDGCode& rhs) const;
156 G4bool operator==(const G4int& rhs) const;
157 G4bool operator!=(const G4QPDGCode& rhs) const;
158 G4bool operator!=(const G4int& rhs) const;
159 G4QPDGCode operator+=(const G4int& rhs);
160 G4QPDGCode operator+=(const G4QPDGCode& rhs);
161 G4QPDGCode operator-=(const G4int& rhs);
162 G4QPDGCode operator-=(const G4QPDGCode& rhs);
163 G4QPDGCode operator*=(const G4int& rhs);
164 G4QPDGCode operator/=(const G4int& rhs);
165
166 // Selectors
167 G4int GetNQHadr(); // Return # of predefined hadrons
168 G4double GetMass(); // GS Mass for the QHadron
169 G4double GetMass2(); // Squared GS Mass for the QHadron
170 G4double GetWidth(); // Width for the QHadron
171 G4double GetNuclMass(G4int Z, G4int N, G4int S); // Wrapper forNuclearMassCalculation
172 G4double GetNuclMass(G4int PDGCode); // Wrapper forNuclearMassCalculation
173 G4QContent GetQuarkContent() const; // Get QC for the particle
174 G4int GetBaryNum() const; // Get Baryon Number of the Hadron
175 G4int GetSpin() const; // Returns 2s+1 for hadrons, 1 for A
176 G4int GetCharge() const; // Get Charge of the Hadron
177 G4int GetPDGCode() const; // Get PDG code of the Hadron
178 G4int GetQCode() const; // Get Q code of the Hadron
179 G4QContent GetExQContent(G4int i, G4int o) const; // Get Q Content for Quark Exchange
180 G4int GetRelCrossIndex(G4int i, G4int o) const; // Relative Cross Index for q_i->q_o
181 G4int GetNumOfComb(G4int i, G4int o) const; // Get #ofCombinations for q_i->q_o
182 G4int GetTotNumOfComb(G4int i) const; // Get total#ofCombinations for q_i
183
184 // Modifiers
185 void SetPDGCode(G4int newPDGCode); // Set PDG code of the Hadron
186 void InitByQCont(G4QContent QCont); // Init ExistingQPDG by QuarkContent
187 void InitByQCode(G4int QCode); // Init ExistingQPDG by Q Code
188
189 // General
191
192 void NegPDGCode();
193 void ConvertPDGToZNS(G4int PDG, G4int& z, G4int& n, G4int& s);
194 std::pair<G4int,G4int> MakeTwoBaryons(G4int L1, G4int L2, G4int R1, G4int R2);
195
196private:
197 // Encapsulated functions
198 G4bool TestRealNeutral(const G4int& PDGCode);
199 G4int MakeQCode(const G4int& PDGCode); // Make Q Code, using PDG Code
200 G4int MakePDGCode(const G4int& QCode); // Make PDG Code, using Q Code
201 G4double CalculateNuclMass(G4int Z, G4int N, G4int S); // Nuclear Mass Calculation
202 G4double QHaM(G4int nQ); // Definition of hadronic masses in Q-order
203private:
204 // Static parameter
205 //static const G4int nQHM=90;
206 static const G4int nQHM=53; // Reduced CHIPS
207 // the Body
208 G4int thePDGCode;
209 G4int theQCode;
210};
211
212// Not member operators
213std::ostream& operator<<(std::ostream& lhs, G4QPDGCode& rhs);
214std::ostream& operator<<(std::ostream& lhs, const G4QPDGCode& rhs);
215G4int operator+(const G4QPDGCode& lhs, const G4QPDGCode& rhs);
216G4int operator+(const G4QPDGCode& lhs, const G4int& rhs);
217G4int operator+(const G4int& lhs, const G4QPDGCode& rhs);
218G4int operator-(const G4QPDGCode& lhs, const G4QPDGCode& rhs);
219G4int operator-(const G4QPDGCode& lhs, const G4int& rhs);
220G4int operator-(const G4int& lhs, const G4QPDGCode& rhs);
221G4int operator*(const G4QPDGCode& lhs, const G4QPDGCode& rhs);
222G4int operator*(const G4QPDGCode& lhs, const G4int& rhs);
223G4int operator*(const G4int& lhs, const G4QPDGCode& rhs);
224G4int operator/(const G4QPDGCode& lhs, const G4QPDGCode& rhs);
225G4int operator/(const G4QPDGCode& lhs, const G4int& rhs);
226G4int operator/(const G4int& lhs, const G4QPDGCode& rhs);
227G4int operator%(const G4QPDGCode& lhs, const G4int& rhs);
228// Not member functions
229//----------------------------------------------------------------------------------------
230
231inline G4bool G4QPDGCode::operator==(const G4QPDGCode& rhs) const {return this==&rhs;}
232inline G4bool G4QPDGCode::operator==(const G4int& rhs) const {return thePDGCode==rhs;}
233inline G4bool G4QPDGCode::operator!=(const G4QPDGCode& rhs) const {return this!=&rhs;}
234inline G4bool G4QPDGCode::operator!=(const G4int& rhs) const {return thePDGCode!=rhs;}
235
236inline G4int G4QPDGCode::GetNQHadr() {return nQHM;} // Return # of predefined hadrons
237
239{
240 thePDGCode+=rhs.GetPDGCode();
241 if(!thePDGCode) theQCode = -2;
242 else theQCode = MakeQCode(thePDGCode);
243 return *this;
244}
246{
247 thePDGCode+=rhs;
248 if(!thePDGCode) theQCode = -2;
249 else theQCode = MakeQCode(thePDGCode);
250 return *this;
251}
253{
254 thePDGCode-=rhs.GetPDGCode();
255 if(!thePDGCode) theQCode = -2;
256 else theQCode = MakeQCode(thePDGCode);
257 return *this;
258}
260{
261 thePDGCode-=rhs;
262 if(!thePDGCode) theQCode = -2;
263 else theQCode = MakeQCode(thePDGCode);
264 return *this;
265}
267{
268 thePDGCode*=rhs;
269 if(!thePDGCode) theQCode = -2;
270 else theQCode = MakeQCode(thePDGCode);
271 return *this;
272}
274{
275 thePDGCode/=rhs;
276 if(!thePDGCode) theQCode = -2;
277 else theQCode = MakeQCode(thePDGCode);
278 return *this;
279}
280
281inline G4double G4QPDGCode::GetMass2() {G4double mass=GetMass(); return mass*mass;}
283{
284 if(PDG>80000000)
285 {
286 G4int szn=PDG-90000000;
287 G4int ds=0;
288 G4int dz=0;
289 G4int dn=0;
290 if(szn<-100000)
291 {
292 G4int ns_value=(-szn)/1000000+1;
293 szn+=ns_value*1000000;
294 ds+=ns_value;
295 }
296 else if(szn<-100)
297 {
298 G4int nz=(-szn)/1000+1;
299 szn+=nz*1000;
300 dz+=nz;
301 }
302 else if(szn<0)
303 {
304 G4int nn=-szn;
305 szn=0;
306 dn+=nn;
307 }
308 G4int sz =szn/1000;
309 G4int n =szn%1000;
310 if(n>700)
311 {
312 n-=1000;
313 dz--;
314 }
315 G4int z =sz%1000-dz;
316 if(z>700)
317 {
318 z-=1000;
319 ds--;
320 }
321 G4int s_value =sz/1000-ds;
322 return GetNuclMass(z,n,s_value);
323 }
324 return 0.;
325}
326inline G4int G4QPDGCode::GetPDGCode() const {return thePDGCode;}
327inline G4int G4QPDGCode::GetQCode() const {return theQCode;}
331{
332 if(thePDGCode<80000000) return thePDGCode%10;
333 else if(GetQuarkContent().GetTot()%2) return 3; // @@ Take into account higher resonances
334 else return 1;
335}
336inline void G4QPDGCode::NegPDGCode() {thePDGCode=-thePDGCode;}
338
339// Redefinition of the PDG instance
340inline void G4QPDGCode::SetPDGCode(G4int newPDGCode)
341{
342 thePDGCode=newPDGCode;
343 if(!thePDGCode) theQCode = -2;
344 else theQCode = MakeQCode(newPDGCode);
345}
346
347// Init existing QPDG by Quark Content
349{
350 thePDGCode = QCont.GetSPDGCode();
351 if(!thePDGCode) theQCode = -2;
352 else theQCode = MakeQCode(thePDGCode);
353}
354
355// Init existing QPDG by Quark Content
357{
358 theQCode = QCode;
359 thePDGCode = MakePDGCode(QCode);
360}
361
362#endif
G4int operator-(const G4QPDGCode &lhs, const G4QPDGCode &rhs)
Definition: G4QPDGCode.cc:149
G4int operator+(const G4QPDGCode &lhs, const G4QPDGCode &rhs)
Definition: G4QPDGCode.cc:132
G4int operator%(const G4QPDGCode &lhs, const G4int &rhs)
Definition: G4QPDGCode.cc:204
std::ostream & operator<<(std::ostream &lhs, G4QPDGCode &rhs)
Definition: G4QPDGCode.cc:118
G4int operator*(const G4QPDGCode &lhs, const G4QPDGCode &rhs)
Definition: G4QPDGCode.cc:166
G4int operator/(const G4QPDGCode &lhs, const G4QPDGCode &rhs)
Definition: G4QPDGCode.cc:185
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4int GetCharge() const
Definition: G4QContent.cc:1159
G4int GetBaryonNumber() const
Definition: G4QContent.cc:1182
G4int GetSPDGCode() const
Definition: G4QContent.cc:1204
G4double GetMass2()
Definition: G4QPDGCode.hh:281
G4QContent GetQuarkContent() const
Definition: G4QPDGCode.cc:2057
G4double GetWidth()
Definition: G4QPDGCode.cc:740
G4QContent GetExQContent(G4int i, G4int o) const
Definition: G4QPDGCode.cc:2244
G4QPDGCode operator+=(const G4int &rhs)
Definition: G4QPDGCode.hh:245
G4int GetPDGCode() const
Definition: G4QPDGCode.hh:326
void InitByQCont(G4QContent QCont)
Definition: G4QPDGCode.hh:348
G4int GetNumOfComb(G4int i, G4int o) const
Definition: G4QPDGCode.cc:2347
G4int GetNQHadr()
Definition: G4QPDGCode.hh:236
G4QPDGCode operator/=(const G4int &rhs)
Definition: G4QPDGCode.hh:273
void InitByQCode(G4int QCode)
Definition: G4QPDGCode.hh:356
G4bool operator==(const G4QPDGCode &rhs) const
Definition: G4QPDGCode.hh:231
G4QPDGCode operator*=(const G4int &rhs)
Definition: G4QPDGCode.hh:266
G4bool operator!=(const G4QPDGCode &rhs) const
Definition: G4QPDGCode.hh:233
G4int GetBaryNum() const
Definition: G4QPDGCode.hh:329
G4QPDGCode operator-=(const G4int &rhs)
Definition: G4QPDGCode.hh:259
G4bool TestRealNeutral()
Definition: G4QPDGCode.hh:337
const G4QPDGCode & operator=(const G4QPDGCode &rhs)
Definition: G4QPDGCode.cc:105
G4double GetMass()
Definition: G4QPDGCode.cc:693
void NegPDGCode()
Definition: G4QPDGCode.hh:336
G4double GetNuclMass(G4int Z, G4int N, G4int S)
Definition: G4QPDGCode.cc:766
void ConvertPDGToZNS(G4int PDG, G4int &z, G4int &n, G4int &s)
Definition: G4QPDGCode.cc:2377
G4int GetRelCrossIndex(G4int i, G4int o) const
Definition: G4QPDGCode.cc:2259
G4int GetSpin() const
Definition: G4QPDGCode.hh:330
G4int GetQCode() const
Definition: G4QPDGCode.hh:327
G4int GetTotNumOfComb(G4int i) const
Definition: G4QPDGCode.cc:2368
std::pair< G4int, G4int > MakeTwoBaryons(G4int L1, G4int L2, G4int R1, G4int R2)
Definition: G4QPDGCode.cc:2413
G4int GetCharge() const
Definition: G4QPDGCode.hh:328
void SetPDGCode(G4int newPDGCode)
Definition: G4QPDGCode.hh:340