16 #ifndef ROOT_Math_GenVector_Quaternion
17 #define ROOT_Math_GenVector_Quaternion 1
51 typedef double Scalar;
70 Quaternion(IT begin, IT end) { SetComponents(begin,end); }
77 template <
class OtherRotation>
78 explicit Quaternion(
const OtherRotation & r) {gv_detail::convert(r,*
this);}
84 Quaternion(Scalar u, Scalar i, Scalar j, Scalar k) :
85 fU(u), fI(i), fJ(j), fK(k) { }
98 template <
class OtherRotation>
99 Quaternion & operator=( OtherRotation
const & r ) {
100 gv_detail::convert(r,*
this);
112 void SetComponents(IT begin, IT end) {
114 void SetComponents(IT begin, IT ) {
129 void GetComponents(IT begin, IT end)
const {
131 void GetComponents(IT begin, IT )
const {
144 void GetComponents(IT begin )
const {
155 void SetComponents(Scalar u, Scalar i, Scalar j, Scalar k) {
156 fU=u; fI=i; fJ=j; fK=k;
162 void GetComponents(Scalar & u, Scalar & i, Scalar & j, Scalar & k)
const {
163 u=fU; i=fI; j=fJ; k=fK;
171 Scalar U()
const {
return fU; }
172 Scalar I()
const {
return fI; }
173 Scalar J()
const {
return fJ; }
174 Scalar K()
const {
return fK; }
181 typedef DisplacementVector3D<Cartesian3D<double>, DefaultCoordinateSystemTag > XYZVector;
182 XYZVector operator() (
const XYZVector & v)
const {
184 const Scalar alpha = fU*fU - fI*fI - fJ*fJ - fK*fK;
185 const Scalar twoQv = 2*(fI*v.X() + fJ*v.Y() + fK*v.Z());
186 const Scalar twoU = 2 * fU;
187 return XYZVector ( alpha * v.X() + twoU * (fJ*v.Z() - fK*v.Y()) + twoQv * fI ,
188 alpha * v.Y() + twoU * (fK*v.X() - fI*v.Z()) + twoQv * fJ ,
189 alpha * v.Z() + twoU * (fI*v.Y() - fJ*v.X()) + twoQv * fK );
195 template <
class CoordSystem,
class Tag>
196 DisplacementVector3D<CoordSystem,Tag>
197 operator() (
const DisplacementVector3D<CoordSystem,Tag> & v)
const {
198 DisplacementVector3D< Cartesian3D<double> > xyz(v.X(), v.Y(), v.Z());
199 DisplacementVector3D< Cartesian3D<double> > rxyz = operator()(xyz);
200 DisplacementVector3D< CoordSystem,Tag > vNew;
201 vNew.SetXYZ( rxyz.X(), rxyz.Y(), rxyz.Z() );
208 template <
class CoordSystem,
class Tag>
209 PositionVector3D<CoordSystem,Tag>
210 operator() (
const PositionVector3D<CoordSystem,Tag> & p)
const {
211 DisplacementVector3D< Cartesian3D<double>,Tag > xyz(p);
212 DisplacementVector3D< Cartesian3D<double>,Tag > rxyz = operator()(xyz);
213 return PositionVector3D<CoordSystem,Tag> ( rxyz );
219 template <
class CoordSystem>
220 LorentzVector<CoordSystem>
221 operator() (
const LorentzVector<CoordSystem> & v)
const {
222 DisplacementVector3D< Cartesian3D<double> > xyz(v.Vect());
223 xyz = operator()(xyz);
224 LorentzVector< PxPyPzE4D<double> > xyzt (xyz.X(), xyz.Y(), xyz.Z(), v.E());
225 return LorentzVector<CoordSystem> ( xyzt );
233 template <
class ForeignVector>
235 operator() (
const ForeignVector & v)
const {
236 DisplacementVector3D< Cartesian3D<double> > xyz(v);
237 DisplacementVector3D< Cartesian3D<double> > rxyz = operator()(xyz);
238 return ForeignVector ( rxyz.X(), rxyz.Y(), rxyz.Z() );
244 template <
class AVector>
246 AVector operator* (
const AVector & v)
const
248 return operator()(v);
254 void Invert() { fI = -fI; fJ = -fJ; fK = -fK; }
259 Quaternion Inverse()
const {
return Quaternion(fU, -fI, -fJ, -fK); }
269 Quaternion operator * (
const Quaternion & q)
const {
270 return Quaternion ( fU*q.fU - fI*q.fI - fJ*q.fJ - fK*q.fK ,
271 fU*q.fI + fI*q.fU + fJ*q.fK - fK*q.fJ ,
272 fU*q.fJ - fI*q.fK + fJ*q.fU + fK*q.fI ,
273 fU*q.fK + fI*q.fJ - fJ*q.fI + fK*q.fU );
276 Quaternion operator * (
const Rotation3D & r)
const;
277 Quaternion operator * (
const AxisAngle & a)
const;
278 Quaternion operator * (
const EulerAngles & e)
const;
279 Quaternion operator * (
const RotationZYX & r)
const;
280 Quaternion operator * (
const RotationX & rx)
const;
281 Quaternion operator * (
const RotationY & ry)
const;
282 Quaternion operator * (
const RotationZ & rz)
const;
288 Quaternion & operator *= (
const R & r) {
return *
this = (*this)*r; }
301 Scalar Distance(
const Quaternion & q)
const ;
306 bool operator == (
const Quaternion & rhs)
const {
307 if( fU != rhs.fU )
return false;
308 if( fI != rhs.fI )
return false;
309 if( fJ != rhs.fJ )
return false;
310 if( fK != rhs.fK )
return false;
313 bool operator != (
const Quaternion & rhs)
const {
314 return ! operator==(rhs);
333 typename Quaternion::Scalar
334 Distance (
const Quaternion& r1,
const R & r2) {
return gv_detail::dist(r1,r2);}
339 Quaternion operator* (RotationX
const & r1, Quaternion
const & r2);
340 Quaternion operator* (RotationY
const & r1, Quaternion
const & r2);
341 Quaternion operator* (RotationZ
const & r1, Quaternion
const & r2);
348 std::ostream & operator<< (std::ostream & os,
const Quaternion & q);
354 #endif // ROOT_Math_GenVector_Quaternion