#ifndef COMMON_HPP
#define COMMON_HPP

#include <cmath>

template<typename A, typename B>
float displacement(const A& a, const B& b){
    return std::sqrt(pow(a.x()-b.x(), 2) +
                     pow(a.y()-b.y(), 2) +
                     pow(a.z()-b.z(), 2));
}

template<typename T>
float rho(const T& t){
    return std::sqrt(pow(t.x(),2)+pow(t.y(),2));
}

float pseudorapidity(float z, float r){
    float theta = atan2(r, z);
    return -log(tan(theta/2.0));
}

float pseudorapidity(float x, float y, float z){
    float r = sqrt(x*x + y*y);
    return pseudorapidity(z, r);
}

template<typename T>
float pseudorapidity(const T &t){
    return pseudorapidity(t.x(), t.y(), t.z());
}

float pseudorapidityP(float px, float py, float pz){
    float p_mag = sqrt(px*px + py*py + pz*pz);
    return 0.5*log((p_mag+pz)/(p_mag-pz));
}

template<typename T>
float pseudorapidityP(const T &t){
    return pseudorapidityP(t.px(), t.py(), t.pz());
}

#endif // COMMON_HPP
