def test_fpack(solved_fits_file): new_file = solved_fits_file.replace('solved', 'solved_copy') copy_file = shutil.copyfile(solved_fits_file, new_file) info = os.stat(copy_file) assert info.st_size > 0. uncompressed = fits_utils.funpack(copy_file, verbose=True) assert os.stat(uncompressed).st_size > info.st_size compressed = fits_utils.fpack(uncompressed, verbose=True) assert os.stat(compressed).st_size == info.st_size os.remove(copy_file)
def test_no_overwrite_fpack(solved_fits_file): new_file = solved_fits_file.replace('solved', 'solved_copy') copy_file = shutil.copyfile(solved_fits_file, new_file) # Unpack the file. This removes the packed version. uncompressed = fits_utils.funpack(copy_file) # Copy file again so now the packed version exists alongside unpacked. copy_file = shutil.copyfile(solved_fits_file, new_file) # Deny overwriting gives error. with pytest.raises(FileExistsError): _ = fits_utils.fpack(uncompressed, overwrite=False) # Default is overwrite=True. compressed = fits_utils.fpack(uncompressed) # Cleanup test. for file in [copy_file, uncompressed, compressed]: with suppress(FileNotFoundError): os.remove(file)
def _lookup_via_sextractor(fits_file, sextractor_params=None, *args, **kwargs): # Write the sextractor catalog to a file base_dir = os.path.dirname(fits_file) source_dir = os.path.join(base_dir, 'sextractor') os.makedirs(source_dir, exist_ok=True) img_id = os.path.splitext(os.path.basename(fits_file))[0] source_file = os.path.join(source_dir, f'point_sources_{img_id}.cat') # sextractor can't handle compressed data if fits_file.endswith('.fz'): fits_file = fits_utils.funpack(fits_file) logger.info("Point source catalog: {}".format(source_file)) if not os.path.exists(source_file) or kwargs.get('force_new', False): logger.info("No catalog found, building from sextractor") # Build catalog of point sources sextractor = shutil.which('sextractor') if sextractor is None: sextractor = shutil.which('sex') if sextractor is None: raise Exception('sextractor not found') if sextractor_params is None: sextractor_params = [ '-c', '{}/PIAA/resources/conf_files/sextractor/panoptes.sex'.format( os.getenv('PANDIR')), '-CATALOG_NAME', source_file, ] logger.info("Running sextractor...") cmd = [sextractor, *sextractor_params, fits_file] logger.info(cmd) try: subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=60, check=True) except subprocess.CalledProcessError as e: raise Exception("Problem running sextractor: {}".format(e)) # Read catalog logger.info('Building detected source table') point_sources = Table.read(source_file, format='ascii.sextractor') # Remove the point sources that sextractor has flagged # if 'FLAGS' in point_sources.keys(): # point_sources = point_sources[point_sources['FLAGS'] == 0] # point_sources.remove_columns(['FLAGS']) # Rename columns point_sources.rename_column('XPEAK_IMAGE', 'x') point_sources.rename_column('YPEAK_IMAGE', 'y') # Filter point sources near edge # w, h = data[0].shape w, h = (3476, 5208) stamp_size = 60 logger.info('Trimming sources near edge') top = point_sources['y'] > stamp_size bottom = point_sources['y'] < w - stamp_size left = point_sources['x'] > stamp_size right = point_sources['x'] < h - stamp_size point_sources = point_sources[top & bottom & right & left].to_pandas() point_sources.columns = [ 'ra', 'dec', 'x', 'y', 'x_image', 'y_image', 'background', 'flux_best', 'fluxerr_best', 'mag_best', 'magerr_best', 'flux_max', 'fwhm_image', 'flags', ] logger.info(f'Returning {len(point_sources)} sources') return point_sources