30 #ifndef __SPH_VECTOR_H__
31 #define __SPH_VECTOR_H__
35 #include <siscone/reference.h>
39 namespace siscone_spherical{
109 inline double phi()
const {
return atan2(
py,
px);}
167 CSphmomentum(
double _px,
double _py,
double _pz,
double _E);
230 inline double sqr(
double x){
return x*x;}
235 inline double dot_product3(
const CSph3vector &v1,
const CSph3vector &v2){
243 return v1.px*v2.px + v1.py*v2.py + v1.pz*v2.pz;
249 inline CSph3vector cross_product3(
const CSph3vector &v1,
const CSph3vector &v2){
255 return CSph3vector(v1.py*v2.pz-v1.pz*v2.py,
256 v1.pz*v2.px-v1.px*v2.pz,
257 v1.px*v2.py-v1.py*v2.px);
263 inline double norm2_cross_product3(
const CSph3vector &v1,
const CSph3vector &v2){
264 return sqr(v1.py*v2.pz-v1.pz*v2.py) + sqr(v1.pz*v2.px-v1.px*v2.pz) + sqr(v1.px*v2.py-v1.py*v2.px);
270 inline double get_tan2_distance(
const CSphmomentum &v1,
const CSphmomentum &v2){
271 return norm2_cross_product3(v1,v2)/sqr(dot_product3(v1,v2));
277 inline double get_distance(
const CSph3vector *v1,
const CSph3vector *v2){
278 return atan2(sqrt(norm2_cross_product3(*v1,*v2)), dot_product3(*v1,*v2));
289 inline bool is_closer(
const CSph3vector *v1,
const CSph3vector *v2,
const double tan2R){
290 double dot = dot_product3(*v1,*v2);
291 return (dot>=0) && (norm2_cross_product3(*v1,*v2)<=tan2R*dot*dot);
299 inline bool is_closer_safer(
const CSph3vector *v1,
const CSph3vector *v2,
const double cosR){
300 return dot_product3(*v1,*v2)>=cosR*sqrt(v1->norm2()*v2->norm2());
307 inline CSph3vector operator * (
const double &r,
const CSph3vector &v){