FEDRA emulsion software from the OPERA Collaboration
Functions.hh File Reference
#include <cmath>
#include "Expression.hh"
Include dependency graph for Functions.hh:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  meta_dot< I >
 
struct  meta_dot< 0 >
 
struct  meta_mag< I >
 
struct  meta_mag< 0 >
 

Functions

template<class A , class B , class T >
SVector< T, 3 > cross (const Expr< A, T, 3 > &lhs, const Expr< B, T, 3 > &rhs)
 
template<class A , class T >
SVector< T, 3 > cross (const Expr< A, T, 3 > &lhs, const SVector< T, 3 > &rhs)
 
template<class T , class A >
SVector< T, 3 > cross (const SVector< T, 3 > &lhs, const Expr< A, T, 3 > &rhs)
 
template<class T >
SVector< T, 3 > cross (const SVector< T, 3 > &lhs, const SVector< T, 3 > &rhs)
 
template<class A , class B , class T , unsigned int D>
dot (const Expr< A, T, D > &lhs, const Expr< B, T, D > &rhs)
 
template<class A , class T , unsigned int D>
dot (const Expr< A, T, D > &lhs, const SVector< T, D > &rhs)
 
template<class A , class T , unsigned int D>
dot (const SVector< T, D > &lhs, const Expr< A, T, D > &rhs)
 
template<class T , unsigned int D>
dot (const SVector< T, D > &lhs, const SVector< T, D > &rhs)
 
template<class A , class T >
Lmag (const Expr< A, T, 4 > &rhs)
 
template<class T >
Lmag (const SVector< T, 4 > &rhs)
 
template<class A , class T >
Lmag2 (const Expr< A, T, 4 > &rhs)
 
template<class T >
Lmag2 (const SVector< T, 4 > &rhs)
 
template<class A , class T , unsigned int D>
mag (const Expr< A, T, D > &rhs)
 
template<class T , unsigned int D>
mag (const SVector< T, D > &rhs)
 
template<class A , class T , unsigned int D>
mag2 (const Expr< A, T, D > &rhs)
 
template<class T , unsigned int D>
mag2 (const SVector< T, D > &rhs)
 
template<class T >
const T maximum (const T &lhs, const T &rhs)
 
template<class T >
const T minimum (const T &lhs, const T &rhs)
 
template<class T >
int round (const T &x)
 
template<class T >
const int sign (const T &x)
 
template<class T >
const T square (const T &x)
 
template<class A , class T , unsigned int D>
SVector< T, D > unit (const Expr< A, T, D > &rhs)
 
template<class T , unsigned int D>
SVector< T, D > unit (const SVector< T, D > &rhs)
 

Function Documentation

◆ cross() [1/4]

template<class A , class B , class T >
SVector<T,3> cross ( const Expr< A, T, 3 > &  lhs,
const Expr< B, T, 3 > &  rhs 
)
inline
322  {
323  return SVector<T,3>(lhs.apply(1)*rhs.apply(2) -
324  lhs.apply(2)*rhs.apply(1),
325  lhs.apply(2)*rhs.apply(0) -
326  lhs.apply(0)*rhs.apply(2),
327  lhs.apply(0)*rhs.apply(1) -
328  lhs.apply(1)*rhs.apply(0));
329 }
T apply(unsigned int i) const
Definition: Expression.hh:55
Definition: SVector.hh:51

◆ cross() [2/4]

template<class A , class T >
SVector<T,3> cross ( const Expr< A, T, 3 > &  lhs,
const SVector< T, 3 > &  rhs 
)
inline
296  {
297  return SVector<T,3>(lhs.apply(1)*rhs.apply(2) -
298  lhs.apply(2)*rhs.apply(1),
299  lhs.apply(2)*rhs.apply(0) -
300  lhs.apply(0)*rhs.apply(2),
301  lhs.apply(0)*rhs.apply(1) -
302  lhs.apply(1)*rhs.apply(0));
303 }
T apply(unsigned int i) const
access the parse tree

◆ cross() [3/4]

template<class T , class A >
SVector<T,3> cross ( const SVector< T, 3 > &  lhs,
const Expr< A, T, 3 > &  rhs 
)
inline
309  {
310  return SVector<T,3>(lhs.apply(1)*rhs.apply(2) -
311  lhs.apply(2)*rhs.apply(1),
312  lhs.apply(2)*rhs.apply(0) -
313  lhs.apply(0)*rhs.apply(2),
314  lhs.apply(0)*rhs.apply(1) -
315  lhs.apply(1)*rhs.apply(0));
316 }

◆ cross() [4/4]

template<class T >
SVector<T,3> cross ( const SVector< T, 3 > &  lhs,
const SVector< T, 3 > &  rhs 
)
inline

cross. Cross product of two 3-dim vectors: $\vec{c} = \vec{a}\times\vec{b}$.

Author
T. Glebe
283  {
284  return SVector<T,3>(lhs.apply(1)*rhs.apply(2) -
285  lhs.apply(2)*rhs.apply(1),
286  lhs.apply(2)*rhs.apply(0) -
287  lhs.apply(0)*rhs.apply(2),
288  lhs.apply(0)*rhs.apply(1) -
289  lhs.apply(1)*rhs.apply(0));
290 }

◆ dot() [1/4]

template<class A , class B , class T , unsigned int D>
T dot ( const Expr< A, T, D > &  lhs,
const Expr< B, T, D > &  rhs 
)
inline
157  {
158  return meta_dot<D-1>::f(rhs,lhs, T());
159 }
static T f(const A &lhs, const B &rhs, const T &x)
Definition: Functions.hh:105

◆ dot() [2/4]

template<class A , class T , unsigned int D>
T dot ( const Expr< A, T, D > &  lhs,
const SVector< T, D > &  rhs 
)
inline
148  {
149  return meta_dot<D-1>::f(lhs,rhs, T());
150 }

◆ dot() [3/4]

template<class A , class T , unsigned int D>
T dot ( const SVector< T, D > &  lhs,
const Expr< A, T, D > &  rhs 
)
inline
140  {
141  return meta_dot<D-1>::f(lhs,rhs, T());
142 }

◆ dot() [4/4]

template<class T , unsigned int D>
T dot ( const SVector< T, D > &  lhs,
const SVector< T, D > &  rhs 
)
inline

dot. Template to compute $\vec{a}\cdot\vec{b} = \sum_i a_i\cdot b_i$.

Author
T. Glebe
132  {
133  return meta_dot<D-1>::f(lhs,rhs, T());
134 }

◆ Lmag() [1/2]

template<class A , class T >
T Lmag ( const Expr< A, T, 4 > &  rhs)
inline
269  {
270  return sqrt(Lmag2(rhs));
271 }
T Lmag2(const SVector< T, 4 > &rhs)
Definition: Functions.hh:238

◆ Lmag() [2/2]

template<class T >
T Lmag ( const SVector< T, 4 > &  rhs)
inline

Lmag. Length of a vector Lorentz-Vector: $|\vec{v}| = \sqrt{v_0^2 - v_1^2 - v_2^2 -v_3^2}$.

Author
T. Glebe
261  {
262  return sqrt(Lmag2(rhs));
263 }

◆ Lmag2() [1/2]

template<class A , class T >
T Lmag2 ( const Expr< A, T, 4 > &  rhs)
inline
246  {
247  return square(rhs.apply(0))
248  - square(rhs.apply(1)) - square(rhs.apply(2)) - square(rhs.apply(3));
249 }
const T square(const T &x)
Definition: Functions.hh:46

◆ Lmag2() [2/2]

template<class T >
T Lmag2 ( const SVector< T, 4 > &  rhs)
inline

Lmag2. Template to compute $|\vec{v}|^2 = v_0^2 - v_1^2 - v_2^2 -v_3^2$.

Author
T. Glebe
238  {
239  return square(rhs[0]) - square(rhs[1]) - square(rhs[2]) - square(rhs[3]);
240 }

◆ mag() [1/2]

template<class A , class T , unsigned int D>
T mag ( const Expr< A, T, D > &  rhs)
inline
224  {
225  return sqrt(mag2(rhs));
226 }
T mag2(const SVector< T, D > &rhs)
Definition: Functions.hh:195

◆ mag() [2/2]

template<class T , unsigned int D>
T mag ( const SVector< T, D > &  rhs)
inline

mag. Length of a vector: $|\vec{v}| = \sqrt{\sum_iv_i^2}$.

Author
T. Glebe
216  {
217  return sqrt(mag2(rhs));
218 }

◆ mag2() [1/2]

template<class A , class T , unsigned int D>
T mag2 ( const Expr< A, T, D > &  rhs)
inline
203  {
204  return meta_mag<D-1>::f(rhs, T());
205 }
static T f(const A &rhs, const T &x)
Definition: Functions.hh:168

◆ mag2() [2/2]

template<class T , unsigned int D>
T mag2 ( const SVector< T, D > &  rhs)
inline

mag2. Template to compute $|\vec{v}|^2 = \sum_iv_i^2$.

Author
T. Glebe
195  {
196  return meta_mag<D-1>::f(rhs, T());
197 }

◆ maximum()

template<class T >
const T maximum ( const T &  lhs,
const T &  rhs 
)
inline

maximum. Template to compute $\max(i,j)$

Author
T. Glebe
57  {
58  return (lhs > rhs) ? lhs : rhs;
59 }

◆ minimum()

template<class T >
const T minimum ( const T &  lhs,
const T &  rhs 
)
inline

minimum. Template to compute $\min(i,j)$

Author
T. Glebe
70  {
71  return (lhs < rhs) ? lhs : rhs;
72 }

◆ round()

template<class T >
int round ( const T &  x)
inline

round. Template to compute nearest integer value.

Author
T. Glebe
83  {
84  return (x-static_cast<int>(x) < 0.5) ? static_cast<int>(x) : static_cast<int>(x+1);
85 }

◆ sign()

template<class T >
const int sign ( const T &  x)
inline

sign. Template to compute the sign of a number $\textrm{sgn}(i)$.

Author
T. Glebe
97 { return (x==0)? 0 : (x<0)? -1 : 1; }

◆ square()

template<class T >
const T square ( const T &  x)
inline

square. Template to compute $x\cdot x$

Author
T. Glebe
46 { return x*x; }

◆ unit() [1/2]

template<class A , class T , unsigned int D>
SVector<T,D> unit ( const Expr< A, T, D > &  rhs)
inline
349  {
350  return SVector<T,D>(rhs).unit();
351 }
SVector< T, D > & unit()
transform vector into a vector of lenght 1

◆ unit() [2/2]

template<class T , unsigned int D>
SVector<T,D> unit ( const SVector< T, D > &  rhs)
inline

unit. Return a vector of unit lenght: $\vec{e}_v = \vec{v}/|\vec{v}|$.

Author
T. Glebe
341  {
342  return SVector<T,D>(rhs).unit();
343 }