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.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// ---------------- G4QPDGCode ----------------
30// by Mikhail Kossov, Sept 1999.
31// class for Hadron definitions 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//#define debug
42//#define pdebug
43//#define qdebug
44//#define idebug
45//#define sdebug
46
47#include <cmath>
48#include <cstdlib>
49
50#include "G4QPDGCodeVector.hh"
51
52using namespace std;
53
54G4QPDGCode::G4QPDGCode(G4int PDGCode): thePDGCode(PDGCode)
55{
56#ifdef sdebug
57 G4cout<<"G4QPDGCode:Constructer is called with PDGCode="<<PDGCode<<G4endl;
58#endif
59 if(PDGCode==130) PDGCode= 311; // Safety. Should not happen.
60 if(PDGCode==310) PDGCode=-311; // Safety. Should not happen.
61 if(PDGCode==90000000)
62 {
63 thePDGCode=22;
64 theQCode=6;
65 }
66 else if(PDGCode) theQCode=MakeQCode(PDGCode);
67 else
68 {
69#ifdef sdebug
70 G4cout<<"***G4QPDGCode: Constructed with PDGCode=0, QCode=-2"<<G4endl;
71#endif
72 theQCode=-2;
73 }
74#ifdef debug
75 if(PDGCode==3222)G4cout<<"G4QPDGCd:Con(PDG) PDG="<<PDGCode<<", QCode="<<theQCode<<G4endl;
76#endif
77}
78
79G4QPDGCode::G4QPDGCode(G4bool f, G4int QCode): theQCode(QCode)
80{
81 if(f&&QCode<0)G4cerr<<"***G4QPDGCode::Constr. QCode="<<QCode<<G4endl;
82 thePDGCode = MakePDGCode(QCode);
83#ifdef debug
84 G4cout<<"G4QPDGCode::Constr: PDGCode="<<thePDGCode<<G4endl;
85#endif
86}
87
89{
90 InitByQCont(QCont);
91}
92
94{
95 thePDGCode =rhs.thePDGCode;
96 theQCode =rhs.theQCode;
97}
98
100{
101 thePDGCode =rhs->thePDGCode;
102 theQCode =rhs->theQCode;
103}
104
106{
107 if(this != &rhs) // Beware of self assignment
108 {
109 thePDGCode =rhs.thePDGCode;
110 theQCode =rhs.theQCode;
111 }
112 return *this;
113}
114
116
117// Standard output for QPDGCode
118ostream& operator<<(ostream& lhs, G4QPDGCode& rhs)
119{
120 lhs << "[ PDG=" << rhs.GetPDGCode() << ", Q=" << rhs.GetQCode() << "]";
121 return lhs;
122}
123
124// Standard output for const QPDGCode
125ostream& operator<<(ostream& lhs, const G4QPDGCode& rhs)
126{
127 lhs << "[ PDG=" << rhs.GetPDGCode() << ", Q=" << rhs.GetQCode() << "]";
128 return lhs;
129}
130
131// Overloading of QPDGCode addition
132G4int operator+(const G4QPDGCode& lhs, const G4QPDGCode& rhs)
133{
134 G4int s_value = lhs.GetPDGCode();
135 return s_value += rhs.GetPDGCode();
136}
137G4int operator+(const G4QPDGCode& lhs, const G4int& rhs)
138{
139 G4int s_value = lhs.GetPDGCode();
140 return s_value += rhs;
141}
142G4int operator+(const G4int& lhs, const G4QPDGCode& rhs)
143{
144 G4int s_value = lhs;
145 return s_value += rhs.GetPDGCode();
146}
147
148// Overloading of QPDGCode subtraction
149G4int operator-(const G4QPDGCode& lhs, const G4QPDGCode& rhs)
150{
151 G4int s_value = lhs.GetPDGCode();
152 return s_value -= rhs.GetPDGCode();
153}
154G4int operator-(const G4QPDGCode& lhs, const G4int& rhs)
155{
156 G4int s_value = lhs.GetPDGCode();
157 return s_value -= rhs;
158}
159G4int operator-(const G4int& lhs, const G4QPDGCode& rhs)
160{
161 G4int s_value = lhs;
162 return s_value -= rhs.GetPDGCode();
163}
164
165// Overloading of QPDGCode multiplication
166G4int operator*(const G4QPDGCode& lhs, const G4QPDGCode& rhs)
167{
168 G4int s_value = lhs.GetPDGCode();
169 return s_value *= rhs.GetPDGCode();
170}
171
172G4int operator*(const G4QPDGCode& lhs, const G4int& rhs)
173{
174 G4int s_value = lhs.GetPDGCode();
175 return s_value *= rhs;
176}
177
178G4int operator*(const G4int& lhs, const G4QPDGCode& rhs)
179{
180 G4int s_value = lhs;
181 return s_value *= rhs.GetPDGCode();
182}
183
184// Overloading of QPDGCode division
185G4int operator/(const G4QPDGCode& lhs, const G4QPDGCode& rhs)
186{
187 G4int s_value = lhs.GetPDGCode();
188 return s_value /= rhs.GetPDGCode();
189}
190
191G4int operator/(const G4QPDGCode& lhs, const G4int& rhs)
192{
193 G4int s_value = lhs.GetPDGCode();
194 return s_value /= rhs;
195}
196
197G4int operator/(const G4int& lhs, const G4QPDGCode& rhs)
198{
199 G4int s_value = lhs;
200 return s_value /= rhs.GetPDGCode();
201}
202
203// Overloading of QPDGCode residual
204G4int operator%(const G4QPDGCode& lhs, const G4int& rhs)
205{
206 G4int s_value = lhs.GetPDGCode();
207 return s_value %= rhs;
208}
209
210// TRUE if it is not RealNeutral (111,221,331 etc), FALSE if it is.
212{
213 if(PDGCode>0 && PDGCode<999) // RealNeutral are always positive && mesons
214 {
215 if(PDGCode==22) return false; // Photon
216 G4int p=PDGCode/10;
217 if(p/10==p%10) return false; // This is a RealNeutral
218 }
219 return true;
220}
221
222// Make a Q Code out of the PDG Code
223G4int G4QPDGCode::MakePDGCode(const G4int& QCode)
224{
225 //static const G4int modi = 81; // Q Codes for more than di-baryon nuclei
226 //static const G4int modi = 89; // Q Codes for more than di-baryon nuclei "IsoNuclei"
227 //static const G4int modi = 122; // Q Codes: more than quarta-baryon nuclei "Lept/Hyper"
228 static const G4int modi = 85; // Reduced Q Codes: > quarta-baryon nuclei "Lept/Hyper"
229 //static G4int qC[modi]={ 11, 12, 13, 14, 15, 16, 22, 23, 24, 25, // 10
230 // 37, 110, 220, 330, 111, 211, 221, 311, 321, 331, // 20
231 // 2112, 2212, 3122, 3112, 3212, 3222, 3312, 3322, 113, 213, // 30
232 // 223, 313, 323, 333, 1114, 2114, 2214, 2224, 3124, 3114, // 40
233 // 3214, 3224, 3314, 3324, 3334, 115, 215, 225, 315, 325, // 50
234 // 335, 2116, 2216, 3126, 3116, 3216, 3226, 3316, 3326, 117, // 60
235 // 217, 227, 317, 327, 337, 1118, 2118, 2218, 2228, 3128, // 70
236 // 3118, 3218, 3228, 3318, 3328, 3338, 119, 219, 229, 319, // 80
237 // 329, 339, 90002999 , 89999003 , 90003998 ,
238 // 89998004 , 90003999 , 89999004 , 90004998 , 89998005 , // 90
239 // 90000001 , 90001000 , 91000000 , 90999001 , 91000999 ,
240 // 91999000 , 91999999 , 92999000 , 90000002 , 90001001 , //100
241 // 90002000 , 91000001 , 91001000 , 92000000 , 90999002 ,
242 // 91001999 , 90001002 , 90002001 , 91000002 , 91001001 , //110
243 // 91002000 , 92000001 , 92001000 , 90999003 , 90001003 ,
244 // 90002002 , 90003001 , 91001002 , 91002001 , 92000002 , //120
245 // 92001001 , 92002000}; //122
246 static G4int qC[modi] ={ 11, 12, 13, 14, 15, 16, 22, 23, 24, 25, // 10
247 37, 110, 220, 330, 111, 211, 221, 311, 321, 331, // 20
248 2112, 2212, 3122, 3112, 3212, 3222, 3312, 3322, 113, 213, // 30
249 223, 313, 323, 333, 1114, 2114, 2214, 2224, 3124, 3114, // 40
250 3214, 3224, 3314, 3324, 3334, // 45
251 90002999 , 89999003 , 90003998 , 89998004 , 90003999 , // 50
252 89999004 , 90004998 , 89998005 , 90000001 , 90001000 , // 55
253 91000000 , 90999001 , 91000999 , 91999000 , 91999999 , // 60
254 92999000 , 90000002 , 90001001 , 90002000 , 91000001 , // 65
255 91001000 , 92000000 , 90999002 , 91001999 , 90001002 , // 70
256 90002001 , 91000002 , 91001001 , 91002000 , 92000001 , // 75
257 92001000 , 90999003 , 90001003 , 90002002 , 90003001 , // 80
258 91001002 , 91002001 , 92000002 , 92001001 , 92002000}; // 85
259 static G4int aC[15] = {1,1000,999001,1000000,1000999,1999000,1999999, // sum 1
260 2,1001,2000,1000001,1001000,1999001,2000000,2000999}; // sum 2
261 if (QCode<0)
262 {
263 G4cerr<<"***G4QPDGCode::MakePDGCode: negative Q Code ="<<QCode<<G4endl;
264 return 0;
265 }
266 else if (QCode>=modi)
267 {
268 //G4int q=QCode-modi; // Starting BarNum=3
269 //G4int a=q/15+1; // BarNum/2
270 //G4int b=q%15;
271 G4int q=QCode-modi; // Starting BarNum=5
272 G4int a=q/15+2; // BarNum/2
273 G4int b=q%15;
274 return 90000000+a*1001+aC[b];
275 }
276 return qC[theQCode];
277}
278
279// Hadronic masses synhronized with the Geant4 hadronic masses
280G4double G4QPDGCode:: QHaM(G4int nQ)
281{
282 static G4bool iniFlag=true;
283 //static G4double mass[nQHM]={.511,0.,105.65837, 0., 1777., 0., 0., 91188., 80403., 140.00
284 //,120.000, 800., 980., 1370., 134.98, 139.57, 547.51, 497.65, 493.68, 957.78
285 //,939.5654,938.272, 1115.683, 1197.45, 1192.64, 1189.37,1321.31,1314.83, 775.5, 775.5
286 //, 782.65, 896.0, 891.66, 1019.46, 1232., 1232., 1232., 1232., 1519.5, 1387.2
287 //, 1383.7, 1382.8, 1535., 1531.8, 1672.45, 1318.3, 1318.3, 1275.4, 1432.4, 1425.6
288 //, 1525., 1680., 1680., 1820., 1915., 1915., 1915., 2025., 2025., 1691.
289 //, 1691., 1667., 1776., 1776., 1854., 1950., 1950., 1950., 1950., 2100.
290 //, 2030., 2030., 2030., 2127., 2127., 2252., 2020., 2020., 2044., 2045.
291 //, 2045., 2297., 2170.272, 2171.565, 2464., 2464., 3108.544, 3111.13,3402.272,3403.565};
292 // Reduced:
293 static G4double mass[nQHM]={.511, 0., 105.65837, 0., 1777., 0., 0., 91188., 80403., 140.00
294 ,120.000, 800., 980., 1370., 134.98, 139.57, 547.51, 497.65, 493.68, 957.78
295 ,939.5654,938.272, 1115.683, 1197.45, 1192.64, 1189.37,1321.31,1314.83, 775.5, 775.5
296 , 782.65, 896.0, 891.66, 1019.46, 1232., 1232., 1232., 1232., 1519.5, 1387.2
297 , 1383.7, 1382.8, 1535., 1531.8, 1672.45,2170.272,2171.565, 2464., 2464.,3108.544
298 ,3111.13,3402.272, 3403.565};
299 if(iniFlag) // Initialization of the Geant4 hadronic masses
300 {
301 mass[ 0]= G4Electron::Electron()->GetPDGMass();
302 mass[ 1]= G4NeutrinoE::NeutrinoE()->GetPDGMass();
303 mass[ 2]= G4MuonMinus::MuonMinus()->GetPDGMass();
305 mass[ 4]= G4TauMinus::TauMinus()->GetPDGMass();
307 mass[14]= G4PionZero::PionZero()->GetPDGMass();
308 mass[15]= G4PionMinus::PionMinus()->GetPDGMass();
309 mass[16]= G4Eta::Eta()->GetPDGMass();
310 mass[17]= G4KaonZero::KaonZero()->GetPDGMass();
311 mass[18]= G4KaonMinus::KaonMinus()->GetPDGMass();
312 mass[19]= G4EtaPrime::EtaPrime()->GetPDGMass();
313 mass[20]= G4Neutron::Neutron()->GetPDGMass();
314 mass[21]= G4Proton::Proton()->GetPDGMass();
315 mass[22]= G4Lambda::Lambda()->GetPDGMass();
317 mass[24]= G4SigmaZero::SigmaZero()->GetPDGMass();
318 mass[25]= G4SigmaPlus::SigmaPlus()->GetPDGMass();
319 mass[26]= G4XiMinus::XiMinus()->GetPDGMass();
320 mass[27]= G4XiZero::XiZero()->GetPDGMass();
322 iniFlag=false;
323 }
324 if(nQ<0 || nQ>=nQHM)
325 {
326 G4cout<<"***G4QPDGCode::QHaM: negative Q-code or Q="<<nQ<<" >= nQmax = "<<nQHM<<G4endl;
327 return 0.;
328 }
329 return mass[nQ];
330}
331
332// Make a Q Code out of the PDG Code
333G4int G4QPDGCode::MakeQCode(const G4int& PDGCode)
334{
335 static const G4int qr[10]={0,13,19,27,33,44,50,58,64,75};
336 G4int PDGC=abs(PDGCode); // Qcode is always not negative
337 G4int s_value=0;
338 G4int z=0;
339 G4int n=0;
340 if (PDGC>100000000) // Not supported
341 {
342#ifdef debug
343 G4cout<<"***G4QPDGCode::MakeQCode: Unknown in Q-System code: "<<PDGCode<<G4endl;
344#endif
345 return -2;
346 }
347 else if (PDGC>80000000 && PDGC<100000000) // Try to convert the NUCCoding to PDGCoding
348 {
349 //if(PDGC==90000000) return 6; // @@ already done in the constructor
350 ConvertPDGToZNS(PDGC, z, n, s_value);
351 G4int b=n+z+s_value; // Baryon number
352#ifdef debug
353 G4cout<<"***G4QPDGCode::Z="<<z<<",N="<<n<<",S="<<s_value<<G4endl;
354#endif
355 if(b<0) // ---> Baryons & Fragments
356 {
357 b=-b;
358 n=-n;
359 z=-z;
360 s_value=-s_value;
361 PDGC=90000000+s_value*1000000+z*1000+n; // New PDGC for anti-baryons
362 }
363 else if(!b) // --> Mesons
364 {
365 //G4bool anti=false; // For the PDG conversion
366 if(z<0) // --> Mesons conversion
367 {
368 n=-n;
369 z=-z;
370 s_value=-s_value;
371 //anti=true; // For the PDG conversion
372 }
373 if(!z)
374 {
375 if(s_value>0)
376 {
377 n=-n;
378 s_value=-s_value;
379 //anti=true; // For the PDG conversion
380 }
381 if (s_value==-1) return 17; // K0
382 else if(s_value==-2) return -1; // K0+K0 chipolino
383 else return -2; // Not supported by Q Code
384 }
385 else // --> z>0
386 {
387 if(z==1)
388 {
389 if (s_value==-1) return 18; // K+
390 else return 15; // pi+
391 }
392 else if(z==2) return -1; // Chipolino
393 else return -2; // Not supported by Q Code
394 }
395 } // End of meson case
396 if(b>0) // --> Baryoniums case
397 {
398 if(b==1) // --> Baryons+Hyperons
399 {
400 if(PDGC>80000000)
401 {
402 if(!s_value) // --> Baryons
403 {
404 if (!z) return 53; // neutron
405 else if(z==1)return 54; // proton
406 else return -2; // Not supported by Q Code
407 }
408 else if(s_value==1) // --> Hyperons
409 {
410 if(z==-1) return 56; // Sigma-
411 else if(!z) return 55; // Lambda
412 else if(z==1)return 57; // Sigma+
413 else return -2; // Not supported by Q Code
414 }
415 else if(s_value==2) // --> Xi Hyperons
416 {
417 if(z==-1) return 58; // Xi-
418 else if(!z) return 59; // Xi0
419 else return -2; // Not supported by Q Code
420 }
421 else if(s_value==3) // --> Xi Hyperons
422 {
423 if(z==-1) return 60; // Omega-
424 else return -2; // Not supported by Q Code
425 }
426 }
427 else
428 {
429 if(!s_value) // --> Baryons
430 {
431 if(z==-1) return 34; // Delta-
432 else if(!z) return 20; // neutron
433 else if(z==1)return 21; // proton
434 else if(z==2)return 37; // Delta++
435 else if(z==3||z==-2)return -1; // Delta+pi Chipolino
436 else return -2; // Not supported by Q Code
437 }
438 else if(s_value==1) // --> Hyperons
439 {
440 if(z==-1) return 23; // Sigma-
441 else if(!z) return 22; // Lambda (@@ 24->Sigma0)
442 else if(z==1)return 25; // Sigma+
443 else if(z==2||z==-2) return -1; // Sigma+pi Chipolino
444 else return -2; // Not supported by Q Code
445 }
446 else if(s_value==2) // --> Xi Hyperons
447 {
448 if(z==-1) return 26; // Xi-
449 else if(!z) return 27; // Xi0
450 else if(z==1||z==-2)return -1; // Xi+pi Chipolino
451 else return -2; // Not supported by Q Code
452 }
453 else if(s_value==3) // --> Xi Hyperons
454 {
455 if(z==-1) return 44; // Omega-
456 else if(!z||z==-2) return -1; // Omega+pi Chipolino
457 else return -2; // Not supported by Q Code
458 }
459 }
460 }
461 else
462 {
463 if(b==2)
464 {
465 if (PDGC==90002999) return 45; // p DEL++
466 else if(PDGC==89999003) return 46; // n DEL-
467 else if(PDGC==90003998) return 47; // DEL++ DEL++
468 else if(PDGC==89998004) return 48; // DEL- DEL-
469 else if(PDGC==90999002) return 67; // n Sigma-
470 else if(PDGC==91001999) return 68; // p Sigma+
471 }
472 if(b==3)
473 {
474 if (PDGC==90003999) return 49; // p p DEL++
475 else if(PDGC==89999004) return 50; // n n DEL-
476 else if(PDGC==90004998) return 51; // p DEL++ DEL++
477 else if(PDGC==89998005) return 52; // n DEL- DEL-
478 else if(PDGC==90999003) return 76; // n n Sigma-
479 }
480 }
481 }
482 }
483 if (PDGC<80000000) // ----> Direct Baryons & Mesons
484 {
485 if (PDGC<100) // => Leptons and field bosons
486 {
487 if (PDGC==10) return -1; // Chipolino
488 else if(PDGC==11) return 0; // e-
489 else if(PDGC==12) return 1; // nu_e
490 else if(PDGC==13) return 2; // mu-
491 else if(PDGC==14) return 3; // nu_mu
492 else if(PDGC==15) return 4; // tau-
493 else if(PDGC==16) return 5; // nu_tau
494 else if(PDGC==22) return 6; // Photon
495 else if(PDGC==23) return 7; // Z0 boson
496 else if(PDGC==24) return 8; // W- boson
497 else if(PDGC==25) return 9; // H0 (neutral Higs boson)
498 else if(PDGC==37) return 10; // H- (charged Higs boson)
499 }
500 G4int r=PDGC%10; // 2s+1
501 G4int Q= 0;
502 if (!r)
503 {
504 // Internal CHIPS codes for the wide f_0 states must be 9000221, 9010221, 10221
505 if (PDGC==110) return 11; // Low R-P: Sigma (pi,pi S-wave)
506 else if(PDGC==220) return 12; // Midle Regeon-Pomeron
507 else if(PDGC==330) return 13; // High Regeon-Pomeron
508#ifdef debug
509 G4cout<<"***G4QPDGCode::MakeQCode: (0) Unknown in Q-System code: "<<PDGCode<<G4endl;
510#endif
511 return -2;
512 }
513 else Q=qr[r];
514 G4int p=PDGC/10; // Quark Content
515 if(r%2) // (2s+1 is odd) Mesons
516 {
517 if (p==11) return Q+=1;
518 else if(p==21) return Q+=2;
519 else if(p==22) return Q+=3;
520 else if(p==31) return Q+=4;
521 else if(p==32) return Q+=5;
522 else if(p==33) return Q+=6;
523 else
524 {
525#ifdef debug
526 G4cout<<"*Warning*G4QPDGCode::MakeQCode:(1)UnknownQCode for PDG="<<PDGCode<<G4endl;
527#endif
528 return -2;
529 }
530 }
531 else // (2s+1 is even) Baryons
532 {
533 s_value=r/2;
534 if(s_value%2) // ((2s+1)/2 is odd) N Family
535 {
536 if (p==211) return Q+=1;
537 else if(p==221) return Q+=2;
538 else if(p==312) return Q+=3;
539 else if(p==311) return Q+=4;
540 else if(p==321) return Q+=5;
541 else if(p==322) return Q+=6;
542 else if(p==331) return Q+=7;
543 else if(p==332) return Q+=8;
544 else
545 {
546#ifdef debug
547 G4cout<<"*Warning*G4QPDGCode::MakeQCode:(2) UnknownQCode, PDG="<<PDGCode<<G4endl;
548#endif
549 return -2;
550 }
551 }
552 else // ((2s+1)/2 is odd) Delta Family
553 {
554 if (p==111) return Q+= 1;
555 else if(p==211) return Q+= 2;
556 else if(p==221) return Q+= 3;
557 else if(p==222) return Q+= 4;
558 else if(p==312) return Q+= 5;
559 else if(p==311) return Q+= 6;
560 else if(p==321) return Q+= 7;
561 else if(p==322) return Q+= 8;
562 else if(p==331) return Q+= 9;
563 else if(p==332) return Q+=10;
564 else if(p==333) return Q+=11;
565 else
566 {
567#ifdef debug
568 G4cout<<"**G4QPDGCode::MakeQCode:(3) Unknown in Q-System code:"<<PDGCode<<G4endl;
569#endif
570 return -2;
571 }
572 }
573 }
574 }
575 else // Nuclear Fragments
576 {
577 G4int d=n+n+z+s_value; // a#of d quarks
578 G4int u=n+z+z+s_value; // a#of u quarks
579 G4int t=d+u+s_value; // tot#of quarks
580 if(t%3 || abs(t)<3) // b=0 are in mesons
581 {
582#ifdef debug
583 G4cout<<"***G4QPDGCode::MakeQCode: Unknown PDGCode="<<PDGCode<<", t="<<t<<G4endl;
584#endif
585 return -2;
586 }
587 else
588 {
589 G4int b=t/3; // baryon number
590 if(b==1) // baryons
591 {
592 if (s_value==0&&u==1&&d==2) return 53; // n
593 else if(s_value==0&&u==2&&d==1) return 54; // p
594 else if(s_value==1&&u==1&&d==1) return 55; // Lambda
595 else if(s_value==1&&u==0&&d==2) return 56; // Sigma-
596 else if(s_value==1&&u==2&&d==0) return 57; // Sigma+
597 else if(s_value==2&&u==0&&d==1) return 58; // Xi-
598 else if(s_value==2&&u==1&&d==0) return 59; // Xi0
599 else if(s_value==3&&u==0&&d==0) return 60; // Omega-
600 else
601 {
602#ifdef debug
603 G4cout<<"**G4QPDGCode::MakeQCode:(5) Unknown in Q-System code:"<<PDGCode<<G4endl;
604#endif
605 return -2;
606 }
607 }
608 else if(b==2) // di-baryons
609 {
610 if (s_value==0&&u==2&&d==4) return 61; // nn
611 else if(s_value==0&&u==3&&d==3) return 62; // np
612 else if(s_value==0&&u==4&&d==2) return 63; // pp
613 else if(s_value==1&&u==2&&d==3) return 64; // nLambda
614 else if(s_value==1&&u==3&&d==2) return 65; // pLambda
615 else if(s_value==2&&u==2&&d==2) return 66; // LambdaLambda
616 else
617 {
618#ifdef debug
619 G4cout<<"**G4QPDGCode::MakeQCode:(6) Unknown in Q-System code:"<<PDGCode<<G4endl;
620#endif
621 return -2;
622 }
623 }
624 else if(b==3) // tri-baryons
625 {
626 if (s_value==0&&u==4&&d==5) return 69; // pnn
627 else if(s_value==0&&u==5&&d==4) return 70; // npp
628 else if(s_value==1&&u==3&&d==5) return 71; // Lnn
629 else if(s_value==1&&u==4&&d==4) return 72; // Lnp
630 else if(s_value==1&&u==5&&d==3) return 73; // Lpp
631 else if(s_value==2&&u==3&&d==4) return 74; // LLn
632 else if(s_value==2&&u==4&&d==3) return 75; // LLp
633 else if(s_value==1&&u==2&&d==6) return 76; // nnSigma-
634 else
635 {
636#ifdef debug
637 G4cout<<"**G4QPDGCode::MakeQCode:(7) Unknown in Q-System code:"<<PDGCode<<G4endl;
638#endif
639 return -2;
640 }
641 }
642 G4int c=b/2; // From here b>3: (4,5):c=2,g=0,1; (6,7):c=3,g=0,1; ...
643 G4int g_value=b%2;
644 G4int h=c*3;
645 //G4int Q=57+c*15;
646 //G4int Q=65+c*15; // "IsoNuclei"
647 //G4int Q=83+c*15; // "Leptons/Hyperons"
648 G4int Q=46+c*15; // Reduced "Leptons/Hyperons"
649 u-=h;
650 d-=h;
651 if(g_value)
652 {
653 if (s_value==0&&u==1&&d==2) return Q+= 9;
654 else if(s_value==0&&u==2&&d==1) return Q+=10;
655 else if(s_value==1&&u==0&&d==2) return Q+=11;
656 else if(s_value==1&&u==1&&d==1) return Q+=12;
657 else if(s_value==1&&u==2&&d==0) return Q+=13;
658 else if(s_value==2&&u==0&&d==1) return Q+=14;
659 else if(s_value==2&&u==1&&d==0) return Q+=15;
660 else
661 {
662#ifdef debug
663 G4cout<<"**G4QPDGCode::MakeQCode:(8) Unknown in Q-System code:"<<PDGCode<<G4endl;
664#endif
665 return -2;
666 }
667 }
668 else
669 {
670 if (s_value==0&&u==-1&&d== 1) return Q+=1;
671 else if(s_value==0&&u== 0&&d== 0) return Q+=2;
672 else if(s_value==0&&u== 1&&d==-1) return Q+=3;
673 else if(s_value==1&&u==-1&&d== 0) return Q+=4;
674 else if(s_value==1&&u== 0&&d==-1) return Q+=5;
675 else if(s_value==2&&u==-2&&d== 0) return Q+=6;
676 else if(s_value==2&&u==-1&&d==-1) return Q+=7;
677 else if(s_value==2&&u== 0&&d==-2) return Q+=8;
678 else
679 {
680#ifdef debug
681 G4cout<<"**G4QPDGCode::MakeQCode:(9) Unknown in Q-System code:"<<PDGCode<<G4endl;
682#endif
683 return -2;
684 }
685 }
686 }
687 }
688 G4cout<<"*Warning*G4QPDGCode::MakeQCode:() Unknown Q Code for PDG = "<<PDGCode<<G4endl;
689 return -2; //not reachable statement (fake, only for compiler)
690}
691
692// Get the mean mass value for the PDG
694{
695 G4int ab=theQCode;
696#ifdef pdebug
697 G4bool pPrint = thePDGCode == 3222 || ab == 25;
698 if(pPrint)
699 G4cout<<"G4QPDGCode::GetMass: Mass for Q="<<ab<<",PDG="<<thePDGCode<<",N="<<nQHM<<G4endl;
700#endif
701 if ( (ab < 0 && thePDGCode < 80000000) || !thePDGCode) {
702#ifdef pdebug
703 if(thePDGCode!=10 && pPrint)
704 G4cout<<"**G4QPDGCode::GetMass:m=100000.,QC="<<theQCode<<",PDG="<<thePDGCode<<G4endl;
705#endif
706 return 100000.;
707 }
708 else if(ab>-1 && ab<nQHM)
709 {
710 G4double mass = QHaM(ab);
711#ifdef pdebug
712 //if(pPrint)
713 if(thePDGCode == 3222 || ab == 25)
714 G4cout<<"G4QPDGCode::GetMa:m="<<mass<<",Q="<<theQCode<<",PDG="<<thePDGCode<<G4endl;
715#endif
716 return mass; // Get mass from the table
717 }
718 //if(szn==0) return m[15]; // @@ mPi0 @@ MK ?
719 if(thePDGCode==90000000)
720 {
721#ifdef pdebug
722 if(pPrint)
723 G4cout<<"G4QPDGCode::GetMass:***m=0, QC="<<theQCode<<",PDG="<<thePDGCode<<G4endl;
724#endif
725 return 0.;
726 }
727 G4int s_value=0;
728 G4int z=0;
729 G4int n=0;
730 ConvertPDGToZNS(thePDGCode, z, n, s_value);
731 G4double m_value=GetNuclMass(z,n,s_value);
732#ifdef pdebug
733 if(pPrint)
734 G4cout<<"G4QPDG::GetM:PDG="<<thePDGCode<<"=>Z="<<z<<",N="<<n<<",S="<<s_value<<",M="<<m_value<<G4endl;
735#endif
736 return m_value;
737}
738
739// Get the width value for the PDG
741{
742 //static const int nW = 72;
743 //static const int nW = 80; // "Isobars"
744 //static G4double width[nQHM] = {0.,0.,0.,0.,0.,0.,0.,2.495,2.118,10.
745 // , 10., 800., 75., 350., 0., 0., .00118, 0., 0., .203
746 // , 0., 0., 0., 0., 0., 0., 0., 0., 160., 160.
747 // , 8.41, 50.5, 50.8, 4.43, 120., 120., 120., 120., 15.6, 39.
748 // , 36., 35.8, 10., 9., 0., 107., 107., 185.5, 109., 98.5
749 // , 76., 130., 130., 80., 120., 120., 120., 20., 20., 160.
750 // , 160., 168., 159., 159., 87., 300., 300., 300., 300., 200.
751 // , 180., 180., 180., 99., 99., 55., 387., 387., 208., 198.
752 // , 198., 149., 120., 120., 170., 170., 120., 120., 170., 170.};
753 // Reduced:
754 static G4double width[nQHM] = {0.,0.,0.,0.,0.,0.,0.,2.495,2.118,10.
755 , 10., 800., 75., 350., 0., 0., .00118, 0., 0., .203
756 , 0., 0., 0., 0., 0., 0., 0., 0., 160., 160.
757 , 8.41, 50.5, 50.8, 4.43, 120., 120., 120., 120., 15.6, 39.
758 , 36., 35.8, 10., 9., 0., 120., 120., 170., 170., 120.
759 , 120., 170., 170.};
760 G4int ab=abs(theQCode);
761 if(ab<nQHM) return width[ab];
762 return 0.; // @@ May be real width should be implemented for nuclei e.g. pp
763}
764
765// Get a nuclear mass for Z (a#of protons), N (a#of neutrons), & S (a#of lambdas)
767{
768 static const G4double anb = .01; // Antibinding for Ksi-n,Sig-n,Sig+p,Sig-nn,
769 static const G4double mNeut= QHaM(20);
770 static const G4double mProt= QHaM(21);
771 static const G4double mLamb= QHaM(22);
772 static const G4double mPiC = QHaM(15);
773 static const G4double mKZ = QHaM(17);
774 static const G4double mKM = QHaM(18);
775 static const G4double mSiM = QHaM(23);
776 static const G4double mSiP = QHaM(25);
777 static const G4double mKsZ = QHaM(27);
778 static const G4double mKsM = QHaM(26);
779 static const G4double mOmM = QHaM(44);
780 static const G4double mKZa = mKZ +anb;
781 static const G4double mKMa = mKM +anb;
782 static const G4double mSigM= mSiM+anb;
783 static const G4double mSigP= mSiP+anb;
784 static const G4double mKsiZ= mKsZ+anb;
785 static const G4double mKsiM= mKsM+anb;
786 static const G4double mOmeg= mOmM+anb;
787 static const G4double mDiPi= mPiC+mPiC+anb;
788 static const G4double mDiKZ= mKZa+mKZ;
789 static const G4double mDiKM= mKMa+mKM;
790 static const G4double mDiPr= mProt+mProt;
791 static const G4double mDiNt= mNeut+mNeut;
792 static const G4double mSmPi= mSiM+mDiPi;
793 static const G4double mSpPi= mSiP+mDiPi;
794 static const G4double mOmN = mOmeg+mNeut;
795 static const G4double mSpP = mSigP+mProt;
796 static const G4double mSpPP= mSpP +mProt;
797 static const G4double mSmN = mSigM+mNeut;
798 static const G4double mSmNN= mSmN +mNeut;
799 // -------------- DAM Arrays ----------------------
800 static const G4int iNR=76; // Neutron maximum range for each Z
801 static const G4int nEl = 105; // Maximum Z of the associative memory is "nEl-1=104"
802 static const G4int iNF[nEl]={0,0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 14
803 1 , 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, // 29
804 16 , 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 44
805 31 , 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 53, 54, 55, // 59
806 56 , 56, 57, 57, 58, 60, 61, 63, 64, 65, 66, 67, 68, 69, 70, // 74
807 71 , 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, // 89
808 86 , 87, 88, 89, 91, 94, 98,103,109,115,122,128,134,140,146};//104
809#ifdef qdebug
810 static G4int iNmin[nEl]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 14
811 1 , 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, // 29
812 16 , 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, // 44
813 31 , 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 53, 54, 55, // 59
814 56 , 56, 57, 57, 58, 60, 61, 63, 64, 65, 66, 67, 68, 69, 70, // 74
815 71 , 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, // 89
816 86 , 87, 88, 89, 91, 94, 98,103,109,115,122,128,134,140,146};//104
817 static G4int iNmax=iNR;
818 static G4int iNran[nEl]={19,20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, // 14
819 34 , 35, 36, 37, 38, 39, 40, 48, 48, 48, 48, 50, 50, 50, 52, // 29
820 53 , 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, // 44
821 68 , 69, 70, 70, 70, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, // 59
822 73 , 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 76, // 74
823 76 , 76, 76, 76, 76, 75, 74, 73, 72, 71, 70, 70, 69, 69, 69, // 89
824 68 , 68, 68, 67, 63, 59, 55, 51, 47, 43, 39, 35, 31, 27, 23};//104
825#endif
826 static const G4int iNL[nEl]={19,20,21,22,23,24, 25, 26, 27, 28, 29, 30, 31, 32, 33, // 14
827 34 , 35, 36, 37, 38, 39, 40, 48, 48, 48, 48, 50, 50, 50, 52, // 29
828 53 , 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, // 44
829 68 , 69, 70, 70, 70, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, // 59
830 73 , 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 76, // 74
831 76 , 76, 76, 76, 76, 75, 74, 73, 72, 71, 70, 70, 69, 69, 69, // 89
832 68 , 68, 68, 67, 63, 59, 55, 51, 47, 43, 39, 35, 31, 27, 23};//104
833 // ********* S=-4 vectors *************
834 static G4bool iNin6[nEl]={false,false,false,false,false,false,false,
835 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
836 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
837 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
838 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
839 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
840 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
841 false,false,false,false,false,false,false,false,false,false,false,false,false,false};
842 static G4double VZ6[nEl][iNR];
843 //********* S=-3 vectors *************
844 static G4bool iNin7[nEl]={false,false,false,false,false,false,false,
845 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
846 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
847 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
848 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
849 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
850 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
851 false,false,false,false,false,false,false,false,false,false,false,false,false,false};
852 static G4double VZ7[nEl][iNR];
853 // ********* S=-2 vectors *************
854 static G4bool iNin8[nEl]={false,false,false,false,false,false,false,
855 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
856 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
857 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
858 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
859 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
860 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
861 false,false,false,false,false,false,false,false,false,false,false,false,false,false};
862 static G4double VZ8[nEl][iNR];
863 // ********* S=-1 vectors *************
864 static G4bool iNin9[nEl]={false,false,false,false,false,false,false,
865 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
866 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
867 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
868 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
869 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
870 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
871 false,false,false,false,false,false,false,false,false,false,false,false,false,false};
872 static G4double VZ9[nEl][iNR];
873 // ********* S=0 vectors *************
874 static G4bool iNin0[nEl]={false,false,false,false,false,false,false,
875 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
876 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
877 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
878 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
879 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
880 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
881 false,false,false,false,false,false,false,false,false,false,false,false,false,false};
882 static G4double VZ0[nEl][iNR];
883 // ********* S=1 vectors *************
884 static G4bool iNin1[nEl]={false,false,false,false,false,false,false,
885 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
886 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
887 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
888 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
889 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
890 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
891 false,false,false,false,false,false,false,false,false,false,false,false,false,false};
892 static G4double VZ1[nEl][iNR];
893 // ********* S=2 vectors *************
894 static G4bool iNin2[nEl]={false,false,false,false,false,false,false,
895 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
896 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
897 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
898 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
899 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
900 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
901 false,false,false,false,false,false,false,false,false,false,false,false,false,false};
902 static G4double VZ2[nEl][iNR];
903 // ********* S=3 vectors *************
904 static G4bool iNin3[nEl]={false,false,false,false,false,false,false,
905 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
906 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
907 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
908 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
909 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
910 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
911 false,false,false,false,false,false,false,false,false,false,false,false,false,false};
912 static G4double VZ3[nEl][iNR];
913 // ********* S=2 vectors *************
914 static G4bool iNin4[nEl]={false,false,false,false,false,false,false,
915 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
916 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
917 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
918 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
919 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
920 false,false,false,false,false,false,false,false,false,false,false,false,false,false,
921 false,false,false,false,false,false,false,false,false,false,false,false,false,false};
922 static G4double VZ4[nEl][iNR];
923 //
924#ifdef qdebug
925 static G4int Smin=-1; // Dynamic Associated memory is implemented for S>-2 nuclei
926 static G4int Smax= 2; // Dynamic Associated memory is implemented for S< 3 nuclei
927 static G4int NZmin= 0; // Dynamic Associated memory is implemented for Z>-1 nuclei
928 static G4int NNmin= 0; // Dynamic Associated memory is implemented for N>-1 nuclei
929 static G4int NZS1max= 0; // Dynamic Associated memory is implemented for S<3, Z=-1, N<2
930 static G4int NNS1max= 0; // Dynamic Associated memory is implemented for S<3, Z=-1, N<2
931#endif
932 // -------------------------------------------------------------------------------------
933 G4double rm=0.;
934 G4int nz=n+z;
935 G4int zns=nz+s_value;
936 if(nz+s_value<0)
937 {
938 z=-z;
939 n=-n;
940 s_value=-s_value;
941 nz=-nz;
942 zns=-zns;
943 }
944 if(z<0)
945 {
946 if(z==-1)
947 {
948 if(!s_value)
949 {
950 if(n==1) return mPiC; // pi-
951 else return mPiC+(n-1)*mNeut; // Delta- + (N-1)*n
952 }
953 else if(s_value==1) // Strange negative hadron
954 {
955 if(!n) return mKM; // K-
956 else if(n==1) return mSiM; // Sigma-
957 else if(n==2) return mSmN ; // Sigma- + n DiBaryon
958 else if(n==3) return mSmNN; // Sigma- +2n TriBaryon
959 else return mSigM+mNeut*(n-1); // Sigma- + (N-1)*n
960 }
961 else if(s_value==2) // --> Double-strange negative hadrons
962 {
963 if(!n) return mKsM; // Ksi-
964 else if(n==1) return mKsiM+mNeut; // Ksi- + n
965 else if(n==2) return mKsiM+mNeut+mNeut; // Ksi- + 2n
966 else return mKsiM+mNeut*n; // Ksi- + Z*n
967 }
968 else if(s_value==-2)
969 {
970 if (nz==2) return mDiKZ+mPiC; // 2K0 + Pi-
971 else return mDiKZ+mPiC+(nz-2)*mProt;
972 }
973 else if(s_value==3) // --> Triple-strange negative hadrons
974 {
975 if (n==-1) return mOmM; // Triple-strange Omega minus
976 else if(!n ) return mOmN; // Triple-strange (Omega-) + n DiBaryon
977 else if(n==-2) return mDiKZ+mKM; // Triple-strange K- + 2*K0
978 else return mOmeg+mNeut*(n+2);
979 }
980 else if(s_value==4)
981 {
982 if(n==-2) return mOmeg+mKM; // Omega- + K-
983 else if(n==-1) return mOmeg+mLamb;// Omega- + Lambda
984 else return mOmeg+mLamb+(n+1)*mNeut; // Omega- + Lambda + (n+1)*Neutrons
985 }
986 else if(!n) return mOmeg+(s_value-2)*mLamb; // Multy-Lambda + Omega minus
987 else
988 {
989#ifdef qdebug
990 if(s_value>NZS1max)
991 {
992 NZS1max=s_value;
993 G4cout<<"-------->>G4QPDGCode::GetNucMass: Z=-1, S="<<s_value<<">2 with N="<<n<<G4endl;
994 }
995#endif
996 return CalculateNuclMass(z,n,s_value);
997 }
998 }
999 else if(!s_value)
1000 {
1001 if(!nz)
1002 {
1003 if(n==2) return mDiPi;
1004 else return mDiPi+(n-2)*mPiC;
1005 }
1006 else return mNeut*nz-z*mPiC+anb;
1007 }
1008 else if(!zns) // !!! s=0 is treated above !!
1009 {
1010 if(s_value>0) return anb+s_value*mKM+n*mPiC; // s*K- + n*Pi-
1011 else return anb-s_value*mKZ-z*mPiC; // (-s)*aK0 + (-z)*Pi-
1012 }
1013 else if(s_value==1)
1014 {
1015 if(!nz)
1016 {
1017 if(n==2) return mSmPi;
1018 else return mSmPi+(n-2)*mPiC;
1019 }
1020 else return mSigM+nz*mNeut-(z+1)*mPiC;
1021 }
1022 else if(s_value==-1) return mKZa-z*mPiC+(nz-1)*mNeut; // aK0+(nz-1)n+(-z)*Pi-
1023 else if(s_value==2)
1024 {
1025 if (nz==-1) return mKsiM+n*mPiC;
1026 else if(!nz) return mKsiM+mNeut-(z+1)*mPiC;
1027 else return mKsiM+(nz+1)*mNeut-(z+1)*mPiC;
1028 }
1029 else if(s_value==-2) return mDiKZ-z*mPiC+(nz-2)*mNeut;
1030 else if(s_value==3)
1031 {
1032 if (nz==-2) return mOmeg+(n+1)*mPiC; // Omega- + (n+1)* Pi-
1033 else if(nz==-1) return mOmeg+mNeut+n*mPiC; // Omega- + n * Pi-
1034 else if(!nz) return mOmeg+mDiNt+(n-1)*mPiC; // Omega- + 2N + (n-1)*Pi-
1035 else return mOmeg+(nz+2)*mProt-(z+1)*mPiC;
1036 }
1037 else if(s_value<-2) return anb-s_value*mKZ-z*mPiC+(nz+s_value)*mNeut;
1038 else if(s_value==4)
1039 {
1040 if (nz==-3) return mOmeg+mKM+(n+1)*mPiC; // Om- + K- + (n+1)*Pi-
1041 else if(nz==-2) return mOmeg+mSigM+n*mPiC; // Om- + Sig- + n*Pi-
1042 else if(nz==-1) return mOmeg+mSigM+mNeut+(n-1)*mPiC;//Om- + Sig- +N +(n-1)*Pi-
1043 else if(!nz) return mOmeg+mSigM+mDiNt+(n-2)*mPiC;//Om- +Sig- +2N +(n-2)*Pi-
1044 else return mOmeg+mSigM+(nz+2)*mDiNt-(z+2)*mPiC;//+(nz+2)N-(z+2)Pi-
1045 }
1046 // s=5: 2*K-, Ksi-; s=6: 3*K-, Omega-; s>6 adds K- and Sigma- instead of Protons
1047 else // !!All s<0 are done and s>4 can be easy extended if appear!!
1048 {
1049#ifdef qdebug
1050 if(z<NZmin)
1051 {
1052 NZmin=z;
1053 G4cout<<"---->>G4QPDGCode::GetNucMass: Z="<<z<<"<-1 with N="<<n<<", S="<<s_value<<G4endl;
1054 }
1055#endif
1056 return CalculateNuclMass(z,n,s_value);
1057 }
1058 }
1059 else if(n<0)
1060 {
1061 if(n==-1)
1062 {
1063 if(!s_value)
1064 {
1065 if(z==1) return mPiC; // pi+
1066 else return mPiC+(z-1)*mProt; // Delta++ + (Z-1)*p
1067 }
1068 else if(s_value==1) // --> Strange neutral hadrons
1069 {
1070 if(!z) return mKZ; // K0
1071 else if(z==1) return mSiP; // Sigma+
1072 else if(z==2) return mSpP ; // Sigma+ + p DiBaryon
1073 else if(z==3) return mSpPP; // Sigma+ +2p TriBaryon
1074 else return mSigP+mProt*(z-1); // Sigma+ + (Z-1)*p
1075 }
1076 else if(s_value==2) // --> Double-strange negative hadrons
1077 {
1078 if(!z) return mKsZ; // Ksi0
1079 else if(z==1) return mKsiZ+mProt; // Ksi- + p
1080 else if(z==2) return mKsiZ+mProt+mProt; // Ksi- + 2p
1081 else return mKsiZ+mProt*z; // Ksi- + Z*p
1082 }
1083 else if(s_value==-2)
1084 {
1085 if (nz==2) return mDiKM+mPiC; // 2K+ + Pi+
1086 else return mDiKM+mPiC+(nz-2)*mProt;
1087 }
1088 else if(s_value==3)
1089 {
1090 if(z==1) return mOmeg+mDiPr;
1091 else return mOmeg+(z+1)*mProt;
1092 }
1093 else if(s_value==4) return mOmeg+mLamb+(z+1)*mProt;
1094 else if(!z) return mKZa+(s_value-1)*mLamb; // Multy-Lambda + K0
1095 else
1096 {
1097#ifdef qdebug
1098 if(s_value>NNS1max)
1099 {
1100 NNS1max=s_value;
1101 G4cout<<"-------->>G4QPDGCode::GetNucMass: N=-1, S="<<s_value<<">2 with Z="<<z<<G4endl;
1102 }
1103#endif
1104 return CalculateNuclMass(z,n,s_value);
1105 }
1106 }
1107 else if(!s_value)
1108 {
1109 if(!nz)
1110 {
1111 if(z==2) return mDiPi;
1112 else return mDiPi+(z-2)*mPiC;
1113 }
1114 else return mProt*nz-n*mPiC+anb;
1115 }
1116 else if(!zns) // !!! s=0 is treated above !!
1117 {
1118 if(s_value>0) return anb+s_value*mKZ+z*mPiC; // s*K0 + n*Pi+
1119 else return anb-s_value*mKM-n*mPiC; // (-s)*aK+ + (-n)*Pi+
1120 }
1121 else if(s_value==1)
1122 {
1123 if(!nz)
1124 {
1125 if(z==2) return mSpPi;
1126 else return mSpPi+(z-2)*mPiC;
1127 }
1128 else return mSigP+nz*mProt-(n+1)*mPiC;
1129 }
1130 else if(s_value==-1) return mKMa-n*mPiC+(nz-1)*mProt; // K+ + (nz-1)*P + (-n)*Pi+
1131 else if(s_value==2)
1132 {
1133 if (nz==-1) return mKsiZ+z*mPiC;
1134 else if(!nz) return mKsiZ+mProt-(n+1)*mPiC;
1135 else return mKsiZ+(nz+1)*mProt-(n+1)*mPiC;
1136 }
1137 else if(s_value==-2) return mDiKM-n*mPiC+(nz-2)*mProt;
1138 else if(s_value==3)
1139 {
1140 if (nz==-2) return mOmeg+(z+1)*mPiC; // Omega + (z+1)*Pi+
1141 else if(nz==-1) return mOmeg+mProt+z*mPiC; // Omega- + P +z*Pi+
1142 else if(!nz) return mOmeg+mDiPr+(z-1)*mPiC; // Omega- + 2P + (z-1)* Pi+
1143 else return mOmeg+(nz+2)*mProt-(n+1)*mPiC;
1144 }
1145 else if(s_value<-2) return anb-s_value*mKM-n*mPiC+(nz+s_value)*mProt;
1146 else if(s_value==4)
1147 {
1148 if (nz==-3) return mOmeg+mKZ+(z+1)*mPiC; // Om- + K0 + (z+1)*Pi+
1149 else if(nz==-2) return mOmeg+mSigP+z*mPiC; // Om- + Sig+ + z*Pi+
1150 else if(nz==-1) return mOmeg+mSigP+mProt+(z-1)*mPiC;// Om- +Sig+ +P +(z-1)*Pi+
1151 else if(!nz) return mOmeg+mSigP+mDiPr+(z-2)*mPiC;//Om- +Sig+ +2P +(z-2)*Pi+
1152 else return mOmeg+mSigP+(nz+2)*mProt-(n+2)*mPiC;//+(nz+2)P-(n+2)Pi+
1153 }
1154 // s=5: 2*KZ, Ksi0; s=6: 3*KZ, Omega-; s>6 adds K0 and Sigma+ instead of Protons
1155 else // !!All s<0 are done and s>4 can be easy extended if appear!!
1156 {
1157#ifdef qdebug
1158 if(n<NNmin)
1159 {
1160 NNmin=n;
1161 G4cout<<"---->>G4QPDGCode::GetNucMass: N="<<n<<"<-1 with Z="<<z<<", S="<<s_value<<G4endl;
1162 }
1163#endif
1164 return CalculateNuclMass(z,n,s_value);
1165 }
1166 }
1167 //return CalculateNuclMass(z,n,s_value); // @@ This is just to compare the calculation time @@
1168 if(nz >= 256 || z >= nEl) return 256000.;
1169 if(!s_value) // **************> S=0 nucleus
1170 {
1171 G4int Nmin=iNF[z]; // Minimun N(Z) for the Dynamic Associative Memory (DAM)
1172 if(!iNin0[z]) // =--=> This element is already initialized
1173 {
1174#ifdef idebug
1175 G4cout<<"**>G4QPDGCode::GetNucM:Z="<<z<<", S=0 is initialized. F="<<iNin0[z]<<G4endl;
1176#endif
1177 G4int iNfin=iNL[z];
1178 if(iNfin>iNR) iNfin=iNR;
1179 for (G4int in=0; in<iNfin; in++) VZ0[z][in] = CalculateNuclMass(z,in+Nmin,s_value);
1180 iNin0[z]=true;
1181 }
1182 G4int dNn=n-Nmin;
1183 if(dNn<0) // --> The minimum N must be reduced
1184 {
1185#ifdef qdebug
1186 if(n<iNmin[z])
1187 {
1188 G4cout<<"-->>G4QPDGCode::GetNucM:Z="<<z<<", S=0 with N="<<n<<"<"<<iNmin[z]<<G4endl;
1189 iNmin[z]=n;
1190 }
1191#endif
1192 return CalculateNuclMass(z,n,s_value);
1193 }
1194 else if(dNn<iNL[z]) return VZ0[z][dNn]; // Found in DAM
1195 else // --> The maximum N must be increased
1196 {
1197#ifdef qdebug
1198 if(dNn>iNmax)
1199 {
1200 G4cout<<"**>>G4QPDGCode::GetNucM:Z="<<z<<", S=0 with dN="<<dNn<<">"<<iNmax<<G4endl;
1201 iNmax=dNn;
1202 }
1203 if(dNn>iNran[z])
1204 {
1205 G4cout<<">G4QPDGCode::GetNucM:Z="<<z<<", S=0 with dN="<<dNn<<">"<<iNran[z]<<G4endl;
1206 iNran[z]=dNn;
1207 }
1208#endif
1209 return CalculateNuclMass(z,n,s_value);
1210 }
1211 }
1212 else if(s_value==1) // ******************> S=1 nucleus
1213 {
1214 G4int Nmin=iNF[z]; // Minimun N(Z) for the Dynamic Associative Memory (DAM)
1215#ifdef pdebug
1216 G4bool pPrint = !z && !n;
1217 if(pPrint)
1218 G4cout<<"G4QPDGC::GetNucM:Nmin="<<Nmin<<",iNin1="<<iNin1[0]<<",iNL="<<iNL[0]<<G4endl;
1219#endif
1220 if(!iNin1[z]) // =--=> This element is already initialized
1221 {
1222#ifdef pdebug
1223 if(pPrint)
1224 G4cout<<"**>G4QPDGCode::GetNucM:Z="<<z<<", S=1 is initialized. F="<<iNin1[z]<<G4endl;
1225#endif
1226 G4int iNfin=iNL[z];
1227 if(iNfin>iNR) iNfin=iNR;
1228 for (G4int in=0; in<iNfin; in++) VZ1[z][in] = CalculateNuclMass(z,in+Nmin,s_value);
1229 iNin1[z]=true;
1230 }
1231 G4int dNn=n-Nmin;
1232 if(dNn<0) // --> The minimum N must be reduced
1233 {
1234#ifdef qdebug
1235 if(n<iNmin[z])
1236 {
1237 G4cout<<"-->>G4QPDGCode::GetNucM:Z="<<z<<", S=1 with N="<<n<<"<"<<iNmin[z]<<G4endl;
1238 iNmin[z]=n;
1239 }
1240#endif
1241 return CalculateNuclMass(z,n,s_value);
1242 }
1243 else if(dNn<iNL[z]) return VZ1[z][dNn]; // Found in DAM
1244 else // --> The maximum N must be increased
1245 {
1246#ifdef qdebug
1247 if(dNn>iNmax)
1248 {
1249 G4cout<<"**>>G4QPDGCode::GetNucM:Z="<<z<<", S=1 with dN="<<dNn<<">"<<iNmax<<G4endl;
1250 iNmax=dNn;
1251 }
1252 if(dNn>iNran[z])
1253 {
1254 G4cout<<">G4QPDGCode::GetNucM:Z="<<z<<", S=1 with dN="<<dNn<<">"<<iNran[z]<<G4endl;
1255 iNran[z]=dNn;
1256 }
1257#endif
1258 return CalculateNuclMass(z,n,s_value);
1259 }
1260 }
1261 else if(s_value==-1) // ******************> S=-1 nucleus
1262 {
1263 G4int Nmin=iNF[z]; // Minimun N(Z) for the Dynamic Associative Memory (DAM)
1264 if(!iNin9[z]) // =--=> This element is already initialized
1265 {
1266#ifdef idebug
1267 G4cout<<"*>G4QPDGCode::GetNucM:Z="<<z<<", S=-1 is initialized. F="<<iNin9[z]<<G4endl;
1268#endif
1269 G4int iNfin=iNL[z];
1270 if(iNfin>iNR) iNfin=iNR;
1271 for (G4int in=0; in<iNfin; in++) VZ9[z][in] = CalculateNuclMass(z,in+Nmin,s_value);
1272 iNin9[z]=true;
1273 }
1274 G4int dNn=n-Nmin;
1275 if(dNn<0) // --> The minimum N must be reduced
1276 {
1277#ifdef qdebug
1278 if(n<iNmin[z])
1279 {
1280 G4cout<<"->>G4QPDGCode::GetNucM:Z="<<z<<" ,S=-1 with N="<<n<<"<"<<iNmin[z]<<G4endl;
1281 iNmin[z]=n;
1282 }
1283#endif
1284 return CalculateNuclMass(z,n,s_value);
1285 }
1286 else if(dNn<iNL[z]) return VZ9[z][dNn]; // Found in DAM
1287 else // --> The maximum N must be increased
1288 {
1289#ifdef qdebug
1290 if(dNn>iNmax)
1291 {
1292 G4cout<<"**>G4QPDGCode::GetNucM:Z="<<z<<", S=-1 with dN="<<dNn<<">"<<iNmax<<G4endl;
1293 iNmax=dNn;
1294 }
1295 if(dNn>iNran[z])
1296 {
1297 G4cout<<"G4QPDGCode::GetNucM:Z="<<z<<", S=-1 with dN="<<dNn<<">"<<iNran[z]<<G4endl;
1298 iNran[z]=dNn;
1299 }
1300#endif
1301 return CalculateNuclMass(z,n,s_value);
1302 }
1303 }
1304 else if(s_value==2) // ******************> S=2 nucleus
1305 {
1306 G4int Nmin=iNF[z]; // Minimun N(Z) for the Dynamic Associative Memory (DAM)
1307 if(!iNin2[z]) // =--=> This element is already initialized
1308 {
1309#ifdef idebug
1310 G4cout<<"**>G4QPDGCode::GetNucM:Z="<<z<<", S=2 is initialized. F="<<iNin2[z]<<G4endl;
1311#endif
1312 G4int iNfin=iNL[z];
1313 if(iNfin>iNR) iNfin=iNR;
1314 for (G4int in=0; in<iNfin; in++) VZ2[z][in] = CalculateNuclMass(z,in+Nmin,s_value);
1315 iNin2[z]=true;
1316 }
1317 G4int dNn=n-Nmin;
1318 if(dNn<0) // --> The minimum N must be reduced
1319 {
1320#ifdef qdebug
1321 if(n<iNmin[z])
1322 {
1323 G4cout<<"-->>G4QPDGCode::GetNucM:Z="<<z<<", S=2 with N="<<n<<"<"<<iNmin[z]<<G4endl;
1324 iNmin[z]=n;
1325 }
1326#endif
1327 return CalculateNuclMass(z,n,s_value);
1328 }
1329 else if(dNn<iNL[z]) return VZ2[z][dNn]; // Found in DAM
1330 else // --> The maximum N must be increased
1331 {
1332#ifdef qdebug
1333 if(dNn>iNmax)
1334 {
1335 G4cout<<"**>>G4QPDGCode::GetNucM:Z="<<z<<", S=2 with dN="<<dNn<<">"<<iNmax<<G4endl;
1336 iNmax=dNn;
1337 }
1338 if(dNn>iNran[z])
1339 {
1340 G4cout<<">G4QPDGCode::GetNucM:Z="<<z<<", S=2 with dN="<<dNn<<">"<<iNran[z]<<G4endl;
1341 iNran[z]=dNn;
1342 }
1343#endif
1344 return CalculateNuclMass(z,n,s_value);
1345 }
1346 }
1347 else if(s_value==-2) // ******************> S=-2 nucleus
1348 {
1349 G4int Nmin=iNF[z]; // Minimun N(Z) for the Dynamic Associative Memory (DAM)
1350 if(!iNin8[z]) // =--=> This element is already initialized
1351 {
1352#ifdef idebug
1353 G4cout<<"*>G4QPDGCode::GetNucM:Z="<<z<<", S=-2 is initialized. F="<<iNin8[z]<<G4endl;
1354#endif
1355 G4int iNfin=iNL[z];
1356 if(iNfin>iNR) iNfin=iNR;
1357 for (G4int in=0; in<iNfin; in++) VZ8[z][in] = CalculateNuclMass(z,in+Nmin,s_value);
1358 iNin8[z]=true;
1359 }
1360 G4int dNn=n-Nmin;
1361 if(dNn<0) // --> The minimum N must be reduced
1362 {
1363#ifdef qdebug
1364 if(n<iNmin[z])
1365 {
1366 G4cout<<"->>G4QPDGCode::GetNucM:Z="<<z<<", S=-2 with N="<<n<<"<"<<iNmin[z]<<G4endl;
1367 iNmin[z]=n;
1368 }
1369#endif
1370 return CalculateNuclMass(z,n,s_value);
1371 }
1372 else if(dNn<iNL[z]) return VZ8[z][dNn]; // Found in DAM
1373 else // --> The maximum N must be increased
1374 {
1375#ifdef qdebug
1376 if(dNn>iNmax)
1377 {
1378 G4cout<<"**>G4QPDGCode::GetNucM:Z="<<z<<", S=-2 with dN="<<dNn<<">"<<iNmax<<G4endl;
1379 iNmax=dNn;
1380 }
1381 if(dNn>iNran[z])
1382 {
1383 G4cout<<"G4QPDGCode::GetNucM:Z="<<z<<", S=-2 with dN="<<dNn<<">"<<iNran[z]<<G4endl;
1384 iNran[z]=dNn;
1385 }
1386#endif
1387 return CalculateNuclMass(z,n,s_value);
1388 }
1389 }
1390 else if(s_value==-3) // ******************> S=-3 nucleus
1391 {
1392 G4int Nmin=iNF[z]; // Minimun N(Z) for the Dynamic Associative Memory (DAM)
1393 if(!iNin7[z]) // =--=> This element is already initialized
1394 {
1395#ifdef idebug
1396 G4cout<<"*>G4QPDGCode::GetNucM:Z="<<z<<", S=-3 is initialized. F="<<iNin7[z]<<G4endl;
1397#endif
1398 G4int iNfin=iNL[z];
1399 if(iNfin>iNR) iNfin=iNR;
1400 for (G4int in=0; in<iNfin; in++) VZ7[z][in] = CalculateNuclMass(z,in+Nmin,s_value);
1401 iNin7[z]=true;
1402 }
1403 G4int dNn=n-Nmin;
1404 if(dNn<0) // --> The minimum N must be reduced
1405 {
1406#ifdef qdebug
1407 if(n<iNmin[z])
1408 {
1409 G4cout<<"->>G4QPDGCode::GetNucM:Z="<<z<<", S=-3 with N="<<n<<"<"<<iNmin[z]<<G4endl;
1410 iNmin[z]=n;
1411 }
1412#endif
1413 return CalculateNuclMass(z,n,s_value);
1414 }
1415 else if(dNn<iNL[z]) return VZ7[z][dNn]; // Found in DAM
1416 else // --> The maximum N must be increased
1417 {
1418#ifdef qdebug
1419 if(dNn>iNmax)
1420 {
1421 G4cout<<"**>G4QPDGCode::GetNucM:Z="<<z<<", S=-3 with dN="<<dNn<<">"<<iNmax<<G4endl;
1422 iNmax=dNn;
1423 }
1424 if(dNn>iNran[z])
1425 {
1426 G4cout<<"G4QPDGCode::GetNucM:Z="<<z<<", S=-3 with dN="<<dNn<<">"<<iNran[z]<<G4endl;
1427 iNran[z]=dNn;
1428 }
1429#endif
1430 return CalculateNuclMass(z,n,s_value);
1431 }
1432 }
1433 else if(s_value==3) // ******************> S=3 nucleus
1434 {
1435 G4int Nmin=iNF[z]; // Minimun N(Z) for the Dynamic Associative Memory (DAM)
1436 if(!iNin3[z]) // =--=> This element is already initialized
1437 {
1438#ifdef idebug
1439 G4cout<<"**>G4QPDGCode::GetNucM:Z="<<z<<", S=3 is initialized. F="<<iNin3[z]<<G4endl;
1440#endif
1441 G4int iNfin=iNL[z];
1442 if(iNfin>iNR) iNfin=iNR;
1443 for (G4int in=0; in<iNfin; in++) VZ3[z][in] = CalculateNuclMass(z,in+Nmin,s_value);
1444 iNin3[z]=true;
1445 }
1446 G4int dNn=n-Nmin;
1447 if(dNn<0) // --> The minimum N must be reduced
1448 {
1449#ifdef qdebug
1450 if(n<iNmin[z])
1451 {
1452 G4cout<<"-->>G4QPDGCode::GetNucM:Z="<<z<<", S=3 with N="<<n<<"<"<<iNmin[z]<<G4endl;
1453 iNmin[z]=n;
1454 }
1455#endif
1456 return CalculateNuclMass(z,n,s_value);
1457 }
1458 else if(dNn<iNL[z]) return VZ3[z][dNn]; // Found in DAM
1459 else // --> The maximum N must be increased
1460 {
1461#ifdef qdebug
1462 if(dNn>iNmax)
1463 {
1464 G4cout<<"**>>G4QPDGCode::GetNucM:Z="<<z<<", S=3 with dN="<<dNn<<">"<<iNmax<<G4endl;
1465 iNmax=dNn;
1466 }
1467 if(dNn>iNran[z])
1468 {
1469 G4cout<<">G4QPDGCode::GetNucM:Z="<<z<<", S=3 with dN="<<dNn<<">"<<iNran[z]<<G4endl;
1470 iNran[z]=dNn;
1471 }
1472#endif
1473 return CalculateNuclMass(z,n,s_value);
1474 }
1475 }
1476 else if(s_value==-4) // ******************> S=-4 nucleus
1477 {
1478 G4int Nmin=iNF[z]; // Minimun N(Z) for the Dynamic Associative Memory (DAM)
1479 if(!iNin6[z]) // =--=> This element is already initialized
1480 {
1481#ifdef idebug
1482 G4cout<<"*>G4QPDGCode::GetNucM:Z="<<z<<", S=-4 is initialized. F="<<iNin6[z]<<G4endl;
1483#endif
1484 G4int iNfin=iNL[z];
1485 if(iNfin>iNR) iNfin=iNR;
1486 for (G4int in=0; in<iNfin; in++) VZ6[z][in] = CalculateNuclMass(z,in+Nmin,s_value);
1487 iNin6[z]=true;
1488 }
1489 G4int dNn=n-Nmin;
1490 if(dNn<0) // --> The minimum N must be reduced
1491 {
1492#ifdef qdebug
1493 if(n<iNmin[z])
1494 {
1495 G4cout<<"->>G4QPDGCode::GetNucM:Z="<<z<<", S=-4 with N="<<n<<"<"<<iNmin[z]<<G4endl;
1496 iNmin[z]=n;
1497 }
1498#endif
1499 return CalculateNuclMass(z,n,s_value);
1500 }
1501 else if(dNn<iNL[z]) return VZ6[z][dNn]; // Found in DAM
1502 else // --> The maximum N must be increased
1503 {
1504#ifdef qdebug
1505 if(dNn>iNmax)
1506 {
1507 G4cout<<"**>G4QPDGCode::GetNucM:Z="<<z<<", S=-4 with dN="<<dNn<<">"<<iNmax<<G4endl;
1508 iNmax=dNn;
1509 }
1510 if(dNn>iNran[z])
1511 {
1512 G4cout<<"G4QPDGCode::GetNucM:Z="<<z<<", S=-4 with dN="<<dNn<<">"<<iNran[z]<<G4endl;
1513 iNran[z]=dNn;
1514 }
1515#endif
1516 return CalculateNuclMass(z,n,s_value);
1517 }
1518 }
1519 else if(s_value==4) // ******************> S=4 nucleus
1520 {
1521 G4int Nmin=iNF[z]; // Minimun N(Z) for the Dynamic Associative Memory (DAM)
1522 if(!iNin4[z]) // =--=> This element is already initialized
1523 {
1524#ifdef idebug
1525 G4cout<<"*>G4QPDGCode::GetNucM:Z="<<z<<", S=4 is initialized. F="<<iNin4[z]<<G4endl;
1526#endif
1527 G4int iNfin=iNL[z];
1528 if(iNfin>iNR) iNfin=iNR;
1529 for (G4int in=0; in<iNfin; in++) VZ4[z][in] = CalculateNuclMass(z,in+Nmin,s_value);
1530 iNin4[z]=true;
1531 }
1532 G4int dNn=n-Nmin;
1533 if(dNn<0) // --> The minimum N must be reduced
1534 {
1535#ifdef qdebug
1536 if(n<iNmin[z])
1537 {
1538 G4cout<<"-->>G4QPDGCode::GetNucM:Z="<<z<<", S=4 with N="<<n<<"<"<<iNmin[z]<<G4endl;
1539 iNmin[z]=n;
1540 }
1541#endif
1542 return CalculateNuclMass(z,n,s_value);
1543 }
1544 else if(dNn<iNL[z]) return VZ4[z][dNn]; // Found in DAM
1545 else // --> The maximum N must be increased
1546 {
1547#ifdef qdebug
1548 if(dNn>iNmax)
1549 {
1550 G4cout<<"**>>G4QPDGCode::GetNucM:Z="<<z<<", S=4 with dN="<<dNn<<">"<<iNmax<<G4endl;
1551 iNmax=dNn;
1552 }
1553 if(dNn>iNran[z])
1554 {
1555 G4cout<<">G4QPDGCode::GetNucM:Z="<<z<<", S=4 with dN="<<dNn<<">"<<iNran[z]<<G4endl;
1556 iNran[z]=dNn;
1557 }
1558#endif
1559 return CalculateNuclMass(z,n,s_value);
1560 }
1561 }
1562 else
1563 {
1564#ifdef qdebug
1565 if(s_value<Smin || s_value>Smax)
1566 {
1567 if(s_value<Smin) Smin=s_value;
1568 if(s_value>Smax) Smax=s_value;
1569 G4cout<<">>G4QPDGCode::GetNucM:Z="<<z<<" with S="<<s_value<<",N="<<n<<" (Improve)"<<G4endl;
1570 }
1571#endif
1572 rm=CalculateNuclMass(z,n,s_value);
1573 }
1574#ifdef debug
1575 G4cout<<"G4QPDGCode::GetMass:GetNuclMass="<<rm<<",Z="<<z<<",N="<<n<<",S="<<s_value<<G4endl;
1576#endif
1577 return rm;
1578} // End of GetNuclearMass
1579
1580// Calculate a nuclear mass for Z (a#of protons), N (a#of neutrons), & S (a#of lambdas)
1581G4double G4QPDGCode::CalculateNuclMass(G4int z, G4int n, G4int s_value)
1582{
1583 static const G4double mP = QHaM(21); // Proton
1584 static const G4double mN = QHaM(20); // Neutron
1585 static const G4double mL = QHaM(22); // Lambda
1586 static const G4double mD = G4Deuteron::Deuteron()->GetPDGMass(); // Deuteron (H-2)
1587 static const G4double mT = G4Triton::Triton()->GetPDGMass(); // Triton (H-3)
1588 static const G4double mHe3= G4He3::He3()->GetPDGMass(); // Hetrium (He-3)
1589 static const G4double mAl = G4Alpha::Alpha()->GetPDGMass(); // Alpha (He-4)
1590 static const G4double dmP = mP+mP; // DiProton
1591 static const G4double dmN = mN+mN; // DiNeutron
1592 static const G4double dmL = mL+mL; // DiLambda
1593 static const G4double dLN = mL+mN; // LambdaNeutron
1594 static const G4double dLP = mL+mP; // LambdaProton
1595 static const G4double mSm = QHaM(23); // Sigma-
1596 static const G4double mSp = QHaM(25); // Sigma+
1597 static const G4double dSP = mSp+mP; // ProtonSigma+
1598 static const G4double dSN = mSm+mN; // NeutronSigma-
1599 static const G4double dnS = dSN+mN; // 2NeutronsSigma-
1600 static const G4double dpS = dSP+mP; // 2ProtonsSigma+
1601 static const G4double mXm = QHaM(26); // Ksi-
1602 static const G4double mXz = QHaM(27); // Ksi0
1603 static const G4double mOm = QHaM(44); // Omega-
1604 static const G4double dXN = mXm+mN; // NeutronKsi-
1605 static const G4double dXP = mXz+mP; // ProtonKsi0
1606 static const G4double dOP = mOm+mP; // ProtonOmega-
1607 static const G4double dON = mOm+mN; // NeutronOmega-
1608 static const G4double mK = QHaM(18); // Charged Kaon
1609 static const G4double mK0 = QHaM(17); // Neutral Kaon
1610 static const G4double mPi = QHaM(15); // Charged Pion
1611 //////////static const G4double mPi0= QHaM(14);
1612 //static const G4int nSh = 164;
1613 //static G4double sh[nSh] = {0., // Fake element for C++ N=Z=0
1614 // -4.315548, 2.435504, -1.170501, 3.950887, 5.425238,
1615 // 13.342524, 15.547586, 22.583129, 23.983480, 30.561036,
1616 // 33.761971, 41.471027, 45.532156, 53.835880, 58.495514,
1617 // 65.693445, 69.903344, 76.899581, 81.329361, 88.979438,
1618 // 92.908703, 100.316636, 105.013393, 113.081686, 118.622601,
1619 // 126.979113, 132.714435, 141.413182, 146.433488, 153.746754,
1620 // 158.665225, 165.988967, 170.952395, 178.473011, 183.471531,
1621 // 191.231310, 196.504414, 204.617158, 210.251108, 218.373984,
1622 // 223.969281, 232.168660, 237.925619, 246.400505, 252.392471,
1623 // 260.938644, 267.191321, 276.107788, 282.722682, 291.881502,
1624 // 296.998590, 304.236025, 309.562296, 316.928655, 322.240263,
1625 // 329.927236, 335.480630, 343.233705, 348.923475, 356.911659,
1626 // 362.785757, 370.920926, 376.929998, 385.130316, 391.197741,
1627 // 399.451554, 405.679971, 414.101869, 420.346260, 428.832412,
1628 // 435.067445, 443.526983, 449.880034, 458.348602, 464.822352,
1629 // 473.313779, 479.744524, 488.320887, 495.025069, 503.841579,
1630 // 510.716379, 519.451976, 525.036156, 532.388151, 537.899017,
1631 // 545.252264, 550.802469, 558.402181, 564.101100, 571.963429,
1632 // 577.980340, 586.063802, 592.451334, 600.518525, 606.832027,
1633 // 614.831626, 621.205330, 629.237413, 635.489106, 643.434167,
1634 // 649.691284, 657.516479, 663.812101, 671.715021, 678.061128,
1635 // 686.002970, 692.343712, 700.360477, 706.624091, 714.617848,
1636 // 721.100390, 729.294717, 735.887170, 744.216084, 751.017094,
1637 // 759.551764, 766.377807, 775.080204, 781.965673, 790.552795,
1638 // 797.572494, 806.088030, 813.158751, 821.655631, 828.867137,
1639 // 836.860955, 842.183292, 849.195302, 854.731798, 861.898839,
1640 // 867.783606, 875.313342, 881.443441, 889.189065, 895.680189,
1641 // 903.679729, 910.368085, 918.579876, 925.543547, 933.790028,
1642 // 940.811396, 949.122548, 956.170201, 964.466810, 971.516490,
1643 // 979.766905, 986.844659, 995.113552,1002.212760,1010.418770,
1644 // 1018.302560,1025.781870,1033.263560,1040.747880,1048.234460,
1645 // 1055.723430,1063.214780,1070.708750,1078.204870,1085.703370,
1646 // 1093.204260,1100.707530,1108.213070};
1647 //static const G4double b1=8.09748564; // MeV
1648 //static const G4double b2=-0.76277387;
1649 //static const G4double b3=83.487332; // MeV
1650 //static const G4double b4=0.090578206;// 2*b4
1651 //static const G4double b5=0.676377211;// MeV
1652 //static const G4double b6=5.55231981; // MeV
1653 static const G4double b7=25.; // MeV (Lambda binding energy predexponent)
1654 // --- even-odd difference is 3.7(MeV)/X
1655 // --- S(X>151)=-57.56-5.542*X**1.05
1656 static const G4double b8=10.5; // (Lambda binding energy exponent)
1657 //static const G4double b9=-1./3.;
1658 static const G4double a2=0.13; // LambdaBindingEnergy for deutron+LambdaSystem(MeV)
1659 static const G4double a3=2.2; // LambdaBindingEnergy for (t/He3)+LambdaSystem(MeV)
1660 static const G4double um_value=931.49432; // Umified atomic mass unit (MeV)
1661 //static const G4double me =0.511; // electron mass (MeV) :: n:8.071, p:7.289
1662 static const G4double eps =0.0001; // security addition for multybaryons
1663 //static G4double c[9][9]={// z=1 =2 =3 =4 =5 =6 =7 =8 =9
1664 // {13.136,14.931,25.320,38.000,45.000,55.000,65.000,75.000,85.000},//n=1
1665 // {14.950, 2.425,11.680,18.374,27.870,35.094,48.000,60.000,72.000}, //n=2
1666 // {25.930,11.390,14.086,15.770,22.921,28.914,39.700,49.000,60.000}, //n=3
1667 // {36.830,17.594,14.908, 4.942,12.416,15.699,24.960,32.048,45.000}, //n=4
1668 // {41.860,26.110,20.946,11.348,12.051,10.650,17.338,23.111,33.610}, //n=5
1669 // {45.000,31.598,24.954,12.607, 8.668, 0.000, 5.345, 8.006,16.780}, //n=6
1670 // {50.000,40.820,33.050,20.174,13.369, 3.125, 2.863, 2.855,10.680}, //n=7
1671 // {55.000,48.810,40.796,25.076,16.562, 3.020, 0.101,-4.737,1.9520}, //n=8
1672 // {60.000,55.000,50.100,33.660,23.664, 9.873, 5.683,-0.809,0.8730}}; //n=9
1673 if(z>107)
1674 {
1675#ifdef debug
1676 G4cout<<"***G4QPDGCode::CalcNuclMass: Z="<<z<<">107, N="<<n<<", S="<<s_value<<G4endl;
1677#endif
1678 return 256000.;
1679 }
1680 G4int Z=z;
1681 G4int N=n;
1682 G4int S=s_value;
1683#ifdef debug
1684 G4cout<<"G4QPDGCode::CalcNuclMass called with Z="<<Z<<",N="<<N<<", S="<<S<<G4endl;
1685#endif
1686 if(!N&&!Z&&!S)
1687 {
1688#ifdef debug
1689 //G4cout<<"G4QPDGCode::GetNuclMass(0,0,0)="<<mPi0<<"#0"<<G4endl;
1690#endif
1691 //return mPi0; // Pi0 mass (dangerose)
1692 return 0.; // Photon mass
1693 }
1694 else if(!N&&!Z&&S==1) return mL;
1695 else if(!N&&Z==1&&!S) return mP;
1696 else if(N==1&&!Z&&!S) return mN;
1697 else if(!N&&!Z&&S>1) return mL*S+eps;
1698 else if(!N&&Z>1&&!S) return mP*Z+eps;
1699 else if(N>1&&!Z&&!S) return mN*N+eps;
1700 G4int A=Z+N;
1701 G4int Bn=A+S;
1702 //if((Z<0||N<0)&&!Bn)
1703 //{
1704 // if (N<0) return Bn*mL-Z*mK - N*mK0+eps* S ;
1705 // else return Bn*mL+N*mPi-A*mK +eps*(N+S);
1706 //}
1707 //if(A<0&&Bn>=0) // Bn*LAMBDA's + (-(N+Z))*antiKaons
1708 //{
1709 // if (N<0&&Z<0) return Bn*mL-Z*mK -N*mK0+eps* S ;
1710 // else if(N<0) return Bn*mL+Z*mPi-A*mK0+eps*(Z+S);
1711 // else return Bn*mL+N*mPi-A*mK +eps*(N+S);
1712 //}
1713 if(!Bn) // => "GS Mesons - octet" case (without eta&pi0)
1714 {
1715 if (!S&&Z<0) return mPi*N;
1716 else if(!S&&N<0) return mPi*Z;
1717 else if ( (N == 1 && S == -1) || (N == -1 && S == 1) )
1718 return mK0; // Simple decision
1719 else if ( (S == 1 && Z == -1) || (S == -1 && Z == 1) )
1720 return mK; // Simple decision
1721 else if(S>0) // General decision
1722 {
1723 if (-Z>S) return S*mK-(S+Z)*mPi+eps;
1724 else if(Z>=0) return S*mK0+Z*mPi+eps;
1725 else return (S+Z)*mK0-Z*mK+eps;
1726 }
1727 else if(S<0) // General decision
1728 {
1729 if (Z>-S) return -S*mK+(S+Z)*mPi+eps;
1730 else if(Z<=0) return -S*mK0-Z*mPi+eps;
1731 else return -(S+Z)*mK0+Z*mK+eps;
1732 }
1733 }
1734 else if(Bn==1) // => "GS Baryons - octet" case (withoutSigma0)
1735 {
1736 if (Z== 1 && N== 0 && S== 0) return mP;
1737 else if(Z== 0 && N== 1 && S== 0) return mN;
1738 else if(Z== 0 && N== 0 && S== 1) return mL;
1739 else if(Z== 1 && N==-1 && S== 1) return mSp; // Lower than Sigma+ (Simp.Decis)
1740 else if(Z==-1 && N== 1 && S== 1) return mSm; // Lower than Sigma- (Simp.Decis)
1741 else if(Z== 0 && N==-1 && S== 2) return mXz; // Lower than Xi0 (Simp.Decis)
1742 else if(Z==-1 && N== 0 && S== 2) return mXm; // Lower than Xi- (Simp.Decis)
1743 else if(Z==-1 && N==-1 && S== 3) return mOm; // Lower than Omega- (Simp.Decis)
1744 else if(!S&&Z<0) return mN-mPi*Z+eps; // Negative Isonuclei
1745 else if(!S&&N<0) return mP-mPi*N+eps; // Positive Isonuclei
1746 else if(S==1) // --> General decision
1747 {
1748 if (N>1) return mSm+(N-1)*mPi+eps; // (Sigma-)+(n*PI-)
1749 else if(Z>1) return mSp+(Z-1)*mPi+eps; // (Sigma+)+(n*PI+)
1750 }
1751 else if(S==2) // --> General decision
1752 {
1753 if (N>0) return mXm+N*mPi+eps; // (Xi-)+(n*PI-)
1754 else if(Z>0) return mXz+Z*mPi+eps; // (Xi0)+(n*PI+)
1755 }
1756 else if(S==3) // --> General decision
1757 {
1758 if (N>-1) return mOm+(N+1)*mPi+eps; // (Omega-)+(n*PI-)
1759 else if(Z>-1) return mOm+(Z+1)*mPi+eps; // (Omega-)+(n*PI+)
1760 }
1761 else if(S>3) // --> General Omega- decision
1762 {
1763 if (-Z>S-2) return mOm+(S-3)*mK +(2-Z-S)*mPi+eps;
1764 else if(Z>-1) return mOm+(S-3)*mK0+(Z+1)+mPi+eps;
1765 else return mOm+(S+Z-2)*mK0-(Z+1)*mK+eps;
1766 }
1767 }
1768 else if(Bn==2) // => "GS Baryons - decuplet" case (NP,LP, and LN are made below)
1769 {
1770 if (Z== 2 && N== 0 && S== 0) return dmP;
1771 //else if(Z== 1 && N== 1 && S== 0) return 1875.61282; // Exact deuteron PDG Mass
1772 else if(Z== 1 && N== 1 && S== 0) return mD; // Exact deuteron PDG Mass
1773 else if(Z== 0 && N== 2 && S== 0) return dmN;
1774 else if(Z== 2 && N==-1 && S== 1) return dSP;
1775 else if(Z== 1 && N== 0 && S== 1) return dLP;
1776 else if(Z== 0 && N== 1 && S== 1) return dLN;
1777 else if(Z==-1 && N== 2 && S== 1) return dSN;
1778 else if(Z== 1 && N==-1 && S== 2) return dXP;
1779 else if(Z== 0 && N== 0 && S== 2) return dmL;
1780 else if(Z==-1 && N== 1 && S== 2) return dXN;
1781 else if(Z== 0 && N==-1 && S== 3) return dOP;
1782 else if(Z==-1 && N== 0 && S== 3) return dON;
1783 else if(!S&&Z<0) return dmN-mPi*Z+eps; // Negative Isonuclei
1784 else if(!S&&N<0) return dmP-mPi*N+eps; // Positive Isonuclei
1785 else if(S==1) // --> General decision
1786 {
1787 if (N>2) return dSP+(N-2)*mPi+eps; // (nSigma-)+(n*PI-)
1788 else if(Z>2) return dSN+(Z-1)*mPi+eps; // (pSigma+)+(n*PI+)
1789 }
1790 else if(S==2) // --> General decision
1791 {
1792 if (N>1) return dXN+(N-1)*mPi+eps; // (nXi-)+(n*PI-)
1793 else if(Z>1) return dXP+(Z-1)*mPi+eps; // (pXi0)+(n*PI+)
1794 }
1795 else if(S==3) // --> General decision
1796 {
1797 if (N>0) return dON+N*mPi+eps; // (nOmega-)+(n*PI-)
1798 else if(Z>0) return dOP+Z*mPi+eps; // (pOmega-)+(n*PI+)
1799 }
1800 else if(S>3) // --> General Omega- decision
1801 {
1802 if (-Z>S-2) return dON+(S-3)*mK +(2-Z-S)*mPi+eps;
1803 else if(Z>0) return dOP+(S-3)*mK0+Z+mPi+eps;
1804 else return dOP+(S+Z-3)*mK0-Z*mK+eps;
1805 }
1806 //else if(S>0) // @@ Implement General Decision
1807 //{
1808 // //#ifdef debug
1809 // G4cout<<"***G4QPDGCode::GetNuclMass:B=2, Z="<<Z<<",N="<<N<<",S="<<S<<G4endl;
1810 // //#endif
1811 // return bigM; // Exotic dibaryons (?)
1812 //}
1813 }
1814 else if(Bn==3)
1815 {
1816 if(!S) // Bn=3
1817 {
1818 if (Z==1 && N== 2) return mT; // tritium
1819 else if(Z==2 && N== 1) return mHe3; // hetrium
1820 }
1821 if(S== 1 && Z==-1 && N== 3) // nnSig-
1822 {
1823 if (Z==-1 && N== 3) return dnS; // nnSig-
1824 else if(Z== 3 && N==-1) return dpS; // ppSig+
1825 }
1826 }
1827 else if(!S)
1828 {
1829 if(Z==2 && N==2) return mAl; // Alpha
1830 else if(Z<0) return A*mN-Z*mPi+eps; // Multybaryon Negative Isonuclei
1831 else if(Z>A) return A*mP+(Z-A)*mPi+eps; // Multybaryon Positive Isonuclei
1832 }
1833 // === Start mesonic extraction ===
1834 G4double km_value=0.; // Mass Sum of K mesons (G4E::DecayAntiStrang.)
1835 G4int Zm=Z;
1836 G4int Nm=N;
1837 G4int Sm=S;
1838 if(S<0&&Bn>0) // NEW: the free mass minimum
1839 {
1840 if(Zm>=-S) // Enough charge for K+'s
1841 {
1842 km_value=-S*mK; // Anti-Lambdas are compensated by protons
1843 Zm+=S;
1844 }
1845 else if(Zm>0)
1846 {
1847 km_value=Zm*mK-(S+Zm)*mK0; // Anti-Lambdas are partially compensated by neutrons
1848 Zm=0;
1849 Nm+=S+Zm;
1850 }
1851 }
1852 else Sm=0; // No alternative calculations
1853 // Old algorithm
1854 G4double k=0.; // Mass Sum of K mesons
1855 if(S<0&&Bn>0) // OLD @@ Can be improved by K0/K+ search of minimum
1856 {
1857 G4int sH=(-S)/2; // SmallHalfS || The algorithm must be the same
1858 G4int bH=-S-sH; // BigHalhS || as in G4QE::DecayAntiStrange
1859 if(Z>0 && Z>N)
1860 {
1861 if(Z>=bH) // => "Enough protons in nucleus" case
1862 {
1863 if(N>=sH)
1864 {
1865 k=bH*mK+sH*mK0;
1866 Z-=bH;
1867 N-=sH;
1868 }
1869 else
1870 {
1871 G4int dN=Z-N;
1872 if(dN>=-S)
1873 {
1874 k=-S*mK;
1875 Z+=S;
1876 }
1877 else
1878 {
1879 G4int sS=(-S-dN)/2;
1880 G4int bS=-S-dN-sS;
1881 sS+=dN;
1882 if(Z>=sS&&N>=bS)
1883 {
1884 k=sS*mK+bS*mK0;
1885 Z-=sS;
1886 N-=bS;
1887 }
1888 else if(Z<sS)
1889 {
1890 G4int dS=-S-Z;
1891 k=Z*mK+dS*mK0;
1892 N-=dS;
1893 Z=0;
1894 }
1895 else
1896 {
1897 G4int dS=-S-N;
1898 k=dS*mK+N*mK0;
1899 Z-=dS;
1900 N=0;
1901 }
1902 }
1903 }
1904 }
1905 else // Must not be here
1906 {
1907#ifdef debug
1908 G4cout<<"***G4QPDGC::CalcNuclMass:Antimatter? Z="<<Z<<",N="<<N<<",S="<<S<<G4endl;
1909#endif
1910 return 0.; // @@ Antiparticles aren't implemented @@
1911 }
1912 }
1913 else if(N>=bH)
1914 {
1915 if(Z>=sH)
1916 {
1917 k=sH*mK+bH*mK0;
1918 Z-=sH;
1919 N-=bH;
1920 }
1921 else
1922 {
1923 G4int dN=N-Z;
1924 if(dN>=-S)
1925 {
1926 k=-S*mK0;
1927 N+=S;
1928 }
1929 else
1930 {
1931 G4int sS=(-S-dN)/2;
1932 G4int bS=-S-dN-sS;
1933 bS+=dN;
1934 if(N>=bS&&Z>=sS)
1935 {
1936 k=sS*mK+bS*mK0;
1937 Z-=sS;
1938 N-=bS;
1939 }
1940 else if(N<bS)
1941 {
1942 G4int dS=-S-N;
1943 k=dS*mK+N*mK0;
1944 Z-=dS;
1945 N=0;
1946 }
1947 else
1948 {
1949 G4int dS=-S-Z;
1950 k=Z*mK+dS*mK0;
1951 N-=dS;
1952 Z=0;
1953 }
1954 }
1955 }
1956 }
1957 else // Must not be here
1958 {
1959 return 0.; // @@ Antiparticles aren't implemented @@
1960#ifdef debug
1961 G4cout<<"***G4QPDGC::CalcNuclMass:Antimatter? N="<<N<<",Z="<<Z<<",S="<<S<<G4endl;
1962#endif
1963 }
1964 S=0;
1965 }
1966 if(N<0)
1967 {
1968 k+=-N*mPi;
1969 Z+=N;
1970 N=0;
1971 }
1972 if(Z<0)
1973 {
1974 k+=-Z*mPi;
1975 N+=Z;
1976 Z=0;
1977 }
1978 A=Z+N;
1979 if (!A) return k+S*mL+S*eps; // @@ multy LAMBDA states are not implemented
1980 G4double m_value=k+A*um_value; // Expected mass in atomic units
1981 //G4double D=N-Z; // Isotopic shift of the nucleus
1982 if ( (A+S < 1 && k==0.) || Z < 0 || N < 0 )
1983 { // @@ Can be generalized to anti-nuclei
1984#ifdef debug
1985 G4cout<<"**G4QPDGCode::CalcNuclMass:A="<<A<<"<1 || Z="<<Z<<"<0 || N="<<N<<"<0"<<G4endl;
1986 //@@throw G4QException("***G4QPDGCode::GetNuclMass: Impossible nucleus");
1987#endif
1988 return 0.; // @@ Temporary
1989 }
1990 if (!Z) return k+N*(mN+.1)+S*(mL+.1); // @@ n+LAMBDA states are not implemented
1991 else if(!N) return k+Z*(mP+1.)+S*(mL+.1); // @@ p+LAMBDA states are not implemented
1992 //else if(N<=9&&Z<=9) m_value+=1.433e-5*pow(double(Z),2.39)-Z*me+c[N-1][Z-1];// Geant4 Comp.now
1993 else
1994 {
1995 //G4double fA=A;
1996 // IsInTable is inside G4NucleiProperties::GetNuclearMass
1997 // G4ParticleTable::GetParticleTable()->FindIon(Zm,Am,0,Zm) creates new Ion!
1998 if(A==256 && Z==128) m_value=256000.;
1999 else m_value=k+G4NucleiProperties::GetNuclearMass(A,Z);
2000 }
2001 //@@//G4double maxM= k+Z*mP+N*mN+S*mL+eps; // @@ eps -- Wings of the Mass parabola
2002 //@@//if(m_value>maxM) m_value=maxM;
2003 G4double mm_value=m_value;
2004 if(Sm<0) // For the new algorithm of calculation
2005 {
2006 if(Nm<0)
2007 {
2008 km_value+=-Nm*mPi;
2009 Zm+=Nm;
2010 Nm=0;
2011 }
2012 if(Zm<0)
2013 {
2014 km_value+=-Zm*mPi;
2015 Nm+=Zm;
2016 Zm=0;
2017 }
2018 G4int Am=Zm+Nm;
2019 if(!Am) return km_value+eps;
2020 mm_value=km_value+Am*um_value; // Expected mass in atomic units
2021 //G4double Dm=Nm-Zm; // Isotopic shift of the nucleus
2022 if ( (Am < 1 && km_value==0.) || Zm < 0 || Nm < 0 )
2023 { // @@ Can be generalized to anti-nuclei
2024#ifdef debug
2025 G4cerr<<"*G4QPDGCode::CalcNucM:A="<<Am<<"<1 || Z="<<Zm<<"<0 || N="<<Nm<<"<0"<<G4endl;
2026#endif
2027 }
2028 if (!Zm) return km_value+Nm*(mN+.1);
2029 else if(!Nm) return km_value+Zm*(mP+1.);
2030 //else if(Nm<=9&&Zm<=9) mm_value+=1.433e-5*pow(double(Zm),2.39)-Zm*me+c[Nm-1][Zm-1];// Geant4
2031 else
2032 {
2033 // IsInTable is inside G4NucleiProperties::GetNuclearMass
2034 // G4ParticleTable::GetParticleTable()->FindIon(Zm,Am,0,Zm) creates new Ion!
2035 mm_value=km_value+G4NucleiProperties::GetNuclearMass(Am,Zm);
2036 }
2037 //@@//G4double mM= km_value+Zm*mP+Nm*mN+eps;
2038 //@@//if(mm_value>mM) mm_value=mM;
2039 }
2040 if(m_value>mm_value) m_value=mm_value;
2041 if(S>0)
2042 {
2043 G4double bs=0.;
2044 if (A==2) bs=a2;
2045 else if(A==3) bs=a3;
2046 else if(A>3) bs=b7*exp(-b8/(A+1.));
2047 m_value+=S*(mL-bs);
2048 }
2049#ifdef debug
2050 G4cout<<"G4QPDGCode::CalcNuclMass: >->-> OUT <-<-< m="<<m_value<<G4endl;
2051#endif
2052 //if(z==8&&n==9&&!s_value) G4cout<<"G4QPDGC::GetNucM:m="<<m_value<<",mm="<<mm_value<<G4endl;
2053 return m_value;
2054}
2055
2056// Get a Quark Content {d,u,s,ad,au,as} for the PDG
2058{
2059 G4int a=0; // particle
2060 if(thePDGCode<0) a=1; // anti-particle
2061 G4int d=0;
2062 G4int u=0;
2063 G4int s_value=0;
2064 G4int ad=0;
2065 G4int au=0;
2066 G4int as=0;
2067 G4int ab=abs(thePDGCode);
2068 if (!ab)
2069 {
2070 G4cerr<<"***G4QPDGCode::GetQuarkContent: PDG=0, return (0,0,0,0,0,0)"<<G4endl;
2071 return G4QContent(0,0,0,0,0,0);
2072 }
2073 else if(ab<4) // @@ for SU(6) : ab<7
2074 {
2075 if (thePDGCode== 1) return G4QContent(1,0,0,0,0,0);
2076 else if(thePDGCode== 2) return G4QContent(0,1,0,0,0,0);
2077 else if(thePDGCode== 3) return G4QContent(0,0,1,0,0,0);
2078 else if(thePDGCode==-1) return G4QContent(0,0,0,1,0,0);
2079 else if(thePDGCode==-2) return G4QContent(0,0,0,0,1,0);
2080 else if(thePDGCode==-3) return G4QContent(0,0,0,0,0,1);
2081 }
2082 else if(ab<99)
2083 {
2084 if (thePDGCode== 11) return G4QContent(1,0,0,0,1,0);
2085 else if(thePDGCode==-11) return G4QContent(0,1,0,1,0,0);
2086 else if(thePDGCode== 13) return G4QContent(1,0,0,0,1,0);
2087 else if(thePDGCode==-13) return G4QContent(0,1,0,1,0,0);
2088 else if(thePDGCode== 15) return G4QContent(1,0,0,0,1,0);
2089 else if(thePDGCode==-15) return G4QContent(0,1,0,1,0,0);
2090#ifdef debug
2091 if (ab==22) G4cout<<"-W-G4QPDGC::GetQuarkCont: For the Photon? - Return 0"<<G4endl;
2092 else if(ab==10) G4cout<<"-W-G4QPDGC::GetQuarkCont: For Chipolino? - Return 0"<<G4endl;
2093 else G4cout<<"-W-G4QPDGCode::GetQuarkCont: For PDG="<<thePDGCode<<" Return 0"<<G4endl;
2094#endif
2095 return G4QContent(0,0,0,0,0,0); // Photon, bosons, leptons
2096 }
2097 else if(ab<80000000) // Baryons & Mesons
2098 {
2099 G4int c=ab/10; // temporary (quarks)
2100 G4int f=c%10; // (1) low quark
2101 G4int v=c/10; // (2,3) temporary(B) or (2) final(M) (high quarks, high quark)
2102 G4int t=0; // (3)prototype of highest quark (B)
2103#ifdef sdebug
2104 G4cout<<"G4QPDGCode::GetQuarkContent: a="<<ab<<", c="<<c<<", f="<<f<<", v="<<v<<G4endl;
2105#endif
2106 if(v>10) // Baryons
2107 {
2108 t=v/10; // (3) highest quark
2109 v%=10; // (2) high quark
2110 if (f==1)
2111 {
2112 if(a) ad++;
2113 else d++;
2114 }
2115 else if(f==2)
2116 {
2117 if(a) au++;
2118 else u++;
2119 }
2120 else if(f==3)
2121 {
2122 if(a) as++;
2123 else s_value++;
2124 }
2125 else G4cerr<<"*G4QPDGC::GetQCont:1 PDG="<<thePDGCode<<","<<f<<","<<v<<","<<t<<G4endl;
2126 if (v==1)
2127 {
2128 if(a) ad++;
2129 else d++;
2130 }
2131 else if(v==2)
2132 {
2133 if(a) au++;
2134 else u++;
2135 }
2136 else if(v==3)
2137 {
2138 if(a) as++;
2139 else s_value++;
2140 }
2141 else G4cerr<<"*G4QPDGC::GetQCont:2 PDG="<<thePDGCode<<","<<f<<","<<v<<","<<t<<G4endl;
2142 if (t==1)
2143 {
2144 if(a) ad++;
2145 else d++;
2146 }
2147 else if(t==2)
2148 {
2149 if(a) au++;
2150 else u++;
2151 }
2152 else if(t==3)
2153 {
2154 if(a) as++;
2155 else s_value++;
2156 }
2157 else G4cerr<<"*G4QPDGC::GetQCont:3 PDG="<<thePDGCode<<","<<f<<","<<v<<","<<t<<G4endl;
2158 return G4QContent(d,u,s_value,ad,au,as);
2159 }
2160 else // Mesons
2161 {
2162 if(f==v)
2163 {
2164 if (f==1) return G4QContent(1,0,0,1,0,0);
2165 else if(f==2) return G4QContent(0,1,0,0,1,0);
2166 else if(f==3) return G4QContent(0,0,1,0,0,1);
2167 else G4cerr<<"*G4QPDGC::GetQC:4 PDG="<<thePDGCode<<","<<f<<","<<v<<","<<t<<G4endl;
2168 }
2169 else
2170 {
2171 if (f==1 && v==2)
2172 {
2173 if(a)return G4QContent(1,0,0,0,1,0);
2174 else return G4QContent(0,1,0,1,0,0);
2175 }
2176 else if(f==1 && v==3)
2177 {
2178 if(a)return G4QContent(0,0,1,1,0,0);
2179 else return G4QContent(1,0,0,0,0,1);
2180 }
2181 else if(f==2 && v==3)
2182 {
2183 if(a)return G4QContent(0,0,1,0,1,0);
2184 else return G4QContent(0,1,0,0,0,1);
2185 }
2186 else G4cerr<<"*G4QPDGC::GetQC:5 PDG="<<thePDGCode<<","<<f<<","<<v<<","<<t<<G4endl;
2187 }
2188 }
2189 }
2190 else
2191 {
2192 G4int szn=ab-90000000;
2193 G4int ds=0;
2194 G4int dz=0;
2195 G4int dn=0;
2196 if(szn<-100000)
2197 {
2198 G4int ns_value=(-szn)/1000000+1;
2199 szn+=ns_value*1000000;
2200 ds+=ns_value;
2201 }
2202 else if(szn<-100)
2203 {
2204 G4int nz=(-szn)/1000+1;
2205 szn+=nz*1000;
2206 dz+=nz;
2207 }
2208 else if(szn<0)
2209 {
2210 G4int nn=-szn;
2211 szn=0;
2212 dn+=nn;
2213 }
2214 G4int sz =szn/1000;
2215 G4int n =szn%1000;
2216 if(n>700)
2217 {
2218 n-=1000;
2219 dz--;
2220 }
2221 G4int z =sz%1000-dz;
2222 if(z>700)
2223 {
2224 z-=1000;
2225 ds--;
2226 }
2227 s_value =sz/1000-ds;
2228 G4int b=z+n+s_value;
2229 d=n+b;
2230 u=z+b;
2231 if (d<0&&u<0&&s_value<0) return G4QContent(0,0,0,-d,-u,-s_value);
2232 else if (u<0&&s_value<0) return G4QContent(d,0,0,0,-u,-s_value);
2233 else if (d<0&&s_value<0) return G4QContent(0,u,0,-d,0,-s_value);
2234 else if (d<0&&u<0) return G4QContent(0,0,s_value,-d,-u,0);
2235 else if (u<0) return G4QContent(d,0,s_value,0,-u,0);
2236 else if (s_value<0) return G4QContent(d,u,0,0,0,-s_value);
2237 else if (d<0) return G4QContent(0,u,s_value,-d,0,0);
2238 else return G4QContent(d,u,s_value,0,0,0);
2239 }
2240 return G4QContent(0,0,0,0,0,0);
2241}
2242
2243// Quark Content of pseudo-meson for q_i->q_o Quark Exchange
2245{
2246 G4QContent cQC(0,0,0,0,0,0);
2247 if (!i) cQC.IncAD();
2248 else if(i==1) cQC.IncAU();
2249 else if(i==2) cQC.IncAS();
2250 else G4cerr<<"***G4QPDGCode::GetExQContent: strange entering quark i="<<i<<G4endl;
2251 if (!o) cQC.IncD();
2252 else if(o==1) cQC.IncU();
2253 else if(o==2) cQC.IncS();
2254 else G4cerr<<"***G4QPDGCode::GetExQContent: strange exiting quark o="<<o<<G4endl;
2255 return cQC;
2256}
2257
2258// Relative Cross Index for q_i->q_o (q=0(d),1(u),2(s), 7 means there is no such cluster)
2260{
2261 // pD,nD,DD,DD,ppDnnDpDDnDD n, p, L,S-,S+,X-,X0,O-
2262 static const G4int b01[16]={ 7,15, 7, 7, 7, 7, 7, 7, 1, 7, 7,-1, 7, 7, 7, 7};
2263 static const G4int b02[16]={ 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7};
2264 static const G4int b10[16]={18, 7, 7, 7, 7, 7, 7, 7, 7,-1, 7, 7,-2, 7, 7, 7}; // Iso+Bary
2265 static const G4int b12[16]={ 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 7, 7, 7, 7, 7, 7};
2266 static const G4int b20[16]={ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,-2, 7,-3, 7,-4, 7};
2267 static const G4int b21[16]={ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,-1,-3, 7,-3, 7, 7};
2268 // nn,np,pp,Ln,Lp,LL,nS,pS,nnpnppLnnLpnLppLLnLLpnnS
2269 static const G4int d01[16]={ 1, 1, 7, 1, 7, 7,-3, 7, 1, 7, 1, 1, 7, 1, 7,-5};
2270 static const G4int d02[16]={ 3, 3, 7, 2, 7, 7, 7, 7, 3, 3, 3, 3, 7, 7, 7, 7};
2271 static const G4int d10[16]={ 7,-1,-1, 7,-1, 7, 7,-4, 7,-1, 7,-1,-1, 7,-1, 7}; //B=2,3
2272 static const G4int d12[16]={ 7, 2, 2, 7, 1, 7, 7, 7, 2, 2, 7, 2, 2, 7, 7, 7};
2273 static const G4int d20[16]={ 7, 7, 7,-3,-3,-2, 7,-5, 7, 7, 7,-3,-3,-3,-3, 7};
2274 static const G4int d21[16]={ 7, 7, 7,-2,-2,-1,-6, 7, 7, 7,-2,-2, 7,-2,-2, 7};
2275 // nn,np,pp,Ln,Lp,nn,np,pp! n, p,nn,np,pp,Ln,Lp
2276 static const G4int m01[15]={ 1, 1, 7, 1, 7, 1, 1, 7, 1, 7, 1, 1, 7, 1, 7};// Multibaryons
2277 static const G4int m02[15]={ 3, 3, 7, 3, 3, 7, 7, 7, 3, 3, 3, 3, 7, 7, 7};// @@ Regular !
2278 static const G4int m10[15]={ 7,-1,-1, 7,-1, 7,-1,-1, 7,-1, 7,-1,-1, 7,-1};// 01->1,10->-1
2279 static const G4int m12[15]={ 7, 2, 2, 2, 2, 7, 7, 7, 2, 2, 7, 2, 2, 7, 7};// 12->2,21->-2
2280 static const G4int m20[15]={ 7, 7, 7,-3,-3, 7,-3,-3, 7, 7, 7,-3,-3,-3,-3};// 02->3,20->-3
2281 static const G4int m21[15]={ 7, 7, 7,-2,-2,-2,-2, 7, 7, 7,-2,-2, 7,-2,-2};
2282 //static const G4int fragmStart = 82; // "Isonuclei are added & Leptons are added"
2283 static const G4int fragmStart = 45; // "Isonuclei & Leptons are added, Reduced"
2284
2285 if(theQCode<fragmStart) return 7;
2286 G4int sub=theQCode-fragmStart;
2287 if ( (sub > 1 && sub < 8) || (sub > 12 && sub <16)) return 7; // SuperIso & SuperStrange
2288 G4int rel=sub; // case of nuclear baryons and isonuclei
2289 if (sub>31) rel =(sub-32)%15; // case of heavy fragments (BaryNum>3)
2290 else if(sub>15) rel = sub-16; // case of nuclear di-baryon & tri-baryons
2291#ifdef debug
2292 G4cout<<"G4QPDGCode::RelGetCrossIndex:i="<<i<<",o="<<o<<",su="<<sub<<",re="<<rel<<G4endl;
2293#endif
2294 //if ( (rel > 5 && rel < 9) || (rel > 13 && rel <16)) return 7; // SuperStrange're closed
2295 if (!i) // ==> input quark = 0(d) (d=-1/3)
2296 {
2297 if (!o) return 0; // -> output quark = 0(d) => 0 = the same cluster
2298 else if(o==1) // -> output quark = 1(u) (ch--)
2299 {
2300 if (sub<16) return b01[rel];
2301 else if(sub<32) return d01[rel];
2302 else return m01[rel];
2303 }
2304 else if(o==2)
2305 {
2306 if (sub<16) return b02[rel];
2307 else if(sub<32) return d02[rel];
2308 else return m02[rel];
2309 }
2310 }
2311 else if(i==1) // ==> input quark = 1(u) (u=2/3)
2312 {
2313 if (!o) // -> output quark = 0(d) (ch++)
2314 {
2315 if (sub<16) return b10[rel];
2316 else if(sub<32) return d10[rel];
2317 else return m10[rel];
2318 }
2319 else if(o==1) return 0; // -> output quark = 1(u) => 0 = the same cluster
2320 else if(o==2)
2321 {
2322 if (sub<16) return b12[rel];
2323 else if(sub<32) return d12[rel];
2324 else return m12[rel];
2325 }
2326 }
2327 else if(i==2)
2328 {
2329 if (!o)
2330 {
2331 if (sub<16) return b20[rel];
2332 else if(sub<32) return d20[rel];
2333 else return m20[rel];
2334 }
2335 else if(o==1)
2336 {
2337 if (sub<16) return b21[rel];
2338 else if(sub<32) return d21[rel];
2339 else return m21[rel];
2340 }
2341 else if(o==2) return 0;
2342 }
2343 return 7;
2344}
2345
2346// Get number of Combinations for q_i->q_o
2348{
2349 if(i>-1&&i<3)
2350 {
2351 G4int shiftQ=GetRelCrossIndex(i, o);
2352 G4int sQCode=theQCode; // QCode of the parent cluster
2353 if (shiftQ==7) return 0; // A parent cluster doesn't exist
2354 else if(!shiftQ) sQCode+=shiftQ; // Shift QCode of son to QCode of his parent
2355 G4QPDGCode parent; // Create a temporary (fake) parent cluster
2356 parent.InitByQCode(sQCode); // Initialize it by Q-Code
2357 G4QContent parentQC=parent.GetQuarkContent();// Quark Content of the parent cluster
2358 if (!o) return parentQC.GetD();
2359 else if(o==1) return parentQC.GetU();
2360 else if(o==2) return parentQC.GetS();
2361 else G4cerr<<"***G4QPDGCode:::GetNumOfComb: strange exiting quark o="<<o<<G4endl;
2362 }
2363 else G4cerr<<"***G4QPDGCode:::GetNumOfComb: strange entering quark i="<<i<<G4endl;
2364 return 0;
2365}
2366
2367// Get a total number of Combinations for q_i
2369{
2370 G4int tot=0;
2371 if(i>-1&&i<3) for(int j=0; j<3; j++) tot+=GetNumOfComb(i, j);
2372 else G4cerr<<"***G4QPDGCode:::GetTotNumOfComb: strange entering quark i="<<i<<G4endl;
2373 return tot;
2374}
2375
2376// Converts nuclear PDGCode to Z(#of protons), N(#of neutrons), S(#of lambdas) values
2377void G4QPDGCode::ConvertPDGToZNS(G4int nucPDG, G4int& z, G4int& n, G4int& s_value)
2378{
2379 if(nucPDG>80000000&&nucPDG<100000000) // Condition of conversion
2380 {
2381 z=0;
2382 n=0;
2383 s_value=0;
2384 G4int r=nucPDG;
2385 if(r==90000000) return;
2386 G4int cn =r%1000; // candidate to #of neutrons
2387 if(cn)
2388 {
2389 if(cn>500) cn-=1000; // AntiNeutrons
2390 n=cn; // Increment neutrons
2391 r-=cn; // Subtract them from the residual
2392 if(r==90000000) return;
2393 }
2394 G4int cz =r%1000000; // candidate to #of neutrons
2395 if(cz)
2396 {
2397 if(cz>500000) cz-=1000000; // AntiProtons
2398 z=cz/1000; // Number of protons
2399 r-=cz; // Subtract them from the residual
2400 if(r==90000000) return;
2401 }
2402 G4int cs =r%10000000; // candidate to #of neutrons
2403 if(cs)
2404 {
2405 if(cs>5000000) cs-=10000000; // AntiLambda
2406 s_value=cs/1000000; // Number of Lambdas
2407 }
2408 }
2409 return;
2410}
2411
2412// Only for irreducable DiQaDiQ! L1!=R1 && L1!=R2 && L2!=R1 && L2!=R2
2413std::pair<G4int,G4int> G4QPDGCode::MakeTwoBaryons(G4int L1, G4int L2, G4int R1, G4int R2)
2414{
2415 G4int dl=0;
2416 G4int ul=0;
2417 //G4int sl=0;
2418 if (L1==1) ++dl;
2419 else if(L1==2) ++ul;
2420 //else if(L1==3) ++sl;
2421 if (L2==1) ++dl;
2422 else if(L2==2) ++ul;
2423 //else if(L2==3) ++sl;
2424 if (R1==1) ++dl;
2425 else if(R1==2) ++ul;
2426 //else if(R1==3) ++sl;
2427 if (R2==1) ++dl;
2428 else if(R2==2) ++ul;
2429 //else if(R2==3) ++sl;
2430 if (dl==2 && ul==2) return make_pair(1114,2212); // @@ can be (2112,2224)
2431 else if(dl==1 && ul==2) return make_pair(3112,2212);
2432 else if(dl==0 && ul==2) return make_pair(3212,3212); // @@ can be (3312,2212)
2433 else if(dl==2 && ul==1) return make_pair(3222,2112);
2434 else if(dl==1 && ul==1) return make_pair(3312,2112); // @@ can be (3322,2212)
2435 else if(dl==2 && ul==0) return make_pair(3112,3112); // @@ can be (3322,1122)
2436 //#ifdef debug
2437 else G4cout<<"-Warning-G4QPDGCode::MakeTwoBaryons: Irreduceble? L1="<<L1<<",L2="<<L2
2438 <<",R1="<<R1<<",R2="<<R2<<G4endl;
2439 //#endif
2440 return make_pair(2212,2112); // @@ Just theMinimum, makeException
2441}
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
G4int operator*(const G4QPDGCode &lhs, const G4QPDGCode &rhs)
Definition: G4QPDGCode.cc:166
ostream & operator<<(ostream &lhs, G4QPDGCode &rhs)
Definition: G4QPDGCode.cc:118
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
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
static G4Alpha * Alpha()
Definition: G4Alpha.cc:89
static G4Deuteron * Deuteron()
Definition: G4Deuteron.cc:94
static G4Electron * Electron()
Definition: G4Electron.cc:94
static G4EtaPrime * EtaPrime()
Definition: G4EtaPrime.cc:105
static G4Eta * Eta()
Definition: G4Eta.cc:109
static G4He3 * He3()
Definition: G4He3.cc:94
static G4KaonMinus * KaonMinus()
Definition: G4KaonMinus.cc:113
static G4KaonZero * KaonZero()
Definition: G4KaonZero.cc:104
static G4Lambda * Lambda()
Definition: G4Lambda.cc:108
static G4MuonMinus * MuonMinus()
Definition: G4MuonMinus.cc:100
static G4NeutrinoE * NeutrinoE()
Definition: G4NeutrinoE.cc:85
static G4NeutrinoMu * NeutrinoMu()
Definition: G4NeutrinoMu.cc:85
static G4NeutrinoTau * NeutrinoTau()
static G4Neutron * Neutron()
Definition: G4Neutron.cc:104
static G4double GetNuclearMass(const G4double A, const G4double Z)
static G4OmegaMinus * OmegaMinus()
static G4PionMinus * PionMinus()
Definition: G4PionMinus.cc:98
static G4PionZero * PionZero()
Definition: G4PionZero.cc:104
static G4Proton * Proton()
Definition: G4Proton.cc:93
void IncAS(G4int n=1)
Definition: G4QContent.hh:321
void IncAD(G4int n=1)
Definition: G4QContent.hh:320
G4int GetU() const
Definition: G4QContent.hh:189
G4int GetS() const
Definition: G4QContent.hh:191
void IncS(G4int n=1)
Definition: G4QContent.hh:318
void IncD(G4int n=1)
Definition: G4QContent.hh:317
G4int GetD() const
Definition: G4QContent.hh:190
void IncAU(G4int n=1)
Definition: G4QContent.hh:319
void IncU(G4int n=1)
Definition: G4QContent.hh:316
G4QContent GetQuarkContent() const
Definition: G4QPDGCode.cc:2057
G4double GetWidth()
Definition: G4QPDGCode.cc:740
G4QContent GetExQContent(G4int i, G4int o) const
Definition: G4QPDGCode.cc:2244
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
G4QPDGCode(G4int PDGCode=0)
Definition: G4QPDGCode.cc:54
void InitByQCode(G4int QCode)
Definition: G4QPDGCode.hh:356
G4bool TestRealNeutral()
Definition: G4QPDGCode.hh:337
const G4QPDGCode & operator=(const G4QPDGCode &rhs)
Definition: G4QPDGCode.cc:105
G4double GetMass()
Definition: G4QPDGCode.cc:693
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 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
static G4SigmaMinus * SigmaMinus()
static G4SigmaPlus * SigmaPlus()
Definition: G4SigmaPlus.cc:108
static G4SigmaZero * SigmaZero()
Definition: G4SigmaZero.cc:99
static G4TauMinus * TauMinus()
Definition: G4TauMinus.cc:135
static G4Triton * Triton()
Definition: G4Triton.cc:95
static G4XiMinus * XiMinus()
Definition: G4XiMinus.cc:106
static G4XiZero * XiZero()
Definition: G4XiZero.cc:106