1
|
|
|
from hawc_hal.maptree import map_tree_factory |
2
|
|
|
from astropy.io import fits |
3
|
|
|
|
4
|
|
|
from IPython import embed |
5
|
|
|
|
6
|
|
|
import healpy as hp |
7
|
|
|
import numpy as np |
8
|
|
|
|
9
|
|
|
import argparse |
10
|
|
|
import os |
11
|
|
|
from datetime import datetime |
12
|
|
|
|
13
|
|
|
|
14
|
|
|
parser = argparse.ArgumentParser(description='Process some integers.') |
15
|
|
|
|
16
|
|
|
parser.add_argument('--input', metavar='input', type=str, |
17
|
|
|
required=True, |
18
|
|
|
help='pick an hdf5 file as input') |
19
|
|
|
|
20
|
|
|
parser.add_argument('--output', metavar='output', type=str, |
21
|
|
|
default="map", |
22
|
|
|
help='pick a file prefix (e.g. given "test" -> test_binX.fits.gz)') |
23
|
|
|
|
24
|
|
|
parser.add_argument('--overwrite', |
25
|
|
|
action="store_true", |
26
|
|
|
help='Overwrite existing files') |
27
|
|
|
|
28
|
|
|
|
29
|
|
|
args = parser.parse_args() |
30
|
|
|
|
31
|
|
|
filename=os.path.expandvars(args.input) |
32
|
|
|
outfile=os.path.expandvars(args.output) |
33
|
|
|
clobber=args.overwrite |
34
|
|
|
|
35
|
|
|
if not os.path.isfile(filename): |
36
|
|
|
print("You must enter a valid file!") |
37
|
|
|
exit(1) |
38
|
|
|
|
39
|
|
|
|
40
|
|
|
# Export the entire map tree (full sky) |
41
|
|
|
# this throws a warning for partial map trees but its OK |
42
|
|
|
maptree = map_tree_factory(filename, None) |
43
|
|
|
|
44
|
|
|
|
45
|
|
|
now=datetime.now() |
46
|
|
|
startMJD=56987.9286332 |
47
|
|
|
|
48
|
|
|
|
49
|
|
|
#FIRST HEADER |
50
|
|
|
''' |
51
|
|
|
COMMENT FITS (Flexible Image Transport System) format is defined in 'Astronomy |
52
|
|
|
COMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H |
53
|
|
|
DATE = '2018-12-01T02:31:14' / file creation date (YYYY-MM-DDThh:mm:ss UT) |
54
|
|
|
STARTMJD= 56987.9286332451 / MJD of first event |
55
|
|
|
STOPMJD = 58107.2396848326 / MJD of last event |
56
|
|
|
NEVENTS = -1. / Number of events in map |
57
|
|
|
TOTDUR = 24412.9020670185 / Total integration time [hours] |
58
|
|
|
DURATION= 1.9943578604616 / Avg integration time [hours] |
59
|
|
|
MAPTYPE = 'duration' / e.g. Skymap, Moonmap |
60
|
|
|
MAXDUR = -1. / Max integration time [hours] |
61
|
|
|
MINDUR = -1. / Min integration time [hours] |
62
|
|
|
EPOCH = 'unknown ' / e.g. J2000, current, J2016, B1950, etc. |
63
|
|
|
HIERARCH MAPFILETYPE = 'duration' / e.g. standard, duration, integration |
64
|
|
|
''' |
65
|
|
|
|
66
|
|
|
FITS_COMMENT="FITS (Flexible Image Transport System) format is defined in 'Astronomy and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H" |
67
|
|
|
|
68
|
|
|
primary_keys=['COMMENT', 'COMMENT', 'DATE', 'STARTMJD', 'STOPMJD', |
69
|
|
|
'NEVENTS', 'TOTDUR', 'DURATION', 'MAPTYPE', 'MAXDUR', |
70
|
|
|
'MINDUR', 'EPOCH', 'MAPFILETYPE'] |
71
|
|
|
|
72
|
|
|
primary_values=[FITS_COMMENT , FITS_COMMENT, "{0}".format(now), 56987.9286332451, 58107.2396848326, |
73
|
|
|
-1.0, 24412.9020670185, 1.9943578604616, 'duration', -1.0, -1.0, 'unknown', 'duration'] |
74
|
|
|
|
75
|
|
|
primary_comments=["file does conform to FITS standard", |
76
|
|
|
"number of bits per data pixel", |
77
|
|
|
"number of data axes", |
78
|
|
|
"FITS dataset may contain extension", |
79
|
|
|
"MJD of first event", "MJD of last event", |
80
|
|
|
"Number of events in map", |
81
|
|
|
"Total integration time [hours]", |
82
|
|
|
"Avg integration time [hours]", |
83
|
|
|
"e.g. Skymap, Moonmap", |
84
|
|
|
"Max integration time [hours]", |
85
|
|
|
"Min integration time [hours]", |
86
|
|
|
"e.g. J2000, current, J2016, B1950, etc.", |
87
|
|
|
"e.g. standard, duration, integration"] |
88
|
|
|
|
89
|
|
|
|
90
|
|
|
|
91
|
|
|
labels=['data map', 'background map', 'exposure map'] |
92
|
|
|
label_format=[ np.float64 for i in range(len(labels)) ] |
93
|
|
|
label_units=[ 'unknown' for i in range(len(labels)) ] |
94
|
|
|
|
95
|
|
|
|
96
|
|
|
for i, analysis_bin in enumerate(maptree.analysis_bins_labels): |
97
|
|
|
map_bin = maptree[analysis_bin] |
98
|
|
|
#properties |
99
|
|
|
nside = map_bin.nside |
100
|
|
|
npix = map_bin.npix |
101
|
|
|
see_pixels = map_bin.observation_map._pixels_ids |
102
|
|
|
transits = map_bin.n_transits |
103
|
|
|
scheme = map_bin.scheme |
104
|
|
|
|
105
|
|
|
nest_scheme=False |
106
|
|
|
if scheme.lower()=='nested': |
107
|
|
|
nest_scheme=True |
108
|
|
|
|
109
|
|
|
#what we want |
110
|
|
|
data = map_bin.observation_map.as_dense() |
111
|
|
|
bkg = map_bin.background_map.as_dense() |
112
|
|
|
|
113
|
|
|
zeros = np.empty(npix) |
114
|
|
|
zeros.fill(9e9) |
115
|
|
|
|
116
|
|
|
outFileName="{0}_bin{1}.fits.gz".format(outfile,analysis_bin) |
117
|
|
|
#I probably need to add some header info, but yeah |
118
|
|
|
hp.fitsfunc.write_map(outFileName, (data, bkg, zeros), |
119
|
|
|
column_names=labels, column_units=label_units, dtype=label_format, |
120
|
|
|
partial=False, fits_IDL=True, overwrite=clobber, nest=nest_scheme) |
121
|
|
|
|
122
|
|
|
|
123
|
|
|
#add the cards to the header |
124
|
|
|
with fits.open(outFileName,'update') as hdu1: |
125
|
|
|
hdr=hdu1[0].header |
126
|
|
|
|
127
|
|
|
for i,key in enumerate(primary_keys): |
128
|
|
|
val=primary_values[i] |
129
|
|
|
comment=primary_comments[i] |
130
|
|
|
|
131
|
|
|
if key=='TOTDUR': |
132
|
|
|
val=24.0*transits |
133
|
|
|
|
134
|
|
|
if key=='STOPMJD': |
135
|
|
|
val=startMJD+transits |
136
|
|
|
|
137
|
|
|
entry=(val,comment) |
138
|
|
|
|
139
|
|
|
hdr[key]=entry |
140
|
|
|
|
141
|
|
|
#File is now closed |
142
|
|
|
print("File Written: {0}".format(outFileName)) |
143
|
|
|
|