BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
Reconstruction/MdcPatRec/MdcGeom/include/MdcGeom/BesAngle.h
Go to the documentation of this file.
1#ifndef __BBRANGLE_H__
2#define __BBRANGLE_H__
3////////////////////////////////
4////////////////////////////////
5//
6// BaBar angles are in radians, and degress should inly be used
7// when absolutely necessary. Automatic conversions to and from
8// the radians form are provided, but you have to manually
9// go to and from degrees
10//
11// By convention, angles are represented as (-pi, pi]
12//
13#include "MdcGeom/Constants.h"
14#include <math.h>
15
16class BesAngle {
17public:
18 inline BesAngle();
19 inline BesAngle( const double );
20 inline ~BesAngle();
21
22 inline operator double() const { return _phi; }; // automatic conversion to double
23
24 inline double rad() const;
25 inline double deg() const;
26 // convention : returns value in [-180, 180]
27
28 inline double posRad() const;
29 inline double posDeg() const;
30 // returns 0 to 360. This is not the BaBar convention, and should not
31 // be used for handing off values to anyone else's code
32
33 inline void setRad( const double );
34 inline void setDeg( const double );
35
36 inline double arc( double radius ) const;
37
38 inline void setSector( int n, int max );
39 inline void setSector( int n, int max, BesAngle phi_0 );
40
41 inline BesAngle operator+( const BesAngle& ) const;
42 inline BesAngle operator+( const double ) const; // assumes double in radians
43 inline BesAngle operator-( const BesAngle& ) const;
44 inline BesAngle operator-( const double ) const; // assumes double in radians
45 inline BesAngle operator*( const double ) const;
46 inline BesAngle operator/( const double ) const;
47 inline friend BesAngle operator*( const double, const BesAngle& );
48
49 inline void operator=( const BesAngle );
50 inline void operator+=( BesAngle );
51 inline void operator-=( BesAngle );
52 inline void operator+=( double ); // assumes double in radians
53 inline void operator-=( double ); // assumes double in radians
54 inline void operator*=( double );
55 inline void operator/=( double );
56
57 // note : > and < should have no well defined meaning ?
58
59 inline int sector( int max );
60 inline int sector( int max, BesAngle phi_0 );
61 // convention : returns values [1..max]
62 // hxt HepString degString() const;
63 inline friend double sin( const BesAngle );
64 inline friend double cos( const BesAngle );
65 inline friend double tan( const BesAngle );
66
67 // class static constants defined in .cc file
68 // these are generally available as Constants::pi, Constants::twoPi, etc,
69 // and once the BaBar/Constants class is in a release they should be
70 /// used instead.
71
72 static const double pi;
73 static const double twoPi;
74
75 // old names, forwarded for migration BobJ May 21 97
76 inline double Rad() const { return rad(); }
77 inline double Deg() const { return deg(); }
78 // hxt inline HepString DegString() const { return degString(); }
79 inline int Sector( int max ) { return sector( max ); }
80 inline int Sector( int max, BesAngle phi_0 ) { return sector( max, phi_0 ); }
81
82protected:
83 double _phi;
84
85 inline static double normalize( double );
86
87 static const double toDegrees;
88 // hxt static const HepString degChar, deg1Char, deg2Char;
89};
90
91//
92// Methods for BesAngle
93//
94
95inline double BesAngle::normalize( double angle ) {
96 if ( angle < -Constants::pi )
97 {
98 angle += Constants::twoPi;
99 if ( angle < -Constants::pi )
100 angle = fmod( angle + Constants::pi, Constants::twoPi ) + Constants::pi;
101 }
102 else if ( angle > Constants::pi )
103 {
104 angle -= Constants::twoPi;
105 if ( angle > Constants::pi )
106 angle = fmod( angle + Constants::pi, Constants::twoPi ) - Constants::pi;
107 }
108 return angle;
109}
110
111inline BesAngle::BesAngle() : _phi( 0 ) {}
112
113inline BesAngle::BesAngle( const double phi ) : _phi( normalize( phi ) ) {}
114
115inline BesAngle::~BesAngle() {}
116
117inline double BesAngle::rad() const { return _phi; }
118
119inline double BesAngle::deg() const { return _phi * Constants::radToDegrees; }
120
121inline double BesAngle::posRad() const {
122 if ( _phi >= 0.0 ) return _phi;
123 else return _phi + Constants::twoPi;
124}
125
126inline double BesAngle::posDeg() const { return posRad() * Constants::radToDegrees; }
127
128inline void BesAngle::setRad( const double phi ) { _phi = normalize( phi ); }
129
130inline void BesAngle::setDeg( const double phi ) { setRad( phi / Constants::radToDegrees ); }
131
132inline double BesAngle::arc( double radius ) const { return radius * rad(); }
133
134inline void BesAngle::setSector( int n, int max ) {
135 setRad( ( n + 0.5 ) * Constants::twoPi / max );
136}
137
138inline void BesAngle::setSector( int n, int max, BesAngle phi_0 ) {
139 setRad( ( n + 0.5 ) * Constants::twoPi / max + phi_0._phi );
140}
141
142inline BesAngle BesAngle::operator+( const BesAngle& a ) const {
143 return BesAngle( _phi + a._phi );
144}
145
146inline BesAngle BesAngle::operator+( const double a ) const { return BesAngle( _phi + a ); }
147
148inline BesAngle BesAngle::operator-( const BesAngle& a ) const {
149 return BesAngle( _phi - a._phi );
150}
151
152inline BesAngle BesAngle::operator-( const double a ) const { return BesAngle( _phi - a ); }
153
154inline BesAngle BesAngle::operator*( const double x ) const { return BesAngle( _phi * x ); }
155
156inline BesAngle BesAngle::operator/( const double x ) const { return BesAngle( _phi / x ); }
157
158inline BesAngle operator*( const double x, const BesAngle& a ) { return BesAngle( a * x ); }
159
160inline void BesAngle::operator=( const BesAngle a ) { _phi = normalize( a._phi ); }
161
162inline void BesAngle::operator+=( BesAngle a ) { _phi = normalize( _phi + a._phi ); }
163
164inline void BesAngle::operator+=( double a ) { _phi = normalize( _phi + a ); }
165
166inline void BesAngle::operator-=( BesAngle a ) { _phi = normalize( _phi - a._phi ); }
167
168inline void BesAngle::operator-=( double a ) { _phi = normalize( _phi - a ); }
169
170inline void BesAngle::operator*=( double x ) { _phi = normalize( _phi * x ); }
171
172inline void BesAngle::operator/=( double x ) { _phi = normalize( _phi / x ); }
173
174inline int BesAngle::sector( int max ) {
175 double phi = _phi;
176 if ( phi < 0 ) phi += Constants::twoPi;
177 return ( int( phi / ( Constants::twoPi / max ) ) + 1 );
178}
179
180inline int BesAngle::sector( int max, BesAngle phi_0 ) {
181 BesAngle t( _phi - phi_0._phi );
182 return t.sector( max );
183}
184
185inline double sin( const BesAngle a ) { return sin( a._phi ); }
186
187inline double cos( const BesAngle a ) { return cos( a._phi ); }
188
189inline double tan( const BesAngle a ) { return tan( a._phi ); }
190
191#endif
const Int_t n
Double_t x[10]
#define max(a, b)
BesAngle operator*(const double x, const BesAngle &a)
void setDeg(const double)
double posRad() const
void operator-=(BesAngle)
void operator*=(double)
void operator/=(double)
static double normalize(double)
void operator-=(double)
BesAngle(const double)
void setRad(const double)
double arc(double radius) const
double rad() const
BesAngle operator-(const BesAngle &) const
void setSector(int n, int max)
BesAngle operator/(const double) const
BesAngle operator+(const double) const
void operator+=(BesAngle)
void operator+=(double)
double deg() const
double posDeg() const
BesAngle operator-(const double) const
BesAngle operator*(const double) const
BesAngle operator+(const BesAngle &) const
void operator=(const BesAngle)
int sector(int max, BesAngle phi_0)
void setSector(int n, int max, BesAngle phi_0)
int sector(int max)
int t()
Definition t.c:1