xref: /plan9/sys/src/cmd/scat/sky.h (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
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