View Javadoc

1   package org.lcsim.util.fourvec;
2   
3   public class Momentum4Vector implements Lorentz4Vector
4   {
5       //
6       //  Basic Lorentz 4-vector contains only x,y,z and ct (px,py,pz and E)
7       //
8       private double _E;
9       private double  _px;
10      private double  _py;
11      private double  _pz;
12      
13      // Default Constructor
14      public  Momentum4Vector()
15      {
16      }
17      // fully qualified Constructor
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      // copy constructor
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      // equality operator
36      public boolean equals(Object o)
37      {
38          if(o instanceof Momentum4Vector) return equals((Momentum4Vector) o);
39          else return false;
40      }
41      
42      //hashcode
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      //sum operator
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      // sum in place operator
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      // subtract operator
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      // multiply by constant
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     // divide by constant
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     // output operator
108     public String toString()
109     {
110         return "\n"+_px+", "+_py+", "+_pz+", "+_E+", "+mass();
111     }
112     
113     // dot product
114     public double dot(Lorentz4Vector y1)
115     {
116         return y1.E()*_E-y1.px()*_px-y1.py()*_py -y1.pz()*_pz;
117     }
118     // space components  dot product
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     //  pseudo-rapidity
162     //  public double eta()const;
163     //  true rapidity
164     //  public double y()const;
165     //float Momentum4Vector::eta()const{
166     //  float pt=std::max ((float)sqrt(_px*_px + _py*_py), (float)1e-10);
167     //  return (_pz>0) ?
168     //    log((sqrt(_px*_px + _py*_py + _pz*_pz) + _pz) / pt) :
169     //    log(pt / (sqrt(pt*pt + _pz*_pz) - _pz));
170     //}
171     
172     //float Momentum4Vector::y()const{
173     //  return 0.5 * log ((_E+_pz+(float)1e-10)/(_E-_pz+(float)1e-10));
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         // generate random decay in cms
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         // polar coordinates to momentum components
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 }