1 #define DIR "/lib/sky" 2 /* 3 * This code reflects many years of changes. There remain residues 4 * of prior implementations. 5 * 6 * Keys: 7 * 32 bits long. High 26 bits are encoded as described below. 8 * Low 6 bits are types: 9 * 10 * Patch is ~ one square degree of sky. It points to an otherwise 11 * anonymous list of Catalog keys. The 0th key is special: 12 * it contains up to 4 constellation identifiers. 13 * Catalogs (SAO,NGC,M,...) are: 14 * 31.........8|76|543210 15 * catalog # |BB|catalog name 16 * BB is two bits of brightness: 17 * 00 -inf < m <= 7 18 * 01 7 < m <= 10 19 * 10 10 < m <= 13 20 * 11 13 < m < inf 21 * The BB field is a dreg, and correct only for SAO and NGC. 22 * IC(n) is just NGC(n+7840) 23 * Others should be self-explanatory. 24 * 25 * Records: 26 * 27 * Star is an SAOrec 28 * Galaxy, PlanetaryN, OpenCl, GlobularCl, DiffuseN, etc., are NGCrecs. 29 * Abell is an Abellrec 30 * The Namedxxx records hold a name and a catalog entry; they result from 31 * name lookups. 32 */ 33 34 typedef enum 35 { 36 Planet, 37 Patch, 38 SAO, 39 NGC, 40 M, 41 Constel_deprecated, 42 Nonstar_deprecated, 43 NamedSAO, 44 NamedNGC, 45 NamedAbell, 46 Abell, 47 /* NGC types */ 48 Galaxy, 49 PlanetaryN, 50 OpenCl, 51 GlobularCl, 52 DiffuseN, 53 NebularCl, 54 Asterism, 55 Knot, 56 Triple, 57 Double, 58 Single, 59 Uncertain, 60 Nonexistent, 61 Unknown, 62 PlateDefect, 63 /* internal */ 64 NGCN, 65 PatchC, 66 NONGC, 67 }Type; 68 69 enum 70 { 71 /* 72 * parameters for plate 73 */ 74 Pppo1 = 0, 75 Pppo2, 76 Pppo3, 77 Pppo4, 78 Pppo5, 79 Pppo6, 80 Pamdx1, 81 Pamdx2, 82 Pamdx3, 83 Pamdx4, 84 Pamdx5, 85 Pamdx6, 86 Pamdx7, 87 Pamdx8, 88 Pamdx9, 89 Pamdx10, 90 Pamdx11, 91 Pamdx12, 92 Pamdx13, 93 Pamdx14, 94 Pamdx15, 95 Pamdx16, 96 Pamdx17, 97 Pamdx18, 98 Pamdx19, 99 Pamdx20, 100 Pamdy1, 101 Pamdy2, 102 Pamdy3, 103 Pamdy4, 104 Pamdy5, 105 Pamdy6, 106 Pamdy7, 107 Pamdy8, 108 Pamdy9, 109 Pamdy10, 110 Pamdy11, 111 Pamdy12, 112 Pamdy13, 113 Pamdy14, 114 Pamdy15, 115 Pamdy16, 116 Pamdy17, 117 Pamdy18, 118 Pamdy19, 119 Pamdy20, 120 Ppltscale, 121 Pxpixelsz, 122 Pypixelsz, 123 Ppltra, 124 Ppltrah, 125 Ppltram, 126 Ppltras, 127 Ppltdec, 128 Ppltdecd, 129 Ppltdecm, 130 Ppltdecs, 131 Pnparam, 132 }; 133 134 #define UNKNOWNMAG 32767 135 #define NPlanet 20 136 137 typedef float Angle; /* in radians */ 138 typedef long DAngle; /* on disk: in units of milliarcsec */ 139 typedef short Mag; /* multiplied by 10 */ 140 typedef long Key; /* known to be 4 bytes, unfortunately */ 141 142 /* 143 * All integers are stored in little-endian order. 144 */ 145 typedef struct NGCrec NGCrec; 146 struct NGCrec{ 147 DAngle ra; 148 DAngle dec; 149 DAngle dummy1; /* compatibility with old RNGC version */ 150 DAngle diam; 151 Mag mag; 152 short ngc; /* if >NNGC, IC number is ngc-NNGC */ 153 char diamlim; 154 char type; 155 char magtype; 156 char dummy2; 157 char desc[52]; /* 0-terminated Dreyer description */ 158 }; 159 160 typedef struct Abellrec Abellrec; 161 struct Abellrec{ 162 DAngle ra; 163 DAngle dec; 164 DAngle glat; 165 DAngle glong; 166 Mag mag10; /* mag of 10th brightest cluster member; in same place as ngc.mag*/ 167 short abell; 168 DAngle rad; 169 short pop; 170 short dist; 171 char distgrp; 172 char richgrp; 173 char flag; 174 char pad; 175 }; 176 177 typedef struct Planetrec Planetrec; 178 struct Planetrec{ 179 DAngle ra; 180 DAngle dec; 181 DAngle az; 182 DAngle alt; 183 DAngle semidiam; 184 double phase; 185 char name[16]; 186 }; 187 188 /* 189 * Star names: 0,0==unused. Numbers are name[0]=1,..,99. 190 * Greek letters are alpha=101, etc. 191 * Constellations are alphabetical order by abbreviation, and=1, etc. 192 */ 193 typedef struct SAOrec SAOrec; 194 struct SAOrec{ 195 DAngle ra; 196 DAngle dec; 197 DAngle dra; 198 DAngle ddec; 199 Mag mag; /* visual */ 200 Mag mpg; 201 char spec[3]; 202 char code; 203 char compid[2]; 204 char hdcode; 205 char pad1; 206 long hd; /* HD catalog number */ 207 char name[3]; /* name[0]=alpha name[1]=2 name[3]=ori */ 208 char nname; /* number of prose names */ 209 /* 36 bytes to here */ 210 }; 211 212 typedef struct Mindexrec Mindexrec; 213 struct Mindexrec{ /* code knows the bit patterns in here; this is a long */ 214 char m; /* M number */ 215 char dummy; 216 short ngc; 217 }; 218 219 typedef struct Bayerec Bayerec; 220 struct Bayerec{ 221 long sao; 222 char name[3]; 223 char pad; 224 }; 225 226 /* 227 * Internal form 228 */ 229 230 typedef struct Namedrec Namedrec; 231 struct Namedrec{ 232 char name[36]; 233 }; 234 235 typedef struct Namerec Namerec; 236 struct Namerec{ 237 long sao; 238 long ngc; 239 long abell; 240 char name[36]; /* null terminated */ 241 }; 242 243 typedef struct Patchrec Patchrec; 244 struct Patchrec{ 245 int nkey; 246 long key[60]; 247 }; 248 249 typedef struct Record Record; 250 struct Record{ 251 Type type; 252 long index; 253 union{ 254 SAOrec sao; 255 NGCrec ngc; 256 Abellrec abell; 257 Namedrec named; 258 Patchrec patch; 259 Planetrec planet; 260 /* PatchCrec is empty */ 261 }; 262 }; 263 264 typedef struct Name Name; 265 struct Name{ 266 char *name; 267 int type; 268 }; 269 270 typedef struct Plate Plate; 271 struct Plate 272 { 273 char rgn[7]; 274 char disk; 275 Angle ra; 276 Angle dec; 277 }; 278 279 typedef struct Header Header; 280 struct Header 281 { 282 float param[Pnparam]; 283 int amdflag; 284 285 float x; 286 float y; 287 float xi; 288 float eta; 289 }; 290 typedef long Pix; 291 292 typedef struct Img Img; 293 struct Img 294 { 295 int nx; 296 int ny; /* ny is the fast-varying dimension */ 297 Pix a[1]; 298 }; 299 300 #define RAD(x) ((x)*PI_180) 301 #define DEG(x) ((x)/PI_180) 302 #define ARCSECONDS_PER_RADIAN (DEG(1)*3600) 303 #define MILLIARCSEC (1000*60*60) 304 305 int nplate; 306 Plate plate[2000]; /* needs to go to 2000 when the north comes */ 307 double PI_180; 308 double TWOPI; 309 double LN2; 310 int debug; 311 struct 312 { 313 float min; 314 float max; 315 float gamma; 316 float absgamma; 317 float mult1; 318 float mult2; 319 int neg; 320 } gam; 321 322 typedef struct Picture Picture; 323 struct Picture 324 { 325 int minx; 326 int miny; 327 int maxx; 328 int maxy; 329 char name[16]; 330 uchar *data; 331 }; 332 333 typedef struct Image Image; 334 335 extern double PI_180; 336 extern double TWOPI; 337 extern char *progname; 338 extern char *desctab[][2]; 339 extern Name names[]; 340 extern Record *rec; 341 extern long nrec; 342 extern Planetrec *planet; 343 /* for bbox: */ 344 extern int folded; 345 extern DAngle ramin; 346 extern DAngle ramax; 347 extern DAngle decmin; 348 extern DAngle decmax; 349 extern Biobuf bout; 350 351 extern void saoopen(void); 352 extern void ngcopen(void); 353 extern void patchopen(void); 354 extern void mopen(void); 355 extern void constelopen(void); 356 extern void lowercase(char*); 357 extern void lookup(char*, int); 358 extern int typetab(int); 359 extern char*ngcstring(int); 360 extern char*skip(int, char*); 361 extern void prrec(Record*); 362 extern int equal(char*, char*); 363 extern int parsename(char*); 364 extern void radec(int, int*, int*, int*); 365 extern int btag(short); 366 extern long patcha(Angle, Angle); 367 extern long patch(int, int, int); 368 extern char*hms(Angle); 369 extern char*dms(Angle); 370 extern char*ms(Angle); 371 extern char*hm(Angle); 372 extern char*dm(Angle); 373 extern char*deg(Angle); 374 extern char*hm5(Angle); 375 extern long dangle(Angle); 376 extern Angle angle(DAngle); 377 extern void prdesc(char*, char*(*)[2], short*); 378 extern double xsqrt(double); 379 extern Angle dist(Angle, Angle, Angle, Angle); 380 extern Header* getheader(char*); 381 extern char* getword(char*, char*); 382 extern void amdinv(Header*, Angle, Angle, float, float); 383 extern void ppoinv(Header*, Angle, Angle); 384 extern void xypos(Header*, Angle, Angle, float, float); 385 extern void traneqstd(Header*, Angle, Angle); 386 extern Angle getra(char*); 387 extern Angle getdec(char*); 388 extern void getplates(void); 389 extern Img* dssread(char*); 390 extern void hinv(Pix*, int, int); 391 extern int input_bit(Biobuf*); 392 extern int input_nbits(Biobuf*, int); 393 extern int input_huffman(Biobuf*); 394 extern int input_nybble(Biobuf*); 395 extern void qtree_decode(Biobuf*, Pix*, int, int, int, int); 396 extern void start_inputing_bits(void); 397 extern Picture* image(Angle, Angle, Angle, Angle); 398 extern char* dssmount(int); 399 extern int dogamma(Pix); 400 extern void displaypic(Picture*); 401 extern void displayimage(Image*); 402 extern void plot(char*); 403 extern void astro(char*, int); 404 extern char* alpha(char*, char*); 405 extern char* skipbl(char*); 406 extern void flatten(void); 407 extern int bbox(long, long, int); 408 extern int inbbox(DAngle, DAngle); 409 extern char* nameof(Record*); 410 411 #define NINDEX 400 412