BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
kinem.h
Go to the documentation of this file.
1/*
2 * kinem.h - kinematics classes
3 *
4 * this file is part of PJFry library
5 * Copyright 2011 Valery Yundin
6 */
7
8#ifndef QUL_KINEM_H
9#define QUL_KINEM_H
10
11#include "common.h"
12#include <cstdlib>
13// #include <cfloat>
14
15template <int R> class Kinem {
16public:
17 bool operator==( const Kinem& kinem ) const;
18
19 inline double mass( int i ) const { return kdata[( i - 1 ) * ( i + 2 ) / 2]; }
20
21protected:
22 Kinem() {}
23
24 void zero(); // initialize to zero
25
26 typedef union {
27 double d64;
28 int64_t i64;
29 } DI64;
30 // static const double mdelta=1e-14;
31 // static const int64_t idelta=1+mdelta/DBL_EPSILON; // needs cfloat
32 /*
33 Comparison tolerance for double
34 idelta fdelta(%)
35 5 - 1.11e-15
36 46 - 1.02e-14
37 451 - 1.00e-13
38 4504 - 1.00e-12
39 45036 - 1.00e-11
40 */
41 static const uint64_t idelta = 5; // unsigned !!!
42
43 inline bool eq( const double& a, const double& b ) const {
44 const DI64 ia = { a };
45 const DI64 ib = { b };
46 const int64_t diff = ia.i64 - ib.i64;
47 return diff == 0LL || static_cast<uint64_t>( llabs( diff ) ) <= idelta;
48 }
49 inline bool neq( const double& a, const double& b ) const {
50 const DI64 ia = { a };
51 const DI64 ib = { b };
52 const int64_t diff = ia.i64 - ib.i64;
53 return diff != 0LL && static_cast<uint64_t>( llabs( diff ) ) > idelta;
54 }
55
56 static const int KLEN = R * ( R + 1 ) / 2;
76
77 double kdata[KLEN];
78};
79
80template <int R> bool Kinem<R>::operator==( const Kinem<R>& kinem ) const {
81 for ( int i = 0; i < KLEN; i++ )
82 {
83 if ( not eq( kdata[i], kinem.kdata[i] ) ) return false;
84 }
85 return true;
86}
87
88template <int R> void Kinem<R>::zero() {
89 for ( int i = 0; i < KLEN; i++ ) { kdata[i] = 0; }
90}
91
92// 1-point kinematics
93class Kinem1 : public Kinem<1> {
94public:
95 Kinem1() { zero(); }
96 Kinem1( double xm1 ) { kdata[im1] = xm1; }
97
98 inline double m1() const { return kdata[im1]; }
99};
100
101// 2-point kinematics
102class Kinem2 : public Kinem<2> {
103public:
104 Kinem2() { zero(); }
105 Kinem2( double xp1, double xm1, double xm2 ) {
106 kdata[ip1] = xp1;
107 kdata[im1] = xm1;
108 kdata[im2] = xm2;
109 }
110
111 inline double p1() const { return kdata[ip1]; }
112 inline double m1() const { return kdata[im1]; }
113 inline double m2() const { return kdata[im2]; }
114};
115
116// 3-point kinematics
117class Kinem3 : public Kinem<3> {
118public:
119 Kinem3() { zero(); }
120 Kinem3( double xp1, double xp2, double xp3, double xm1, double xm2, double xm3 ) {
121 kdata[ip1] = xp1;
122 kdata[ip2] = xp2;
123 kdata[ip3] = xp3;
124 kdata[im1] = xm1;
125 kdata[im2] = xm2;
126 kdata[im3] = xm3;
127 }
128
129 inline double p1() const { return kdata[ip1]; }
130 inline double p2() const { return kdata[ip2]; }
131 inline double p3() const { return kdata[ip3]; }
132 inline double m1() const { return kdata[im1]; }
133 inline double m2() const { return kdata[im2]; }
134 inline double m3() const { return kdata[im3]; }
135};
136
137// 4-point kinematics
138class Kinem4 : public Kinem<4> {
139public:
140 Kinem4() { zero(); }
141 Kinem4( double xp1, double xp2, double xp3, double xp4, double xs12, double xs23, double xm1,
142 double xm2, double xm3, double xm4 ) {
143 kdata[ip1] = xp1;
144 kdata[ip2] = xp2;
145 kdata[ip3] = xp3;
146 kdata[ip4] = xp4;
147 kdata[is12] = xs12;
148 kdata[is23] = xs23;
149 kdata[im1] = xm1;
150 kdata[im2] = xm2;
151 kdata[im3] = xm3;
152 kdata[im4] = xm4;
153 }
154
155 inline double p1() const { return kdata[ip1]; }
156 inline double p2() const { return kdata[ip2]; }
157 inline double p3() const { return kdata[ip3]; }
158 inline double p4() const { return kdata[ip4]; }
159 inline double m1() const { return kdata[im1]; }
160 inline double m2() const { return kdata[im2]; }
161 inline double m3() const { return kdata[im3]; }
162 inline double m4() const { return kdata[im4]; }
163 inline double s12() const { return kdata[is12]; }
164 inline double s23() const { return kdata[is23]; }
165};
166
167// 5-point kinematics
168class Kinem5 : public Kinem<5> {
169public:
170 Kinem5() { zero(); }
171 Kinem5( double xp1, double xp2, double xp3, double xp4, double xp5, double xs12, double xs23,
172 double xs34, double xs45, double xs15, double xm1, double xm2, double xm3,
173 double xm4, double xm5 ) {
174 kdata[ip1] = xp1;
175 kdata[ip2] = xp2;
176 kdata[ip3] = xp3;
177 kdata[ip4] = xp4;
178 kdata[ip5] = xp5;
179 kdata[is12] = xs12;
180 kdata[is23] = xs23;
181 kdata[is34] = xs34;
182 kdata[is45] = xs45;
183 kdata[is15] = xs15;
184 kdata[im1] = xm1;
185 kdata[im2] = xm2;
186 kdata[im3] = xm3;
187 kdata[im4] = xm4;
188 kdata[im5] = xm5;
189 }
190
191 inline double p1() const { return kdata[ip1]; }
192 inline double p2() const { return kdata[ip2]; }
193 inline double p3() const { return kdata[ip3]; }
194 inline double p4() const { return kdata[ip4]; }
195 inline double p5() const { return kdata[ip5]; }
196 inline double m1() const { return kdata[im1]; }
197 inline double m2() const { return kdata[im2]; }
198 inline double m3() const { return kdata[im3]; }
199 inline double m4() const { return kdata[im4]; }
200 inline double m5() const { return kdata[im5]; }
201 inline double s12() const { return kdata[is12]; }
202 inline double s23() const { return kdata[is23]; }
203 inline double s34() const { return kdata[is34]; }
204 inline double s45() const { return kdata[is45]; }
205 inline double s15() const { return kdata[is15]; }
206};
207
208#endif /* QUL_KINEM_H */
Kinem1()
Definition kinem.h:95
Kinem1(double xm1)
Definition kinem.h:96
double m1() const
Definition kinem.h:98
Kinem2(double xp1, double xm1, double xm2)
Definition kinem.h:105
double m2() const
Definition kinem.h:113
Kinem2()
Definition kinem.h:104
double m1() const
Definition kinem.h:112
double p1() const
Definition kinem.h:111
double m1() const
Definition kinem.h:132
double p1() const
Definition kinem.h:129
double p3() const
Definition kinem.h:131
Kinem3(double xp1, double xp2, double xp3, double xm1, double xm2, double xm3)
Definition kinem.h:120
double p2() const
Definition kinem.h:130
double m2() const
Definition kinem.h:133
double m3() const
Definition kinem.h:134
Kinem3()
Definition kinem.h:119
double m1() const
Definition kinem.h:159
double m3() const
Definition kinem.h:161
double s12() const
Definition kinem.h:163
double p1() const
Definition kinem.h:155
Kinem4(double xp1, double xp2, double xp3, double xp4, double xs12, double xs23, double xm1, double xm2, double xm3, double xm4)
Definition kinem.h:141
double s23() const
Definition kinem.h:164
double m2() const
Definition kinem.h:160
Kinem4()
Definition kinem.h:140
double p3() const
Definition kinem.h:157
double p2() const
Definition kinem.h:156
double p4() const
Definition kinem.h:158
double m4() const
Definition kinem.h:162
double p4() const
Definition kinem.h:194
Kinem5(double xp1, double xp2, double xp3, double xp4, double xp5, double xs12, double xs23, double xs34, double xs45, double xs15, double xm1, double xm2, double xm3, double xm4, double xm5)
Definition kinem.h:171
double p3() const
Definition kinem.h:193
double m1() const
Definition kinem.h:196
Kinem5()
Definition kinem.h:170
double p1() const
Definition kinem.h:191
double s15() const
Definition kinem.h:205
double s45() const
Definition kinem.h:204
double p2() const
Definition kinem.h:192
double p5() const
Definition kinem.h:195
double m4() const
Definition kinem.h:199
double s34() const
Definition kinem.h:203
double m5() const
Definition kinem.h:200
double m2() const
Definition kinem.h:197
double s12() const
Definition kinem.h:201
double s23() const
Definition kinem.h:202
double m3() const
Definition kinem.h:198
bool eq(const double &a, const double &b) const
Definition kinem.h:43
static const uint64_t idelta
Definition kinem.h:41
static const int KLEN
Definition kinem.h:56
Kinem()
Definition kinem.h:22
Invar
Definition kinem.h:57
@ is34
Definition kinem.h:69
@ im1
Definition kinem.h:58
@ im4
Definition kinem.h:67
@ im2
Definition kinem.h:60
@ is45
Definition kinem.h:70
@ ip5
Definition kinem.h:68
@ im6
Definition kinem.h:74
@ ip3
Definition kinem.h:62
@ ip2
Definition kinem.h:61
@ im3
Definition kinem.h:63
@ ip6
Definition kinem.h:73
@ im5
Definition kinem.h:72
@ ip1
Definition kinem.h:59
@ is15
Definition kinem.h:71
@ is12
Definition kinem.h:65
@ is23
Definition kinem.h:66
@ ip4
Definition kinem.h:64
double kdata[KLEN]
Definition kinem.h:77
void zero()
Definition kinem.h:88
double mass(int i) const
Definition kinem.h:19
bool neq(const double &a, const double &b) const
Definition kinem.h:49
bool operator==(const Kinem &kinem) const
Definition kinem.h:80
double d64
Definition kinem.h:27
int64_t i64
Definition kinem.h:28