1 package org.lcsim.util.fourvec;
2
3 public class Momentum4Vector implements Lorentz4Vector
4 {
5
6
7
8 private double _E;
9 private double _px;
10 private double _py;
11 private double _pz;
12
13
14 public Momentum4Vector()
15 {
16 }
17
18 public Momentum4Vector(double f1,double f2,double f3, double f4)
19 {
20 _px = f1;
21 _py = f2;
22 _pz=f3;
23 _E=f4;
24 }
25
26
27 public Momentum4Vector(Lorentz4Vector p)
28 {
29 _px = p.px();
30 _py = p.py();
31 _pz = p.pz();
32 _E = p.E();
33 }
34
35
36 public boolean equals(Object o)
37 {
38 if(o instanceof Momentum4Vector) return equals((Momentum4Vector) o);
39 else return false;
40 }
41
42
43 public int hashcode()
44 {
45 int result = 17;
46 long code = Double.doubleToLongBits(_px);
47 result = 37*result + (int)(code^(code>>>32));
48 code = Double.doubleToLongBits(_py);
49 result = 37*result + (int)(code^(code>>>32));
50 Double.doubleToLongBits(_pz);
51 result = 37*result + (int)(code^(code>>>32));
52 Double.doubleToLongBits(_E);
53 result = 37*result + (int)(code^(code>>>32));
54 return result;
55 }
56
57 public boolean equals(Momentum4Vector y)
58 {
59 return _px==y.px() && _py==y.py() && _pz==y.pz() && _E==y.E();
60 }
61
62
63 public Lorentz4Vector plus(Lorentz4Vector y2)
64 {
65 return new Momentum4Vector(_px+y2.px(),_py+y2.py(),_pz+y2.pz(),
66 _E+y2.E());
67 }
68
69
70 public void plusEquals(Lorentz4Vector y1)
71 {
72 _px+=y1.px();
73 _py+=y1.py();
74 _pz+=y1.pz();
75 _E+=y1.E();
76 }
77
78 public void plusEquals(double f1,double f2,double f3, double f4)
79 {
80 _px+=f1;
81 _py+=f2;
82 _pz+=f3;
83 _E+=f4;
84 }
85
86
87 public Lorentz4Vector minus(Lorentz4Vector y1,Lorentz4Vector y2)
88 {
89 return new Momentum4Vector(y1.px()-y2.px(),y1.py()-y2.py(),y1.pz()-y2.pz(),
90 y1.E()-y2.E());
91 }
92
93 public Lorentz4Vector times(double a,Lorentz4Vector y)
94 {
95 return new Momentum4Vector(a*y.px(),a*y.py(),a*y.pz(),a*y.E());
96 }
97
98 public Lorentz4Vector times(Lorentz4Vector y,double a)
99 {
100 return times(a,y);
101 }
102
103 public Lorentz4Vector divide(Lorentz4Vector y, double a)
104 {
105 return new Momentum4Vector(y.px()/a,y.py()/a,y.pz()/a,y.E()/a);
106 }
107
108 public String toString()
109 {
110 return "\n"+_px+", "+_py+", "+_pz+", "+_E+", "+mass();
111 }
112
113
114 public double dot(Lorentz4Vector y1)
115 {
116 return y1.E()*_E-y1.px()*_px-y1.py()*_py -y1.pz()*_pz;
117 }
118
119 public double vec3dot(Lorentz4Vector y1)
120 {
121 return y1.px()*_px + y1.py()*_py + y1.pz()*_pz;
122 }
123
124 public double px()
125 {
126 return _px;
127 }
128 public double py()
129 {
130 return _py;
131 }
132 public double pz()
133 {
134 return _pz;
135 }
136 public double E()
137 {
138 return _E;
139 }
140 public double pT()
141 {
142 return Math.sqrt(_px*_px+_py*_py);
143 }
144 public double p()
145 {
146 return Math.sqrt(_px*_px+_py*_py+_pz*_pz);
147 }
148 public double phi()
149 {
150 double ph=Math.atan2(_py,_px);
151 return (ph<0.) ? ph+2.*Math.acos(-1) : ph;
152 }
153 public double theta()
154 {
155 return Math.acos(_pz/p());
156 }
157 public double mass2()
158 {
159 return dot(this);
160 }
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176 public double mass()
177 {
178 double m;
179 m=mass2();
180 return (m < 0) ? -Math.sqrt(-m) : Math.sqrt(m);
181 }
182
183 public Lorentz4Vector boost(Lorentz4Vector prest)
184 {
185 double mrest=prest.mass();
186 double Enew=dot(prest)/mrest;
187 double f=(Enew+_E)/(prest.E()+mrest);
188 double pxnew=_px-f*prest.px();
189 double pynew=_py-f*prest.py();
190 double pznew=_pz-f*prest.pz();
191 return new Momentum4Vector(-pxnew,-pynew,-pznew,Enew);
192 }
193
194 public Lorentz4Vector[] twobodyDecay(double m1, double m2)
195 {
196 double m0 = mass();
197 double e0 = (m0*m0+m1*m1-m2*m2)/(2.*m0);
198 double p0 = Math.sqrt(Math.abs((e0-m1)*(e0+m1)));
199
200 java.util.Random ran = new java.util.Random();
201 double costh = 2.*ran.nextDouble()-1.;
202 double sinth = Math.sqrt((1.-costh)*(1.+costh));
203
204 double phi = 2.*Math.PI*ran.nextDouble();
205
206 Lorentz4Vector[] vec = new Lorentz4Vector[2];
207 double p1 = p0*sinth*Math.cos(phi);
208 double p2 = p0*sinth*Math.sin(phi);
209 double p3 = p0*costh;
210 double p4 = e0;
211 vec[0] = (new Momentum4Vector(p1,p2,p3,p4)).boost(this);
212 p4 = Math.sqrt(p1*p1+p2*p2+p3*p3+m2*m2);
213 vec[1] = (new Momentum4Vector(-p1,-p2,-p3,p4)).boost(this);
214 return vec;
215 }
216 }