Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4HadronBuilder.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//
28// -----------------------------------------------------------------------------
29// GEANT 4 class implementation file
30//
31// History:
32// Gunter Folger, August/September 2001
33// Create class; algorithm previously in G4VLongitudinalStringDecay.
34// -----------------------------------------------------------------------------
35
36#include "G4HadronBuilder.hh"
37#include "G4SystemOfUnits.hh"
38#include "Randomize.hh"
40#include "G4ParticleTable.hh"
41
42//#define debug_Hbuilder
43//#define debug_heavyHadrons
44
45G4HadronBuilder::G4HadronBuilder(const std::vector<G4double> & mesonMix, const G4double barionMix,
46 const std::vector<G4double> & scalarMesonMix,
47 const std::vector<G4double> & vectorMesonMix,
48 const G4double Eta_cProb, const G4double Eta_bProb)
49{
50 mesonSpinMix = mesonMix;
51 barionSpinMix = barionMix;
52 scalarMesonMixings = scalarMesonMix;
53 vectorMesonMixings = vectorMesonMix;
54 ProbEta_c = Eta_cProb;
55 ProbEta_b = Eta_bProb;
56}
57
58//-------------------------------------------------------------------------
59
61{
62 if (black->GetParticleSubType()== "di_quark" || white->GetParticleSubType()== "di_quark" ) {
63 // Barion
64 Spin spin = (G4UniformRand() < barionSpinMix) ? SpinHalf : SpinThreeHalf;
65 return Barion(black,white,spin);
66 } else {
67 // Meson
68 G4int StrangeQ = 0;
69 if( std::abs(black->GetPDGEncoding()) >= 3 ) StrangeQ++;
70 if( std::abs(white->GetPDGEncoding()) >= 3 ) StrangeQ++;
71 Spin spin = (G4UniformRand() < mesonSpinMix[StrangeQ]) ? SpinZero : SpinOne;
72 return Meson(black,white,spin);
73 }
74}
75
76//-------------------------------------------------------------------------
77
79{
80 if ( black->GetParticleSubType()== "quark" && white->GetParticleSubType()== "quark" ) {
81 return Meson(black,white, SpinZero);
82 } else {
83 // will return a SpinThreeHalf Barion if all quarks the same
84 return Barion(black,white, SpinHalf);
85 }
86}
87
88//-------------------------------------------------------------------------
89
91{
92 if ( black->GetParticleSubType()== "quark" && white->GetParticleSubType()== "quark" ) {
93 return Meson(black,white, SpinOne);
94 } else {
95 return Barion(black,white,SpinThreeHalf);
96 }
97}
98
99//-------------------------------------------------------------------------
100
101G4ParticleDefinition * G4HadronBuilder::Meson(G4ParticleDefinition * black,
102 G4ParticleDefinition * white, Spin theSpin)
103{
104 #ifdef debug_Hbuilder
105 // Verify Input Charge
106 G4double charge = black->GetPDGCharge() + white->GetPDGCharge();
107 if (std::abs(charge) > 2 || std::abs(3.*charge - 3*G4int(charge*1.001)) > perCent ) // 1.001 to avoid int(.9999) -> 0
108 {
109 G4cerr << " G4HadronBuilder::Build()" << G4endl;
110 G4cerr << " Invalid total charge found for on input: "
111 << charge<< G4endl;
112 G4cerr << " PGDcode input quark1/quark2 : " <<
113 black->GetPDGEncoding() << " / "<<
114 white->GetPDGEncoding() << G4endl;
115 G4cerr << G4endl;
116 }
117 #endif
118
119 G4int id1 = black->GetPDGEncoding();
120 G4int id2 = white->GetPDGEncoding();
121
122 // G4int ifl1= std::max(std::abs(id1), std::abs(id2));
123 if ( std::abs(id1) < std::abs(id2) )
124 {
125 G4int xchg = id1;
126 id1 = id2;
127 id2 = xchg;
128 }
129
130 G4int abs_id1 = std::abs(id1);
131
132 if ( abs_id1 > 5 )
133 throw G4HadronicException(__FILE__, __LINE__, "G4HadronBuilder::Meson : Illegal Quark content as input");
134
135 G4int PDGEncoding=0;
136
137 if (id1 + id2 == 0) {
138 if ( abs_id1 < 4) { // light quarks: u, d or s
139 G4double rmix = G4UniformRand();
140 G4int imix = 2*std::abs(id1) - 1;
141 if (theSpin == SpinZero) {
142 PDGEncoding = 110*(1 + (G4int)(rmix + scalarMesonMixings[imix - 1])
143 + (G4int)(rmix + scalarMesonMixings[imix])
144 ) + theSpin;
145 } else {
146 PDGEncoding = 110*(1 + (G4int)(rmix + vectorMesonMixings[imix - 1])
147 + (G4int)(rmix + vectorMesonMixings[imix])
148 ) + theSpin;
149 }
150 } else { // for c and b quarks
151
152 PDGEncoding = abs_id1*100 + abs_id1*10;
153
154 if (PDGEncoding == 440) {
155 if ( G4UniformRand() < ProbEta_c ) {
156 PDGEncoding +=1;
157 } else {
158 PDGEncoding +=3;
159 }
160 }
161 if (PDGEncoding == 550) {
162 if ( G4UniformRand() < ProbEta_b ) {
163 PDGEncoding +=1;
164 } else {
165 PDGEncoding +=3;
166 }
167 }
168 }
169 } else {
170 PDGEncoding = 100 * std::abs(id1) + 10 * std::abs(id2) + theSpin;
171 G4bool IsUp = (std::abs(id1)&1) == 0; // quark 1 up type quark (u or c)
172 G4bool IsAnti = id1 < 0; // quark 1 is antiquark?
173 if ( (IsUp && IsAnti ) || (!IsUp && !IsAnti ) ) PDGEncoding = - PDGEncoding;
174 }
175
176 // ---------------------------------------------------------------------
177 // Special treatment for charmed and bottom mesons : in Geant4 there are
178 // no excited charmed or bottom mesons, therefore we need to transform these
179 // into existing charmed and bottom mesons in Geant4. Whenever possible,
180 // we use the corresponding ground state mesons with the same quantum numbers;
181 // else, we prefer to conserve the electric charge rather than other flavor numbers.
182 #ifdef debug_heavyHadrons
183 G4int initialPDGEncoding = PDGEncoding;
184 #endif
185 if ( std::abs( PDGEncoding ) == 10411 ) // D*0(2400)+ -> D+
186 ( PDGEncoding > 0 ? PDGEncoding = 411 : PDGEncoding = -411 );
187 else if ( std::abs( PDGEncoding ) == 10421 ) // D*0(2400)0 -> D0
188 ( PDGEncoding > 0 ? PDGEncoding = 421 : PDGEncoding = -421 );
189 else if ( std::abs( PDGEncoding ) == 413 ) // D*(2010)+ -> D+
190 ( PDGEncoding > 0 ? PDGEncoding = 411 : PDGEncoding = -411 );
191 else if ( std::abs( PDGEncoding ) == 423 ) // D*(2007)0 -> D0
192 ( PDGEncoding > 0 ? PDGEncoding = 421 : PDGEncoding = -421 );
193 else if ( std::abs( PDGEncoding ) == 10413 ) // D1(2420)+ -> D+
194 ( PDGEncoding > 0 ? PDGEncoding = 411 : PDGEncoding = -411 );
195 else if ( std::abs( PDGEncoding ) == 10423 ) // D1(2420)0 -> D0
196 ( PDGEncoding > 0 ? PDGEncoding = 421 : PDGEncoding = -421 );
197 else if ( std::abs( PDGEncoding ) == 20413 ) // D1(H)+ -> D+
198 ( PDGEncoding > 0 ? PDGEncoding = 411 : PDGEncoding = -411 );
199 else if ( std::abs( PDGEncoding ) == 20423 ) // D1(2430)0 -> D0
200 ( PDGEncoding > 0 ? PDGEncoding = 421 : PDGEncoding = -421 );
201 else if ( std::abs( PDGEncoding ) == 415 ) // D2*(2460)+ -> D+
202 ( PDGEncoding > 0 ? PDGEncoding = 411 : PDGEncoding = -411 );
203 else if ( std::abs( PDGEncoding ) == 425 ) // D2*(2460)0 -> D0
204 ( PDGEncoding > 0 ? PDGEncoding = 421 : PDGEncoding = -421 );
205 else if ( std::abs( PDGEncoding ) == 10431 ) // Ds0*(2317)+ -> Ds+
206 ( PDGEncoding > 0 ? PDGEncoding = 431 : PDGEncoding = -431 );
207 else if ( std::abs( PDGEncoding ) == 433 ) // Ds*+ -> Ds+
208 ( PDGEncoding > 0 ? PDGEncoding = 431 : PDGEncoding = -431 );
209 else if ( std::abs( PDGEncoding ) == 10433 ) // Ds1(2536)+ -> Ds+
210 ( PDGEncoding > 0 ? PDGEncoding = 431 : PDGEncoding = -431 );
211 else if ( std::abs( PDGEncoding ) == 20433 ) // Ds1(2460)+ -> Ds+
212 ( PDGEncoding > 0 ? PDGEncoding = 431 : PDGEncoding = -431 );
213 else if ( std::abs( PDGEncoding ) == 435 ) // Ds2*(2573)+ -> Ds+
214 ( PDGEncoding > 0 ? PDGEncoding = 431 : PDGEncoding = -431 );
215 else if ( std::abs( PDGEncoding ) == 10441 ) PDGEncoding = 441; // chi_c0(1P) -> eta_c
216 else if ( std::abs( PDGEncoding ) == 100441 ) PDGEncoding = 441; // eta_c(2S) -> eta_c
217 else if ( std::abs( PDGEncoding ) == 10443 ) PDGEncoding = 443; // h_c(1P) -> J/psi
218 else if ( std::abs( PDGEncoding ) == 20443 ) PDGEncoding = 443; // chi_c1(1P) -> J/psi
219 else if ( std::abs( PDGEncoding ) == 100443 ) PDGEncoding = 443; // psi(2S) -> J/psi
220 else if ( std::abs( PDGEncoding ) == 30443 ) PDGEncoding = 443; // psi(3770) -> J/psi
221 else if ( std::abs( PDGEncoding ) == 9000443 ) PDGEncoding = 443; // psi(4040) -> J/psi
222 else if ( std::abs( PDGEncoding ) == 9010443 ) PDGEncoding = 443; // psi(4160) -> J/psi
223 else if ( std::abs( PDGEncoding ) == 9020443 ) PDGEncoding = 443; // psi(4415) -> J/psi
224 else if ( std::abs( PDGEncoding ) == 445 ) PDGEncoding = 443; // chi_c2(1P) -> J/psi
225 else if ( std::abs( PDGEncoding ) == 100445 ) PDGEncoding = 443; // chi_c2(2P) -> J/psi
226 // Bottom mesons
227 else if ( std::abs( PDGEncoding ) == 10511 ) // B0*0 -> B0
228 ( PDGEncoding > 0 ? PDGEncoding = 511 : PDGEncoding = -511 );
229 else if ( std::abs( PDGEncoding ) == 10521 ) // B0*+ -> B+
230 ( PDGEncoding > 0 ? PDGEncoding = 521 : PDGEncoding = -521 );
231 else if ( std::abs( PDGEncoding ) == 513 ) // B*0 -> B0
232 ( PDGEncoding > 0 ? PDGEncoding = 511 : PDGEncoding = -511 );
233 else if ( std::abs( PDGEncoding ) == 523 ) // B*+ -> B+
234 ( PDGEncoding > 0 ? PDGEncoding = 521 : PDGEncoding = -521 );
235 else if ( std::abs( PDGEncoding ) == 10513 ) // B1(L)0 -> B0
236 ( PDGEncoding > 0 ? PDGEncoding = 511 : PDGEncoding = -511 );
237 else if ( std::abs( PDGEncoding ) == 10523 ) // B1(L)+ -> B+
238 ( PDGEncoding > 0 ? PDGEncoding = 521 : PDGEncoding = -521 );
239 else if ( std::abs( PDGEncoding ) == 20513 ) // B1(H)0 -> B0
240 ( PDGEncoding > 0 ? PDGEncoding = 511 : PDGEncoding = -511 );
241 else if ( std::abs( PDGEncoding ) == 20523 ) // B1(H)+ -> B+
242 ( PDGEncoding > 0 ? PDGEncoding = 521 : PDGEncoding = -521 );
243 else if ( std::abs( PDGEncoding ) == 515 ) // B2*0 -> B0
244 ( PDGEncoding > 0 ? PDGEncoding = 511 : PDGEncoding = -511 );
245 else if ( std::abs( PDGEncoding ) == 525 ) // B2*+ -> B+
246 ( PDGEncoding > 0 ? PDGEncoding = 521 : PDGEncoding = -521 );
247 else if ( std::abs( PDGEncoding ) == 10531 ) // Bs0*0 -> Bs0
248 ( PDGEncoding > 0 ? PDGEncoding = 531 : PDGEncoding = -531 );
249 else if ( std::abs( PDGEncoding ) == 533 ) // Bs*0 -> Bs0
250 ( PDGEncoding > 0 ? PDGEncoding = 531 : PDGEncoding = -531 );
251 else if ( std::abs( PDGEncoding ) == 10533 ) // Bs1(L)0 -> Bs0
252 ( PDGEncoding > 0 ? PDGEncoding = 531 : PDGEncoding = -531 );
253 else if ( std::abs( PDGEncoding ) == 20533 ) // Bs1(H)0 -> Bs0
254 ( PDGEncoding > 0 ? PDGEncoding = 531 : PDGEncoding = -531 );
255 else if ( std::abs( PDGEncoding ) == 535 ) // Bs2*0 -> Bs0
256 ( PDGEncoding > 0 ? PDGEncoding = 531 : PDGEncoding = -531 );
257 else if ( std::abs( PDGEncoding ) == 10541 ) // Bc0*+ -> Bc+
258 ( PDGEncoding > 0 ? PDGEncoding = 541 : PDGEncoding = -541 );
259 else if ( std::abs( PDGEncoding ) == 543 ) // Bc*+ -> Bc+
260 ( PDGEncoding > 0 ? PDGEncoding = 541 : PDGEncoding = -541 );
261 else if ( std::abs( PDGEncoding ) == 10543 ) // Bc1(L)+ -> Bc+
262 ( PDGEncoding > 0 ? PDGEncoding = 541 : PDGEncoding = -541 );
263 else if ( std::abs( PDGEncoding ) == 20543 ) // Bc1(H)+ -> Bc+
264 ( PDGEncoding > 0 ? PDGEncoding = 541 : PDGEncoding = -541 );
265 else if ( std::abs( PDGEncoding ) == 545 ) // Bc2*+ -> Bc+
266 ( PDGEncoding > 0 ? PDGEncoding = 541 : PDGEncoding = -541 );
267 else if ( std::abs( PDGEncoding ) == 551 ) PDGEncoding = 553; // eta_b(1S) -> Upsilon
268 else if ( std::abs( PDGEncoding ) == 10551 ) PDGEncoding = 553; // chi_b0(1P) -> Upsilon
269 else if ( std::abs( PDGEncoding ) == 100551 ) PDGEncoding = 553; // eta_b(2S) -> Upsilon
270 else if ( std::abs( PDGEncoding ) == 110551 ) PDGEncoding = 553; // chi_b0(2P) -> Upsilon
271 else if ( std::abs( PDGEncoding ) == 200551 ) PDGEncoding = 553; // eta_b(3S) -> Upsilon
272 else if ( std::abs( PDGEncoding ) == 210551 ) PDGEncoding = 553; // chi_b0(3P) -> Upsilon
273 else if ( std::abs( PDGEncoding ) == 10553 ) PDGEncoding = 553; // h_b(1P) -> Upsilon
274 else if ( std::abs( PDGEncoding ) == 20553 ) PDGEncoding = 553; // chi_b1(1P) -> Upsilon
275 else if ( std::abs( PDGEncoding ) == 30553 ) PDGEncoding = 553; // Upsilon_1(1D) -> Upsilon
276 else if ( std::abs( PDGEncoding ) == 100553 ) PDGEncoding = 553; // Upsilon(2S) -> Upsilon
277 else if ( std::abs( PDGEncoding ) == 110553 ) PDGEncoding = 553; // h_b(2P) -> Upsilon
278 else if ( std::abs( PDGEncoding ) == 120553 ) PDGEncoding = 553; // chi_b1(2P) -> Upsilon
279 else if ( std::abs( PDGEncoding ) == 130553 ) PDGEncoding = 553; // Upsilon_1(2D) -> Upsilon
280 else if ( std::abs( PDGEncoding ) == 200553 ) PDGEncoding = 553; // Upsilon(3S) -> Upsilon
281 else if ( std::abs( PDGEncoding ) == 210553 ) PDGEncoding = 553; // h_b(3P) -> Upsilon
282 else if ( std::abs( PDGEncoding ) == 220553 ) PDGEncoding = 553; // chi_b1(3P) -> Upsilon
283 else if ( std::abs( PDGEncoding ) == 300553 ) PDGEncoding = 553; // Upsilon(4S) -> Upsilon
284 else if ( std::abs( PDGEncoding ) == 9000553 ) PDGEncoding = 553; // Upsilon(10860) -> Upsilon
285 else if ( std::abs( PDGEncoding ) == 9010553 ) PDGEncoding = 553; // Upsilon(11020) -> Upsilon
286 else if ( std::abs( PDGEncoding ) == 555 ) PDGEncoding = 553; // chi_b2(1P) -> Upsilon
287 else if ( std::abs( PDGEncoding ) == 10555 ) PDGEncoding = 553; // eta_b2(1D) -> Upsilon
288 else if ( std::abs( PDGEncoding ) == 20555 ) PDGEncoding = 553; // Upsilon_2(1D) -> Upsilon
289 else if ( std::abs( PDGEncoding ) == 100555 ) PDGEncoding = 553; // chi_b2(2P) -> Upsilon
290 else if ( std::abs( PDGEncoding ) == 110555 ) PDGEncoding = 553; // eta_b2(2D) -> Upsilon
291 else if ( std::abs( PDGEncoding ) == 120555 ) PDGEncoding = 553; // Upsilon_2(2D) -> Upsilon
292 else if ( std::abs( PDGEncoding ) == 200555 ) PDGEncoding = 553; // chi_b2(3P) -> Upsilon
293 else if ( std::abs( PDGEncoding ) == 557 ) PDGEncoding = 553; // Upsilon_3(1D) -> Upsilon
294 else if ( std::abs( PDGEncoding ) == 100557 ) PDGEncoding = 553; // Upsilon_3(2D) -> Upsilon
295 #ifdef debug_heavyHadrons
296 if ( initialPDGEncoding != PDGEncoding ) {
297 G4cout << "G4HadronBuilder::Meson : forcing (inexisting in G4) heavy meson with pdgCode="
298 << initialPDGEncoding << " into pdgCode=" << PDGEncoding << G4endl;
299 }
300 #endif
301 // ---------------------------------------------------------------------
302
303 G4ParticleDefinition * MesonDef=
305
306 #ifdef debug_Hbuilder
307 if (MesonDef == 0 ) {
308 G4cerr << " G4HadronBuilder - Warning: No particle for PDGcode= "
309 << PDGEncoding << G4endl;
310 } else if ( ( black->GetPDGCharge() + white->GetPDGCharge()
311 - MesonDef->GetPDGCharge() ) > perCent ) {
312 G4cerr << " G4HadronBuilder - Warning: Incorrect Charge : "
313 << " Quark1/2 = "
314 << black->GetParticleName() << " / "
315 << white->GetParticleName()
316 << " resulting Hadron " << MesonDef->GetParticleName()
317 << G4endl;
318 }
319 #endif
320
321 return MesonDef;
322}
323
324//-------------------------------------------------------------------------
325
326G4ParticleDefinition * G4HadronBuilder::Barion(G4ParticleDefinition * black,
327 G4ParticleDefinition * white,Spin theSpin)
328{
329 #ifdef debug_Hbuilder
330 // Verify Input Charge
331 G4double charge = black->GetPDGCharge() + white->GetPDGCharge();
332 if (std::abs(charge) > 2 || std::abs(3.*charge - 3*G4int(charge*1.001)) > perCent )
333 {
334 G4cerr << " G4HadronBuilder::Build()" << G4endl;
335 G4cerr << " Invalid total charge found for on input: "
336 << charge<< G4endl;
337 G4cerr << " PGDcode input quark1/quark2 : " <<
338 black->GetPDGEncoding() << " / "<<
339 white->GetPDGEncoding() << G4endl;
340 G4cerr << G4endl;
341 }
342 #endif
343
344 G4int id1 = black->GetPDGEncoding();
345 G4int id2 = white->GetPDGEncoding();
346
347 if ( std::abs(id1) < std::abs(id2) )
348 {
349 G4int xchg = id1;
350 id1 = id2;
351 id2 = xchg;
352 }
353
354 if (std::abs(id1) < 1000 || std::abs(id2) > 5 )
355 throw G4HadronicException(__FILE__, __LINE__, "G4HadronBuilder::Barion: Illegal quark content as input");
356
357 G4int ifl1= std::abs(id1)/1000;
358 G4int ifl2 = (std::abs(id1) - ifl1 * 1000)/100;
359 G4int diquarkSpin = std::abs(id1)%10;
360 G4int ifl3 = id2;
361 if (id1 < 0)
362 {
363 ifl1 = - ifl1;
364 ifl2 = - ifl2;
365 }
366 //... Construct barion, distinguish Lambda and Sigma barions.
367 G4int kfla = std::abs(ifl1);
368 G4int kflb = std::abs(ifl2);
369 G4int kflc = std::abs(ifl3);
370
371 G4int kfld = std::max(kfla,kflb);
372 kfld = std::max(kfld,kflc);
373 G4int kflf = std::min(kfla,kflb);
374 kflf = std::min(kflf,kflc);
375
376 G4int kfle = kfla + kflb + kflc - kfld - kflf;
377
378 //... barion with content uuu or ddd or sss has always spin = 3/2
379 theSpin = (kfla == kflb && kflb == kflc)? SpinThreeHalf : theSpin;
380
381 G4int kfll = 0;
382 if (kfld < 6) {
383 if (theSpin == SpinHalf && kfld > kfle && kfle > kflf) {
384 // Spin J=1/2 and all three quarks different
385 // Two states exist: (uds -> lambda or sigma0)
386 // - lambda: s(ud)0 s : 3122; ie. reverse the two lighter quarks
387 // - sigma0: s(ud)1 s : 3212
388 if (diquarkSpin == 1 ) {
389 if ( kfla == kfld) { // heaviest quark in diquark
390 kfll = 1;
391 } else {
392 kfll = (G4int)(0.25 + G4UniformRand());
393 }
394 }
395 if (diquarkSpin == 3 && kfla != kfld)
396 kfll = (G4int)(0.75 + G4UniformRand());
397 }
398 }
399
400 G4int PDGEncoding;
401 if (kfll == 1)
402 PDGEncoding = 1000 * kfld + 100 * kflf + 10 * kfle + theSpin;
403 else
404 PDGEncoding = 1000 * kfld + 100 * kfle + 10 * kflf + theSpin;
405
406 if (id1 < 0)
407 PDGEncoding = -PDGEncoding;
408
409 // ---------------------------------------------------------------------
410 // Special treatment for charmed and bottom baryons : in Geant4 there are
411 // neither excited charmed or bottom baryons, nor baryons with two or three
412 // heavy (c, b) constitutent quarks:
413 // Sigma_c* , Xi_c' , Xi_c* , Omega_c* ,
414 // Xi_cc , Xi_cc* , Omega_cc , Omega_cc* , Omega_ccc ;
415 // Sigma_b* , Xi_b' , Xi_b* , Omega_b*,
416 // Xi_bc , Xi_bc' , Xi_bc* , Omega_bc , Omega_bc' , Omega_bc* ,
417 // Omega_bcc , Omega_bcc* , Xi_bb, Xi_bb* , Omega_bb, Omega_bb* ,
418 // Omega_bbc , Omega_bbc* , Omega_bbb
419 // therefore we need to transform these into existing charmed and bottom
420 // baryons in Geant4. Whenever possible, we use the corresponding ground state
421 // baryons with the same quantum numbers; else, we prefer to conserve the
422 // electric charge rather than other flavor numbers.
423 #ifdef debug_heavyHadrons
424 G4int charmViolation = 0, bottomViolation = 0; // Only positive
425 G4int initialPDGEncoding = PDGEncoding;
426 #endif
427 if ( std::abs( PDGEncoding ) == 4224 ) { // Sigma_c*++ -> Sigma_c++
428 ( PDGEncoding > 0 ? PDGEncoding = 4222 : PDGEncoding = -4222 );
429 } else if ( std::abs( PDGEncoding ) == 4214 ) { // Sigma_c*+ -> Sigma_c+
430 ( PDGEncoding > 0 ? PDGEncoding = 4212 : PDGEncoding = -4212 );
431 } else if ( std::abs( PDGEncoding ) == 4114 ) { // Sigma_c*0 -> Sigma_c0
432 ( PDGEncoding > 0 ? PDGEncoding = 4112 : PDGEncoding = -4112 );
433 } else if ( std::abs( PDGEncoding ) == 4322 ) { // Xi_c'+ -> Xi_c+
434 ( PDGEncoding > 0 ? PDGEncoding = 4232 : PDGEncoding = -4232 );
435 } else if ( std::abs( PDGEncoding ) == 4312 ) { // Xi_c'0 -> Xi_c0
436 ( PDGEncoding > 0 ? PDGEncoding = 4132 : PDGEncoding = -4132 );
437 } else if ( std::abs( PDGEncoding ) == 4324 ) { // Xi_c*+ -> Xi_c+
438 ( PDGEncoding > 0 ? PDGEncoding = 4232 : PDGEncoding = -4232 );
439 } else if ( std::abs( PDGEncoding ) == 4314 ) { // Xi_c*0 -> Xi_c0
440 ( PDGEncoding > 0 ? PDGEncoding = 4132 : PDGEncoding = -4132 );
441 } else if ( std::abs( PDGEncoding ) == 4334 ) { // Omega_c*0 -> Omega_c0
442 ( PDGEncoding > 0 ? PDGEncoding = 4332 : PDGEncoding = -4332 );
443 } else if ( std::abs( PDGEncoding ) == 4412 ) { // Xi_cc+ -> Xi_c+
444 ( PDGEncoding > 0 ? PDGEncoding = 4232 : PDGEncoding = -4232 );
445 #ifdef debug_heavyHadrons
446 charmViolation = 1;
447 #endif
448 } else if ( std::abs( PDGEncoding ) == 4422 ) { // Xi_cc++ -> Sigma_c++ (use Sigma to conserve charge)
449 ( PDGEncoding > 0 ? PDGEncoding = 4222 : PDGEncoding = -4222 );
450 #ifdef debug_heavyHadrons
451 charmViolation = 1;
452 #endif
453 } else if ( std::abs( PDGEncoding ) == 4414 ) { // Xi_cc*+ -> Xi_c+
454 ( PDGEncoding > 0 ? PDGEncoding = 4232 : PDGEncoding = -4232 );
455 #ifdef debug_heavyHadrons
456 charmViolation = 1;
457 #endif
458 } else if ( std::abs( PDGEncoding ) == 4424 ) { // Xi_cc*++ -> Sigma_c++ (use Sigma to conserve charge)
459 ( PDGEncoding > 0 ? PDGEncoding = 4222 : PDGEncoding = -4222 );
460 #ifdef debug_heavyHadrons
461 charmViolation = 1;
462 #endif
463 } else if ( std::abs( PDGEncoding ) == 4432 ) { // Omega_cc+ -> Xi_c+ (use Xi to conserve charge)
464 ( PDGEncoding > 0 ? PDGEncoding = 4232 : PDGEncoding = -4232 );
465 #ifdef debug_heavyHadrons
466 charmViolation = 1;
467 #endif
468 } else if ( std::abs( PDGEncoding ) == 4434 ) { // Omega_cc*+ -> Xi_c+ (use Xi to conserve charge)
469 ( PDGEncoding > 0 ? PDGEncoding = 4232 : PDGEncoding = -4232 );
470 #ifdef debug_heavyHadrons
471 charmViolation = 1;
472 #endif
473 } else if ( std::abs( PDGEncoding ) == 4444 ) { // Omega_ccc++ -> Sigma_c++ (use Sigma to conserve charge)
474 ( PDGEncoding > 0 ? PDGEncoding = 4222 : PDGEncoding = -4222 );
475 #ifdef debug_heavyHadrons
476 charmViolation = 2;
477 #endif
478 // Bottom baryons
479 } else if ( std::abs( PDGEncoding ) == 5114 ) { // Sigma_b*- -> Sigma_b-
480 ( PDGEncoding > 0 ? PDGEncoding = 5112 : PDGEncoding = -5112 );
481 } else if ( std::abs( PDGEncoding ) == 5214 ) { // Sigma_b*0 -> Sigma_b0
482 ( PDGEncoding > 0 ? PDGEncoding = 5212 : PDGEncoding = -5212 );
483 } else if ( std::abs( PDGEncoding ) == 5224 ) { // Sigma_b*+ -> Sigma_b+
484 ( PDGEncoding > 0 ? PDGEncoding = 5222 : PDGEncoding = -5222 );
485 } else if ( std::abs( PDGEncoding ) == 5312 ) { // Xi_b'- -> Xi_b-
486 ( PDGEncoding > 0 ? PDGEncoding = 5132 : PDGEncoding = -5132 );
487 } else if ( std::abs( PDGEncoding ) == 5322 ) { // Xi_b'0 -> Xi_b0
488 ( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
489 } else if ( std::abs( PDGEncoding ) == 5314 ) { // Xi_b*- -> Xi_b-
490 ( PDGEncoding > 0 ? PDGEncoding = 5132 : PDGEncoding = -5132 );
491 } else if ( std::abs( PDGEncoding ) == 5324 ) { // Xi_b*0 -> Xi_b0
492 ( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
493 } else if ( std::abs( PDGEncoding ) == 5334 ) { // Omega_b*- -> Omega_b-
494 ( PDGEncoding > 0 ? PDGEncoding = 5332 : PDGEncoding = -5332 );
495 } else if ( std::abs( PDGEncoding ) == 5142 ) { // Xi_bc0 -> Xi_b0
496 ( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
497 #ifdef debug_heavyHadrons
498 charmViolation = 1;
499 #endif
500 } else if ( std::abs( PDGEncoding ) == 5242 ) { // Xi_bc+ -> Sigma_b+ (use Sigma to conserve charge)
501 ( PDGEncoding > 0 ? PDGEncoding = 5222 : PDGEncoding = -5222 );
502 #ifdef debug_heavyHadrons
503 charmViolation = 1;
504 #endif
505 } else if ( std::abs( PDGEncoding ) == 5412 ) { // Xi_bc'0 -> Xi_b0
506 ( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
507 #ifdef debug_heavyHadrons
508 charmViolation = 1;
509 #endif
510 } else if ( std::abs( PDGEncoding ) == 5422 ) { // Xi_bc'+ -> Sigma_b+ (use Sigma to conserve charge)
511 ( PDGEncoding > 0 ? PDGEncoding = 5222 : PDGEncoding = -5222 );
512 #ifdef debug_heavyHadrons
513 charmViolation = 1;
514 #endif
515 } else if ( std::abs( PDGEncoding ) == 5414 ) { // Xi_bc*0 -> Xi_b0
516 ( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
517 #ifdef debug_heavyHadrons
518 charmViolation = 1;
519 #endif
520 } else if ( std::abs( PDGEncoding ) == 5424 ) { // Xi_bc*+ -> Sigma_b+ (use Sigma to conserve charge)
521 ( PDGEncoding > 0 ? PDGEncoding = 5222 : PDGEncoding = -5222 );
522 #ifdef debug_heavyHadrons
523 charmViolation = 1;
524 #endif
525 } else if ( std::abs( PDGEncoding ) == 5342 ) { // Omega_bc0 -> Xi_b0 (use Xi to conserve charge)
526 ( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
527 #ifdef debug_heavyHadrons
528 charmViolation = 1;
529 #endif
530 } else if ( std::abs( PDGEncoding ) == 5432 ) { // Omega_bc'0 -> Xi_b0 (use Xi to conserve charge)
531 ( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
532 #ifdef debug_heavyHadrons
533 charmViolation = 1;
534 #endif
535 } else if ( std::abs( PDGEncoding ) == 5434 ) { // Omega_bc*0 -> Xi_b0 (use Xi to conserve charge)
536 ( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
537 #ifdef debug_heavyHadrons
538 charmViolation = 1;
539 #endif
540 } else if ( std::abs( PDGEncoding ) == 5442 ) { // Omega_bcc+ -> Sigma_b+ (use Sigma to conserve charge)
541 ( PDGEncoding > 0 ? PDGEncoding = 5222 : PDGEncoding = -5222 );
542 #ifdef debug_heavyHadrons
543 charmViolation = 2;
544 #endif
545 } else if ( std::abs( PDGEncoding ) == 5444 ) { // Omega_bcc*+ -> Sigma_b+ (use Sigma to conserve charge)
546 ( PDGEncoding > 0 ? PDGEncoding = 5222 : PDGEncoding = -5222 );
547 #ifdef debug_heavyHadrons
548 charmViolation = 2;
549 #endif
550 } else if ( std::abs( PDGEncoding ) == 5512 ) { // Xi_bb- -> Xi_b-
551 ( PDGEncoding > 0 ? PDGEncoding = 5132 : PDGEncoding = -5132 );
552 #ifdef debug_heavyHadrons
553 bottomViolation = 1;
554 #endif
555 } else if ( std::abs( PDGEncoding ) == 5522 ) { // Xi_bb0 -> Xi_b0
556 ( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
557 #ifdef debug_heavyHadrons
558 bottomViolation = 1;
559 #endif
560 } else if ( std::abs( PDGEncoding ) == 5514 ) { // Xi_bb*- -> Xi_b-
561 ( PDGEncoding > 0 ? PDGEncoding = 5132 : PDGEncoding = -5132 );
562 #ifdef debug_heavyHadrons
563 bottomViolation = 1;
564 #endif
565 } else if ( std::abs( PDGEncoding ) == 5524 ) { // Xi_bb*0 -> Xi_b0
566 ( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
567 #ifdef debug_heavyHadrons
568 bottomViolation = 1;
569 #endif
570 } else if ( std::abs( PDGEncoding ) == 5532 ) { // Omega_bb- -> Omega_b-
571 ( PDGEncoding > 0 ? PDGEncoding = 5332 : PDGEncoding = -5332 );
572 #ifdef debug_heavyHadrons
573 bottomViolation = 1;
574 #endif
575 } else if ( std::abs( PDGEncoding ) == 5534 ) { // Omega_bb*- -> Omega_b-
576 ( PDGEncoding > 0 ? PDGEncoding = 5332 : PDGEncoding = -5332 );
577 #ifdef debug_heavyHadrons
578 bottomViolation = 1;
579 #endif
580 } else if ( std::abs( PDGEncoding ) == 5542 ) { // Omega_bbc0 -> Xi_b0 (use Xi to conserve charge)
581 ( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
582 #ifdef debug_heavyHadrons
583 charmViolation = 1; bottomViolation = 1;
584 #endif
585 } else if ( std::abs( PDGEncoding ) == 5544 ) { // Omega_bbc*0 -> Xi_b0 (use Xi to conserve charge)
586 ( PDGEncoding > 0 ? PDGEncoding = 5232 : PDGEncoding = -5232 );
587 #ifdef debug_heavyHadrons
588 charmViolation = 1; bottomViolation = 1;
589 #endif
590 } else if ( std::abs( PDGEncoding ) == 5554 ) { // Omega_bbb- -> Omega_b-
591 ( PDGEncoding > 0 ? PDGEncoding = 5332 : PDGEncoding = -5332 );
592 #ifdef debug_heavyHadrons
593 bottomViolation = 2;
594 #endif
595 }
596 #ifdef debug_heavyHadrons
597 if ( initialPDGEncoding != PDGEncoding ) {
598 G4cout << "G4HadronBuilder::Barion : forcing (inexisting in G4) heavy baryon with pdgCode="
599 << initialPDGEncoding << " into pdgCode=" << PDGEncoding << G4endl;
600 if ( charmViolation != 0 || bottomViolation != 0 ) {
601 G4cout << "\t --> VIOLATION of " << ( charmViolation != 0 ? " CHARM " : " " )
602 << ( charmViolation != 0 && bottomViolation != 0 ? " and " : " " )
603 << ( bottomViolation != 0 ? " BOTTOM " : " " ) << " quantum number ! " << G4endl;
604 }
605 }
606 #endif
607 // ---------------------------------------------------------------------
608
609 G4ParticleDefinition * BarionDef=
611
612 #ifdef debug_Hbuilder
613 if (BarionDef == 0 ) {
614 G4cerr << " G4HadronBuilder - Warning: No particle for PDGcode= "
615 << PDGEncoding << G4endl;
616 } else if ( ( black->GetPDGCharge() + white->GetPDGCharge()
617 - BarionDef->GetPDGCharge() ) > perCent ) {
618 G4cerr << " G4HadronBuilder - Warning: Incorrect Charge : "
619 << " DiQuark/Quark = "
620 << black->GetParticleName() << " / "
621 << white->GetParticleName()
622 << " resulting Hadron " << BarionDef->GetParticleName()
623 << G4endl;
624 }
625 #endif
626
627 return BarionDef;
628}
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4GLOB_DLL std::ostream G4cerr
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:52
G4ParticleDefinition * Build(G4ParticleDefinition *black, G4ParticleDefinition *white)
G4ParticleDefinition * BuildLowSpin(G4ParticleDefinition *black, G4ParticleDefinition *white)
G4HadronBuilder(const std::vector< G4double > &mesonMix, const G4double barionMix, const std::vector< G4double > &scalarMesonMix, const std::vector< G4double > &vectorMesonMix, const G4double Eta_cProb, const G4double Eta_bProb)
G4ParticleDefinition * BuildHighSpin(G4ParticleDefinition *black, G4ParticleDefinition *white)
G4double GetPDGCharge() const
const G4String & GetParticleName() const
const G4String & GetParticleSubType() const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()