Jpp 19.3.0-rc.1
the software that should make you happy
Loading...
Searching...
No Matches
JLine3Z.hh
Go to the documentation of this file.
1#ifndef __JLINE3Z__
2#define __JLINE3Z__
3
4#include <istream>
5#include <ostream>
6
7#include "JMath/JMath.hh"
14#include "JFit/JLine1Z.hh"
15
16
17/**
18 * \author mdejong
19 */
20
21namespace JFIT {}
22namespace JPP { using namespace JFIT; }
23
24namespace JFIT {
25
26 using JMATH::JMath;
30
31
32 /**
33 * Data structure for fit of straight line in positive z-direction.
34 * Note that the position coordinates are defined with respect to the given direction.
35 */
36 class JLine3Z :
37 public JLine1Z,
38 public JVersor3Z,
39 public JMath<JLine3Z>
40 {
41 public:
42
43 using JLine1Z::add;
44 using JLine1Z::sub;
45 using JLine1Z::getT;
46 using JVersor3Z::add;
47 using JVersor3Z::sub;
49
50
51 /**
52 * Default constructor.
53 */
55 JLine1Z(),
56 JVersor3Z()
57 {}
58
59
60 /**
61 * Constructor.
62 *
63 * \param line line
64 */
65 JLine3Z(const JLine1Z& line) :
66 JLine1Z(line),
67 JVersor3Z()
68 {}
69
70
71 /**
72 * Constructor.
73 *
74 * \param line line
75 * \param dir direction
76 */
77 JLine3Z(const JLine1Z& line,
78 const JVersor3Z& dir) :
79 JLine1Z(line),
80 JVersor3Z(dir)
81 {}
82
83
84 /**
85 * Move vertex along this line with given velocity.
86 *
87 * \param step step
88 * \param velocity velocity
89 */
90 void move(const double step, const double velocity)
91 {
92 __x += step * getDX();
93 __y += step * getDY();
94 __z += step * getDZ();
95 __t += step / velocity;
96 }
97
98
99 /**
100 * Set z-position.
101 *
102 * \param z z-position
103 * \param velocity velocity
104 */
105 void setZ(const double z, const double velocity)
106 {
107 move((z - getZ()) / getDZ(), velocity);
108 }
109
110
111 /**
112 * Prefix unary minus.
113 *
114 * \return line
115 */
117 {
118 JLine1Z ::negate();
120
121 return *this;
122 }
123
124
125 /**
126 * Addition operator.
127 *
128 * \param value line
129 * \return line
130 */
131 JLine3Z& add(const JLine3Z& value)
132 {
133 JLine1Z ::add(value);
134 JVersor3Z::add(value);
135
136 return *this;
137 }
138
139
140 /**
141 * Subtraction operator.
142 *
143 * \param value line
144 * \return line
145 */
146 JLine3Z& sub(const JLine3Z& value)
147 {
148 JLine1Z ::sub(value);
149 JVersor3Z::sub(value);
150
151 return *this;
152 }
153
154
155 /**
156 * Multiplication operator.
157 *
158 * \param value multiplication factor
159 * \return line
160 */
161 JLine3Z& mul(const double value)
162 {
163 JLine1Z ::mul(value);
164 JVersor3Z::mul(value);
165
166 return *this;
167 }
168
169
170 /**
171 * Division operator.
172 *
173 * \param value multiplication factor
174 * \return line
175 */
176 JLine3Z& div(const double value)
177 {
178 JLine1Z ::div(value);
179 JVersor3Z::div(value);
180
181 return *this;
182 }
183
184
185 /**
186 * Type conversion.
187 *
188 * \return track
189 */
190 inline operator JTrack3D() const
191 {
192 return JTrack3D(JAxis3D(this->getPosition(),
193 this->getDirection()),
194 this->getT());
195 }
196
197
198 /**
199 * Get distance squared.
200 *
201 * \param pos position
202 * \return square of distance
203 */
204 inline double getDistanceSquared(const JVector3D& pos) const
205 {
206 JPosition3D D(pos);
207
208 D.sub(this->getPosition());
209
210 const double dz = D.getDot(this->getDirection());
211
212 return D.getLengthSquared() - dz*dz;
213 }
214
215
216 /**
217 * Get distance.
218 *
219 * \param pos position
220 * \return distance
221 */
222 inline double getDistance(const JVector3D& pos) const
223 {
224 return sqrt(this->getDistanceSquared(pos));
225 }
226
227
228 /**
229 * Get arrival time of Cherenkov light at given position.
230 *
231 * \param pos position [m]
232 * \return time [ns]
233 */
234 inline double getT(const JVector3D& pos) const
235 {
236 using namespace JPP;
237
238 JPosition3D D(pos);
239
240 D.sub(this->getPosition());
241
242 const double dz = D.getDot(this->getDirection());
243 const double R = sqrt(D.getLengthSquared() - dz*dz);
244
245 return this->getT() + (dz + R * getKappaC()) * getInverseSpeedOfLight();
246 }
247
248
249 /**
250 * Get photon direction of Cherenkov light on PMT.
251 *
252 * \param pos PMT position
253 * \return direction
254 */
255 inline JVersor3D getDirection(const JVector3D& pos) const
256 {
257 using namespace JPP;
258
259 JPosition3D D(pos);
260
261 D.sub(this->getPosition());
262
263 const double dz = D.getDot(this->getDirection());
264 const double R = sqrt(D.getLengthSquared() - dz*dz);
265
266 D.sub(JPosition3D(this->getDirection()) * (dz - R/getTanThetaC()));
267
268 return JDirection3D(D);
269 }
270
271
272 /**
273 * Get cosine angle of impact of Cherenkov light on PMT.
274 *
275 * \param axis PMT axis
276 * \return cosine angle of impact
277 */
278 inline double getDot(const JAxis3D& axis) const
279 {
280 return getDirection(axis.getPosition()).getDot(axis.getDirection());
281 }
282
283
284 /**
285 * Read object from input.
286 *
287 * \param in input stream
288 * \param object object
289 * \return input stream
290 */
291 friend inline std::istream& operator>>(std::istream& in, JLine3Z& object)
292 {
293 in >> static_cast<JLine1Z&> (object);
294 in >> static_cast<JVersor3Z&>(object);
295
296 return in;
297 }
298
299
300 /**
301 * Write object to output.
302 *
303 * \param out output stream
304 * \param object object
305 * \return output stream
306 */
307 friend inline std::ostream& operator<<(std::ostream& out, const JLine3Z& object)
308 {
309 out << static_cast<const JLine1Z&> (object);
310 out << ' ';
311 out << static_cast<const JVersor3Z&>(object);
312
313 return out;
314 }
315
316
317 typedef double JLine3Z::*parameter_type;
318
319 static parameter_type pDX() { return &JLine3Z::__dx; }
320 static parameter_type pDY() { return &JLine3Z::__dy; }
321 };
322}
323
324#endif
Base class for data structures with artithmetic capabilities.
Physics constants.
Data structure for fit of straight line paralel to z-axis.
Definition JLine1Z.hh:29
Data structure for fit of straight line in positive z-direction.
Definition JLine3Z.hh:40
friend std::istream & operator>>(std::istream &in, JLine3Z &object)
Read object from input.
Definition JLine3Z.hh:291
JVersor3D getDirection(const JVector3D &pos) const
Get photon direction of Cherenkov light on PMT.
Definition JLine3Z.hh:255
JLine3Z(const JLine1Z &line, const JVersor3Z &dir)
Constructor.
Definition JLine3Z.hh:77
JLine3Z & sub(const JLine3Z &value)
Subtraction operator.
Definition JLine3Z.hh:146
friend std::ostream & operator<<(std::ostream &out, const JLine3Z &object)
Write object to output.
Definition JLine3Z.hh:307
void setZ(const double z, const double velocity)
Set z-position.
Definition JLine3Z.hh:105
double getDot(const JAxis3D &axis) const
Get cosine angle of impact of Cherenkov light on PMT.
Definition JLine3Z.hh:278
double getDistanceSquared(const JVector3D &pos) const
Get distance squared.
Definition JLine3Z.hh:204
JLine3Z()
Default constructor.
Definition JLine3Z.hh:54
JLine3Z & negate()
Prefix unary minus.
Definition JLine3Z.hh:116
JLine3Z & div(const double value)
Division operator.
Definition JLine3Z.hh:176
double JLine3Z::* parameter_type
Definition JLine3Z.hh:317
JLine3Z(const JLine1Z &line)
Constructor.
Definition JLine3Z.hh:65
double getDistance(const JVector3D &pos) const
Get distance.
Definition JLine3Z.hh:222
void move(const double step, const double velocity)
Move vertex along this line with given velocity.
Definition JLine3Z.hh:90
const JVersor3Z & getDirection() const
Get direction.
Definition JVersor3Z.hh:81
static parameter_type pDY()
Definition JLine3Z.hh:320
static parameter_type pDX()
Definition JLine3Z.hh:319
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
Definition JLine3Z.hh:234
JLine3Z & add(const JLine3Z &value)
Addition operator.
Definition JLine3Z.hh:131
JLine3Z & mul(const double value)
Multiplication operator.
Definition JLine3Z.hh:161
Axis object.
Definition JAxis3D.hh:41
Data structure for direction in three dimensions.
const JDirection3D & getDirection() const
Get direction.
Data structure for position in three dimensions.
double getDot(const JAngle3D &angle) const
Get dot product.
JPosition3D()
Default constructor.
const JPosition3D & getPosition() const
Get position.
JTime & add(const JTime &value)
Addition operator.
double getT() const
Get time.
JTime & sub(const JTime &value)
Subtraction operator.
Data structure for vector in three dimensions.
Definition JVector3D.hh:36
double getLengthSquared() const
Get length squared.
Definition JVector3D.hh:235
double getZ() const
Get z position.
Definition JVector3D.hh:115
JVector3D & sub(const JVector3D &vector)
Subtract vector.
Definition JVector3D.hh:158
Data structure for normalised vector in three dimensions.
Definition JVersor3D.hh:28
Data structure for normalised vector in positive z-direction.
Definition JVersor3Z.hh:41
double getDot(const JVersor3Z &dir) const
Get dot product.
Definition JVersor3Z.hh:275
JVersor3Z & add(const JVersor3Z &value)
Addition operator.
Definition JVersor3Z.hh:200
JVersor3Z & sub(const JVersor3Z &value)
Subtraction operator.
Definition JVersor3Z.hh:215
JVersor3Z & mul(const double value)
Multiplication operator.
Definition JVersor3Z.hh:230
JVersor3Z & negate()
Prefix unary minus.
Definition JVersor3Z.hh:185
double getDZ() const
Get z direction.
Definition JVersor3Z.hh:169
const JVersor3Z & getDirection() const
Get direction.
Definition JVersor3Z.hh:81
JVersor3Z & div(const double value)
Division operator.
Definition JVersor3Z.hh:245
double getDY() const
Get y direction.
Definition JVersor3Z.hh:158
double getDX() const
Get x direction.
Definition JVersor3Z.hh:147
double getT() const
Get time.
Auxiliary classes and methods for linear and iterative data regression.
Definition JEnergy.hh:15
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary base class for aritmetic operations of derived class types.
Definition JMath.hh:347