Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4HEVector.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// $Id$
28//
29//
30
31//
32// G4 Gheisha friend class G4GHEVector
33// J.L. Chuma, TRIUMF, 22-Feb-1996
34// last modified: H. Fesefeldt 02-July--1998
35// Fesefeldt, bug fixed in Defs1, 14 August 2000
36
37#include "G4HEVector.hh"
38#include "globals.hh"
39#include "G4ios.hh"
41#include "G4SystemOfUnits.hh"
43
45 {
46 G4ThreeVector aMom = 1./GeV*aParticle->Get4Momentum().vect();
47 px = aMom.x();
48 py = aMom.y();
49 pz = aMom.z();
50 energy = aParticle->GetTotalEnergy()/GeV;
51 kineticEnergy = aParticle->GetKineticEnergy()/GeV;
52 mass = aParticle->GetDefinition()->GetPDGMass()/GeV;
53 charge = aParticle->GetDefinition()->GetPDGCharge()/eplus;
54 timeOfFlight = 0.0;
55 side = 0;
56 flag = false;
57 code = aParticle->GetDefinition()->GetPDGEncoding();
58 baryon = aParticle->GetDefinition()->GetBaryonNumber();
61 strangeness = aParticle->GetDefinition()->GetQuarkContent(3);
62 }
63
65 {
66 G4double c = a;
67 if(b > a) c = b;
68 return c;
69 }
70
72 {
73 G4String name;
74 if(aCode == 211) name = "PionPlus";
75 else if(aCode == 111) name = "PionZero";
76 else if(aCode == -211) name = "PionMinus";
77 else if(aCode == 321) name = "KaonPlus";
78 else if(aCode == 311) name = "KaonZero";
79 else if(aCode == -311) name = "AntiKaonZero";
80 else if(aCode == -321) name = "KaonMinus";
81 else if(aCode == 310) name = "KaonZeroShort";
82 else if(aCode == 130) name = "KaonZeroLong";
83 else if(aCode == 2212) name = "Proton";
84 else if(aCode == -2212) name = "AntiProton";
85 else if(aCode == 2112) name = "Neutron";
86 else if(aCode == -2112) name = "AntiNeutron";
87 else if(aCode == 3122) name = "Lambda";
88 else if(aCode == -3122) name = "AntiLambda";
89 else if(aCode == 3222) name = "SigmaPlus";
90 else if(aCode == 3212) name = "SigmaZero";
91 else if(aCode == 3112) name = "SigmaMinus";
92 else if(aCode == -3222) name = "AntiSigmaPlus";
93 else if(aCode == -3212) name = "AntiSigmaZero";
94 else if(aCode == -3112) name = "AntiSigmaMinus";
95 else if(aCode == 3322) name = "XiZero";
96 else if(aCode == 3312) name = "XiMinus";
97 else if(aCode == -3322) name = "AntiXiZero";
98 else if(aCode == -3312) name = "AntiXiMinus";
99 else if(aCode == 3334) name = "OmegaMinus";
100 else if(aCode == -3334) name = "AntiOmegaMinus";
101 else if(aCode == 0)
102 {
103 if(aBaryon==2) name = "Deuteron";
104 else if(aBaryon==3) name = "Triton";
105 else if(aBaryon==4) name = "Alpha";
106 }
107 else if(aCode == 22) name = "Gamma";
108 else
109 {
110 G4cout << "particle " << aCode << " " <<aBaryon<< " not known in this generator!!" << G4endl;
111 }
112 return name;
113 }
114
115
116void
118 {
119 px = mom.x();
120 py = mom.y();
121 pz = mom.z();
122 return;
123 }
124
125void
127 {
128 px = mom->x();
129 py = mom->y();
130 pz = mom->z();
131 return;
132 }
133
134void
136 {
137 px = mom.x();
138 py = mom.y();
139 pz = mom.z();
140 energy = std::sqrt(mass*mass + px*px + py*py + pz*pz);
142 return;
143 }
144
145void
147 {
148 px = mom->x();
149 py = mom->y();
150 pz = mom->z();
151 energy = std::sqrt(mass*mass + px*px + py*py + pz*pz);
153 return;
154 }
155
158 {
160 mom.setX(px);
161 mom.setY(py);
162 mom.setZ(pz);
163 return mom;
164 }
165
167{
168 return std::sqrt(px*px + py*py + pz*pz);
169}
170
171void
173{
174 px = x;
175 py = y;
176 pz = z;
177 return;
178}
179
180void
182{
183 px = x;
184 py = y;
185 pz = z;
186 energy = std::sqrt(mass*mass + px*px + py*py + pz*pz);
188 return;
189}
190
191void
193{
194 px = x;
195 py = y;
196 return;
197}
198
199void
201 {
202 px = x;
203 py = y;
204 energy = std::sqrt(mass*mass + px*px + py*py + pz*pz);
206 return;
207 }
208
209void
211 {
212 pz = z;
213 return;
214 }
215
216void
218 {
219 pz = z;
220 energy = std::sqrt(mass*mass + px*px + py*py + pz*pz);
222 return;
223 }
224
225void
227 {
228 energy = e;
229 return;
230 }
231
232void
234 {
235 if (e <= mass)
236 {
237 energy = mass;
238 kineticEnergy = 0.;
239 px = 0.;
240 py = 0.;
241 pz = 0.;
242 }
243 else
244 {
245 energy = e;
247 G4double momold = std::sqrt(px*px + py*py + pz*pz);
248 G4double momnew = std::sqrt(energy*energy - mass*mass);
249 if (momold == 0.)
250 {
251 G4double cost = 1.0- 2.0*G4UniformRand();
252 G4double sint = std::sqrt(1. - cost*cost);
253 G4double phi = twopi* G4UniformRand();
254 px = momnew * sint * std::cos(phi);
255 py = momnew * sint * std::sin(phi);
256 pz = momnew * cost;
257 }
258 else
259 {
260 momnew /= momold;
261 px *= momnew;
262 py *= momnew;
263 pz *= momnew;
264 }
265 }
266 return;
267 }
268
269void
271 {
272 kineticEnergy = ekin;
273 return;
274 }
275
276void
278 {
279 if (ekin <= 0.)
280 {
281 energy = mass;
282 kineticEnergy = 0.;
283 px = 0.;
284 py = 0.;
285 pz = 0.;
286 }
287 else
288 {
289 energy = ekin + mass;
290 kineticEnergy = ekin;
291 G4double momold = std::sqrt(px*px + py*py + pz*pz);
292 G4double momnew = std::sqrt(energy*energy - mass*mass);
293 if (momold == 0.)
294 {
295 G4double cost = 1.0-2.0*G4UniformRand();
296 G4double sint = std::sqrt(1. - cost*cost);
297 G4double phi = twopi* G4UniformRand();
298 px = momnew * sint * std::cos(phi);
299 py = momnew * sint * std::sin(phi);
300 pz = momnew * cost;
301 }
302 else
303 {
304 momnew /= momold;
305 px *= momnew;
306 py *= momnew;
307 pz *= momnew;
308 }
309 }
310 return;
311 }
312
314{
315 return energy;
316}
317
319{
320 return kineticEnergy;
321}
322
323
325{
326 mass = amass;
327 return;
328}
329
330
332{
333 kineticEnergy = Amax(0., energy - mass);
334 mass = amass;
336 G4double momnew = std::sqrt(Amax(0., energy*energy - mass*mass));
337 if (momnew == 0.0) {
338 px = 0.;
339 py = 0.;
340 pz = 0.;
341 } else {
342 G4double momold = std::sqrt(px*px + py*py + pz*pz);
343 if (momold == 0.) {
344 G4double cost = 1.-2.*G4UniformRand();
345 G4double sint = std::sqrt(1.-cost*cost);
346 G4double phi = twopi*G4UniformRand();
347 px = momnew*sint*std::cos(phi);
348 py = momnew*sint*std::sin(phi);
349 pz = momnew*cost;
350 } else {
351 momnew /= momold;
352 px *= momnew ;
353 py *= momnew ;
354 pz *= momnew ;
355 }
356 }
357 return;
358}
359
360
362{
363 return mass;
364}
365
366void
368 {
369 charge = c;
370 return;
371 }
372
374{
375 return charge;
376}
377
378void
380 {
381 timeOfFlight = t;
382 return;
383 }
384
387 {
388 return timeOfFlight;
389 }
390
391
393{
394 side = aside;
395 return;
396}
397
398
399G4int
401 {
402 return side;
403 }
404
405
406void
408 {
409 flag = f;
410 return;
411 }
412
413G4bool
415 {
416 return flag;
417 }
418
419void
421 {
422 code = c;
423 return;
424 }
425
427{
428 return code;
429}
430
432{
433 return particleName;
434}
435
437{
438 return particleType;
439}
440
442{
443 return baryon;
444}
445
447{
448 return strangeness;
449}
450
451G4int
453 {
454 if(flavor > 0 && flavor < 8)
455 {
456 G4int check;
457 check = FillQuarkContent();
458 if(check != code)
459 {
460 return 0;
461 }
462 else
463 {
464 return theQuarkContent[flavor-1];
465 }
466 }
467 else
468 {
469 return 0;
470 }
471 }
472
473G4int
475 {
476 if(flavor > 0 && flavor < 8)
477 {
478 G4int check;
479 check = FillQuarkContent();
480 if(check != code)
481 {
482 return 0;
483 }
484 else
485 {
486 return theAntiQuarkContent[flavor-1];
487 }
488 }
489 else
490 {
491 return 0;
492 }
493 }
494
495void
497 {
498 px = 0.0;
499 py = 0.0;
500 pz = 0.0;
501 energy = 0.0;
502 kineticEnergy = 0.0;
503 mass = 0.0;
504 charge = 0.0;
505 timeOfFlight = 0.0;
506 side = 0;
507 flag = false;
508 code = 0;
509 particleName = "";
510 particleType = "";
511 baryon = 0;
512 strangeness = 0;
513 }
514
515void
516G4HEVector::Add( const G4HEVector & p1, const G4HEVector & p2 )
517 {
518 px = p1.px + p2.px;
519 py = p1.py + p2.py;
520 pz = p1.pz + p2.pz;
521 energy = p1.energy + p2.energy;
522 G4double b = energy*energy - px*px - py*py - pz*pz;
523 if( b < 0 )
524 mass = -1. * std::sqrt( -b );
525 else
526 mass = std::sqrt( b );
528 charge = p1.charge + p2.charge;
529 code = 0;
530 particleName = "";
531 particleType = "";
532 baryon = 0;
533 strangeness = 0;
534 }
535
536void
537G4HEVector::Sub( const G4HEVector & p1, const G4HEVector & p2 )
538 {
539 px = p1.px - p2.px;
540 py = p1.py - p2.py;
541 pz = p1.pz - p2.pz;
542 energy = p1.energy - p2.energy;
543 G4double b = energy*energy - px*px - py*py - pz*pz;
544 if( b < 0 )
545 mass = -1. * std::sqrt( -b );
546 else
547 mass = std::sqrt( b );
549 charge = p1.charge - p2.charge;
550 code = 0;
551 particleName = "";
552 particleType = "";
553 baryon = 0;
554 strangeness = 0;
555 }
556
557void
558G4HEVector::Lor( const G4HEVector & p1, const G4HEVector & p2 )
559 {
560 G4double a;
561 a = ( Dot(p1,p2)/(p2.energy+p2.mass) - p1.energy ) / p2.mass;
562 px = p1.px + a*p2.px;
563 py = p1.py + a*p2.py;
564 pz = p1.pz + a*p2.pz;
565 energy = std::sqrt( sqr(p1.mass) + px*px + py*py + pz*pz);
566 mass = p1.mass;
569 side = p1.side;
570 flag = p1.flag;
571 code = p1.code;
574 baryon = p1.baryon;
576 }
577
579{
580 G4double a = std::sqrt( (px*px + py*py + pz*pz)*(p.px*p.px + p.py*p.py + p.pz*p.pz) );
581 if (a != 0.0) {
582 a = (px*p.px + py*p.py + pz*p.pz)/a;
583 if (std::fabs(a) > 1.0) {
584 if (a < 0.0) a = -1.0;
585 else a = 1.0;
586 }
587 }
588 return a;
589}
590
593 {
594 G4double a = std::sqrt( (px*px + py*py + pz*pz)*(p.px*p.px + p.py*p.py + p.pz*p.pz) );
595 if( a != 0.0 )
596 {
597 a = (px*p.px + py*p.py + pz*p.pz)/a;
598 if( std::fabs(a) > 1.0 )
599 {
600 if(a<0.0) a=-1.0;
601 else a=1.0;
602 }
603 }
604 return std::acos(a);
605 }
606
608G4HEVector::Dot4( const G4HEVector & p1, const G4HEVector & p2)
609 {
610 return ( p1.energy*p2.energy - p1.px*p2.px - p1.py*p2.py - p1.pz*p2.pz );
611 }
612
614G4HEVector::Impu( const G4HEVector & p1, const G4HEVector & p2)
615 {
616 return ( - sqr( p1.energy - p2.energy)
617 + sqr( p1.px - p2.px)
618 + sqr( p1.py - p2.py)
619 + sqr( p1.pz - p2.pz) );
620 }
621
622void
623G4HEVector::Add3( const G4HEVector & p1, const G4HEVector & p2)
624 {
625 px = p1.px + p2.px;
626 py = p1.py + p2.py;
627 pz = p1.pz + p2.pz;
628 return;
629 }
630
631void
632G4HEVector::Sub3( const G4HEVector & p1, const G4HEVector & p2)
633 {
634 px = p1.px - p2.px;
635 py = p1.py - p2.py;
636 pz = p1.pz - p2.pz;
637 return;
638 }
639
640void
642 {
643 G4double tpx = p1.py * p2.pz - p1.pz * p2.py;
644 G4double tpy = p1.pz * p2.px - p1.px * p2.pz;
645 G4double tpz = p1.px * p2.py - p1.py * p2.px;
646 px=tpx;
647 py=tpy;
648 pz=tpz;
649 return;
650 }
651
653G4HEVector::Dot( const G4HEVector & p1, const G4HEVector & p2)
654 {
655 return ( p1.px * p2.px + p1.py * p2.py + p1.pz * p2.pz );
656 }
657
658void
660 {
661 px = h * p.px;
662 py = h * p.py;
663 pz = h * p.pz;
664 return;
665 }
666
667void
669 {
670 px = h * p.px;
671 py = h * p.py;
672 pz = h * p.pz;
673 mass = p.mass;
674 energy = std::sqrt(px*px + py*py + pz*pz + mass*mass);
676 charge = p.charge;
678 side = p.side;
679 flag = p.flag;
680 code = p.code;
683 baryon = p.baryon;
685 return;
686 }
687
688void
690 {
691 G4double a = p.px*p.px + p.py*p.py + p.pz*p.pz;
692 if (a > 0.0) a = 1./std::sqrt(a);
693 px = a * p.px;
694 py = a * p.py;
695 pz = a * p.pz;
696 mass = p.mass;
697 energy = std::sqrt(px*px + py*py + pz*pz + mass*mass);
699 charge = p.charge;
701 side = p.side;
702 flag = p.flag;
703 code = p.code;
706 baryon = p.baryon;
708 return;
709 }
710
712{
713 return std::sqrt(px*px + py*py + pz*pz);
714}
715
716void
718 {
719 G4HEVector mx = *this;
720 *this = p1;
721 p1 = mx;
722 return;
723 }
724
725void
727 {
728 G4double pt2 = p2.px*p2.px + p2.py*p2.py;
729 if (pt2 > 0.0)
730 {
731 G4double ph, qx, qy, qz;
732 G4double a = std::sqrt(p2.px*p2.px + p2.py*p2.py + p2.pz*p2.pz);
733 G4double cost = p2.pz/a;
734 G4double sint = 0.5 * (std::sqrt(std::fabs((1.-cost)*(1.+cost))) + std::sqrt(pt2)/a);
735 if(p2.py < 0.) ph = 1.5*pi;
736 else ph = halfpi;
737 if( p2.px != 0.0)
738 ph = std::atan2(p2.py,p2.px);
739 qx = cost*std::cos(ph)*p1.px - std::sin(ph)*p1.py
740 + sint*std::cos(ph)*p1.pz;
741 qy = cost*std::sin(ph)*p1.px + std::cos(ph)*p1.py
742 + sint*std::sin(ph)*p1.pz;
743 qz = - sint *p1.px
744 + cost *p1.pz;
745 px = qx;
746 py = qy;
747 pz = qz;
748 }
749 else
750 {
751 px = p1.px;
752 py = p1.py;
753 pz = p1.pz;
754 }
755 }
756
757void
758G4HEVector::Defs( const G4HEVector & p1, const G4HEVector & p2,
759 G4HEVector & my, G4HEVector & mz )
760 {
761 my = p1;
762 mz = p2;
763 px = my.py*mz.pz - my.pz*mz.py;
764 py = my.pz*mz.px - my.px*mz.pz;
765 pz = my.px*mz.py - my.py*mz.px;
766 my.px = mz.py*pz - mz.pz*py;
767 my.py = mz.pz*px - mz.px*pz;
768 my.pz = mz.px*py - mz.py*px;
769 G4double pp;
770 pp = std::sqrt(px*px + py*py + pz*pz);
771 if (pp > 0.)
772 {
773 pp = 1./pp;
774 px = px*pp ;
775 py = py*pp ;
776 pz = pz*pp ;
777 }
778 pp = std::sqrt(my.px*my.px + my.py*my.py + my.pz*my.pz);
779 if (pp > 0.)
780 {
781 pp = 1./pp;
782 my.px = my.px*pp ;
783 my.py = my.py*pp ;
784 my.pz = my.pz*pp ;
785 }
786 pp = std::sqrt(mz.px*mz.px + mz.py*mz.py + mz.pz*mz.pz);
787 if (pp > 0.)
788 {
789 pp = 1./pp;
790 mz.px = mz.px*pp ;
791 mz.py = mz.py*pp ;
792 mz.pz = mz.pz*pp ;
793 }
794 return;
795 }
796
797void
798G4HEVector::Trac( const G4HEVector & p1, const G4HEVector & mx,
799 const G4HEVector & my, const G4HEVector & mz)
800 {
801 G4double qx, qy, qz;
802 qx = mx.px*p1.px + mx.py*p1.py + mx.pz*p1.pz;
803 qy = my.px*p1.px + my.py*p1.py + my.pz*p1.pz;
804 qz = mz.px*p1.px + mz.py*p1.py + mz.pz*p1.pz;
805 px = qx ;
806 py = qy ;
807 pz = qz ;
808 return;
809 }
810
811void
813 {
814 if(name == "PionPlus")
815 {
816 mass = 0.1395700;
817 charge = 1.;
818 code = 211;
819 particleType = "Meson";
820 particleName = name;
821 baryon = 0;
822 strangeness = 0;
823 }
824 else if(name == "PionZero")
825 {
826 mass = 0.1349764;
827 charge = 0.;
828 code = 111;
829 particleType = "Meson";
830 particleName = name;
831 baryon = 0;
832 strangeness = 0;
833 }
834 else if(name == "PionMinus")
835 {
836 mass = 0.1395700;
837 charge = -1.;
838 code = -211;
839 particleType = "Meson";
840 particleName = name;
841 baryon = 0;
842 strangeness = 0;
843 }
844 else if(name == "KaonPlus")
845 {
846 mass = 0.493677;
847 charge = 1.;
848 code = 321;
849 particleType = "Meson";
850 particleName = name;
851 baryon = 0;
852 strangeness = 1;
853 }
854 else if(name == "KaonZero")
855 {
856 mass = 0.497672;
857 charge = 0.;
858 code = 311;
859 particleType = "Meson";
860 particleName = name;
861 baryon = 0;
862 strangeness = 1;
863 }
864 else if(name == "AntiKaonZero")
865 {
866 mass = 0.497672;
867 charge = 0.;
868 code = -311;
869 particleType = "Meson";
870 particleName = name;
871 baryon = 0;
872 strangeness =-1;
873 }
874 else if(name == "KaonMinus")
875 {
876 mass = 0.493677;
877 charge = -1.;
878 code = -321;
879 particleType = "Meson";
880 particleName = name;
881 baryon = 0;
882 strangeness = -1;
883 }
884 else if(name == "KaonZeroShort")
885 {
886 mass = 0.497672;
887 charge = 0.;
888 code = 310;
889 particleType = "Meson";
890 particleName = name;
891 baryon = 0;
892 strangeness = 0;
893 }
894 else if(name == "KaonZeroLong")
895 {
896 mass = 0.497672;
897 charge = 0.;
898 code = 130;
899 particleType = "Meson";
900 particleName = name;
901 baryon = 0;
902 strangeness = 0;
903 }
904 else if(name == "Proton")
905 {
906 mass = 0.9382723;
907 charge = 1.;
908 code = 2212;
909 particleType = "Baryon";
910 particleName = name;
911 baryon = 1;
912 strangeness = 0;
913 }
914 else if(name == "AntiProton")
915 {
916 mass = 0.9382723;
917 charge = -1.;
918 code = -2212;
919 particleType = "AntiBaryon";
920 particleName = name;
921 baryon = -1;
922 strangeness = 0;
923 }
924 else if(name == "Neutron")
925 {
926 mass = 0.93956563;
927 charge = 0.;
928 code = 2112;
929 particleType = "Baryon";
930 particleName = name;
931 baryon = 1;
932 strangeness = 0;
933 }
934 else if(name == "AntiNeutron")
935 {
936 mass = 0.93956563;
937 charge = 0.;
938 code = -2112;
939 particleType = "AntiBaryon";
940 particleName = name;
941 baryon = -1;
942 strangeness = 0;
943 }
944 else if(name == "Lambda")
945 {
946 mass = 1.115684;
947 charge = 0.;
948 code = 3122;
949 particleType = "Baryon";
950 particleName = name;
951 baryon = 1;
952 strangeness = -1;
953 }
954 else if(name == "AntiLambda")
955 {
956 mass = 1.115684;
957 charge = 0.;
958 code = -3122;
959 particleType = "AntiBaryon";
960 particleName = name;
961 baryon = -1;
962 strangeness = 1;
963 }
964 else if(name == "SigmaPlus")
965 {
966 mass = 1.18937;
967 charge = 1.;
968 code = 3222;
969 particleType = "Baryon";
970 particleName = name;
971 baryon = 1;
972 strangeness = -1;
973 }
974 else if(name == "SigmaZero")
975 {
976 mass = 1.19255;
977 charge = 0.;
978 code = 3212;
979 particleType = "Baryon";
980 particleName = name;
981 baryon = 1;
982 strangeness = -1;
983 }
984 else if(name == "SigmaMinus")
985 {
986 mass = 1.19744;
987 charge = -1.;
988 code = 3112;
989 particleType = "Baryon";
990 particleName = name;
991 baryon = 1;
992 strangeness = -1;
993 }
994 else if(name == "AntiSigmaPlus")
995 {
996 mass = 1.18937;
997 charge = -1.;
998 code = -3222;
999 particleType = "AntiBaryon";
1000 particleName = name;
1001 baryon = -1;
1002 strangeness = 1;
1003 }
1004 else if(name == "AntiSigmaZero")
1005 {
1006 mass = 1.19255;
1007 charge = 0.;
1008 code = -3212;
1009 particleType = "AntiBaryon";
1010 particleName = name;
1011 baryon = -1;
1012 strangeness = 1;
1013 }
1014 else if(name == "AntiSigmaMinus")
1015 {
1016 mass = 1.19744;
1017 charge = 1.;
1018 code = -3112;
1019 particleType = "AntiBaryon";
1020 particleName = name;
1021 baryon = -1;
1022 strangeness = 1;
1023 }
1024 else if(name == "XiZero")
1025 {
1026 mass = 1.3149;
1027 charge = 0.;
1028 code = 3322;
1029 particleType = "Baryon";
1030 particleName = name;
1031 baryon = 1;
1032 strangeness = -2;
1033 }
1034 else if(name == "XiMinus")
1035 {
1036 mass = 1.32132;
1037 charge = -1.;
1038 code = 3312;
1039 particleType = "Baryon";
1040 particleName = name;
1041 baryon = 1;
1042 strangeness = -2;
1043 }
1044 else if(name == "AntiXiZero")
1045 {
1046 mass = 1.3149;
1047 charge = 0.;
1048 code = -3322;
1049 particleType = "AntiBaryon";
1050 particleName = name;
1051 baryon = -1;
1052 strangeness = 2;
1053 }
1054 else if(name == "AntiXiMinus")
1055 {
1056 mass = 1.32132;
1057 charge = 1.;
1058 code = -3312;
1059 particleType = "AntiBaryon";
1060 particleName = name;
1061 baryon = -1;
1062 strangeness = 2;
1063 }
1064 else if(name == "OmegaMinus")
1065 {
1066 mass = 1.67245;
1067 charge = -1.;
1068 code = 3334;
1069 particleType = "Baryon";
1070 particleName = name;
1071 baryon = 1;
1072 strangeness = -3;
1073 }
1074 else if(name == "AntiOmegaMinus")
1075 {
1076 mass = 1.67245;
1077 charge = 1.;
1078 code = -3334;
1079 particleType = "AntiBaryon";
1080 particleName = name;
1081 baryon = -1;
1082 strangeness = 3;
1083 }
1084 else if(name == "Deuteron")
1085 {
1086 mass = 1.875613;
1087 charge = 1.;
1088 code = 0;
1089 particleType = "Nucleus";
1090 particleName = name;
1091 baryon = 2;
1092 strangeness = 0;
1093 }
1094 else if(name == "Triton")
1095 {
1096 mass = 2.80925;
1097 charge = 1.;
1098 code = 0;
1099 particleType = "Nucleus";
1100 particleName = name;
1101 baryon = 3;
1102 strangeness = 0;
1103 }
1104 else if(name == "Alpha")
1105 {
1106 mass = 3.727417;
1107 charge = 2.;
1108 code = 0;
1109 particleType = "Nucleus";
1110 particleName = name;
1111 baryon = 4;
1112 strangeness = 0;
1113 }
1114 else if(name == "Gamma")
1115 {
1116 mass = 0.;
1117 charge = 0.;
1118 code = 22;
1119 particleType = "Boson";
1120 particleName = name;
1121 baryon = 0;
1122 strangeness = 0;
1123 }
1124 else
1125 {
1126 G4cout << "particle " << name << " not known in this generator!!" << G4endl;
1127 return;
1128 }
1129 px = 0.;
1130 py = 0.;
1131 pz = 0.;
1132 kineticEnergy = 0.;
1133 energy = mass;
1134 timeOfFlight = 0.;
1135 side = 0;
1136 flag = false;
1137 return;
1138 }
1139
1141{
1142 // Calculate quark and anti-quark content
1143 // Return value is PDG encoding for this particle
1144 // Error if return value is differnt from this->thePDGEncoding
1145
1146 G4int tempPDGcode = code;
1147 G4double echarge = 1.;
1148
1149 for (G4int flavor=0; flavor<NumberOfQuarkFlavor; flavor++){
1150 theQuarkContent[flavor] =0;
1151 theAntiQuarkContent[flavor] =0;
1152 }
1153
1154 G4int temp = std::abs(tempPDGcode);
1155 G4int multiplet = temp/10000;
1156 temp -= G4int(multiplet*10000);
1157 G4int quark1 = temp/1000;
1158 temp -= G4int(quark1*1000);
1159 G4int quark2 = temp/100;
1160 temp -= G4int(quark2*100);
1161 G4int quark3 = temp/10;
1162 temp -= G4int(quark3*10);
1163
1164 // G4int spin= (temp-1); DHW 19 May 2011: variable set but not used
1165
1166 if (particleType =="quark") {
1167 if (tempPDGcode>0){
1168 if (tempPDGcode<=NumberOfQuarkFlavor){
1169 theQuarkContent[tempPDGcode-1] =1;
1170 } else {
1171 // --- thePDGEncoding is wrong
1172 tempPDGcode = 0;
1173 }
1174 } else {
1175 G4int temp0 = -1*tempPDGcode;
1176 if (temp0 <= NumberOfQuarkFlavor) {
1177 theAntiQuarkContent[temp0-1] =1;
1178 } else {
1179 // --- thePDGEncoding is wrong
1180 tempPDGcode = 0;
1181 }
1182 }
1183
1184 } else if (particleType == "Meson") {
1185 // -- exceptions --
1186 // if (tempPDGcode == 310) spin = 0; //K0s
1187 // DHW 19 May 2011: variable set but not used
1188
1189 if (tempPDGcode == 130) { //K0l
1190 // spin = 0; DHW 19 May 2011: variable set but not used
1191 quark2 = 3;
1192 quark3 = 1;
1193 }
1194
1195 if (quark1 !=0)
1196 {
1197 tempPDGcode = 0;
1198 }
1199 if ((quark2==0)||(quark3==0)){
1200 tempPDGcode = 0;
1201 }
1202 if (quark2<quark3) {
1203 tempPDGcode = 0;
1204 }
1205 // check quark flavor
1206 if (quark2>=NumberOfQuarkFlavor){
1207 tempPDGcode = 0;
1208 }
1209 // check heavier quark type
1210 if (quark2 & 1) {
1211 // down type qurak
1212 if (tempPDGcode >0) {
1213 theQuarkContent[quark3-1] =1;
1214 theAntiQuarkContent[quark2-1] =1;
1215 } else {
1216 theQuarkContent[quark2-1] =1;
1217 theAntiQuarkContent[quark3-1] =1;
1218 }
1219 } else {
1220 // up type quark
1221 if (tempPDGcode >0) {
1222 theQuarkContent[quark2-1] =1;
1223 theAntiQuarkContent[quark3-1] =1;
1224 } else {
1225 theQuarkContent[quark3-1] =1;
1226 theAntiQuarkContent[quark2-1] =1;
1227 }
1228 }
1229 // check charge
1230 G4double totalCharge = 0.0;
1231 for (G4int flavor= 0; flavor<NumberOfQuarkFlavor-1; flavor+=2){
1232 totalCharge += (-1./3.)*echarge*theQuarkContent[flavor];
1233 totalCharge += 1./3.*echarge*theAntiQuarkContent[flavor];
1234 totalCharge += 2./3.*echarge*theQuarkContent[flavor+1];
1235 totalCharge += (-2./3.)*echarge*theAntiQuarkContent[flavor+1];
1236 }
1237 if (std::abs(totalCharge-charge)>0.1*echarge) {
1238 tempPDGcode = 0;
1239 }
1240 } else if (particleType == "baryon"){
1241 // check Meson or not
1242 if ((quark1==0)||(quark2==0)||(quark3==0)){
1243 tempPDGcode = 0;
1244 }
1245 //exceptions
1246 if (std::abs(tempPDGcode) == 3122) {
1247 // Lambda
1248 quark2 = 2;
1249 quark3 = 1;
1250 // spin = 1; DHW 19 May 2011: variable set but not used
1251 } else if (std::abs(tempPDGcode) == 4122) {
1252 // Lambda_c
1253 quark2 = 2;
1254 quark3 = 1;
1255 // spin = 1; DHW 19 May 2011: variable set but not used
1256 }
1257 // check quark flavor
1258 if ((quark1<quark2)||(quark2<quark3)||(quark1<quark3)) {
1259 tempPDGcode = 0;
1260 }
1261 if (quark1>=NumberOfQuarkFlavor) {
1262 tempPDGcode = 0;
1263 }
1264 if (tempPDGcode >0) {
1265 theQuarkContent[quark1-1] ++;
1266 theQuarkContent[quark2-1] ++;
1267 theQuarkContent[quark3-1] ++;
1268 } else {
1269 theAntiQuarkContent[quark1-1] ++;
1270 theAntiQuarkContent[quark2-1] ++;
1271 theAntiQuarkContent[quark3-1] ++;
1272 }
1273 // check charge
1274 G4double totalCharge = 0.0;
1275 for (G4int flavor= 0; flavor<NumberOfQuarkFlavor-1; flavor+=2){
1276 totalCharge += (-1./3.)*echarge*theQuarkContent[flavor];
1277 totalCharge += 1./3.*echarge*theAntiQuarkContent[flavor];
1278 totalCharge += 2./3.*echarge*theQuarkContent[flavor+1];
1279 totalCharge += (-2./3.)*echarge*theAntiQuarkContent[flavor+1];
1280 }
1281 if (std::abs(totalCharge - charge) > 0.1*echarge) tempPDGcode = 0;
1282
1283 } else {
1284 }
1285 return tempPDGcode;
1286}
1287
1288
1290{
1291 G4cout << "HEV: "
1292 << L << " " << px << " " << py << " " << pz << " "
1293 << energy << " " << mass << " " << charge << " "
1294 << timeOfFlight << " " << side << " " << flag << " "
1295 << code << " " << baryon << " " << particleName << G4endl;
1296 return;
1297}
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 G4cout
#define G4UniformRand()
Definition: Randomize.hh:53
double z() const
double x() const
void setY(double)
double y() const
void setZ(double)
void setX(double)
Hep3Vector vect() const
void Smul(const G4HEVector &p, G4double h)
Definition: G4HEVector.cc:659
G4double Impu(const G4HEVector &p1, const G4HEVector &p2)
Definition: G4HEVector.cc:614
void setMomentumAndUpdate(const G4ParticleMomentum mom)
Definition: G4HEVector.cc:135
G4double charge
Definition: G4HEVector.hh:58
void Lor(const G4HEVector &p1, const G4HEVector &p2)
Definition: G4HEVector.cc:558
G4int side
Definition: G4HEVector.hh:60
G4double getCharge() const
Definition: G4HEVector.cc:373
const G4ParticleMomentum getMomentum() const
Definition: G4HEVector.cc:157
void Sub(const G4HEVector &p1, const G4HEVector &p2)
Definition: G4HEVector.cc:537
G4double pz
Definition: G4HEVector.hh:54
void setZero()
Definition: G4HEVector.cc:496
G4int getQuarkContent(G4int flavor)
Definition: G4HEVector.cc:452
G4int getSide()
Definition: G4HEVector.cc:400
void Defs(const G4HEVector &p1, const G4HEVector &p2, G4HEVector &my, G4HEVector &mz)
Definition: G4HEVector.cc:758
void Norz(const G4HEVector &p)
Definition: G4HEVector.cc:689
G4String getType() const
Definition: G4HEVector.cc:436
void setEnergy(G4double e)
Definition: G4HEVector.cc:226
void setSide(G4int s)
Definition: G4HEVector.cc:392
void setEnergyAndUpdate(G4double e)
Definition: G4HEVector.cc:233
G4double py
Definition: G4HEVector.hh:53
void Add(const G4HEVector &p1, const G4HEVector &p2)
Definition: G4HEVector.cc:516
void Add3(const G4HEVector &p1, const G4HEVector &p2)
Definition: G4HEVector.cc:623
G4double CosAng(const G4HEVector &p) const
Definition: G4HEVector.cc:578
void setTOF(G4double t)
Definition: G4HEVector.cc:379
G4int theAntiQuarkContent[NumberOfQuarkFlavor]
Definition: G4HEVector.hh:69
G4double mass
Definition: G4HEVector.hh:57
G4String particleName
Definition: G4HEVector.hh:63
void setKineticEnergyAndUpdate(G4double ekin)
Definition: G4HEVector.cc:277
G4int baryon
Definition: G4HEVector.hh:65
void Cross(const G4HEVector &p1, const G4HEVector &p2)
Definition: G4HEVector.cc:641
G4int strangeness
Definition: G4HEVector.hh:66
G4double getTOF()
Definition: G4HEVector.cc:386
void Exch(G4HEVector &p1)
Definition: G4HEVector.cc:717
G4int theQuarkContent[NumberOfQuarkFlavor]
Definition: G4HEVector.hh:68
G4double Amax(G4double a, G4double b)
Definition: G4HEVector.cc:64
void Defs1(const G4HEVector &p1, const G4HEVector &p2)
Definition: G4HEVector.cc:726
G4String getParticleName(G4int code, G4int baryon)
Definition: G4HEVector.cc:71
void setCode(G4int c)
Definition: G4HEVector.cc:420
@ NumberOfQuarkFlavor
Definition: G4HEVector.hh:67
G4double getEnergy() const
Definition: G4HEVector.cc:313
G4double kineticEnergy
Definition: G4HEVector.hh:56
G4double Ang(const G4HEVector &p)
Definition: G4HEVector.cc:592
G4double px
Definition: G4HEVector.hh:52
G4bool getFlag()
Definition: G4HEVector.cc:414
G4int code
Definition: G4HEVector.hh:62
void Trac(const G4HEVector &p1, const G4HEVector &mx, const G4HEVector &my, const G4HEVector &mz)
Definition: G4HEVector.cc:798
void setCharge(G4double c)
Definition: G4HEVector.cc:367
G4double getMass() const
Definition: G4HEVector.cc:361
G4double Length() const
Definition: G4HEVector.cc:711
void SmulAndUpdate(const G4HEVector &p, G4double h)
Definition: G4HEVector.cc:668
G4double Dot4(const G4HEVector &p1, const G4HEVector &p2)
Definition: G4HEVector.cc:608
G4bool flag
Definition: G4HEVector.hh:61
G4String particleType
Definition: G4HEVector.hh:64
G4int FillQuarkContent()
Definition: G4HEVector.cc:1140
void setFlag(G4bool f)
Definition: G4HEVector.cc:407
G4double Dot(const G4HEVector &p1, const G4HEVector &p2)
Definition: G4HEVector.cc:653
G4int getCode() const
Definition: G4HEVector.cc:426
void setMassAndUpdate(G4double m)
Definition: G4HEVector.cc:331
void setKineticEnergy(G4double ekin)
Definition: G4HEVector.cc:270
void Print(G4int L) const
Definition: G4HEVector.cc:1289
G4double getTotalMomentum() const
Definition: G4HEVector.cc:166
G4double energy
Definition: G4HEVector.hh:55
G4double getKineticEnergy() const
Definition: G4HEVector.cc:318
G4int getBaryonNumber() const
Definition: G4HEVector.cc:441
G4String getName() const
Definition: G4HEVector.cc:431
void setMomentum(const G4ParticleMomentum mom)
Definition: G4HEVector.cc:117
void setMass(G4double m)
Definition: G4HEVector.cc:324
void setDefinition(G4String name)
Definition: G4HEVector.cc:812
G4int getStrangenessNumber() const
Definition: G4HEVector.cc:446
G4double timeOfFlight
Definition: G4HEVector.hh:59
void Sub3(const G4HEVector &p1, const G4HEVector &p2)
Definition: G4HEVector.cc:632
G4int getAntiQuarkContent(G4int flavor)
Definition: G4HEVector.cc:474
const G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
const G4LorentzVector & Get4Momentum() const
G4double GetTotalEnergy() const
const G4String & GetParticleType() const
G4int GetQuarkContent(G4int flavor) const
G4double GetPDGCharge() const
T sqr(const T &x)
Definition: templates.hh:145