ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitHzz4l/Angles/src/Angles.cc
Revision: 1.1.1.1 (vendor branch)
Committed: Thu Sep 8 13:33:18 2011 UTC (13 years, 8 months ago) by khahn
Content type: text/plain
Branch: kh
CVS Tags: AN490, v1
Changes since 1.1: +0 -0 lines
Log Message:

File Contents

# User Rev Content
1 khahn 1.1 #include "Angles.h"
2     #include <iostream>
3    
4     void getAngles( LabVectors &l,
5     Angles &a ) {
6    
7     //
8     // define the frames
9     // --------------------------------------------------------------------------------------------------
10     TVector3 Xframe = l.vec4l.BoostVector();
11     TVector3 Z1frame = l.vecz1.BoostVector();
12     TVector3 Z2frame = l.vecz2.BoostVector();
13    
14     //
15     // costheta(l1m,X) in Z1 frame
16     // --------------------------------------------------------------------------------------------------
17     TLorentzVector vecl1m_in_Z1frame( l.vecl1m ); // make a copies of the vectors
18     TLorentzVector vec4l_in_Z1frame( l.vec4l ); //
19     vecl1m_in_Z1frame.Boost( -1*Z1frame ); // now go to the Z1 rest frame
20     vec4l_in_Z1frame.Boost( -1*Z1frame ); //
21     a.costheta1
22     = vecl1m_in_Z1frame.Vect().Dot(-1*vec4l_in_Z1frame.Vect()) /
23     (vecl1m_in_Z1frame.Vect().Mag()*vec4l_in_Z1frame.Vect().Mag());
24    
25     //
26     // costheta(l3,X) in Z2 frame
27     // --------------------------------------------------------------------------------------------------
28     TLorentzVector vecl2m_in_Z2frame( l.vecl2m ); // make copies of the vectors
29     TLorentzVector vec4l_in_Z2frame( l.vec4l ); //
30     vecl2m_in_Z2frame.Boost( -1*Z2frame ); // now go to the Z2 rest frame
31     vec4l_in_Z2frame.Boost( -1*Z2frame );
32     a.costheta2 =
33     vecl2m_in_Z2frame.Vect().Dot(-1*vec4l_in_Z2frame.Vect()) /
34     (vecl2m_in_Z2frame.Vect().Mag()*vec4l_in_Z2frame.Vect().Mag());
35    
36    
37     //
38     // Phi(Z1,Z2) in X frame
39     // --------------------------------------------------------------------------------------------------
40    
41     // this is essentially what they do and it reproduces their numbers,
42     // it's the angle between l1 and the z2 decay plane in the Z1 frame
43     TLorentzVector vecz2_in_Z1frame( l.vecz2 ); //
44     TLorentzVector vecl2m_in_Z1frame( l.vecl2m ); //
45     TLorentzVector vecl2p_in_Z1frame( l.vecl2p ); //
46     vecz2_in_Z1frame.Boost( -1*Z1frame ); //
47     vecl2m_in_Z1frame.Boost( -1*Z1frame ); //
48     vecl2p_in_Z1frame.Boost( -1*Z1frame ); //
49    
50     //
51     // define the Z2 coordinate system in the Z1 frame
52     // x : opposite the Z2 dir, lies in the Z2 decay plane
53     // z : orthogonal to the Z2 decay plane
54     // y : orthogonal to x&z, lies in the Z2 decay plane
55     TVector3 nnewX = ( -1*vecz2_in_Z1frame.Vect()).Unit();
56     TVector3 nnewZ = (vecl2m_in_Z1frame.Vect().Cross(vecl2p_in_Z1frame.Vect())).Unit();
57     TVector3 nnewY = nnewZ.Cross(nnewX).Unit();
58     TRotation rotation2;
59     rotation2 = (rotation2.RotateAxes( nnewX, nnewY, nnewZ )).Inverse();
60     TVector3 vecl1m_in_Z2coords_Z1frame = vecl1m_in_Z1frame.Vect().Transform(rotation2);
61    
62     //
63     // axes are redfined so that Phi is the angle between the Z1 orthogonal
64     // and the Z2 decay plane as given by y
65     //
66     TRotation rotation3;
67     TVector3 nnnewX( 0,1,0 );
68     TVector3 nnnewY( 0,0,1 );
69     TVector3 nnnewZ( 1,0,0 );
70     rotation3 = (rotation3.RotateAxes( nnnewX, nnnewY, nnnewZ )).Inverse();
71     TVector3 vecl1m_in_Z2coords_redefined_Z1frame = vecl1m_in_Z2coords_Z1frame.Transform(rotation3);
72     a.Phi = vecl1m_in_Z2coords_redefined_Z1frame.Phi();
73    
74    
75     //
76     // rather, I'd expect something like this ...
77     //
78     TLorentzVector vecl1p_in_Xframe( l.vecl1p ); // make a copies of the vectors
79     TLorentzVector vecl1m_in_Xframe( l.vecl1m ); //
80     TLorentzVector vecl2p_in_Xframe( l.vecl2p ); //
81     TLorentzVector vecl2m_in_Xframe( l.vecl2m ); //
82    
83     vecl1p_in_Xframe.Boost( -1*Xframe ); // go to the X rest frame
84     vecl1m_in_Xframe.Boost( -1*Xframe ); //
85     vecl2p_in_Xframe.Boost( -1*Xframe ); //
86     vecl2m_in_Xframe.Boost( -1*Xframe ); //
87    
88     /*
89     // sanity check ...
90     TLorentzVector z1inX = vecl1p_in_Xframe+vecl1m_in_Xframe;
91     TLorentzVector z2inX = vecl2p_in_Xframe+vecl2m_in_Xframe;
92     float dotz1z2 = z1inX.Vect().Dot(z2inX.Vect()) / (z1inX.Vect().Mag()*z2inX.Vect().Mag());
93     std::cout << "dotz1z2: " << dotz1z2 << std::endl;
94     */
95    
96     TVector3 Z1ortho_in_Xframe = // define the decay planes via the orthogonals
97     vecl1m_in_Xframe.Vect().Cross(vecl1p_in_Xframe.Vect());
98     TVector3 Z2ortho_in_Xframe =
99     vecl2m_in_Xframe.Vect().Cross(vecl2p_in_Xframe.Vect());
100    
101     /*
102     // sanity check ... why are these small but not exactly zero ???
103     float z1odot = Z1ortho_in_Xframe.Dot(z1inX.Vect())/(Z1ortho_in_Xframe.Mag()*z1inX.Vect().Mag());
104     float z2odot = Z2ortho_in_Xframe.Dot(z2inX.Vect())/(Z2ortho_in_Xframe.Mag()*z2inX.Vect().Mag());
105     float l1podot = Z1ortho_in_Xframe.Dot(vecl1p_in_Xframe.Vect())/(Z1ortho_in_Xframe.Mag()*vecl1p_in_Xframe.Vect().Mag());
106     float l1modot = Z1ortho_in_Xframe.Dot(vecl1m_in_Xframe.Vect())/(Z1ortho_in_Xframe.Mag()*vecl1m_in_Xframe.Vect().Mag());
107     std::cout << "Z1ortho_in_Xframe.Dot(z1inX): " << z1odot << "\t"
108     << "Z2ortho_in_Xframe.Dot(z2inX): " << z2odot << "\t"
109     << "Z1ortho_in_Xframe.Dot(veclp1_in_Xframe) : " << l1podot << "\t"
110     << "Z1ortho_in_Xframe.Dot(veclm1_in_Xframe) : " << l1modot << "\t"
111     << std::endl;
112     */
113    
114    
115     // a.Phi = Z1ortho_in_Xframe.DeltaPhi(Z2ortho_in_Xframe);
116     //a.Phi = Z1ortho_in_Xframe.Angle(Z2ortho_in_Xframe);
117    
118    
119    
120     //
121     // costheta*(Z1,pp) in X frame
122     // --------------------------------------------------------------------------------------------------
123     TLorentzVector vecz1_in_Xframe( l.vecz1 ); // make a copies of the vectors
124     TLorentzVector vecpp_in_Xframe( 0., 0., 1., 0. ); // define pp axis
125    
126     vecz1_in_Xframe.Boost( -1*Xframe ); // go to the X rest frame
127     vecpp_in_Xframe.Boost( -1*Xframe ); //
128    
129     a.costhetastar =
130     vecz1_in_Xframe.Vect().Dot(vecpp_in_Xframe.Vect()) /
131     (vecz1_in_Xframe.Vect().Mag()*vecpp_in_Xframe.Vect().Mag());
132    
133    
134     //
135     // Phi1(Z1,pp) in X frame
136     // --------------------------------------------------------------------------------------------------
137    
138     // define the Z1 decay plane in the Xframe
139     // y: orthogonal to the Z1 decay plane
140     // x: lies in the Z1 decay plane, but orthogonal to Z1
141     // z: z1 in Xframe
142     TVector3 newY = (vecl1p_in_Xframe.Vect().Unit().Cross(vecl1m_in_Xframe.Vect().Unit())).Unit();
143     TVector3 newX = (newY.Cross(vecz1_in_Xframe.Vect().Unit())).Unit();
144     TVector3 newZ( (vecz1_in_Xframe.Vect()).Unit() );
145    
146     TRotation rotation;
147     rotation = (rotation.RotateAxes( newX, newY, newZ )).Inverse();
148     TVector3 vecpp( 0., 0., 1. );
149     TVector3 vecpp_in_Z1coords_Xframe = vecpp.Transform(rotation);
150     a.Phi1 = vecpp_in_Z1coords_Xframe.Phi();
151    
152     a.mz1 = (l.vecl1m+l.vecl1p).M();
153     a.mz2 = (l.vecl2m+l.vecl2p).M();
154     a.m4l = (l.vec4l).M();
155    
156     };
157    
158