This file is indexed.

/usr/include/astrometry/sip.h is in libastrometry-dev 0.70+dfsg-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
/*
# This file is part of the Astrometry.net suite.
# Licensed under a 3-clause BSD style license - see LICENSE
*/

#ifndef ANSIP_H
#define ANSIP_H

#include <stdio.h>
#include "astrometry/an-bool.h"
#include "astrometry/keywords.h"

#define SIP_MAXORDER 10

// WCS TAN header.
typedef struct {

	// World coordinate of the tangent point, in ra,dec.
	double crval[2];

	// Tangent point location in pixel (CCD) coordinates
	// This may not be in the image; consider a telescope with an array of
	// CCD's, where the tangent point is in one or none of the CCD's.
	double crpix[2];

	// Matrix for the linear transformation of relative pixel coordinates
	// (u,v) onto "intermediate world coordinates", which are in degrees
	// (x,y). The x,y coordinates are on the tangent plane. If the SIP
	// terms are all zero, then the equation to get from pixel coordinates
	// to intermediate world coordinates is:
	//
	//   u = pixel_x - crpix0
	//   v = pixel_y - crpix1
	// 
	//   x  = [cd00 cd01] * u
	//   y    [cd10 cd11]   v
	// 
	// where x,y are in intermediate world coordinates (i.e. x points
	// along negative ra and y points to positive dec) and u,v are in pixel
	// coordinates.
	double cd[2][2];

    // size of the image in pixels.  Not strictly part of the WCS, but useful!
    double imagew;
    double imageh;

	// SIN projection rather than TAN.
	anbool sin;

} tan_t;

// Flat structure for minimal SIP wcs. This structure should contain enough
// information to effectively represent any image, provided it is possible to
// convert that image's projecton to a TAN projection and the distortion to SIP
// distortion.
typedef struct {

	// A basic TAN header.
	tan_t wcstan;

	// Forward SIP coefficients
	// The transformation from relative pixel coordinates to intermediate
	// world coordinates[1] is:
	// 
	//   x  = [cd00 cd01] * (u + f(u,v))          x,y are intermediate coordinates on the sky (in deg)
	//   y    [cd10 cd11]   (v + g(u,v))            which are just a "translation" away from final WCS
	//                                            u,v are original (unwarped) pixel coordinates
	// where
	//                                       p    q
	//   U = u + f(u,v) = u + SUM a[p][q] * u  * v  ,  p+q <= a_order
  	//                        p,q
   //
	//                                       p    q
	//   V = v + g(u,v) = v + SUM b[p][q] * u  * v  ,  p+q <= b_order
	//                        p,q
	// 
	// [1] The SIP convention for representing distortion in FITS image
	// headers. D. L. Shupe, M.Moshir, J. Li, D. Makovoz, R. Narron, R. N.
	// Hook. Astronomical Data Analysis Software and Systems XIV.
	// http://ssc.spitzer.caltech.edu/postbcd/doc/shupeADASS.pdf
	//
	// Note: These matricies are larger than they strictly need to be
	// because aij = 0 if i+j > a_order and similarily for b.
	// 
	// Note: The convention for indicating that no SIP polynomial is
	// present is to simply set [ab]_order to zero.
	int a_order, b_order;
	double a[SIP_MAXORDER][SIP_MAXORDER];
	double b[SIP_MAXORDER][SIP_MAXORDER];

	// Inverse SIP coefficients
	// To convert from world coordinates back into image coordinates, the
	// inverse transformation may be stored. To convert from intermediate
	// world coordinates, first we calculate the linear pixel coordinates:
	// 
	//                   -1
	//    U = [cd00 cd01]    * x
	//    V   [cd10 cd11]      y
	//
	// Then, the original pixel coordinates are computed as:
	// 
	//                            p    q
	//   u  = U + SUM ap[p][q] * U  * V  ,  p+q <= ap_order
	//            p,q
        //
	//                            p    q
	//   v  = V + SUM bp[p][q] * U  * V  ,  p+q <= ap_order
	//            p,q
	// 
	// Note: ap_order does not necessarily equal a_order, because the
	// inverse of a nth-order polynomial may be of higer order than n.
	// 
	// Note: The convention for indicating that no inverse SIP polynomial
	// is present is to simply set [ab]p_order to zero.
	int ap_order, bp_order;
	double ap[SIP_MAXORDER][SIP_MAXORDER];
	double bp[SIP_MAXORDER][SIP_MAXORDER];
} sip_t;

sip_t* sip_create(void);
void   sip_free(sip_t* sip);

void sip_copy(sip_t* dest, const sip_t* src);

// Set the given SIP wcs to the given TAN wcs.
void sip_wrap_tan(const tan_t* tan, sip_t* sip);

double sip_imagew(sip_t* sip);
double sip_imageh(sip_t* sip);

// Pixels to RA,Dec in degrees.
void   sip_pixelxy2radec(const sip_t* sip, double px, double py, double *a, double *d);

// Pixels to XYZ unit vector.
void   sip_pixelxy2xyzarr(const sip_t* sip, double px, double py, double *xyz);

// RA,Dec in degrees to Pixels.
// Returns FALSE if the point is on the opposite side of the sphere (and hence the point
// does not project onto the tangent plane)
WarnUnusedResult
anbool sip_radec2pixelxy(const sip_t* sip, double a, double d, double *px, double *py);

WarnUnusedResult
anbool sip_radec2pixelxy_check(const sip_t* sip, double ra, double dec, double *px, double *py);

WarnUnusedResult
anbool sip_xyzarr2pixelxy(const sip_t* sip, const double* xyz, double *px, double *py);

WarnUnusedResult
anbool sip_xyz2pixelxy(const sip_t* sip, double x, double y, double z, double *px, double *py);

// Pixels to Intermediate World Coordinates in degrees.
void sip_pixelxy2iwc(const sip_t* sip, double px, double py,
					 double *iwcx, double* iwcy);


double tan_det_cd(const tan_t* tan);
double sip_det_cd(const sip_t* sip);
// returns pixel scale in arcseconds/pixel (NOT arcsec^2)
double tan_pixel_scale(const tan_t* tn);
double sip_pixel_scale(const sip_t* sip);

// these take *relative* pixel coords (WRT crpix)
void   sip_calc_inv_distortion(const sip_t* sip, double U, double V, double* u, double *v);
void   sip_calc_distortion(const sip_t* sip, double u, double v, double* U, double *V);
      
// Applies forward SIP distortion to pixel coords.
// This applies the A,B matrix terms;
// This is the distortion applied in the pixel-to-RA,Dec direction.
//   (pix -> "un"distorted -> TAN -> RA,Dec)
void sip_pixel_distortion(const sip_t* sip, double x, double y,
                          double *p_x, double *p_y);

// Reverses sip_pixel_distortion;
// Applies "reverse" SIP distortion: the AP, BP matrices;
// This is the distortion applied in the RA,Dec-to-pixel direction:
//   (RA,Dec -> TAN -> undistorted -> pix)
void sip_pixel_undistortion(const sip_t* sip, double x, double y,
                            double *p_x, double *p_y);

// Pixels to XYZ unit vector.
void   tan_pixelxy2xyzarr(const tan_t* tan, double px, double py, double *xyz);

// Pixels to RA,Dec in degrees.
void   tan_pixelxy2radec(const tan_t* wcs_tan, double px, double py, double *ra, double *dec);

// Pixels to RA,Dec in degrees.
void   tan_pixelxy2radecarr(const tan_t* wcs_tan, double px, double py, double *radec);

// RA,Dec in degrees to Pixels.
// Returns FALSE if the point is on the opposite side of the sphere.
WarnUnusedResult
anbool   tan_radec2pixelxy(const tan_t* wcs_tan, double ra, double dec, double *px, double *py);

// xyz unit vector to Pixels.
// Returns TRUE if all is good.
WarnUnusedResult
anbool   tan_xyzarr2pixelxy(const tan_t* wcs_tan, const double* xyz, double *px, double *py);

void tan_iwc2pixelxy(const tan_t* tan, double iwcx, double iwcy,
					 double *px, double* py);
void tan_iwc2xyzarr(const tan_t* tan, double x, double y, double *xyz);

void tan_iwc2radec(const tan_t* tan, double x, double y, double *p_ra, double *p_dec);

/**
 Subtracts off CRPIX, multiplies by CD matrix.
 Results are in degrees.
 */
void tan_pixelxy2iwc(const tan_t* tan, double px, double py, double *iwcx, double* iwcy);

anbool tan_xyzarr2iwc(const tan_t* tan, const double* xyz,
					double* iwcx, double* iwcy);
anbool tan_radec2iwc(const tan_t* tan, double ra, double dec,
				   double* iwcx, double* iwcy);

anbool sip_xyzarr2iwc(const sip_t* sip, const double* xyz,
					double* iwcx, double* iwcy);
anbool sip_radec2iwc(const sip_t* sip, double ra, double dec,
				   double* iwcx, double* iwcy);

void sip_iwc2pixelxy(const sip_t* sip, double iwcx, double iwcy,
					 double *px, double* py);

void sip_iwc2radec(const sip_t* sip, double x, double y, double *p_ra, double *p_dec);

void   sip_print(const sip_t*);
void   sip_print_to(const sip_t*, FILE* fid);

void tan_print(const tan_t* tan);
void tan_print_to(const tan_t* tan, FILE* f);

// for python
void sip_get_crval(const sip_t* sip, double* ra, double* dec);

double tan_get_orientation(const tan_t* tan);
double sip_get_orientation(const sip_t* sip);

#endif