ToolDAQFramework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
TimeDelta.cpp
Go to the documentation of this file.
1 #include <cmath>
2 #include "TimeDelta.h"
3 
4 TimeDelta::TimeDelta(double naive_ns){
5  m_long_time = 0;
6  m_short_time = naive_ns;
7  Normalize();
8  // Avoid loss of precision when possible
9  double difference = naive_ns - (*this / ns);
10  m_short_time += difference;
11  Normalize();
12 }
13 
15  long_time_t long_diff = std::floor(m_short_time / s_long_time_unit);
16  m_long_time += long_diff;
17  m_short_time -= (long_diff * s_long_time_unit);
18 }
19 
20 TimeDelta operator*(const TimeDelta& old_delta, double factor){
21  TimeDelta new_delta(old_delta);
22  new_delta.m_short_time *= factor;
23  new_delta.m_long_time *= factor;
24  // Make sure no information of m_long_time is lost
25  if (factor != 0){
26  double remainder = old_delta.m_long_time - new_delta.m_long_time * (1. / factor);
27  new_delta.m_short_time += (remainder * TimeDelta::s_long_time_unit);
28  }
29  new_delta.Normalize();
30  return new_delta;
31 }
32 
33 TimeDelta operator*(double factor, const TimeDelta& old_delta){
34  return old_delta * factor;
35 }
36 
37 double operator/(const TimeDelta& left_delta, const TimeDelta& right_delta){
38  double left_ns = (left_delta.m_long_time * (double)TimeDelta::s_long_time_unit);
39  left_ns += left_delta.m_short_time;
40  double right_ns = (right_delta.m_long_time * (double)TimeDelta::s_long_time_unit);
41  right_ns += right_delta.m_short_time;
42  return left_ns / right_ns;
43 }
44 
45 TimeDelta operator+(const TimeDelta& left_delta, const TimeDelta& right_delta){
46  TimeDelta new_delta(left_delta);
47  new_delta.m_long_time += right_delta.m_long_time;
48  new_delta.m_short_time += right_delta.m_short_time;
49  new_delta.Normalize();
50  return new_delta;
51 }
52 
53 TimeDelta operator-(const TimeDelta& left_delta, const TimeDelta& right_delta){
54  return left_delta + (-1.0 * right_delta);
55 }
56 
57 TimeDelta& operator+=(TimeDelta& left_delta, const TimeDelta& right_delta){
58  left_delta = left_delta + right_delta;
59  return left_delta;
60 }
61 
62 TimeDelta& operator-=(TimeDelta& left_delta, const TimeDelta& right_delta){
63  left_delta = left_delta - right_delta;
64  return left_delta;
65 }
66 
67 bool operator==(const TimeDelta& left_delta, const TimeDelta& right_delta){
68  TimeDelta A(left_delta);
69  TimeDelta B(right_delta);
70  A.Normalize();
71  B.Normalize();
72  return (A.m_long_time == B.m_long_time) and (A.m_short_time == B.m_short_time);
73 }
74 
75 bool operator<(const TimeDelta& left_delta, const TimeDelta& right_delta){
76  TimeDelta A(left_delta);
77  TimeDelta B(right_delta);
78  A.Normalize();
79  B.Normalize();
80  return (A.m_long_time < B.m_long_time)
81  or ((A.m_long_time == B.m_long_time) and (A.m_short_time < B.m_short_time));
82 }
83 
84 bool operator<=(const TimeDelta& left_delta, const TimeDelta& right_delta){
85  return (left_delta < right_delta) or (left_delta == right_delta);
86 }
87 
88 bool operator>(const TimeDelta& left_delta, const TimeDelta& right_delta){
89  return not (left_delta <= right_delta);
90 }
91 
92 bool operator>=(const TimeDelta& left_delta, const TimeDelta& right_delta){
93  return not (left_delta < right_delta);
94 }
95 
96 bool operator!=(const TimeDelta& left_delta, const TimeDelta& right_delta){
97  return not (left_delta == right_delta);
98 }
99 
100 std::ostream& operator<<(std::ostream& outs, const TimeDelta& delta){
101  return outs << delta.m_short_time + delta.m_long_time*TimeDelta::s_long_time_unit << " ns";
102 }
103 
104 // Unit constants
105 const TimeDelta TimeDelta::ps = TimeDelta(0.001);
106 const TimeDelta TimeDelta::ns = TimeDelta(1.0);
107 const TimeDelta TimeDelta::us = 1000 * TimeDelta::ns;
108 const TimeDelta TimeDelta::ms = 1000 * TimeDelta::us;
109 const TimeDelta TimeDelta::s = 1000 * TimeDelta::ms;
static const TimeDelta ps
TimeDelta of 1 ps.
Definition: TimeDelta.h:55
double operator/(const TimeDelta &left_delta, const TimeDelta &right_delta)
Definition: TimeDelta.cpp:37
static constexpr double s_long_time_unit
Relative unit of long time member, i.e. long_unit / short_unit, both ns so = 1.
Definition: TimeDelta.h:47
bool operator>(const TimeDelta &left_delta, const TimeDelta &right_delta)
Definition: TimeDelta.cpp:88
bool operator>=(const TimeDelta &left_delta, const TimeDelta &right_delta)
Definition: TimeDelta.cpp:92
void Normalize()
Ensure that the time difference stored in m_short_time is small and positive.
Definition: TimeDelta.cpp:14
static const TimeDelta ms
TimeDelta of 1 ms.
Definition: TimeDelta.h:61
static const TimeDelta us
TimeDelta of 1 us.
Definition: TimeDelta.h:59
TimeDelta operator-(const TimeDelta &left_delta, const TimeDelta &right_delta)
Definition: TimeDelta.cpp:53
bool operator==(const TimeDelta &left_delta, const TimeDelta &right_delta)
Definition: TimeDelta.cpp:67
long_time_t m_long_time
Member for long time delta.
Definition: TimeDelta.h:44
bool operator<(const TimeDelta &left_delta, const TimeDelta &right_delta)
Definition: TimeDelta.cpp:75
bool operator<=(const TimeDelta &left_delta, const TimeDelta &right_delta)
Definition: TimeDelta.cpp:84
static const TimeDelta ns
TimeDelta of 1 ns.
Definition: TimeDelta.h:57
int64_t long_time_t
Type for absolute timestamps of a SubSample. Unit = ns.
Definition: TimeDelta.h:39
TimeDelta()
Default constructor (sets all times to 0)
Definition: TimeDelta.h:30
TimeDelta operator+(const TimeDelta &left_delta, const TimeDelta &right_delta)
Definition: TimeDelta.cpp:45
TimeDelta & operator-=(TimeDelta &left_delta, const TimeDelta &right_delta)
Definition: TimeDelta.cpp:62
std::ostream & operator<<(std::ostream &outs, const TimeDelta &delta)
Definition: TimeDelta.cpp:100
bool operator!=(const TimeDelta &left_delta, const TimeDelta &right_delta)
Definition: TimeDelta.cpp:96
TimeDelta & operator+=(TimeDelta &left_delta, const TimeDelta &right_delta)
Definition: TimeDelta.cpp:57
short_time_t m_short_time
Member for short time deltas.
Definition: TimeDelta.h:42
static const TimeDelta s
TimeDelta of 1 s.
Definition: TimeDelta.h:63
TimeDelta operator*(const TimeDelta &old_delta, double factor)
Definition: TimeDelta.cpp:20