1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
#ifndef Math_notmalizedPhi_h
#define Math_notmalizedPhi_h
#include "DataFormats/Math/interface/deltaPhi.h"
#include <algorithm>
// return a value of phi into interval [-pi,+pi]
template <typename T>
constexpr T normalizedPhi(T phi) {
return reco::reducePhiRange(phi);
}
// cernlib V306
template <typename T>
constexpr T proxim(T b, T a) {
constexpr T c1 = 2. * M_PI;
constexpr T c2 = 1 / c1;
return b + c1 * std::round(c2 * (a - b));
}
#include <iostream>
// smallest range
template <typename T>
constexpr bool checkPhiInSymRange(T phi, T phi1, T phi2, float maxDphi = float(M_PI)) {
// symmetrize
if (phi2 < phi1)
std::swap(phi1, phi2);
return checkPhiInRange(phi, phi1, phi2, maxDphi);
}
// counterclock-wise range
template <typename T>
constexpr bool checkPhiInRange(T phi, T phi1, T phi2, float maxDphi = float(M_PI)) {
phi2 = proxim(phi2, phi1);
constexpr float c1 = 2. * M_PI;
if (phi2 < phi1)
phi2 += c1;
auto dphi = std::min(maxDphi, 0.5f * (phi2 - phi1));
auto phiA = phi1 + dphi;
phi = proxim(phi, phiA);
return std::abs(phiA - phi) < dphi;
/* old "alternative algo"
constexpr T c1 = 2.*M_PI;
phi1 = normalizedPhi(phi1);
phi2 = proxim(phi2,phi1);
if (phi2<phi1) phi2+=c1;
// phi & phi1 are in [-pi,pi] range...
return ( (phi1 <= phi) & (phi <= phi2) )
// || ( (phi1 <= phi-c1) & (phi-c1 <= phi2) )
|| ( (phi1 <= phi+c1) & (phi+c1 <= phi2) );
*/
}
#endif
|