1 |
khahn |
1.1 |
#include "Angles.h"
|
2 |
|
|
#include <iostream>
|
3 |
|
|
|
4 |
|
|
//
|
5 |
|
|
// angles from Gainer, et. al.
|
6 |
|
|
// arVix:1108.2274v1 [hep-ph], 10 Aug 2011
|
7 |
|
|
//
|
8 |
|
|
// NB : phi1 will look quite different from the plots on pg 14, which have no kinematic cuts. phi1 looks
|
9 |
|
|
// more like the plots on pg 22, which do have cuts.
|
10 |
|
|
|
11 |
|
|
void getAngles_ANL_NWU( LabVectors &l, Angles &a ) {
|
12 |
|
|
|
13 |
|
|
//
|
14 |
|
|
// define the frames & coordinate systems
|
15 |
|
|
// --------------------------------------------------------------------------------------------------
|
16 |
|
|
|
17 |
|
|
TVector3 Xframe = l.vec4l.BoostVector();
|
18 |
|
|
TVector3 Z1frame = l.vecz1.BoostVector();
|
19 |
|
|
TVector3 Z2frame = l.vecz2.BoostVector();
|
20 |
|
|
|
21 |
|
|
// "partons" (pg6)
|
22 |
|
|
TLorentzVector kq( 0, 0, (l.vec4l.E()+l.vec4l.Pz())/2, (l.vec4l.E()+l.vec4l.Pz())/2 );
|
23 |
|
|
TLorentzVector kqbar( 0, 0, (l.vec4l.Pz()-l.vec4l.E())/2, (l.vec4l.E()-l.vec4l.Pz())/2 );
|
24 |
|
|
TLorentzVector veckq_in_Xframe(kq);
|
25 |
|
|
TLorentzVector veckqbar_in_Xframe(kqbar);
|
26 |
|
|
veckq_in_Xframe.Boost(-1*Xframe);
|
27 |
|
|
veckqbar_in_Xframe.Boost(-1*Xframe);
|
28 |
|
|
|
29 |
|
|
// Z vectors
|
30 |
|
|
TLorentzVector vecz1_in_Xframe (l.vecz1);
|
31 |
|
|
TLorentzVector vecz2_in_Xframe (l.vecz2);
|
32 |
|
|
TLorentzVector vecz1_in_Z1frame (l.vecz1);
|
33 |
|
|
TLorentzVector vecz2_in_Z2frame (l.vecz2);
|
34 |
|
|
vecz1_in_Xframe.Boost(-1*Xframe);
|
35 |
|
|
vecz2_in_Xframe.Boost(-1*Xframe);
|
36 |
|
|
vecz1_in_Z1frame.Boost(-1*Z1frame);
|
37 |
|
|
vecz2_in_Z2frame.Boost(-1*Z2frame);
|
38 |
|
|
|
39 |
|
|
// coord system in the CM frame
|
40 |
|
|
TVector3 uz_in_Xframe = vecz1_in_Xframe.Vect().Unit();
|
41 |
|
|
TVector3 uy_in_Xframe = (veckq_in_Xframe.Vect().Unit().Cross(uz_in_Xframe.Unit())).Unit();
|
42 |
|
|
TVector3 ux_in_Xframe = (uy_in_Xframe.Unit().Cross(uz_in_Xframe.Unit())).Unit();
|
43 |
|
|
TRotation rotation;
|
44 |
|
|
rotation = rotation.RotateAxes( ux_in_Xframe,uy_in_Xframe,uz_in_Xframe ).Inverse();
|
45 |
|
|
|
46 |
|
|
// coords for Z2. rotate CM around y by pi
|
47 |
|
|
TVector3 ux_in_Xframe_z2(ux_in_Xframe);
|
48 |
|
|
TVector3 uy_in_Xframe_z2(uy_in_Xframe);
|
49 |
|
|
TVector3 uz_in_Xframe_z2(uz_in_Xframe);
|
50 |
|
|
TRotation aroundy;
|
51 |
|
|
aroundy.Rotate(TMath::Pi(),uy_in_Xframe_z2);
|
52 |
|
|
ux_in_Xframe_z2.Transform(aroundy);
|
53 |
|
|
uz_in_Xframe_z2.Transform(aroundy);
|
54 |
|
|
TRotation rotation2;
|
55 |
|
|
rotation2 = rotation2.RotateAxes( ux_in_Xframe_z2,uy_in_Xframe_z2,uz_in_Xframe_z2 ).Inverse();
|
56 |
|
|
|
57 |
|
|
//
|
58 |
|
|
// for going to the Z frames from the CM frame
|
59 |
|
|
//
|
60 |
|
|
TLorentzVector vecz1_in_Xframe_newcoords(vecz1_in_Xframe);
|
61 |
|
|
vecz1_in_Xframe_newcoords.Transform(rotation);
|
62 |
|
|
TVector3 Z1frame_from_Xframe_newcoords = vecz1_in_Xframe_newcoords.BoostVector();
|
63 |
|
|
TLorentzVector vecz2_in_Xframe_newcoords(vecz2_in_Xframe);
|
64 |
|
|
vecz2_in_Xframe_newcoords.Transform(rotation2);
|
65 |
|
|
TVector3 Z2frame_from_Xframe_newcoords = vecz2_in_Xframe_newcoords.BoostVector();
|
66 |
|
|
|
67 |
|
|
|
68 |
|
|
//
|
69 |
|
|
// theta(l1m), phi(l1m) in Z1 frame
|
70 |
|
|
// --------------------------------------------------------------------------------------------------
|
71 |
|
|
TLorentzVector vecl1m_in_Z1frame(l.vecl1m);
|
72 |
|
|
|
73 |
|
|
// redefine coords
|
74 |
|
|
vecl1m_in_Z1frame.Boost(-1*Xframe);
|
75 |
|
|
vecl1m_in_Z1frame.Transform(rotation);
|
76 |
|
|
|
77 |
|
|
// then boost to Z1
|
78 |
|
|
vecl1m_in_Z1frame.Boost(-1*Z1frame_from_Xframe_newcoords);
|
79 |
|
|
|
80 |
|
|
// now get angles
|
81 |
|
|
a.costheta1 = vecl1m_in_Z1frame.CosTheta();
|
82 |
|
|
a.phi1 = vecl1m_in_Z1frame.Phi();
|
83 |
|
|
|
84 |
|
|
|
85 |
|
|
//
|
86 |
|
|
// theta(l2m), phi(l2m) in Z2 frame
|
87 |
|
|
// --------------------------------------------------------------------------------------------------
|
88 |
|
|
TLorentzVector vecl2m_in_Z2frame(l.vecl2m);
|
89 |
|
|
|
90 |
|
|
// redefine coords
|
91 |
|
|
vecl2m_in_Z2frame.Boost(-1*Xframe);
|
92 |
|
|
vecl2m_in_Z2frame.Transform(rotation2);
|
93 |
|
|
|
94 |
|
|
// then boost to Z
|
95 |
|
|
vecl2m_in_Z2frame.Boost(-1*Z2frame_from_Xframe_newcoords);
|
96 |
|
|
|
97 |
|
|
// now get angles
|
98 |
|
|
a.costheta2 = vecl2m_in_Z2frame.CosTheta();
|
99 |
|
|
a.phi2 = vecl2m_in_Z2frame.Phi();
|
100 |
|
|
|
101 |
|
|
a.Phi = TVector2::Phi_0_2pi(TMath::Pi()
|
102 |
|
|
-TVector2::Phi_0_2pi(a.phi1)
|
103 |
|
|
-TVector2::Phi_0_2pi(a.phi2) );
|
104 |
|
|
|
105 |
|
|
//
|
106 |
|
|
// Theta(Z1,pp) in X frame
|
107 |
|
|
// --------------------------------------------------------------------------------------------------
|
108 |
|
|
// but store it under Phi1 ...
|
109 |
|
|
|
110 |
|
|
// redefine coords
|
111 |
|
|
veckq_in_Xframe.Transform(rotation);
|
112 |
|
|
|
113 |
|
|
// already boosted ....
|
114 |
|
|
a.Phi1 = veckq_in_Xframe.Theta();
|
115 |
|
|
|
116 |
|
|
|
117 |
|
|
//
|
118 |
|
|
// why not ... let's add some masses
|
119 |
|
|
// --------------------------------------------------------------------------------------------------
|
120 |
khahn |
1.2 |
// a.mz1 = (l.vecl1m+l.vecl1p).M();
|
121 |
|
|
// a.mz2 = (l.vecl2m+l.vecl2p).M();
|
122 |
|
|
// a.m4l = (l.vec4l).M();
|
123 |
khahn |
1.1 |
|
124 |
|
|
};
|