10template <
typename tel_data_t,
typename po
inting_offset_t>
12 const std::string pixel_axes, pointing_offset_t &pointing_offsets,
13 const std::string map_grouping) {
16 if (map_grouping==
"detector") {
22 Eigen::VectorXd lat, lon;
25 auto elev = tel_data[
"TelElAct"].array();
28 Eigen::VectorXd rot_az_off = cos(elev)*az_off
29 - sin(elev)*el_off + pointing_offsets[
"az"].array();
30 Eigen::VectorXd rot_alt_off = cos(elev)*el_off
31 + sin(elev)*az_off + pointing_offsets[
"alt"].array();
34 if (pixel_axes==
"radec") {
36 auto& par_ang = tel_data[
"ActParAng"];
39 lat = (rot_az_off.array()*sin(par_ang.array()) + rot_alt_off.array()*cos(par_ang.array()))*
ASEC_TO_RAD
40 + tel_data[
"dec_phys"].array();
42 lon = (-rot_az_off.array()*cos(par_ang.array()) + rot_alt_off.array()*sin(par_ang.array()))*
ASEC_TO_RAD
43 + tel_data[
"ra_phys"].array();
47 else if (pixel_axes==
"altaz") {
49 lat = (rot_alt_off.array()*
ASEC_TO_RAD) + tel_data[
"alt_phys"].array();
51 lon = (rot_az_off.array()*
ASEC_TO_RAD) + tel_data[
"az_phys"].array();
54 else if (pixel_axes==
"galactic") {
56 auto ang = tel_data[
"ActParAng"] + tel_data[
"ActGalAng"];
59 lat = (rot_az_off.array()*sin(ang.array()) + rot_alt_off.array()*cos(ang.array()))*
ASEC_TO_RAD
60 + tel_data[
"b_phys"].array();
62 lon = (-rot_az_off.array()*cos(ang.array()) + rot_alt_off.array()*sin(ang.array()))*
ASEC_TO_RAD
63 + tel_data[
"l_phys"].array();
66 return std::tuple<Eigen::VectorXd, Eigen::VectorXd>{lat,lon};
69template <
typename Derived>
70auto calc_par_ang_from_coords(
const double lat,
const double lon, Eigen::DenseBase<Derived> &az, Eigen::DenseBase<Derived> &alt,
71 Eigen::DenseBase<Derived> &ra, Eigen::DenseBase<Derived> &dec) {
73 auto cosha = (sin(alt.derived().array()) - sin(dec.derived().array())* sin(lat)) /
74 (cos(dec.derived().array())* cos(lat));
76 auto sinha = (-sin(az.derived().array())* cos(alt.derived().array())/ cos(dec.derived().array()));
78 Eigen::VectorXd par_ang(alt.size());
80 for (Eigen::Index i=0; i<alt.size(); ++i) {
81 par_ang(i) = atan2(sinha(i), (tan(lat)* cos(dec(i)) - sin(dec(i)) * cosha(i)));
87template <
typename Derived>
88auto tangent_to_abs(Eigen::DenseBase<Derived>& lat, Eigen::DenseBase<Derived>& lon,
const double cra,
const double cdec) {
91 Eigen::Index n_pts = lat.size();
94 Eigen::VectorXd abs_lat(n_pts), abs_lon(n_pts);
95 for (Eigen::Index i=0; i<n_pts; ++i) {
96 double rho = sqrt(pow(lat(i),2) + pow(lon(i),2));
103 double ccwhn0 = cos(c);
104 double scwhn0 = sin(c);
105 double ccdec = cos(cdec);
106 double scdec = sin(cdec);
108 a1 = ccwhn0*scdec + lat(i)*scwhn0*ccdec/rho;
109 abs_lat(i) = asin(a1);
110 a2 = lon(i)*scwhn0/(rho*ccdec*ccwhn0 - lat(i)*scdec*scwhn0);
111 abs_lon(i) = cra + atan(a2);
114 return std::tuple<Eigen::VectorXd, Eigen::VectorXd>{abs_lat,abs_lon};
118template <
typename Derived>
120 double l0,
double b0, Eigen::DenseBase<Derived> &x, Eigen::DenseBase<Derived> &y) {
123 Eigen::VectorXd cos_b = b.derived().array().cos();
124 Eigen::VectorXd sin_b = b.derived().array().sin();
125 double cos_b0 = std::cos(b0);
126 double sin_b0 = std::sin(b0);
129 Eigen::VectorXd cos_c = sin_b.array() * sin_b0 + cos_b.array() * cos_b0 * (l.derived().array() - l0).cos();
132 for (
int i = 0; i < cos_c.size(); ++i) {
133 if (std::abs(cos_c(i)) < std::numeric_limits<double>::epsilon()) {
138 x(i) = cos_b(i) * std::sin(l(i) - l0) / cos_c(i);
139 y(i) = (cos_b0 * sin_b(i) - sin_b0 * cos_b(i) * std::cos(l(i) - l0)) / cos_c(i);
152 double sin_b = std::sin(dec_NGP) * std::sin(dec) + std::cos(dec_NGP) * std::cos(dec) * std::cos(ra - ra_NGP);
153 b = std::asin(sin_b);
156 double sin_l_ncp_minus_l = std::cos(dec) * std::sin(ra - ra_NGP) / std::cos(b);
157 double cos_l_ncp_minus_l = (std::cos(dec_NGP) * std::sin(dec) - std::sin(dec_NGP) * std::cos(dec) * std::cos(ra - ra_NGP)) / std::cos(b);
158 double l_ncp_minus_l = std::atan2(sin_l_ncp_minus_l, cos_l_ncp_minus_l);
159 l = l_NCP - l_ncp_minus_l;
162 l = std::fmod(l, 2 * M_PI);
#define DEG_TO_RAD
Definition constants.h:27
#define ASEC_TO_RAD
Definition constants.h:33
auto calc_det_pointing(tel_data_t &tel_data, double az_off, double el_off, const std::string pixel_axes, pointing_offset_t &pointing_offsets, const std::string map_grouping)
Definition pointing.h:11
auto tangent_to_abs(Eigen::DenseBase< Derived > &lat, Eigen::DenseBase< Derived > &lon, const double cra, const double cdec)
Definition pointing.h:88
void gnomonic_projection(const Eigen::DenseBase< Derived > &l, const Eigen::DenseBase< Derived > &b, double l0, double b0, Eigen::DenseBase< Derived > &x, Eigen::DenseBase< Derived > &y)
Definition pointing.h:119
auto calc_par_ang_from_coords(const double lat, const double lon, Eigen::DenseBase< Derived > &az, Eigen::DenseBase< Derived > &alt, Eigen::DenseBase< Derived > &ra, Eigen::DenseBase< Derived > &dec)
Definition pointing.h:70
static const void equatorial_to_galactic(const double ra, const double dec, double &l, double &b)
Definition pointing.h:145