#define DIR "/lib/sky" /* * This code reflects many years of changes. There remain residues * of prior implementations. * * Keys: * 32 bits long. High 26 bits are encoded as described below. * Low 6 bits are types: * * Patch is ~ one square degree of sky. It points to an otherwise * anonymous list of Catalog keys. The 0th key is special: * it contains up to 4 constellation identifiers. * Catalogs (SAO,NGC,M,...) are: * 31.........8|76|543210 * catalog # |BB|catalog name * BB is two bits of brightness: * 00 -inf < m <= 7 * 01 7 < m <= 10 * 10 10 < m <= 13 * 11 13 < m < inf * The BB field is a dreg, and correct only for SAO and NGC. * IC(n) is just NGC(n+7840) * Others should be self-explanatory. * * Records: * * Star is an SAOrec * Galaxy, PlanetaryN, OpenCl, GlobularCl, DiffuseN, etc., are NGCrecs. * Abell is an Abellrec * The Namedxxx records hold a name and a catalog entry; they result from * name lookups. */ typedef enum { Planet, Patch, SAO, NGC, M, Constel_deprecated, Nonstar_deprecated, NamedSAO, NamedNGC, NamedAbell, Abell, /* NGC types */ Galaxy, PlanetaryN, OpenCl, GlobularCl, DiffuseN, NebularCl, Asterism, Knot, Triple, Double, Single, Uncertain, Nonexistent, Unknown, PlateDefect, /* internal */ NGCN, PatchC, NONGC, }Type; enum { /* * parameters for plate */ Pppo1 = 0, Pppo2, Pppo3, Pppo4, Pppo5, Pppo6, Pamdx1, Pamdx2, Pamdx3, Pamdx4, Pamdx5, Pamdx6, Pamdx7, Pamdx8, Pamdx9, Pamdx10, Pamdx11, Pamdx12, Pamdx13, Pamdx14, Pamdx15, Pamdx16, Pamdx17, Pamdx18, Pamdx19, Pamdx20, Pamdy1, Pamdy2, Pamdy3, Pamdy4, Pamdy5, Pamdy6, Pamdy7, Pamdy8, Pamdy9, Pamdy10, Pamdy11, Pamdy12, Pamdy13, Pamdy14, Pamdy15, Pamdy16, Pamdy17, Pamdy18, Pamdy19, Pamdy20, Ppltscale, Pxpixelsz, Pypixelsz, Ppltra, Ppltrah, Ppltram, Ppltras, Ppltdec, Ppltdecd, Ppltdecm, Ppltdecs, Pnparam, }; #define UNKNOWNMAG 32767 #define NPlanet 20 typedef float Angle; /* in radians */ typedef long DAngle; /* on disk: in units of milliarcsec */ typedef short Mag; /* multiplied by 10 */ typedef long Key; /* known to be 4 bytes, unfortunately */ /* * All integers are stored in little-endian order. */ typedef struct NGCrec NGCrec; struct NGCrec{ DAngle ra; DAngle dec; DAngle dummy1; /* compatibility with old RNGC version */ DAngle diam; Mag mag; short ngc; /* if >NNGC, IC number is ngc-NNGC */ char diamlim; char type; char magtype; char dummy2; char desc[52]; /* 0-terminated Dreyer description */ }; typedef struct Abellrec Abellrec; struct Abellrec{ DAngle ra; DAngle dec; DAngle glat; DAngle glong; Mag mag10; /* mag of 10th brightest cluster member; in same place as ngc.mag*/ short abell; DAngle rad; short pop; short dist; char distgrp; char richgrp; char flag; char pad; }; typedef struct Planetrec Planetrec; struct Planetrec{ DAngle ra; DAngle dec; DAngle az; DAngle alt; DAngle semidiam; double phase; char name[16]; }; /* * Star names: 0,0==unused. Numbers are name[0]=1,..,99. * Greek letters are alpha=101, etc. * Constellations are alphabetical order by abbreviation, and=1, etc. */ typedef struct SAOrec SAOrec; struct SAOrec{ DAngle ra; DAngle dec; DAngle dra; DAngle ddec; Mag mag; /* visual */ Mag mpg; char spec[3]; char code; char compid[2]; char hdcode; char pad1; long hd; /* HD catalog number */ char name[3]; /* name[0]=alpha name[1]=2 name[3]=ori */ char nname; /* number of prose names */ /* 36 bytes to here */ }; typedef struct Mindexrec Mindexrec; struct Mindexrec{ /* code knows the bit patterns in here; this is a long */ char m; /* M number */ char dummy; short ngc; }; typedef struct Bayerec Bayerec; struct Bayerec{ long sao; char name[3]; char pad; }; /* * Internal form */ typedef struct Namedrec Namedrec; struct Namedrec{ char name[36]; }; typedef struct Namerec Namerec; struct Namerec{ long sao; long ngc; long abell; char name[36]; /* null terminated */ }; typedef struct Patchrec Patchrec; struct Patchrec{ int nkey; long key[60]; }; typedef struct Record Record; struct Record{ Type type; long index; union{ SAOrec sao; NGCrec ngc; Abellrec abell; Namedrec named; Patchrec patch; Planetrec planet; /* PatchCrec is empty */ }; }; typedef struct Name Name; struct Name{ char *name; int type; }; typedef struct Plate Plate; struct Plate { char rgn[7]; char disk; Angle ra; Angle dec; }; typedef struct Header Header; struct Header { float param[Pnparam]; int amdflag; float x; float y; float xi; float eta; }; typedef long Pix; typedef struct Img Img; struct Img { int nx; int ny; /* ny is the fast-varying dimension */ Pix a[1]; }; #define RAD(x) ((x)*PI_180) #define DEG(x) ((x)/PI_180) #define ARCSECONDS_PER_RADIAN (DEG(1)*3600) #define MILLIARCSEC (1000*60*60) int nplate; Plate plate[2000]; /* needs to go to 2000 when the north comes */ double PI_180; double TWOPI; double LN2; int debug; struct { float min; float max; float gamma; float absgamma; float mult1; float mult2; int neg; } gam; typedef struct Picture Picture; struct Picture { int minx; int miny; int maxx; int maxy; char name[16]; uchar *data; }; typedef struct Image Image; extern double PI_180; extern double TWOPI; extern char *progname; extern char *desctab[][2]; extern Name names[]; extern Record *rec; extern long nrec; extern Planetrec *planet; /* for bbox: */ extern int folded; extern DAngle ramin; extern DAngle ramax; extern DAngle decmin; extern DAngle decmax; extern Biobuf bout; extern void saoopen(void); extern void ngcopen(void); extern void patchopen(void); extern void mopen(void); extern void constelopen(void); extern void lowercase(char*); extern void lookup(char*, int); extern int typetab(int); extern char*ngcstring(int); extern char*skip(int, char*); extern void prrec(Record*); extern int equal(char*, char*); extern int parsename(char*); extern void radec(int, int*, int*, int*); extern int btag(short); extern long patcha(Angle, Angle); extern long patch(int, int, int); extern char*hms(Angle); extern char*dms(Angle); extern char*ms(Angle); extern char*hm(Angle); extern char*dm(Angle); extern char*deg(Angle); extern char*hm5(Angle); extern long dangle(Angle); extern Angle angle(DAngle); extern void prdesc(char*, char*(*)[2], short*); extern double xsqrt(double); extern Angle dist(Angle, Angle, Angle, Angle); extern Header* getheader(char*); extern char* getword(char*, char*); extern void amdinv(Header*, Angle, Angle, float, float); extern void ppoinv(Header*, Angle, Angle); extern void xypos(Header*, Angle, Angle, float, float); extern void traneqstd(Header*, Angle, Angle); extern Angle getra(char*); extern Angle getdec(char*); extern void getplates(void); extern Img* dssread(char*); extern void hinv(Pix*, int, int); extern int input_bit(Biobuf*); extern int input_nbits(Biobuf*, int); extern int input_huffman(Biobuf*); extern int input_nybble(Biobuf*); extern void qtree_decode(Biobuf*, Pix*, int, int, int, int); extern void start_inputing_bits(void); extern Picture* image(Angle, Angle, Angle, Angle); extern char* dssmount(int); extern int dogamma(Pix); extern void displaypic(Picture*); extern void displayimage(Image*); extern void plot(char*); extern void astro(char*, int); extern char* alpha(char*, char*); extern char* skipbl(char*); extern void flatten(void); extern int bbox(long, long, int); extern int inbbox(DAngle, DAngle); extern char* nameof(Record*); #define NINDEX 400