def test_cosmetics_mask_2(): size = 200 flat1 = numpy.ones((size, size)) flat1[0:100, 0] = 0 flat2 = flat1 mask = numpy.zeros((size, size), dtype="int") mask[0:10, 0] = 1 mascara = cosmetics(flat1, flat2, mask) expected_mask = numpy.zeros((size, size), dtype="int") expected_mask[0:100, 0] = 1 expected_mask = expected_mask.astype("bool") assert mascara.all() == expected_mask.all()
def run(self, rinput): # FIXME: # We need 2 flats # Of different exposure times # # And their calibrations # if len(rinput.obresult.frames) < 2: raise RecipeError('The recipe requires 2 flat frames') iinfo = [] for frame in rinput.obresult.frames: with frame.open() as hdulist: iinfo.append(gather_info(hdulist)) # Loading calibrations with rinput.master_bias.open() as hdul: readmode = hdul[0].header.get('READMODE', 'undefined') if readmode.lower() in ['simple', 'bias']: self.logger.debug('loading bias') mbias = hdul[0].data bias_corrector = proc.BiasCorrector(mbias) else: self.logger.debug('ignoring bias') bias_corrector = numina.util.node.IdNode() with rinput.master_dark.open() as mdark_hdul: self.logger.debug('loading dark') mdark = mdark_hdul[0].data dark_corrector = proc.DarkCorrector(mdark) flow = numina.util.flow.SerialFlow([bias_corrector, dark_corrector]) self.logger.info('processing flat #1') with rinput.obresult.frames[0].open() as hdul: other = flow(hdul) f1 = other[0].data.copy() * iinfo[0]['texp'] * 1e-3 self.logger.info('processing flat #2') with rinput.obresult.frames[1].open() as hdul: other = flow(hdul) f2 = other[0].data.copy() * iinfo[1]['texp'] * 1e-3 # Preprocess... maxiter = rinput.maxiter lowercut = rinput.lowercut uppercut = rinput.uppercut ninvalid = 0 mask = None if mask: m = fits.getdata(mask) ninvalid = numpy.count_nonzero(m) else: m = numpy.zeros_like(f1, dtype='int') for niter in range(1, maxiter + 1): self.logger.debug('iter %d', niter) ratio, m, sigma = cosmetics(f1, f2, m, lowercut=lowercut, uppercut=uppercut) if self.intermediate_results: with warnings.catch_warnings(): warnings.simplefilter('ignore') fits.writeto('numina-cosmetics-i%02d.fits' % niter, ratio, overwrite=True) fits.writeto('numina-mask-i%02d.fits' % niter, m, overwrite=True) fits.writeto('numina-sigma-i%02d.fits' % niter, m * 0.0 + sigma, overwrite=True) self.logger.debug('iter %d, invalid points in input mask: %d', niter, ninvalid) self.logger.debug('iter %d, estimated sigma is %f', niter, sigma) n_ninvalid = numpy.count_nonzero(m) # Probably there is something wrong here # too much defective pixels if ninvalid / m.size >= 0.10: # This should set a flag in the output msg = 'defective pixels are greater than 10%' self.logger.warning(msg) if n_ninvalid == ninvalid: self.logger.info('convergence reached after %d iterations', niter) break self.logger.info('new invalid points: %d', n_ninvalid - ninvalid) ninvalid = n_ninvalid else: # This should set a flag in the output msg = 'convergence not reached after %d iterations' % maxiter self.logger.warning(msg) self.logger.info('number of dead pixels %d', numpy.count_nonzero(m == PIXEL_DEAD)) self.logger.info('number of hot pixels %d', numpy.count_nonzero(m == PIXEL_HOT)) if self.intermediate_results: with warnings.catch_warnings(): warnings.simplefilter('ignore') fits.writeto('numina-cosmetics.fits', ratio, overwrite=True) fits.writeto('numina-mask.fits', m, overwrite=True) fits.writeto('numina-sigma.fits', sigma * numpy.ones_like(m), overwrite=True) hdu = fits.PrimaryHDU(ratio) hdr = hdu.header hdr['NUMXVER'] = (__version__, 'Numina package version') hdr['NUMRNAM'] = (self.__class__.__name__, 'Numina recipe name') hdr['NUMRVER'] = (self.__version__, 'Numina recipe version') ratiohdl = fits.HDUList([hdu]) maskhdu = fits.PrimaryHDU(m) hdr = maskhdu.header hdr['NUMXVER'] = (__version__, 'Numina package version') hdr['NUMRNAM'] = (self.__class__.__name__, 'Numina recipe name') hdr['NUMRVER'] = (self.__version__, 'Numina recipe version') maskhdl = fits.HDUList([maskhdu]) res = self.create_result(ratioframe=ratiohdl, maskframe=maskhdl) return res
def run(self, rinput): # FIXME: # We need 2 flats # Of different exposure times # # And their calibrations # if len(rinput.obresult.frames) < 2: raise RecipeError('The recipe requires 2 flat frames') iinfo = [] for frame in rinput.obresult.frames: with frame.open() as hdulist: iinfo.append(gather_info(hdulist)) # Loading calibrations with rinput.master_bias.open() as hdul: readmode = hdul[0].header.get('READMODE', 'undefined') if readmode.lower() in ['simple', 'bias']: self.logger.debug('loading bias') mbias = hdul[0].data bias_corrector = proc.BiasCorrector(mbias) else: self.logger.debug('ignoring bias') bias_corrector = numina.util.node.IdNode() with rinput.master_dark.open() as mdark_hdul: self.logger.debug('loading dark') mdark = mdark_hdul[0].data dark_corrector = proc.DarkCorrector(mdark) flow = numina.util.flow.SerialFlow([bias_corrector, dark_corrector]) self.logger.info('processing flat #1') with rinput.obresult.frames[0].open() as hdul: other = flow(hdul) f1 = other[0].data.copy() * iinfo[0]['texp'] * 1e-3 self.logger.info('processing flat #2') with rinput.obresult.frames[1].open() as hdul: other = flow(hdul) f2 = other[0].data.copy() * iinfo[1]['texp'] * 1e-3 # Preprocess... maxiter = rinput.maxiter lowercut = rinput.lowercut uppercut = rinput.uppercut ninvalid = 0 mask = None if mask: m = fits.getdata(mask) ninvalid = numpy.count_nonzero(m) else: m = numpy.zeros_like(f1, dtype='int') for niter in range(1, maxiter + 1): self.logger.debug('iter %d', niter) ratio, m, sigma = cosmetics( f1, f2, m, lowercut=lowercut, uppercut=uppercut) if self.intermediate_results: with warnings.catch_warnings(): warnings.simplefilter('ignore') fits.writeto('numina-cosmetics-i%02d.fits' % niter, ratio, overwrite=True) fits.writeto('numina-mask-i%02d.fits' % niter, m, overwrite=True) fits.writeto('numina-sigma-i%02d.fits' % niter, m * 0.0 + sigma, overwrite=True) self.logger.debug( 'iter %d, invalid points in input mask: %d', niter, ninvalid) self.logger.debug('iter %d, estimated sigma is %f', niter, sigma) n_ninvalid = numpy.count_nonzero(m) # Probably there is something wrong here # too much defective pixels if ninvalid / m.size >= 0.10: # This should set a flag in the output msg = 'defective pixels are greater than 10%' self.logger.warning(msg) if n_ninvalid == ninvalid: self.logger.info('convergence reached after %d iterations', niter) break self.logger.info('new invalid points: %d', n_ninvalid - ninvalid) ninvalid = n_ninvalid else: # This should set a flag in the output msg = 'convergence not reached after %d iterations' % maxiter self.logger.warning(msg) self.logger.info( 'number of dead pixels %d', numpy.count_nonzero(m == PIXEL_DEAD)) self.logger.info( 'number of hot pixels %d', numpy.count_nonzero(m == PIXEL_HOT)) if self.intermediate_results: with warnings.catch_warnings(): warnings.simplefilter('ignore') fits.writeto('numina-cosmetics.fits', ratio, overwrite=True) fits.writeto('numina-mask.fits', m, overwrite=True) fits.writeto( 'numina-sigma.fits', sigma * numpy.ones_like(m), overwrite=True) hdu = fits.PrimaryHDU(ratio) hdr = hdu.header hdr['NUMXVER'] = (__version__, 'Numina package version') hdr['NUMRNAM'] = (self.__class__.__name__, 'Numina recipe name') hdr['NUMRVER'] = (self.__version__, 'Numina recipe version') ratiohdl = fits.HDUList([hdu]) maskhdu = fits.PrimaryHDU(m) hdr = maskhdu.header hdr['NUMXVER'] = (__version__, 'Numina package version') hdr['NUMRNAM'] = (self.__class__.__name__, 'Numina recipe name') hdr['NUMRVER'] = (self.__version__, 'Numina recipe version') maskhdl = fits.HDUList([maskhdu]) res = self.create_result(ratioframe=ratiohdl, maskframe=maskhdl) return res
def test_cosmetics_mask(): flat1 = numpy.ones((2, 2)) flat2 = flat1 mask = numpy.zeros((2, 2), dtype="int") mascara = cosmetics(flat1, flat2, mask) assert mascara.all() == False
def test_cosmetics_no_mask(): flat1 = numpy.ones((20, 20)) flat2 = flat1 mascara = cosmetics(flat1, flat2) assert mascara.all() == False
def test_cosmetics_flat2_None(): flat1 = numpy.ones((20, 20)) mascara = cosmetics(flat1) assert mascara.all() == False