#ifndef __JTRACK3E__ #define __JTRACK3E__ #include #include #include "JGeometry3D/JTrack3D.hh" #include "JIO/JSerialisable.hh" #include "JLang/JManip.hh" #include "JPhysics/JGeane.hh" /** * \author mdejong */ namespace JGEOMETRY3D {} namespace JPP { using namespace JGEOMETRY3D; } namespace JGEOMETRY3D { using JIO::JReader; using JIO::JWriter; using JPHYSICS::JGeane; /** * 3D track with energy. */ class JTrack3E : public JTrack3D { public: /** * Default constructor. */ JTrack3E() : JTrack3D(), __E(0.0) {} /** * Constructor. * * \param track track * \param E energy at vertex */ JTrack3E(const JTrack3D& track, const double E) : JTrack3D(track), __E(E) {} /** * Constructor. * * \param pos position * \param dir direction * \param t0 time at vertex * \param E energy at vertex */ JTrack3E(const JVector3D& pos, const JVersor3D& dir, const JTime& t0, const double E) : JTrack3D(pos, dir, t0), __E(E) {} /** * Constructor. * * \param vertex vertex * \param dir direction * \param E energy at vertex */ JTrack3E(const JVertex3D& vertex, const JVersor3D& dir, const double E) : JTrack3D(vertex, dir), __E(E) {} /** * Get energy. * * \return energy */ inline double getE() const { return __E; } /** * Set energy. * * \param E energy */ inline void setE(const double E) { __E = E; } /** * Move vertex along this track with given velocity. * * \param step step * \param velocity velocity * \param geane energy loss */ void move(const double step, const double velocity, const JGeane& geane) { JTrack3D::move(step, velocity); __E = geane(__E, step); } /** * Read track from input. * * \param in input stream * \param track track * \return input stream */ friend inline std::istream& operator>>(std::istream& in, JTrack3E& track) { in >> static_cast(track); in >> track.__E; return in; } /** * Write track to output. * * \param out output stream * \param track track * \return output stream */ friend inline std::ostream& operator<<(std::ostream& out, const JTrack3E& track) { const JFormat format(out, getFormat(JFormat_t(9, 3, std::ios::fixed | std::ios::showpos))); out << static_cast(track); out << ' '; out << track.__E; return out; } /** * Read track from input. * * \param in reader * \param track track * \return reader */ friend inline JReader& operator>>(JReader& in, JTrack3E& track) { in >> static_cast(track); in >> track.__E; return in; } /** * Write track to output. * * \param out writer * \param track track * \return writer */ friend inline JWriter& operator<<(JWriter& out, const JTrack3E& track) { out << static_cast(track); out << track.__E; return out; } protected: double __E; }; } #endif