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
G4LightMedia.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// Hadronic Process: Light Media Charge and/or Strangeness Exchange
28// J.L. Chuma, TRIUMF, 21-Feb-1997
29// Last modified: 13-Mar-1997
30
31// 11-OCT-2007 F.W. Jones: fixed coding errors in inequalities for
32// charge exchange occurrence in PionPlusExchange,
33// KaonZeroShortExchange, and NeutronExchange.
34
35#include "G4LightMedia.hh"
36#include "G4SystemOfUnits.hh"
37#include "Randomize.hh"
38
41 const G4HadProjectile *incidentParticle,
42 const G4Nucleus & targetNucleus )
43 {
46
47 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
48
49 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
50
51 if( targetParticle->GetDefinition() == aNeutron ) {
52
53 // for pi+ n reactions, change some of the elastic cross section to pi0 p
54
55 const G4double cech[] = {0.33,0.27,0.29,0.31,0.27,0.18,0.13,0.10,0.09,0.07};
56 G4int iplab = G4int(std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*5.0 ));
57 if( G4UniformRand() < cech[iplab]/std::pow(atomicNumber,0.42) ) {
58 G4DynamicParticle* resultant = new G4DynamicParticle;
59 resultant->SetDefinition( aPiZero );
60 // targetParticle->SetDefinition( aProton );
61 delete targetParticle;
62 return resultant;
63 }
64 }
65 delete targetParticle;
66 return (G4DynamicParticle*)NULL;
67 }
68
71 const G4HadProjectile *,
72 const G4Nucleus& )
73 {
74 return (G4DynamicParticle*)NULL;
75 }
76
79 const G4HadProjectile *incidentParticle,
80 const G4Nucleus& targetNucleus )
81 {
85
86 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
87
88 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
89
90 if( targetParticle->GetDefinition() == aNeutron ) {
91
92 // for k+ n reactions, change some of the elastic cross section to k0 p
93
94 const G4double cech[] = {0.33,0.27,0.29,0.31,0.27,0.18,0.13,0.10,0.09,0.07};
95 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*5.0 ) );
96 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
97 G4DynamicParticle* resultant = new G4DynamicParticle;
98 if( G4UniformRand() < 0.5 )
99 resultant->SetDefinition( aKaonZS );
100 else
101 resultant->SetDefinition( aKaonZL );
102 // targetParticle->SetDefinition( aProton );
103 delete targetParticle;
104 return resultant;
105 }
106 }
107 delete targetParticle;
108 return (G4DynamicParticle*)NULL;
109 }
110
113 const G4HadProjectile *incidentParticle,
114 const G4Nucleus& targetNucleus )
115 {
119
120 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
121
122 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
123
124 if( targetParticle->GetDefinition() == aProton ) {
125
126 // for k0 p reactions, change some of the elastic cross section to k+ n
127
128 const G4double cech[] = {0.33,0.27,0.29,0.31,0.27,0.18,0.13,0.10,0.09,0.07};
129 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*5.0 ) );
130 if( G4UniformRand() < cech[iplab]/std::pow(atomicNumber,0.42) ) {
131 G4DynamicParticle* resultant = new G4DynamicParticle;
132 resultant->SetDefinition( aKaonPlus );
133 // targetParticle->SetDefinition( aNeutron );
134 delete targetParticle;
135 return resultant;
136 }
137 } else {
138 if( G4UniformRand() >= 0.5 ) {
139 G4DynamicParticle* resultant = new G4DynamicParticle;
140 resultant->SetDefinition( aKaonZL );
141 delete targetParticle;
142 return resultant;
143 }
144 }
145 delete targetParticle;
146 return (G4DynamicParticle*)NULL;
147 }
148
151 const G4HadProjectile *,
152 const G4Nucleus& )
153 {
155
156 if( G4UniformRand() >= 0.5 ) {
157 G4DynamicParticle* resultant = new G4DynamicParticle;
158 resultant->SetDefinition( aKaonZS );
159 return resultant;
160 }
161 return (G4DynamicParticle*)NULL;
162 }
163
166 const G4HadProjectile *,
167 const G4Nucleus& )
168 {
169 return (G4DynamicParticle*)NULL;
170 }
171
174 const G4HadProjectile *incidentParticle,
175 const G4Nucleus& targetNucleus )
176 {
178
179 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
180
181 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
182
183 if( targetParticle->GetDefinition() == aNeutron ) {
184 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.};
185 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
186 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
187 G4DynamicParticle* resultant = new G4DynamicParticle;
188 resultant->SetDefinition( aNeutron );
189 // targetParticle->SetDefinition( aProton );
190 delete targetParticle;
191 return resultant;
192 }
193 }
194 delete targetParticle;
195 return (G4DynamicParticle*)NULL;
196 }
197
200 const G4HadProjectile *incidentParticle,
201 const G4Nucleus& targetNucleus )
202 {
205
206 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
207
208 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
209
210 if( targetParticle->GetDefinition() == aProton ) {
211 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.};
212 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*10.0 ) );
213 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.75) ) {
214 G4DynamicParticle* resultant = new G4DynamicParticle;
215 resultant->SetDefinition( anAntiNeutron );
216 // targetParticle->SetDefinition( aNeutron );
217 delete targetParticle;
218 return resultant;
219 }
220 }
221 delete targetParticle;
222 return (G4DynamicParticle*)NULL;
223 }
224
227 const G4HadProjectile *incidentParticle,
228 const G4Nucleus& targetNucleus )
229 {
231
232 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
233
234 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
235
236 if( targetParticle->GetDefinition() == aProton ) {
237 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.};
238 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
239 if( G4UniformRand() < cech[iplab]/std::pow(atomicNumber,0.42) ) {
240 G4DynamicParticle* resultant = new G4DynamicParticle;
241 resultant->SetDefinition( aProton );
242 // targetParticle->SetDefinition( aNeutron );
243 delete targetParticle;
244 return resultant;
245 }
246 }
247 delete targetParticle;
248 return (G4DynamicParticle*)NULL;
249 }
250
253 const G4HadProjectile *incidentParticle,
254 const G4Nucleus& targetNucleus )
255 {
258
259 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
260
261 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
262
263 if( targetParticle->GetDefinition() == aNeutron ) {
264 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
265 G4int iplab = std::min( 9, G4int( incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
266 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.75) ) {
267 G4DynamicParticle* resultant = new G4DynamicParticle;
268 resultant->SetDefinition( anAntiProton );
269 // targetParticle->SetDefinition( aProton );
270 delete targetParticle;
271 return resultant;
272 }
273 }
274 delete targetParticle;
275 return (G4DynamicParticle*)NULL;
276 }
277
280 const G4HadProjectile *incidentParticle,
281 const G4Nucleus& targetNucleus )
282 {
288
289 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
290
291 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
292
293 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
294 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
295 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
296 G4DynamicParticle* resultant = new G4DynamicParticle;
297 G4int irn = G4int( G4UniformRand()/0.2 );
298 if( targetParticle->GetDefinition() == aNeutron ) {
299
300 // LN --> S0 N, LN --> S- P, LN --> N L, LN --> N S0, LN --> P S-
301
302 switch( irn ) {
303 case 0:
304 resultant->SetDefinition( aSigmaZero );
305 break;
306 case 1:
307 resultant->SetDefinition( aSigmaMinus );
308 // targetParticle->SetDefinition( aProton );
309 break;
310 case 2:
311 resultant->SetDefinition( aNeutron );
312 // targetParticle->SetDefinition( aLambda );
313 break;
314 case 3:
315 resultant->SetDefinition( aNeutron );
316 // targetParticle->SetDefinition( aSigmaZero );
317 break;
318 default:
319 resultant->SetDefinition( aProton );
320 // targetParticle->SetDefinition( aSigmaMinus );
321 break;
322 }
323 } else { // target particle is a proton
324
325 // LP --> S+ N, LP --> S0 P, LP --> P L, LP --> P S0, LP --> N S+
326
327 switch( irn ) {
328 case 0:
329 resultant->SetDefinition( aSigmaPlus );
330 // targetParticle->SetDefinition( aNeutron );
331 break;
332 case 1:
333 resultant->SetDefinition( aSigmaZero );
334 break;
335 case 2:
336 resultant->SetDefinition( aProton );
337 // targetParticle->SetDefinition( aLambda );
338 break;
339 case 3:
340 resultant->SetDefinition( aProton );
341 // targetParticle->SetDefinition( aSigmaZero );
342 break;
343 default:
344 resultant->SetDefinition( aNeutron );
345 // targetParticle->SetDefinition( aSigmaPlus );
346 break;
347 }
348 }
349 delete targetParticle;
350 return resultant;
351 }
352 delete targetParticle;
353 return (G4DynamicParticle*)NULL;
354 }
355
358 const G4HadProjectile *incidentParticle,
359 const G4Nucleus& targetNucleus )
360 {
366
367 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
368
369 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
370
371 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
372 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
373 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
374 G4DynamicParticle* resultant = new G4DynamicParticle;
375 G4int irn = G4int( G4UniformRand()/0.2 );
376 if( targetParticle->GetDefinition() == aNeutron ) {
377
378 // LB N --> S+B P, LB N --> S0B N, LB N --> N LB,
379 // LB N --> N S0B, LB N --> P S+B
380
381 switch( irn ) {
382 case 0:
383 resultant->SetDefinition( anAntiSigmaPlus );
384 // targetParticle->SetDefinition( aProton );
385 break;
386 case 1:
387 resultant->SetDefinition( anAntiSigmaZero );
388 break;
389 case 2:
390 resultant->SetDefinition( aNeutron );
391 // targetParticle->SetDefinition( anAntiLambda );
392 break;
393 case 3:
394 resultant->SetDefinition( aNeutron );
395 // targetParticle->SetDefinition( anAntiSigmaZero );
396 break;
397 default:
398 resultant->SetDefinition( aProton );
399 // targetParticle->SetDefinition( anAntiSigmaPlus );
400 break;
401 }
402 } else { // target particle is a proton
403
404 // LB P --> S0B P, LB P --> S-B N, LB P --> P LB,
405 // LB P --> P S0B, LB P --> N S-B
406
407 switch( irn ) {
408 case 0:
409 resultant->SetDefinition( anAntiSigmaZero );
410 break;
411 case 1:
412 resultant->SetDefinition( anAntiSigmaMinus );
413 // targetParticle->SetDefinition( aNeutron );
414 break;
415 case 2:
416 resultant->SetDefinition( aProton );
417 // targetParticle->SetDefinition( anAntiLambda );
418 break;
419 case 3:
420 resultant->SetDefinition( aProton );
421 // targetParticle->SetDefinition( anAntiSigmaZero );
422 break;
423 default:
424 resultant->SetDefinition( aNeutron );
425 // targetParticle->SetDefinition( anAntiSigmaMinus );
426 break;
427 }
428 }
429 delete targetParticle;
430 return resultant;
431 }
432 delete targetParticle;
433 return (G4DynamicParticle*)NULL;
434 }
435
438 const G4HadProjectile *incidentParticle,
439 const G4Nucleus& targetNucleus )
440 {
445
446 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
447
448 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
449
450 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
451 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
452 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
453 G4DynamicParticle* resultant = new G4DynamicParticle;
454
455 // introduce charge and strangeness exchange reactions
456
457 G4int irn = G4int( G4UniformRand()/0.2 );
458 if( targetParticle->GetDefinition() == aNeutron ) {
459
460 // S+ N --> S0 P, S+ N --> L P, S+ N --> N S+, S+ N --> P S0, S+ N --> P L
461
462 switch( irn ) {
463 case 0:
464 resultant->SetDefinition( aSigmaZero );
465 // targetParticle->SetDefinition( aProton );
466 break;
467 case 1:
468 resultant->SetDefinition( aLambda );
469 // targetParticle->SetDefinition( aProton );
470 break;
471 case 2:
472 resultant->SetDefinition( aNeutron );
473 // targetParticle->SetDefinition( aSigmaPlus );
474 break;
475 case 3:
476 resultant->SetDefinition( aProton );
477 // targetParticle->SetDefinition( aSigmaZero );
478 break;
479 default:
480 resultant->SetDefinition( aProton );
481 // targetParticle->SetDefinition( aLambda );
482 break;
483 }
484 } else { // target particle is a proton
485
486 // S+ P --> P S+
487
488 resultant->SetDefinition( aProton );
489 // targetParticle->SetDefinition( aSigmaPlus );
490 }
491 delete targetParticle;
492 return resultant;
493 }
494 delete targetParticle;
495 return (G4DynamicParticle*)NULL;
496 }
497
500 const G4HadProjectile *incidentParticle,
501 const G4Nucleus& targetNucleus )
502 {
507
508 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
509
510 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
511
512 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
513 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
514 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
515 G4DynamicParticle* resultant = new G4DynamicParticle;
516
517 // introduce charge and strangeness exchange reactions
518
519 G4int irn = G4int( G4UniformRand()/0.2 );
520 if( targetParticle->GetDefinition() == aNeutron ) {
521
522 // S- N --> N S-
523
524 resultant->SetDefinition( aNeutron );
525 // targetParticle->SetDefinition( aSigmaMinus );
526 } else { // target particle is a proton
527
528 // S+ N --> S0 P, S+ N --> L P, S+ N --> N S+, S+ N --> P S0, S+ N --> P L
529
530 switch( irn ) {
531 case 0:
532 resultant->SetDefinition( aSigmaZero );
533 // targetParticle->SetDefinition( aNeutron );
534 break;
535 case 1:
536 resultant->SetDefinition( aLambda );
537 // targetParticle->SetDefinition( aNeutron );
538 break;
539 case 2:
540 resultant->SetDefinition( aProton );
541 // targetParticle->SetDefinition( aSigmaMinus );
542 break;
543 case 3:
544 resultant->SetDefinition( aNeutron );
545 // targetParticle->SetDefinition( aSigmaZero );
546 break;
547 default:
548 resultant->SetDefinition( aNeutron );
549 // targetParticle->SetDefinition( aLambda );
550 break;
551 }
552 }
553 delete targetParticle;
554 return resultant;
555 }
556 delete targetParticle;
557 return (G4DynamicParticle*)NULL;
558 }
559
562 const G4HadProjectile *incidentParticle,
563 const G4Nucleus& targetNucleus )
564 {
569
570 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
571
572 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
573
574 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
575 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
576 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
577 G4DynamicParticle* resultant = new G4DynamicParticle;
578 G4int irn = G4int( G4UniformRand()/0.2 );
579 if( targetParticle->GetDefinition() == aNeutron ) {
580
581 // S+B N --> N S+B
582
583 resultant->SetDefinition( aNeutron );
584 // targetParticle->SetDefinition( anAntiSigmaPlus );
585 } else { // target particle is a proton
586
587 // S+ N --> S0 P, S+ N --> L P, S+ N --> N S+, S+ N --> P S0, S+ N --> P L
588
589 switch( irn ) {
590 case 0:
591 resultant->SetDefinition( anAntiLambda );
592 // targetParticle->SetDefinition( aNeutron );
593 break;
594 case 1:
595 resultant->SetDefinition( anAntiSigmaZero );
596 // targetParticle->SetDefinition( aNeutron );
597 break;
598 case 2:
599 resultant->SetDefinition( aNeutron );
600 // targetParticle->SetDefinition( anAntiLambda );
601 break;
602 case 3:
603 resultant->SetDefinition( aNeutron );
604 // targetParticle->SetDefinition( anAntiSigmaZero );
605 break;
606 default:
607 resultant->SetDefinition( aProton );
608 // targetParticle->SetDefinition( anAntiLambda );
609 break;
610 }
611 }
612 delete targetParticle;
613 return resultant;
614 }
615 delete targetParticle;
616 return (G4DynamicParticle*)NULL;
617 }
618
621 const G4HadProjectile *incidentParticle,
622 const G4Nucleus& targetNucleus )
623 {
628
629 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
630
631 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
632
633 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
634 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
635 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
636 G4DynamicParticle* resultant = new G4DynamicParticle;
637 G4int irn = G4int( G4UniformRand()/0.2 );
638 if( targetParticle->GetDefinition() == aNeutron ) {
639
640 // S-B N --> LB P, S-B N --> S0B P, S-B N --> N S-B,
641 // S-B N --> P LB, S-B N --> P S0B
642
643 switch( irn ) {
644 case 0:
645 resultant->SetDefinition( anAntiLambda );
646 // targetParticle->SetDefinition( aProton );
647 break;
648 case 1:
649 resultant->SetDefinition( anAntiSigmaZero );
650 // targetParticle->SetDefinition( aProton );
651 break;
652 case 2:
653 resultant->SetDefinition( aNeutron );
654 // targetParticle->SetDefinition( anAntiSigmaMinus );
655 break;
656 case 3:
657 resultant->SetDefinition( aProton );
658 // targetParticle->SetDefinition( anAntiLambda );
659 break;
660 default:
661 resultant->SetDefinition( aProton );
662 // targetParticle->SetDefinition( anAntiSigmaZero );
663 break;
664 }
665 } else { // target particle is a proton
666
667 // S-B P --> P S-B
668
669 resultant->SetDefinition( aProton );
670 // targetParticle->SetDefinition( anAntiSigmaMinus );
671 }
672 delete targetParticle;
673 return resultant;
674 }
675 delete targetParticle;
676 return (G4DynamicParticle*)NULL;
677 }
678
681 const G4HadProjectile *incidentParticle,
682 const G4Nucleus& targetNucleus )
683 {
691
692 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
693
694 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
695
696 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
697 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
698 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
699 G4DynamicParticle* resultant = new G4DynamicParticle;
700 if( targetParticle->GetDefinition() == aNeutron ) {
701 G4int irn = G4int( G4UniformRand()*7.0 );
702 switch( irn ) {
703 case 0:
704 resultant->SetDefinition( aSigmaZero );
705 // targetParticle->SetDefinition( aSigmaZero );
706 break;
707 case 1:
708 resultant->SetDefinition( aLambda );
709 // targetParticle->SetDefinition( aLambda );
710 break;
711 case 2:
712 resultant->SetDefinition( aXiMinus );
713 // targetParticle->SetDefinition( aProton );
714 break;
715 case 3:
716 resultant->SetDefinition( aProton );
717 // targetParticle->SetDefinition( aXiMinus );
718 break;
719 case 4:
720 resultant->SetDefinition( aSigmaPlus );
721 // targetParticle->SetDefinition( aSigmaMinus );
722 break;
723 case 5:
724 resultant->SetDefinition( aSigmaMinus );
725 // targetParticle->SetDefinition( aSigmaPlus );
726 break;
727 default:
728 resultant->SetDefinition( aNeutron );
729 // targetParticle->SetDefinition( aXiZero );
730 break;
731 }
732 } else { // target particle is a proton
733 G4int irn = G4int( G4UniformRand()*5.0 );
734 switch( irn ) {
735 case 0:
736 resultant->SetDefinition( aSigmaPlus );
737 // targetParticle->SetDefinition( aSigmaZero );
738 break;
739 case 1:
740 resultant->SetDefinition( aSigmaZero );
741 // targetParticle->SetDefinition( aSigmaPlus );
742 break;
743 case 2:
744 resultant->SetDefinition( aSigmaPlus );
745 // targetParticle->SetDefinition( aLambda );
746 break;
747 case 3:
748 resultant->SetDefinition( aLambda );
749 // targetParticle->SetDefinition( aSigmaPlus );
750 break;
751 default:
752 resultant->SetDefinition( aProton );
753 // targetParticle->SetDefinition( aXiZero );
754 break;
755 }
756 }
757 delete targetParticle;
758 return resultant;
759 }
760 delete targetParticle;
761 return (G4DynamicParticle*)NULL;
762 }
763
766 const G4HadProjectile *incidentParticle,
767 const G4Nucleus& targetNucleus )
768 {
775
776 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
777
778 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
779
780 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
781 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
782 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
783 G4DynamicParticle* resultant = new G4DynamicParticle;
784 if( targetParticle->GetDefinition() == aNeutron ) {
785 G4int irn = G4int( G4UniformRand()*5.0 );
786 switch( irn ) {
787 case 0:
788 resultant->SetDefinition( aNeutron );
789 // targetParticle->SetDefinition( aXiMinus );
790 break;
791 case 1:
792 resultant->SetDefinition( aSigmaZero );
793 // targetParticle->SetDefinition( aSigmaMinus );
794 break;
795 case 2:
796 resultant->SetDefinition( aSigmaMinus );
797 // targetParticle->SetDefinition( aSigmaZero );
798 break;
799 case 3:
800 resultant->SetDefinition( aLambda );
801 // targetParticle->SetDefinition( aSigmaMinus );
802 break;
803 default:
804 resultant->SetDefinition( aSigmaMinus );
805 // targetParticle->SetDefinition( aLambda );
806 break;
807 }
808 } else { // target particle is a proton
809 G4int irn = G4int( G4UniformRand()*7.0 );
810 switch( irn ) {
811 case 0:
812 resultant->SetDefinition( aXiZero );
813 // targetParticle->SetDefinition( aNeutron );
814 break;
815 case 1:
816 resultant->SetDefinition( aNeutron );
817 // targetParticle->SetDefinition( aXiZero );
818 break;
819 case 2:
820 resultant->SetDefinition( aSigmaZero );
821 // targetParticle->SetDefinition( aSigmaZero );
822 break;
823 case 3:
824 resultant->SetDefinition( aLambda );
825 // targetParticle->SetDefinition( aLambda );
826 break;
827 case 4:
828 resultant->SetDefinition( aSigmaZero );
829 // targetParticle->SetDefinition( aLambda );
830 break;
831 case 5:
832 resultant->SetDefinition( aLambda );
833 // targetParticle->SetDefinition( aSigmaZero );
834 break;
835 default:
836 resultant->SetDefinition( aProton );
837 // targetParticle->SetDefinition( aXiMinus );
838 break;
839 }
840 }
841 delete targetParticle;
842 return resultant;
843 }
844 delete targetParticle;
845 return (G4DynamicParticle*)NULL;
846 }
847
850 const G4HadProjectile *incidentParticle,
851 const G4Nucleus& targetNucleus )
852 {
853 // NOTE: The FORTRAN version of the cascade, CASAXO, simply called the
854 // routine for the XiZero particle. Hence, the Exchange function
855 // below is just a copy of the Exchange from the XiZero particle
856
864
865 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
866
867 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
868
869 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
870 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
871 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
872 G4DynamicParticle* resultant = new G4DynamicParticle;
873 if( targetParticle->GetDefinition() == aNeutron ) {
874 G4int irn = G4int( G4UniformRand()*7.0 );
875 switch( irn ) {
876 case 0:
877 resultant->SetDefinition( aSigmaZero );
878 // targetParticle->SetDefinition( aSigmaZero );
879 break;
880 case 1:
881 resultant->SetDefinition( aLambda );
882 // targetParticle->SetDefinition( aLambda );
883 break;
884 case 2:
885 resultant->SetDefinition( aXiMinus );
886 // targetParticle->SetDefinition( aProton );
887 break;
888 case 3:
889 resultant->SetDefinition( aProton );
890 // targetParticle->SetDefinition( aXiMinus );
891 break;
892 case 4:
893 resultant->SetDefinition( aSigmaPlus );
894 // targetParticle->SetDefinition( aSigmaMinus );
895 break;
896 case 5:
897 resultant->SetDefinition( aSigmaMinus );
898 // targetParticle->SetDefinition( aSigmaPlus );
899 break;
900 default:
901 resultant->SetDefinition( aNeutron );
902 // targetParticle->SetDefinition( aXiZero );
903 break;
904 }
905 } else { // target particle is a proton
906 G4int irn = G4int( G4UniformRand()*5.0 );
907 switch( irn ) {
908 case 0:
909 resultant->SetDefinition( aSigmaPlus );
910 // targetParticle->SetDefinition( aSigmaZero );
911 break;
912 case 1:
913 resultant->SetDefinition( aSigmaZero );
914 // targetParticle->SetDefinition( aSigmaPlus );
915 break;
916 case 2:
917 resultant->SetDefinition( aSigmaPlus );
918 // targetParticle->SetDefinition( aLambda );
919 break;
920 case 3:
921 resultant->SetDefinition( aLambda );
922 // targetParticle->SetDefinition( aSigmaPlus );
923 break;
924 default:
925 resultant->SetDefinition( aProton );
926 // targetParticle->SetDefinition( aXiZero );
927 break;
928 }
929 }
930 delete targetParticle;
931 return resultant;
932 }
933 delete targetParticle;
934 return (G4DynamicParticle*)NULL;
935 }
936
939 const G4HadProjectile *incidentParticle,
940 const G4Nucleus& targetNucleus )
941 {
942 // NOTE: The FORTRAN version of the cascade, CASAXM, simply called the
943 // routine for the XiMinus particle. Hence, the Exchange function
944 // below is just a copy of the Exchange from the XiMinus particle
945
952
953 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
954
955 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
956
957 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
958 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
959 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
960 G4DynamicParticle* resultant = new G4DynamicParticle;
961 if( targetParticle->GetDefinition() == aNeutron ) {
962 G4int irn = G4int( G4UniformRand()*5.0 );
963 switch( irn ) {
964 case 0:
965 resultant->SetDefinition( aNeutron );
966 // targetParticle->SetDefinition( aXiMinus );
967 break;
968 case 1:
969 resultant->SetDefinition( aSigmaZero );
970 // targetParticle->SetDefinition( aSigmaMinus );
971 break;
972 case 2:
973 resultant->SetDefinition( aSigmaMinus );
974 // targetParticle->SetDefinition( aSigmaZero );
975 break;
976 case 3:
977 resultant->SetDefinition( aLambda );
978 // targetParticle->SetDefinition( aSigmaMinus );
979 break;
980 default:
981 resultant->SetDefinition( aSigmaMinus );
982 // targetParticle->SetDefinition( aLambda );
983 break;
984 }
985 } else { // target particle is a proton
986 G4int irn = G4int( G4UniformRand()*7.0 );
987 switch( irn ) {
988 case 0:
989 resultant->SetDefinition( aXiZero );
990 // targetParticle->SetDefinition( aNeutron );
991 break;
992 case 1:
993 resultant->SetDefinition( aNeutron );
994 // targetParticle->SetDefinition( aXiZero );
995 break;
996 case 2:
997 resultant->SetDefinition( aSigmaZero );
998 // targetParticle->SetDefinition( aSigmaZero );
999 break;
1000 case 3:
1001 resultant->SetDefinition( aLambda );
1002 // targetParticle->SetDefinition( aLambda );
1003 break;
1004 case 4:
1005 resultant->SetDefinition( aSigmaZero );
1006 // targetParticle->SetDefinition( aLambda );
1007 break;
1008 case 5:
1009 resultant->SetDefinition( aLambda );
1010 // targetParticle->SetDefinition( aSigmaZero );
1011 break;
1012 default:
1013 resultant->SetDefinition( aProton );
1014 // targetParticle->SetDefinition( aXiMinus );
1015 break;
1016 }
1017 }
1018 delete targetParticle;
1019 return resultant;
1020 }
1021 delete targetParticle;
1022 return (G4DynamicParticle*)NULL;
1023 }
1024
1027 const G4HadProjectile *incidentParticle,
1028 const G4Nucleus& targetNucleus )
1029 {
1038
1039 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
1040
1041 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
1042
1043 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
1044 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
1045 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
1046 G4DynamicParticle* resultant = new G4DynamicParticle;
1047
1048 // introduce charge and strangeness exchange reactions
1049
1050 if( targetParticle->GetDefinition() == aNeutron ) {
1051 G4int irn = G4int( G4UniformRand()*7.0 );
1052 switch( irn ) {
1053 case 0:
1054 resultant->SetDefinition( aXiZero );
1055 // targetParticle->SetDefinition( aSigmaMinus );
1056 break;
1057 case 1:
1058 resultant->SetDefinition( aSigmaMinus );
1059 // targetParticle->SetDefinition( aXiZero );
1060 break;
1061 case 2:
1062 resultant->SetDefinition( aXiMinus );
1063 // targetParticle->SetDefinition( aLambda );
1064 break;
1065 case 3:
1066 resultant->SetDefinition( aLambda );
1067 // targetParticle->SetDefinition( aXiMinus );
1068 break;
1069 case 4:
1070 resultant->SetDefinition( aXiMinus );
1071 // targetParticle->SetDefinition( aSigmaZero );
1072 break;
1073 case 5:
1074 resultant->SetDefinition( aSigmaZero );
1075 // targetParticle->SetDefinition( aXiMinus );
1076 break;
1077 default:
1078 resultant->SetDefinition( aNeutron );
1079 // targetParticle->SetDefinition( anOmegaMinus );
1080 break;
1081 }
1082 } else { // target particle is a proton
1083 G4int irn = G4int( G4UniformRand()*7.0 );
1084 switch( irn ) {
1085 case 0:
1086 resultant->SetDefinition( aXiZero );
1087 // targetParticle->SetDefinition( aSigmaZero );
1088 break;
1089 case 1:
1090 resultant->SetDefinition( aSigmaZero );
1091 // targetParticle->SetDefinition( aXiZero );
1092 break;
1093 case 2:
1094 resultant->SetDefinition( aXiZero );
1095 // targetParticle->SetDefinition( aLambda );
1096 break;
1097 case 3:
1098 resultant->SetDefinition( aLambda );
1099 // targetParticle->SetDefinition( aXiZero );
1100 break;
1101 case 4:
1102 resultant->SetDefinition( aXiMinus );
1103 // targetParticle->SetDefinition( aSigmaPlus );
1104 break;
1105 case 5:
1106 resultant->SetDefinition( aSigmaPlus );
1107 // targetParticle->SetDefinition( aXiMinus );
1108 break;
1109 default:
1110 resultant->SetDefinition( aProton );
1111 // targetParticle->SetDefinition( anOmegaMinus );
1112 break;
1113 }
1114 }
1115 delete targetParticle;
1116 return resultant;
1117 }
1118 delete targetParticle;
1119 return (G4DynamicParticle*)NULL;
1120 }
1121
1124 const G4HadProjectile *incidentParticle,
1125 const G4Nucleus& targetNucleus )
1126 {
1127 // NOTE: The FORTRAN version of the cascade, CASAOM, simply called the
1128 // routine for the OmegaMinus particle. Hence, the Exchange function
1129 // below is just a copy of the Exchange from the OmegaMinus particle.
1130
1139
1140 const G4double atomicNumber = G4double(targetNucleus.GetZ_asInt());
1141
1142 G4DynamicParticle* targetParticle = targetNucleus.ReturnTargetParticle();
1143
1144 const G4double cech[] = {0.50,0.45,0.40,0.35,0.30,0.25,0.06,0.04,0.005,0.0};
1145 G4int iplab = G4int( std::min( 9.0, incidentParticle->GetTotalMomentum()/GeV*2.5 ) );
1146 if( G4UniformRand() <= cech[iplab]/std::pow(atomicNumber,0.42) ) {
1147 G4DynamicParticle* resultant = new G4DynamicParticle;
1148
1149 // introduce charge and strangeness exchange reactions
1150
1151 if( targetParticle->GetDefinition() == aNeutron ) {
1152 G4int irn = G4int( G4UniformRand()*7.0 );
1153 switch( irn ) {
1154 case 0:
1155 resultant->SetDefinition( aXiZero );
1156 // targetParticle->SetDefinition( aSigmaMinus );
1157 break;
1158 case 1:
1159 resultant->SetDefinition( aSigmaMinus );
1160 // targetParticle->SetDefinition( aXiZero );
1161 break;
1162 case 2:
1163 resultant->SetDefinition( aXiMinus );
1164 // targetParticle->SetDefinition( aLambda );
1165 break;
1166 case 3:
1167 resultant->SetDefinition( aLambda );
1168 // targetParticle->SetDefinition( aXiMinus );
1169 break;
1170 case 4:
1171 resultant->SetDefinition( aXiMinus );
1172 // targetParticle->SetDefinition( aSigmaZero );
1173 break;
1174 case 5:
1175 resultant->SetDefinition( aSigmaZero );
1176 // targetParticle->SetDefinition( aXiMinus );
1177 break;
1178 default:
1179 resultant->SetDefinition( aNeutron );
1180 // targetParticle->SetDefinition( anOmegaMinus );
1181 break;
1182 }
1183 } else { // target particle is a proton
1184 G4int irn = G4int( G4UniformRand()*7.0 );
1185 switch( irn ) {
1186 case 0:
1187 resultant->SetDefinition( aXiZero );
1188 // targetParticle->SetDefinition( aSigmaZero );
1189 break;
1190 case 1:
1191 resultant->SetDefinition( aSigmaZero );
1192 // targetParticle->SetDefinition( aXiZero );
1193 break;
1194 case 2:
1195 resultant->SetDefinition( aXiZero );
1196 // targetParticle->SetDefinition( aLambda );
1197 break;
1198 case 3:
1199 resultant->SetDefinition( aLambda );
1200 // targetParticle->SetDefinition( aXiZero );
1201 break;
1202 case 4:
1203 resultant->SetDefinition( aXiMinus );
1204 // targetParticle->SetDefinition( aSigmaPlus );
1205 break;
1206 case 5:
1207 resultant->SetDefinition( aSigmaPlus );
1208 // targetParticle->SetDefinition( aXiMinus );
1209 break;
1210 default:
1211 resultant->SetDefinition( aProton );
1212 // targetParticle->SetDefinition( anOmegaMinus );
1213 break;
1214 }
1215 }
1216 delete targetParticle;
1217 return resultant;
1218 }
1219 delete targetParticle;
1220 return (G4DynamicParticle*)NULL;
1221 }
1222
1223 /* end of file */
1224
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4UniformRand()
Definition: Randomize.hh:53
static G4AntiLambda * AntiLambda()
static G4AntiNeutron * AntiNeutron()
static G4AntiProton * AntiProton()
Definition: G4AntiProton.cc:93
static G4AntiSigmaMinus * AntiSigmaMinus()
static G4AntiSigmaPlus * AntiSigmaPlus()
static G4AntiSigmaZero * AntiSigmaZero()
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
G4ParticleDefinition * GetDefinition() const
G4double GetTotalMomentum() const
static G4KaonPlus * KaonPlus()
Definition: G4KaonPlus.cc:113
static G4KaonZeroLong * KaonZeroLong()
static G4KaonZeroShort * KaonZeroShort()
static G4Lambda * Lambda()
Definition: G4Lambda.cc:108
G4DynamicParticle * PionMinusExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
Definition: G4LightMedia.cc:70
G4DynamicParticle * KaonPlusExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
Definition: G4LightMedia.cc:78
G4DynamicParticle * KaonZeroLongExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * NeutronExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * PionPlusExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
Definition: G4LightMedia.cc:40
G4DynamicParticle * AntiLambdaExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * AntiOmegaMinusExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * XiZeroExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * KaonMinusExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * SigmaPlusExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * AntiNeutronExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * ProtonExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * OmegaMinusExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * AntiXiMinusExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * AntiXiZeroExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * XiMinusExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * SigmaMinusExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * KaonZeroShortExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * LambdaExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * AntiSigmaPlusExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * AntiSigmaMinusExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
G4DynamicParticle * AntiProtonExchange(const G4HadProjectile *incidentParticle, const G4Nucleus &aNucleus)
static G4Neutron * Neutron()
Definition: G4Neutron.cc:104
G4int GetZ_asInt() const
Definition: G4Nucleus.hh:115
G4DynamicParticle * ReturnTargetParticle() const
Definition: G4Nucleus.cc:227
static G4PionZero * PionZero()
Definition: G4PionZero.cc:104
static G4Proton * Proton()
Definition: G4Proton.cc:93
static G4SigmaMinus * SigmaMinus()
static G4SigmaPlus * SigmaPlus()
Definition: G4SigmaPlus.cc:108
static G4SigmaZero * SigmaZero()
Definition: G4SigmaZero.cc:99
static G4XiMinus * XiMinus()
Definition: G4XiMinus.cc:106
static G4XiZero * XiZero()
Definition: G4XiZero.cc:106