YAP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AmplitudeBasis.h
Go to the documentation of this file.
1 /* YAP - Yet another PWA toolkit
2  Copyright 2015, Technische Universitaet Muenchen,
3  Authors: Daniel Greenwald, Johannes Rauch
4 
5  This program is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 3 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17  */
18 
20 
21 #ifndef yap_AmplitudeBasis_h
22 #define yap_AmplitudeBasis_h
23 
24 #include "fwd/AmplitudeBasis.h"
25 
26 #include "ComplexBasis.h"
27 
28 #include "Exceptions.h"
29 #include "Matrix.h"
30 #include "Vector.h"
31 
32 #include <complex>
33 
34 namespace yap {
35 
36 namespace amplitude_basis {
37 
39 template <typename T>
40 using covariance_matrix = SquareMatrix<complex_basis::covariance_matrix<T>, 3>;
41 
45 template <typename T>
46 class basis {
47 
48 protected:
52  basis(Vector<std::complex<T>, 3> c,
53  covariance_matrix<T> cov = covariance_matrix<T>()) :
54  Amplitudes_(c), Covariance_(cov)
55  {}
56 
57  // conversion constructor
58  explicit basis(const basis<T>& other, const SquareMatrix<T, 3>& jacobian) :
59  Amplitudes_(jacobian * other.Amplitudes_),
60  Covariance_(jacobian * other.Covariance_ * transpose(jacobian))
61  {}
62 
63 public:
66  { return Amplitudes_; }
67 
69  const covariance_matrix<T>& covariance() const
70  { return Covariance_; }
71 
72 private:
76  covariance_matrix<T> Covariance_;
77 };
78 
83 template <typename T>
84 class canonical : public basis<T> {
85 
86 public:
92  explicit canonical(const std::complex<T>& c1, const std::complex<T>& c2, const std::complex<T>& c3,
93  covariance_matrix<T> cov = covariance_matrix<T>()) :
94  basis<T>(Vector<std::complex<T>, 3>({c1, c2, c3}), cov)
95  {}
96 
100  explicit canonical(Vector<std::complex<T>, 3> c,
101  covariance_matrix<T> cov = covariance_matrix<T>()) :
102  basis<T>(c, cov)
103  {}
104 
107  explicit canonical(const covariance_matrix<T>& cov) :
108  basis<T>(Vector<std::complex<T>, 3>({0, 0, 0}), cov)
109  {}
110 
115  canonical(const complex_basis::cartesian<T>& c1, const complex_basis::cartesian<T>& c2, const complex_basis::cartesian<T>& c3) :
116  basis<T>(Vector<std::complex<T>, 3>({c1, c2, c3}),
117  diagonalMatrix<complex_basis::covariance_matrix<T>, 3>({c1.covariance(), c2.covariance(), c3.covariance()}))
118  {}
119 
121  explicit constexpr canonical(const transversity<T>& t) :
122  basis<T>(t, jacobian_from_transversity)
123  {}
124 
126  explicit constexpr canonical(const helicity<T>& h) :
127  basis<T>(h, jacobian_from_helicity)
128  {}
129 
131  const std::complex<T> s() const
132  { return basis<T>::coordinates()[0]; }
133 
135  const std::complex<T> p() const
136  { return basis<T>::coordinates()[1]; }
137 
139  const std::complex<T> d() const
140  { return basis<T>::coordinates()[2]; }
141 
144  const std::complex<T> operator[] (size_t l) const
145  {
146  switch (l) {
147  case 0:
148  return s();
149  case 1:
150  return p();
151  case 2:
152  return d();
153  default :
154  throw exceptions::Exception("l must be 0, 1, or 2", "canonical::operator[]");
155  }
156  }
157 
158 private:
159 
160  // transformation matrix (jacobian) from transversity to canonical
161  static const SquareMatrix<T, 3> jacobian_from_transversity;
162 
163  // transformation matrix (jacobian) from helicity to canonical
164  static const SquareMatrix<T, 3> jacobian_from_helicity;
165 };
166 
170 template <typename T>
171 class transversity : public basis<T> {
172 
173 public:
179  explicit transversity(const std::complex<T>& c1, const std::complex<T>& c2, const std::complex<T>& c3,
180  covariance_matrix<T> cov = covariance_matrix<T>()) :
181  basis<T>(Vector<std::complex<T>, 3>({c1, c2, c3}), cov)
182  {}
183 
187  explicit transversity(Vector<std::complex<T>, 3> c,
188  covariance_matrix<T> cov = covariance_matrix<T>()) :
189  basis<T>(c, cov)
190  {}
191 
194  explicit transversity(const covariance_matrix<T>& cov) :
195  basis<T>(Vector<std::complex<T>, 3>({0, 0, 0}), cov)
196  {}
197 
202  transversity(const complex_basis::cartesian<T>& c1, const complex_basis::cartesian<T>& c2, const complex_basis::cartesian<T>& c3) :
203  basis<T>(Vector<std::complex<T>, 3>({c1, c2, c3}),
204  diagonalMatrix<complex_basis::covariance_matrix<T>, 3>({c1.covariance(), c2.covariance(), c3.covariance()}))
205  {}
206 
208  explicit constexpr transversity(const canonical<T>& c) :
209  basis<T>(c, jacobian_from_canonical)
210  {}
211 
213  explicit constexpr transversity(const helicity<T>& h) :
214  basis<T>(h, jacobian_from_helicity)
215  {}
216 
218  const std::complex<T> longitudinal() const
219  { return basis<T>::coordinates()[0]; }
220 
222  const std::complex<T> parallel() const
223  { return basis<T>::coordinates()[1]; }
224 
226  const std::complex<T> perpendicular() const
227  { return basis<T>::coordinates()[2]; }
228 
229 private:
230 
231  // transformation matrix (jacobian) from canonical to transversity
232  static const SquareMatrix<T, 3> jacobian_from_canonical;
233 
234  // transformation matrix (jacobian) from helicity to transversity
235  static const SquareMatrix<T, 3> jacobian_from_helicity;
236 };
237 
238 
242 template <typename T>
243 class helicity : public basis<T> {
244 
245 public:
251  explicit helicity(const std::complex<T>& c1, const std::complex<T>& c2, const std::complex<T>& c3,
252  covariance_matrix<T> cov = covariance_matrix<T>()) :
253  basis<T>(Vector<std::complex<T>, 3>({c1, c2, c3}), cov)
254  {}
255 
259  explicit helicity(Vector<std::complex<T>, 3> c,
260  covariance_matrix<T> cov = covariance_matrix<T>()) :
261  basis<T>(c, cov)
262  {}
263 
266  explicit helicity(const covariance_matrix<T>& cov) :
267  basis<T>(Vector<std::complex<T>, 3>({0, 0, 0}), cov)
268  {}
269 
274  helicity(const complex_basis::cartesian<T>& c1, const complex_basis::cartesian<T>& c2, const complex_basis::cartesian<T>& c3) :
275  basis<T>(Vector<std::complex<T>, 3>({c1, c2, c3}),
276  diagonalMatrix<complex_basis::covariance_matrix<T>, 3>({c1.covariance(), c2.covariance(), c3.covariance()}))
277  {}
278 
280  explicit constexpr helicity(const canonical<T>& c) :
281  basis<T>(c, jacobian_from_canonical)
282  {}
283 
285  explicit constexpr helicity(const transversity<T>& t) :
286  basis<T>(t, jacobian_from_transversity)
287  {}
288 
290  const std::complex<T> zero() const
291  { return basis<T>::coordinates()[0]; }
292 
294  const std::complex<T> plus() const
295  { return basis<T>::coordinates()[1]; }
296 
298  const std::complex<T> minus() const
299  { return basis<T>::coordinates()[2]; }
300 
301 private:
302 
303  // transformation matrix (jacobian) from canonical to helicity
304  static const SquareMatrix<T, 3> jacobian_from_canonical;
305 
306  // transformation matrix (jacobian) from transversity to helicity
307  static const SquareMatrix<T, 3> jacobian_from_transversity;
308 };
309 
310 
312 
313 template <typename T>
314 const SquareMatrix<T, 3> canonical<T>::jacobian_from_transversity(
315  // longitudinal parallel perpendicular
316  {-sqrt(1./3.), sqrt(2./3.), 0, // S
317  0, 0, 1, // P
318  sqrt(2./3.), sqrt(1./3.), 0}); // D
319 
320 template <typename T>
321 const SquareMatrix<T, 3> canonical<T>::jacobian_from_helicity(
322  // zero plus minus
323  {-sqrt(1./3.), sqrt(1./3.), sqrt(1./3.), // S
324  0, sqrt(0.5), -sqrt(0.5) , // P
325  sqrt(2./3.), sqrt(1./6.), sqrt(1./6.)}); // D
326 
327 template <typename T>
328 const SquareMatrix<T, 3> transversity<T>::jacobian_from_canonical(
329  // S P D
330  {-sqrt(1. / 3.), 0, sqrt(2. / 3.), // longitudinal
331  sqrt(2. / 3.), 0, sqrt(1. / 3.), // parallel
332  0, 1, 0 }); // perpendicular
333 
334 template <typename T>
335 const SquareMatrix<T, 3> transversity<T>::jacobian_from_helicity(
336  // zero plus minus
337  {1, 0, 0 , // longitudinal
338  0, sqrt(0.5), sqrt(0.5), // parallel
339  0, sqrt(0.5), -sqrt(0.5)}); // perpendicular
340 
341 template <typename T>
342 const SquareMatrix<T, 3> helicity<T>::jacobian_from_canonical(
343  // S P D
344  {-sqrt(1./3.), 0, sqrt(2./3.), // zero
345  sqrt(1./3.), sqrt(0.5), sqrt(1./6.), // plus
346  sqrt(1./3.), -sqrt(0.5), sqrt(1./6.)}); // minus
347 
348 template <typename T>
349 const SquareMatrix<T, 3> helicity<T>::jacobian_from_transversity(
350  // longitudinal parallel perpendicular
351  {1, 0, 0 , // zero
352  0, sqrt(0.5), sqrt(0.5), // plus
353  0, sqrt(0.5), -sqrt(0.5)}); // minus
354 }
355 
356 }
357 
358 #endif
Definition: AmplitudeBasis.h:46
Definition: AmplitudeBasis.h:84
const Matrix< T, C, R > transpose(const Matrix< T, R, C > &M)
transpose a matrix
Definition: Matrix.h:148
helicity(const std::complex< T > &c1, const std::complex< T > &c2, const std::complex< T > &c3, covariance_matrix< T > cov=covariance_matrix< T >())
Definition: AmplitudeBasis.h:251
covariance_matrix< T > Covariance_
covariance matrix
Definition: AmplitudeBasis.h:76
const Vector< std::complex< T >, 3 > & coordinates() const
Definition: AmplitudeBasis.h:65
transversity(const std::complex< T > &c1, const std::complex< T > &c2, const std::complex< T > &c3, covariance_matrix< T > cov=covariance_matrix< T >())
Definition: AmplitudeBasis.h:179
const SquareMatrix< T, N > diagonalMatrix(std::array< T, N > d)
diagonal matrix
Definition: Matrix.h:114
Definition: AmplitudeBasis.h:243
Definition: AmplitudeBasis.h:171
const covariance_matrix< T > & covariance() const
Definition: AmplitudeBasis.h:69
canonical(const std::complex< T > &c1, const std::complex< T > &c2, const std::complex< T > &c3, covariance_matrix< T > cov=covariance_matrix< T >())
Definition: AmplitudeBasis.h:92
Vector< std::complex< T >, 3 > Amplitudes_
vector of amplitudes
Definition: AmplitudeBasis.h:74
basis(Vector< std::complex< T >, 3 > c, covariance_matrix< T > cov=covariance_matrix< T >())
Definition: AmplitudeBasis.h:52
N-dimensional column vector.
Definition: Vector.h:168