Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed DQ bug for JWST, correct bits now set #217

Merged
merged 10 commits into from Apr 25, 2024
2 changes: 1 addition & 1 deletion grizli/combine.py
Expand Up @@ -173,7 +173,7 @@ def combine_flt(files=[], output='exposures_cmb.fits', grow=1,
print('{0:3d} {1:s} {2:6.1f} {3:6.1f} {4:10.2f}'.format(i+1, file,
x0[i], y0[i], im[0].header['EXPTIME']))

dq = utils.unset_dq_bits(im['DQ'].data, okbits=608,
dq = utils.mod_dq_bits(im['DQ'].data, okbits=608,
verbose=False)
wht = 1./im['ERR'].data**2
wht[(im['ERR'].data == 0) | (dq > 0) | (~np.isfinite(wht))] = 0
Expand Down
2 changes: 1 addition & 1 deletion grizli/jwst_utils.py
Expand Up @@ -1036,7 +1036,7 @@ def exposure_oneoverf_correction(file, axis=None, thresholds=[5,4,3], erode_mask
else:
erode_mask = True

dq = utils.unset_dq_bits(im['DQ'].data, 4)
dq = utils.mod_dq_bits(im['DQ'].data, okbits=4)
dqmask = dq == 0
mask = dqmask

Expand Down
4 changes: 2 additions & 2 deletions grizli/model.py
Expand Up @@ -1687,7 +1687,7 @@ def __init__(self, sci=None, err=None, dq=None,
self.MW_EBV = 0.

def unset_dq(self):
"""Flip OK data quality bits using utils.unset_dq_bits
"""Flip OK data quality bits using utils.mod_dq_bits

OK bits are defined as

Expand All @@ -1709,7 +1709,7 @@ def unset_dq(self):
else:
okbits = okbits_instrument[self.instrument]

self.data['DQ'] = utils.unset_dq_bits(self.data['DQ'], okbits=okbits)
self.data['DQ'] = utils.mod_dq_bits(self.data['DQ'], okbits=okbits)


def flag_negative(self, sigma=-3):
Expand Down
6 changes: 3 additions & 3 deletions grizli/prep.py
Expand Up @@ -6499,13 +6499,13 @@ def visit_grism_sky(grism={}, apply=True, column_average=True, verbose=True, ext
if isACS:
bits = 64+32
elif isJWST:
bits = 1+4+6+32768 #+16777200+1049600+26232800+9438210+9438220
bits = 2+4+32768 #+16777200+1049600+26232800+9438210+9438220
else:
bits = 576

for i in range(Nexp):
flt = pyfits.open(grism['files'][i])
dq = utils.unset_dq_bits(flt['DQ', ext].data, okbits=bits)
dq = utils.mod_dq_bits(flt['DQ', ext].data, okbits=bits)
dq_mask = dq == 0

# Data
Expand Down Expand Up @@ -6895,7 +6895,7 @@ def fix_star_centers(root='macs1149.6+2223-rot-ca5-22-032.0-f105w',

sci = images[i]['SCI'].data[sly, slx]
dq = images[i]['DQ'].data[sly, slx]
dqm = dq - (dq & 2048)
dqm = utils.mod_dq_bits(dq,okbits=2048)
err = images[i]['ERR'].data[sly, slx]
mask = satpix[sly, slx]

Expand Down
60 changes: 11 additions & 49 deletions grizli/utils.py
Expand Up @@ -1621,46 +1621,9 @@ def flt_to_dict(fobj, primary_keys=DEFAULT_PRIMARY_KEYS, extensions=[('SCI', i+1

return flt_dict


def get_set_bits(value):
"""
Compute which binary bits are set for an integer
"""

if hasattr(value, '__iter__'):
values = value
single = False
else:
values = [value]
single = True

result = []

for v in values:
try:
bitstr = np.binary_repr(v)[::-1]
except:
result.append([])

nset = bitstr.count('1')
setbits = []

j = -1
for i in range(nset):
j = bitstr.index('1', j+1)
setbits.append(j)

result.append(setbits)

if single:
return result[0]
else:
return result


def unset_dq_bits(value, okbits=32+64+512, verbose=False):
def mod_dq_bits(value, okbits=32+64+512, badbits=0, verbose=False):
"""
Unset bit flags from a DQ array
Modify bit flags from a DQ array

For WFC3/IR, the following DQ bits can usually be unset:

Expand All @@ -1675,6 +1638,9 @@ def unset_dq_bits(value, okbits=32+64+512, verbose=False):
okbits : int
Bits to unset

badbits : int
Bits to set

verbose : bool
Print some information

Expand All @@ -1683,16 +1649,12 @@ def unset_dq_bits(value, okbits=32+64+512, verbose=False):
new_value : int, `~numpy.ndarray`

"""
bin_bits = np.binary_repr(okbits)
n = len(bin_bits)
for i in range(n):
if bin_bits[-(i+1)] == '1':
if verbose:
print(2**i)

value -= (value & 2**i)
if verbose:
print(f'Unset bits: {np.binary_repr(okbits)}')
print(f'Set bits: {np.binary_repr(badbits)}')

return value
return (value & ~okbits) | badbits


def detect_with_photutils(sci, err=None, dq=None, seg=None, detect_thresh=2.,
Expand Down Expand Up @@ -6312,11 +6274,11 @@ def drizzle_from_visit(visit, output=None, pixfrac=1., kernel='point',
dq = flt[('DQ', ext)].data & (1+1024+4096)
dq |= bpdata.astype(dq.dtype)

# dq0 = unset_dq_bits(flt[('DQ', ext)].data, bits) | bpdata
# dq0 = mod_dq_bits(flt[('DQ', ext)].data, okbits=bits) | bpdata
# print('xxx', (dq > 0).sum(), (dq0 > 0).sum())

else:
dq = unset_dq_bits(flt[('DQ', ext)].data, bits) | bpdata
dq = mod_dq_bits(flt[('DQ', ext)].data, okbits=bits) | bpdata


wht = 1/err**2
Expand Down