1
/***************************************************************************
2
healpix_tools.cpp - tools for healpix datasource
4
begin : Wed June 01 2005
5
copyright : (C) 2005 Ted Kisner
6
email : tskisner.public@gmail.com
7
***************************************************************************/
9
/***************************************************************************
11
* This program is free software; you can redistribute it and/or modify *
12
* it under the terms of the GNU General Public License as published by *
13
* the Free Software Foundation; either version 2 of the License, or *
14
* (at your option) any later version. *
16
***************************************************************************/
18
#include "healpix_tools.h"
22
healpix_keys *healpix_keys_alloc()
25
keys = (healpix_keys *) calloc(1, sizeof(healpix_keys));
29
keys->skeynames = NULL;
30
keys->skeyvals = NULL;
31
keys->skeycoms = NULL;
32
keys->ikeynames = NULL;
33
keys->ikeyvals = NULL;
34
keys->ikeycoms = NULL;
35
keys->fkeynames = NULL;
36
keys->fkeyvals = NULL;
37
keys->fkeycoms = NULL;
41
int healpix_keys_free(healpix_keys * keys)
45
for (i = 0; i < (keys->nskeys); i++) {
46
free(keys->skeynames[i]);
47
free(keys->skeyvals[i]);
48
free(keys->skeycoms[i]);
50
if (keys->nskeys != 0) {
51
free(keys->skeynames);
55
for (i = 0; i < (keys->nikeys); i++) {
56
free(keys->ikeynames[i]);
57
free(keys->ikeycoms[i]);
59
if (keys->nikeys != 0) {
60
free(keys->ikeynames);
64
for (i = 0; i < (keys->nfkeys); i++) {
65
free(keys->fkeynames[i]);
66
free(keys->fkeycoms[i]);
68
if (keys->nfkeys != 0) {
69
free(keys->fkeynames);
78
int healpix_keys_clear(healpix_keys * keys)
82
for (i = 0; i < (keys->nskeys); i++) {
83
free(keys->skeynames[i]);
84
free(keys->skeyvals[i]);
85
free(keys->skeycoms[i]);
87
if (keys->nskeys != 0) {
88
free(keys->skeynames);
92
for (i = 0; i < (keys->nikeys); i++) {
93
free(keys->ikeynames[i]);
94
free(keys->ikeycoms[i]);
96
if (keys->nikeys != 0) {
97
free(keys->ikeynames);
101
for (i = 0; i < (keys->nfkeys); i++) {
102
free(keys->fkeynames[i]);
103
free(keys->fkeycoms[i]);
105
if (keys->nfkeys != 0) {
106
free(keys->fkeynames);
107
free(keys->fkeyvals);
108
free(keys->fkeycoms);
113
keys->skeynames = NULL;
114
keys->skeyvals = NULL;
115
keys->skeycoms = NULL;
116
keys->ikeynames = NULL;
117
keys->ikeyvals = NULL;
118
keys->ikeycoms = NULL;
119
keys->fkeynames = NULL;
120
keys->fkeyvals = NULL;
121
keys->fkeycoms = NULL;
128
int healpix_keys_sadd(healpix_keys * keys, char *keyname, char *keyval, char *keycom)
133
(char **)realloc(keys->skeynames,
134
((keys->nskeys) + 1) * sizeof(char *));
135
(keys->skeynames[keys->nskeys]) =
136
(char *)calloc(HEALPIX_STRNL, sizeof(char));
138
(keys->skeyvals) = (char **)realloc(keys->skeyvals, ((keys->nskeys) + 1) * sizeof(char *));
139
(keys->skeyvals[keys->nskeys]) = (char *)calloc(HEALPIX_STRNL, sizeof(char));
141
(keys->skeycoms) = (char **)realloc(keys->skeycoms, ((keys->nskeys) + 1) * sizeof(char *));
142
(keys->skeycoms[keys->nskeys]) = (char *)calloc(HEALPIX_STRNL, sizeof(char));
144
strncpy(keys->skeynames[keys->nskeys], keyname, HEALPIX_STRNL);
145
strncpy(keys->skeyvals[keys->nskeys], keyval, HEALPIX_STRNL);
146
strncpy(keys->skeycoms[keys->nskeys], keycom, HEALPIX_STRNL);
152
int healpix_keys_iadd(healpix_keys * keys, char *keyname, int keyval, char *keycom)
156
(char **)realloc(keys->ikeynames,
157
((keys->nikeys) + 1) * sizeof(char *));
158
(keys->ikeynames[keys->nikeys]) =
159
(char *)calloc(HEALPIX_STRNL, sizeof(char));
162
(int *)realloc(keys->ikeyvals, ((keys->nikeys) + 1) * sizeof(int));
165
(char **)realloc(keys->ikeycoms, ((keys->nikeys) + 1) * sizeof(char *));
166
(keys->ikeycoms[keys->nikeys]) = (char *)calloc(HEALPIX_STRNL, sizeof(char));
168
strncpy(keys->ikeynames[keys->nikeys], keyname, HEALPIX_STRNL);
169
keys->ikeyvals[keys->nikeys] = keyval;
170
strncpy(keys->ikeycoms[keys->nikeys], keycom, HEALPIX_STRNL);
176
int healpix_keys_fadd(healpix_keys * keys, char *keyname, float keyval, char *keycom)
180
(char **)realloc(keys->fkeynames,
181
((keys->nfkeys) + 1) * sizeof(char *));
182
(keys->fkeynames[keys->nfkeys]) =
183
(char *)calloc(HEALPIX_STRNL, sizeof(char));
186
(float *)realloc(keys->fkeyvals, ((keys->nfkeys) + 1) * sizeof(float));
189
(char **)realloc(keys->fkeycoms, ((keys->nfkeys) + 1) * sizeof(char *));
190
(keys->fkeycoms[keys->nfkeys]) = (char *)calloc(HEALPIX_STRNL, sizeof(char));
192
strncpy(keys->fkeynames[keys->nfkeys], keyname, HEALPIX_STRNL);
193
keys->fkeyvals[keys->nfkeys] = keyval;
194
strncpy(keys->fkeycoms[keys->nfkeys], keycom, HEALPIX_STRNL);
202
int healpix_keys_read(healpix_keys * keys, fitsfile * fp, int *ret)
209
char card[HEALPIX_STRNL];
210
char keyval[HEALPIX_STRNL];
211
char keycom[HEALPIX_STRNL];
213
char keyname[HEALPIX_STRNL];
216
exclist = healpix_strarr_alloc(nexc);
217
inclist = healpix_strarr_alloc(1);
219
/*exclude required keywords */
220
strcpy(exclist[0], "XTENSION");
221
strcpy(exclist[1], "BITPIX");
222
strcpy(exclist[2], "NAXIS*");
223
strcpy(exclist[3], "PCOUNT");
224
strcpy(exclist[4], "GCOUNT");
225
strcpy(exclist[5], "TFIELDS");
226
strcpy(exclist[6], "TTYPE*");
227
strcpy(exclist[7], "TFORM*");
228
strcpy(exclist[8], "TUNIT*");
229
strcpy(exclist[9], "EXTNAME");
230
strcpy(exclist[10], "PIXTYPE");
231
strcpy(exclist[11], "ORDERING");
232
strcpy(exclist[12], "NSIDE");
233
strcpy(exclist[13], "COORDSYS");
234
strcpy(exclist[14], "INDXSCHM");
235
strcpy(exclist[15], "GRAIN");
236
strcpy(exclist[16], "COMMENT");
237
strcpy(exclist[17], "TBCOL*");
238
strcpy(exclist[18], "SIMPLE");
239
strcpy(exclist[19], "EXTEND");
240
strcpy(exclist[19], "CREATOR");
241
strcpy(inclist[0], "*");
244
if (fits_read_record(fp, rec, card, ret)) {
247
while (!fits_find_nextkey(fp, inclist, 1, exclist, (int)nexc, card, ret)) {
248
fits_get_keyname(card, keyname, &keylen, ret);
249
fits_parse_value(card, keyval, keycom, ret);
250
fits_get_keytype(keyval, &keytype, ret);
253
healpix_keys_iadd(keys, keyname, atoi(keyval), keycom);
256
healpix_keys_fadd(keys, keyname, (float)atof(keyval), keycom);
259
healpix_keys_sadd(keys, keyname, keyval, keycom);
266
healpix_strarr_free(exclist, nexc);
267
healpix_strarr_free(inclist, 1);
272
/* FITS file tests */
274
int healpix_fits_map_test(char *filename, size_t * nside, int *order, int *coord, int *type, size_t * nmaps)
284
char pixtype[HEALPIX_STRNL];
285
char coordstr[HEALPIX_STRNL];
286
char orderstr[HEALPIX_STRNL];
287
char indxstr[HEALPIX_STRNL];
288
char comment[HEALPIX_STRNL];
289
char extname[HEALPIX_STRNL];
290
float nullval = HEALPIX_NULL;
299
if (fits_open_file(&fp, filename, READONLY, &ret)) {
303
/* make sure extension is a binary table */
304
if (fits_movabs_hdu(fp, 2, &ttype, &ret)) {
306
fits_close_file(fp, &ret);
309
if (ttype != BINARY_TBL) {
311
fits_close_file(fp, &ret);
315
/* determine the number of maps */
316
if (fits_read_btblhdr(fp, HEALPIX_FITS_MAXCOL, &nrows, &tfields, NULL, NULL, NULL, extname, &pcount, &ret)) {
318
fits_close_file(fp, &ret);
322
/* make sure this is a HEALPIX file */
323
if (fits_read_key(fp, TSTRING, "PIXTYPE", pixtype, comment, &ret)) {
325
fits_close_file(fp, &ret);
328
if (strncmp(pixtype, "HEALPIX", HEALPIX_STRNL) != 0) {
330
fits_close_file(fp, &ret);
334
/* check required keywords (NSIDE, ORDERING, COORDSYS) */
335
if (fits_read_key(fp, TINT, "NSIDE", &inside, comment, &ret)) {
337
fits_close_file(fp, &ret);
340
(*nside) = (size_t) inside;
341
if (healpix_nsidecheck(*nside)) {
343
fits_close_file(fp, &ret);
346
if (fits_read_key(fp, TSTRING, "ORDERING", orderstr, comment, &ret)) {
348
fits_close_file(fp, &ret);
351
if (strncmp(orderstr, "RING", HEALPIX_STRNL) == 0) {
352
(*order) = HEALPIX_RING;
353
} else if (strncmp(orderstr, "NESTED", HEALPIX_STRNL) == 0) {
354
(*order) = HEALPIX_NEST;
357
fits_close_file(fp, &ret);
360
if (fits_read_key(fp, TSTRING, "COORDSYS", coordstr, comment, &ret)) {
362
(*coord) = HEALPIX_COORD_C;
364
if (strncmp(coordstr, "C", HEALPIX_STRNL) == 0) {
365
(*coord) = HEALPIX_COORD_C;
366
} else if (strncmp(coordstr, "G", HEALPIX_STRNL) == 0) {
367
(*coord) = HEALPIX_COORD_G;
368
} else if (strncmp(coordstr, "E", HEALPIX_STRNL) == 0) {
369
(*coord) = HEALPIX_COORD_E;
371
(*coord) = HEALPIX_COORD_O;
375
/* check for INDXSCHM and GRAIN. if not found, assume implicit */
378
if (fits_read_key(fp, TSTRING, "OBJECT", indxstr, comment, &ret)) {
380
if (fits_read_key(fp, TSTRING, "INDXSCHM", indxstr, comment, &ret)) {
382
(*type) = HEALPIX_FITS_FULL;
384
if (strncmp(indxstr, "EXPLICIT", HEALPIX_STRNL) == 0) {
385
(*type) = HEALPIX_FITS_CUT;
387
(*type) = HEALPIX_FITS_FULL;
390
if (fits_read_key(fp, TINT, "GRAIN", &grain, comment, &ret)) {
394
if (((grain == 0) && ((*type) == HEALPIX_FITS_CUT)) ||
395
((grain != 0) && ((*type) == HEALPIX_FITS_FULL))) {
397
fits_close_file(fp, &ret);
401
if (strncmp(indxstr, "PARTIAL", HEALPIX_STRNL) == 0) {
402
(*type) = HEALPIX_FITS_CUT;
404
if (strncmp(indxstr, "FULLSKY", HEALPIX_STRNL) == 0) {
405
(*type) = HEALPIX_FITS_FULL;
407
if (fits_read_key(fp, TSTRING, "INDXSCHM", indxstr, comment, &ret)) {
409
(*type) = HEALPIX_FITS_FULL;
411
if (strncmp(indxstr, "EXPLICIT", HEALPIX_STRNL) == 0) {
412
(*type) = HEALPIX_FITS_CUT;
414
(*type) = HEALPIX_FITS_FULL;
417
if (fits_read_key(fp, TINT, "GRAIN", &grain, comment, &ret)) {
421
if (((grain == 0) && ((*type) == HEALPIX_FITS_CUT)) ||
422
((grain != 0) && ((*type) == HEALPIX_FITS_FULL))) {
424
fits_close_file(fp, &ret);
431
/* check for chunk file and truncation */
433
if ((*type) == HEALPIX_FITS_FULL) {
435
if ((nrows != (long)(12*inside*inside))&&(1024*nrows != (long)(12*inside*inside))) {
436
/*is this a chunk file?*/
437
if (fits_read_key(fp, TLONG, "FIRSTPIX", &keyfirst, comment, &ret)) {
438
/*must at least have FIRSTPIX key*/
442
if (fits_read_key(fp, TLONG, "NPIX", &keynpix, comment, &ret)) {
444
/*might be using LASTPIX instead*/
445
if (fits_read_key(fp, TLONG, "LASTPIX", &keynpix, comment, &ret)) {
449
keynpix = keynpix - keyfirst + 1;
450
if ((keyfirst < 0)||(keynpix < 0)||(keynpix+keyfirst > (long)(12*inside*inside))) {
457
if ((keyfirst < 0)||(keynpix < 0)||(keynpix+keyfirst > (long)(12*inside*inside))) {
465
/*header doesn't matter, since we have entire map*/
466
if (nrows == (long)(12*inside*inside)) {
473
if (nrows == keynpix) {
476
lastcol = keynpix % 1024;
482
if (fits_read_col(fp, TFLOAT, 1, nrows, lastcol, 1, &nullval, &testval, &nnull, &ret)) {
484
fits_close_file(fp, &ret);
488
(*nmaps) = tfields - 3;
489
if (fits_read_col(fp, TFLOAT, 2, nrows, 1, 1, &nullval, &testval, &nnull, &ret)) {
491
fits_close_file(fp, &ret);
496
fits_close_file(fp, &ret);
500
int healpix_fits_map_info(char *filename, size_t * nside, int *order, int *coord, int *type, size_t * nmaps, char *creator, char *extname, char **names, char **units, healpix_keys *keys)
510
char pixtype[HEALPIX_STRNL];
511
char coordstr[HEALPIX_STRNL];
512
char orderstr[HEALPIX_STRNL];
513
char indxstr[HEALPIX_STRNL];
514
char comment[HEALPIX_STRNL];
515
float nullval = HEALPIX_NULL;
524
if (fits_open_file(&fp, filename, READONLY, &ret)) {
528
/* read header info */
529
fits_read_key(fp, TSTRING, "CREATOR", creator, comment, &ret);
532
/* make sure extension is a binary table */
533
if (fits_movabs_hdu(fp, 2, &ttype, &ret)) {
535
fits_close_file(fp, &ret);
538
if (ttype != BINARY_TBL) {
540
fits_close_file(fp, &ret);
544
/* determine the number of maps */
545
if (fits_read_btblhdr(fp, HEALPIX_FITS_MAXCOL, &nrows, &tfields, names, NULL, units, extname, &pcount, &ret)) {
547
fits_close_file(fp, &ret);
551
/* make sure this is a HEALPIX file */
552
if (fits_read_key(fp, TSTRING, "PIXTYPE", pixtype, comment, &ret)) {
554
fits_close_file(fp, &ret);
557
if (strncmp(pixtype, "HEALPIX", HEALPIX_STRNL) != 0) {
559
fits_close_file(fp, &ret);
563
/* check required keywords (NSIDE, ORDERING, COORDSYS) */
564
if (fits_read_key(fp, TINT, "NSIDE", &inside, comment, &ret)) {
566
fits_close_file(fp, &ret);
569
(*nside) = (size_t) inside;
570
if (healpix_nsidecheck(*nside)) {
572
fits_close_file(fp, &ret);
575
if (fits_read_key(fp, TSTRING, "ORDERING", orderstr, comment, &ret)) {
577
fits_close_file(fp, &ret);
580
if (strncmp(orderstr, "RING", HEALPIX_STRNL) == 0) {
581
(*order) = HEALPIX_RING;
582
} else if (strncmp(orderstr, "NESTED", HEALPIX_STRNL) == 0) {
583
(*order) = HEALPIX_NEST;
586
fits_close_file(fp, &ret);
589
if (fits_read_key(fp, TSTRING, "COORDSYS", coordstr, comment, &ret)) {
591
(*coord) = HEALPIX_COORD_C;
593
if (strncmp(coordstr, "C", HEALPIX_STRNL) == 0) {
594
(*coord) = HEALPIX_COORD_C;
595
} else if (strncmp(coordstr, "G", HEALPIX_STRNL) == 0) {
596
(*coord) = HEALPIX_COORD_G;
597
} else if (strncmp(coordstr, "E", HEALPIX_STRNL) == 0) {
598
(*coord) = HEALPIX_COORD_E;
600
(*coord) = HEALPIX_COORD_O;
604
/* check for INDXSCHM and GRAIN. if not found, assume implicit */
607
if (fits_read_key(fp, TSTRING, "OBJECT", indxstr, comment, &ret)) {
609
if (fits_read_key(fp, TSTRING, "INDXSCHM", indxstr, comment, &ret)) {
611
(*type) = HEALPIX_FITS_FULL;
613
if (strncmp(indxstr, "EXPLICIT", HEALPIX_STRNL) == 0) {
614
(*type) = HEALPIX_FITS_CUT;
616
(*type) = HEALPIX_FITS_FULL;
619
if (fits_read_key(fp, TINT, "GRAIN", &grain, comment, &ret)) {
623
if (((grain == 0) && ((*type) == HEALPIX_FITS_CUT)) ||
624
((grain != 0) && ((*type) == HEALPIX_FITS_FULL))) {
626
fits_close_file(fp, &ret);
630
if (strncmp(indxstr, "PARTIAL", HEALPIX_STRNL) == 0) {
631
(*type) = HEALPIX_FITS_CUT;
633
if (strncmp(indxstr, "FULLSKY", HEALPIX_STRNL) == 0) {
634
(*type) = HEALPIX_FITS_FULL;
636
if (fits_read_key(fp, TSTRING, "INDXSCHM", indxstr, comment, &ret)) {
638
(*type) = HEALPIX_FITS_FULL;
640
if (strncmp(indxstr, "EXPLICIT", HEALPIX_STRNL) == 0) {
641
(*type) = HEALPIX_FITS_CUT;
643
(*type) = HEALPIX_FITS_FULL;
646
if (fits_read_key(fp, TINT, "GRAIN", &grain, comment, &ret)) {
650
if (((grain == 0) && ((*type) == HEALPIX_FITS_CUT)) ||
651
((grain != 0) && ((*type) == HEALPIX_FITS_FULL))) {
653
fits_close_file(fp, &ret);
660
/* read extension keys */
661
healpix_keys_read(keys, fp, &ret);
663
/* check for chunk file and truncation */
665
if ((*type) == HEALPIX_FITS_FULL) {
667
if ((nrows != (long)(12*inside*inside))&&(1024*nrows != (long)(12*inside*inside))) {
668
/*is this a chunk file?*/
669
if (fits_read_key(fp, TLONG, "FIRSTPIX", &keyfirst, comment, &ret)) {
670
/*must at least have FIRSTPIX key*/
674
if (fits_read_key(fp, TLONG, "NPIX", &keynpix, comment, &ret)) {
676
/*might be using LASTPIX instead*/
677
if (fits_read_key(fp, TLONG, "LASTPIX", &keynpix, comment, &ret)) {
681
keynpix = keynpix - keyfirst + 1;
682
if ((keyfirst < 0)||(keynpix < 0)||(keynpix+keyfirst > (long)(12*inside*inside))) {
689
if ((keyfirst < 0)||(keynpix < 0)||(keynpix+keyfirst > (long)(12*inside*inside))) {
697
/*header doesn't matter, since we have entire map*/
698
if (nrows == (long)(12*inside*inside)) {
705
if (nrows == keynpix) {
708
lastcol = keynpix % 1024;
714
if (fits_read_col(fp, TFLOAT, 1, nrows, lastcol, 1, &nullval, &testval, &nnull, &ret)) {
716
fits_close_file(fp, &ret);
720
(*nmaps) = tfields - 3;
721
if (fits_read_col(fp, TFLOAT, 2, nrows, 1, 1, &nullval, &testval, &nnull, &ret)) {
723
fits_close_file(fp, &ret);
728
fits_close_file(fp, &ret);