def mkpsf(expnum, ccd, fversion): """Run the OSSOS makepsf script. """ ## get image from the vospace storage area filename = storage.get_image(expnum, ccd, version=fversion) logging.info("Running mkpsf on %s %d" % (expnum, ccd)) ## launch the makepsf script util.exec_prog(['jmpmakepsf.csh', './', filename, 'no']) ## place the results into VOSpace basename = os.path.splitext(filename)[0] ## confirm destination directory exists. destdir = os.path.dirname( storage.dbimages_uri(expnum, ccd, version=fversion,ext='fits')) logging.info("Checking that destination directories exist") storage.mkdir(destdir) for ext in ('mopheader', 'psf.fits', 'zeropoint.used', 'apcor', 'fwhm', 'phot'): dest = storage.dbimages_uri(expnum, ccd, version=fversion, ext=ext) source = basename + "." + ext logging.info("Copying %s -> %s" % ( source, dest)) storage.remove(dest) storage.copy(source, dest) return
def mk_mopheader(expnum, ccd, version, dry_run=False, prefix=""): """Run the OSSOS mopheader script. """ ## confirm destination directory exists. destdir = os.path.dirname( storage.dbimages_uri(expnum, ccd, prefix=prefix, version=version, ext='fits')) if not dry_run: storage.mkdir(destdir) ## get image from the vospace storage area filename = storage.get_image(expnum, ccd, version=version, prefix=prefix) logging.info("Running mopheader on %s %d" % (expnum, ccd)) ## launch the mopheader script ## launch the makepsf script expname = os.path.basename(filename).strip('.fits') logging.info(util.exec_prog(['stepZjmp', '-f', expname])) mopheader_filename = expname+".mopheader" # mopheader_filename = mopheader.main(filename) if dry_run: return destination = storage.dbimages_uri(expnum, ccd, prefix=prefix, version=version, ext='mopheader') source = mopheader_filename storage.copy(source, destination) return
def mkpsf(expnum, ccd): """Run the OSSOS makepsf script. """ ## get image from the vospace storage area filename = storage.get_image(expnum, ccd, version='p') logging.info("Running mkpsf on %s %d" % (expnum, ccd)) ## launch the makepsf script util.exec_prog(['jmpmakepsf.csh', './', filename, 'no']) ## place the results into VOSpace basename = os.path.splitext(filename)[0] ## confirm destination directory exists. destdir = os.path.dirname( storage.dbimages_uri(expnum, ccd, version='p',ext='fits')) logging.info("Checking that destination direcoties exist") storage.mkdir(destdir) for ext in ('mopheader', 'psf.fits', 'zeropoint.used', 'apcor', 'fwhm', 'phot'): dest = storage.dbimages_uri(expnum, ccd, version='p', ext=ext) source = basename + "." + ext storage.copy(source, dest) return
def mkpsf(expnum, ccd, version, dry_run=False, prefix=""): """Run the OSSOS jmpmakepsf script. """ ## confirm destination directory exists. destdir = os.path.dirname( storage.dbimages_uri(expnum, ccd, prefix=prefix, version=version, ext='fits')) if not dry_run: storage.mkdir(destdir) ## get image from the vospace storage area logging.info("Getting file from VOSpace") filename = storage.get_image(expnum, ccd, version=version, prefix=prefix) logging.info("Running mkpsf on %s %d" % (expnum, ccd)) ## launch the makepsf script logging.info(util.exec_prog(['jmpmakepsf.csh', './', filename, 'yes', 'yes'])) if dry_run: return ## place the results into VOSpace basename = os.path.splitext(filename)[0] for ext in ('mopheader', 'psf.fits', 'zeropoint.used', 'apcor', 'fwhm', 'phot'): dest = storage.dbimages_uri(expnum, ccd, prefix=prefix, version=version, ext=ext) source = basename + "." + str(ext) storage.copy(source, dest) return
def step3(expnums, ccd, version, rate_min, rate_max, angle, width, field=None, prefix=None): '''run the actual step2 on the given exp/ccd combo''' jmp_args = ['step3jmp'] matt_args = ['step3matt'] idx = 0 cmd_args = [] for expnum in expnums: idx += 1 for ext in ['unid.jmp', 'unid.matt', 'trans.jmp' ]: filename = storage.get_image(expnum, ccd=ccd, version=version, ext=ext, prefix=prefix ) image = os.path.splitext(os.path.splitext(os.path.basename(filename))[0])[0] cmd_args.append('-f%d' % ( idx)) cmd_args.append(image) cmd_args.extend(['-rn', str(rate_min), '-rx', str(rate_max), '-a', str(angle), '-w', str(width)]) jmp_args.extend(cmd_args) matt_args.extend(cmd_args) util.exec_prog(jmp_args) util.exec_prog(matt_args) if field is None: field = str(expnums[0]) storage.mkdir(os.path.dirname( storage.get_uri(field, ccd=ccd, version=version, ext=ext, prefix=prefix))) for ext in ['moving.jmp', 'moving.matt']: uri = storage.get_uri(field, ccd=ccd, version=version, ext=ext, prefix=prefix) filename = '%s%d%s%s.%s' % ( prefix, expnums[0], version, str(ccd).zfill(2), ext) storage.copy(filename, uri) return
def step3(expnums, ccd, version, rate_min, rate_max, angle, width, field=None, prefix=None, dry_run=False, maximum_flux_ratio=3, minimum_area=5, minimum_median_flux=1000.0): """run the actual step3 on the given exp/ccd combo""" jmp_args = ['step3jmp'] matt_args = ['step3jjk'] idx = 0 cmd_args = [] for expnum in expnums: idx += 1 for ext in ['unid.jmp', 'unid.matt']: storage.get_file(expnum, ccd=ccd, version=version, ext=ext, prefix=prefix) image = os.path.splitext(os.path.basename(storage.get_uri(expnum, ccd, version=version, prefix=prefix)))[0] cmd_args.append('-f%d' % idx) cmd_args.append(image) cmd_args.extend(['-rn', str(rate_min), '-rx', str(rate_max), '-a', str(angle), '-w', str(width)]) jmp_args.extend(cmd_args) # Add some extra arguemnents for the ISO search. cmd_args.extend(['-fr', str(maximum_flux_ratio), '-ma', str(minimum_area), '-mf', str(minimum_median_flux)]) matt_args.extend(cmd_args) logging.info(util.exec_prog(jmp_args)) logging.info(util.exec_prog(matt_args)) if dry_run: return if field is None: field = str(expnums[0]) storage.mkdir(os.path.dirname(storage.get_uri(field, ccd=ccd, version=version, prefix=prefix))) for ext in ['moving.jmp', 'moving.matt']: uri = storage.get_uri(field, ccd=ccd, version=version, ext=ext, prefix=prefix) filename = '%s%d%s%s.%s' % (prefix, expnums[0], version, str(ccd).zfill(2), ext) storage.copy(filename, uri) return
def main(): parser = argparse.ArgumentParser( description='Parse a directory of TNO .ast files and create links in the postage stamp directory ' 'that allow retrieval of cutouts of the FITS images associated with the OSSOS detections. ' 'Cutouts are defined on the WCS RA/DEC of the object position.') parser.add_argument("version", help="The OSSOS data release version these stamps should be assigned to.") parser.add_argument("--ossin", action="store", default="vos:OSSOS/dbaseclone/ast/", help="The vospace containerNode that clones ossin dbaseclone" "holding the .ast files of astrometry/photometry measurements.") parser.add_argument("--blocks", "-b", action="store", default=["o3e", "o3o"], choices=["o3e", "o3o", "O13BL", "Col3N"], help="Prefixes of object designations to include.") parser.add_argument("--radius", '-r', action='store', default=0.02, help='Radius (degree) of circle of cutout postage stamp.') parser.add_argument("--debug", "-d", action="store_true") parser.add_argument("--verbose", "-v", action="store_true") args = parser.parse_args() username = raw_input("CADC username: "******"CADC password: ") if args.debug: logging.basicConfig(level=logging.DEBUG) elif args.verbose: logging.basicConfig(level=logging.INFO) for fn in storage.listdir(args.ossin)[10:11]: #FIXME: TESTING ONLY obj = mpc.MPCReader(args.ossin + fn) # let MPCReader's logic determine the provisional name for block in args.blocks: if obj.provisional_name.startswith(block): obj_dir = '{}/{}/{}'.format(storage.POSTAGE_STAMPS, args.version, obj.provisional_name) if not storage.exists(obj_dir, force=True): storage.mkdir(obj_dir) # assert storage.exists(obj_dir, force=True) cutout(obj, obj_dir, args.radius, username, password)
def mkpsf(expnum, ccd, version, dry_run=False, prefix=""): """Run the OSSOS jmpmakepsf script. """ ## confirm destination directory exists. destdir = os.path.dirname( storage.dbimages_uri(expnum, ccd, prefix=prefix, version=version, ext='fits')) if not dry_run: storage.mkdir(destdir) ## get image from the vospace storage area filename = storage.get_image(expnum, ccd, version=version, prefix=prefix) logging.info("Running mkpsf on %s %d" % (expnum, ccd)) ## launch the makepsf script logging.info(util.exec_prog(['jmpmakepsf.csh', './', filename, 'no'])) if dry_run: return ## place the results into VOSpace basename = os.path.splitext(filename)[0] for ext in ('mopheader', 'psf.fits', 'zeropoint.used', 'apcor', 'fwhm', 'phot'): dest = storage.dbimages_uri(expnum, ccd, prefix=prefix, version=version, ext=ext) source = basename + "." + str(ext) storage.copy(source, dest) return
def run(expnum, ccd, version, dry_run=False, prefix="", force=False): """Run the OSSOS jmpmakepsf script. """ message = storage.SUCCESS if storage.get_status(task, prefix, expnum, version=version, ccd=ccd) and not force: logging.info("{} completed successfully for {} {} {} {}".format( task, prefix, expnum, version, ccd)) return with storage.LoggingManager(task, prefix, expnum, ccd, version, dry_run): try: if not storage.get_status( dependency, prefix, expnum, version, ccd=ccd): raise IOError("{} not yet run for {}".format( dependency, expnum)) # confirm destination directory exists. destdir = os.path.dirname( storage.dbimages_uri(expnum, ccd, prefix=prefix, version=version, ext='fits')) if not dry_run: storage.mkdir(destdir) # get image from the vospace storage area logging.info("Getting fits image from VOSpace") filename = storage.get_image(expnum, ccd, version=version, prefix=prefix) # get mopheader from the vospace storage area logging.info("Getting mopheader from VOSpace") mopheader_filename = storage.get_file(expnum, ccd, version=version, prefix=prefix, ext='mopheader') # run mkpsf process logging.info("Running mkpsf on %s %d" % (expnum, ccd)) logging.info( util.exec_prog( ['jmpmakepsf.csh', './', filename, 'yes', 'yes'])) if dry_run: return # place the results into VOSpace basename = os.path.splitext(filename)[0] for ext in ('mopheader', 'psf.fits', 'zeropoint.used', 'apcor', 'fwhm', 'phot'): dest = storage.dbimages_uri(expnum, ccd, prefix=prefix, version=version, ext=ext) source = basename + "." + str(ext) count = 0 with open(source, 'r'): while True: count += 1 try: logging.info("Attempt {} to copy {} -> {}".format( count, source, dest)) storage.copy(source, dest) break except Exception as ex: if count > 10: raise ex # set some data parameters associated with the image, determined in this step. storage.set_status('fwhm', prefix, expnum, version=version, ccd=ccd, status=str( storage.get_fwhm(expnum, ccd=ccd, prefix=prefix, version=version))) storage.set_status('zeropoint', prefix, expnum, version=version, ccd=ccd, status=str( storage.get_zeropoint(expnum, ccd=ccd, prefix=prefix, version=version))) logging.info(message) except Exception as e: message = str(e) logging.error(message) storage.set_status(task, prefix, expnum, version, ccd=ccd, status=message) return
def run(expnums, ccd, version, rate_min, rate_max, angle, width, field=None, prefix=None, dry_run=False, force=False): """run the actual step2 on the given exp/ccd combo""" jmp_args = ['step3jmp'] matt_args = ['step3matt'] if storage.get_status(task, prefix, expnums[0], version=version, ccd=ccd) and not force: logging.info("{} completed successfully for {}{}{}{:02d}".format( task, prefix, expnums[0], version, ccd)) return with storage.LoggingManager(task, prefix, expnums[0], ccd, version, dry_run): try: if not storage.get_status( dependency, prefix, expnums[0], version=version, ccd=ccd): raise IOError( 35, "Cannot start {} as {} not yet completed {}{}{}{:02d}". format(task, dependency, prefix, expnums[0], version, ccd)) # Default message is success, message gets overwritten with failure messages. message = storage.SUCCESS idx = 0 cmd_args = [] for expnum in expnums: idx += 1 for ext in ['unid.jmp', 'unid.matt', 'trans.jmp']: storage.get_file(expnum, ccd=ccd, version=version, ext=ext, prefix=prefix) image = os.path.splitext( os.path.basename( storage.get_uri(expnum, ccd, version=version, prefix=prefix)))[0] cmd_args.append('-f%d' % idx) cmd_args.append(image) cmd_args.extend([ '-rn', str(rate_min), '-rx', str(rate_max), '-a', str(angle), '-w', str(width) ]) jmp_args.extend(cmd_args) matt_args.extend(cmd_args) logging.info(util.exec_prog(jmp_args)) logging.info(util.exec_prog(matt_args)) if dry_run: return if field is None: field = str(expnums[0]) # Make sure a dbimages destination exists for this file. storage.mkdir( os.path.dirname( storage.get_uri(field, ccd=ccd, version=version, prefix=prefix))) for ext in ['moving.jmp', 'moving.matt']: uri = storage.get_uri(field, ccd=ccd, version=version, ext=ext, prefix=prefix) filename = '%s%d%s%s.%s' % (prefix, expnums[0], version, str(ccd).zfill(2), ext) storage.copy(filename, uri) except Exception as ex: message = str(ex) logging.error(message) storage.set_status(task, prefix, expnums[0], version=version, ccd=ccd, status=message) return
def main(): parser = argparse.ArgumentParser( description='Parse a directory of TNO .ast files and create links in the postage stamp directory ' 'that allow retrieval of cutouts of the FITS images associated with the OSSOS detections. ' 'Cutouts are defined on the WCS RA/DEC of the object position.') parser.add_argument("version", help="The OSSOS data release version these stamps should be assigned to. e.g. v8") parser.add_argument("astdir", help="Directory containing the input .ast files", action="store", default="ast/") parser.add_argument("--ossin", action="store", default="vos:OSSOS/0_OSSOSreleases/OSSOS", help="The vospace containerNode that clones ossin dbaseclone" "holding the .ast files of astrometry/photometry measurements.") parser.add_argument("--blocks", "-b", action="store", default=['o3e', 'o3o', 'o3l', 'o4h', 'o5p', 'o5m', 'o5s', 'o5t', 'o5c', 'o5d'], choices=["o3e", "o3o", "Col3N", 'o3l', 'o4h', 'o5m', 'o5p', 'o5s', 'o5t', 'o5c', 'o5d'], help="Prefixes of object designations to include.") parser.add_argument("--radius", '-r', # FIXME: figure out how to assign this a unit.degree before storage action='store', default=36 * units.arcsec, # about 200 px square help='Radius (arcsec) of circle of cutout postage stamp.') parser.add_argument("--debug", "-d", action="store_true") parser.add_argument("--verbose", "-v", action="store_true") parser.add_argument("--recheck", default=None, action="store", help="A tuple of TNO IDs to rerun") args = parser.parse_args() if args.debug: logging.basicConfig(level=logging.DEBUG) elif args.verbose: logging.basicConfig(level=logging.INFO) else: logging.basicConfig(level=logging.ERROR) astdir = args.astdir flist = os.listdir(astdir) if args.recheck: flist = [args.recheck + '.ast'] for fn in flist: if not fn.endswith('.ast'): continue for block in args.blocks: if fn.startswith(block): obj_dir = '{}/{}/{}'.format(storage.POSTAGE_STAMPS, args.version, fn.partition('.')[0]) # obj.provisional_name logging.info("Processing astrometric files in {}".format(obj_dir)) storage.mkdir(obj_dir) obj = mpc.MPCReader(astdir + fn) # assert storage.exists(obj_dir, force=True) sys.stderr.write('{} beginning...'.format(obj.provisional_name)) # if int(obj.provisional_name[3:]) == 49: assert isinstance(args.radius, Quantity) cutout(obj, obj_dir, args.radius) sys.stderr.write('{} complete.\n\n'.format(obj.provisional_name))
def main(): parser = argparse.ArgumentParser( description='Parse a directory of TNO .ast files and create links in the postage stamp directory ' 'that allow retrieval of cutouts of the FITS images associated with the OSSOS detections. ' 'Cutouts are defined on the WCS RA/DEC of the object position.') parser.add_argument("version", help="The OSSOS data release version these stamps should be assigned to. e.g. v8") parser.add_argument("astdir", help="Directory containing the input .ast files", action="store", default="ast/") parser.add_argument("--ossin", action="store", default="vos:OSSOS/0_OSSOSreleases/OSSOS", help="The vospace containerNode that clones ossin dbaseclone" "holding the .ast files of astrometry/photometry measurements.") parser.add_argument("--blocks", "-b", action="store", default=['o3e', 'o3o', 'o3l', 'o4h', 'o5p', 'o5m', 'o5s', 'o5t', 'o5c', 'o5d'], choices=["o3e", "o3o", "Col3N", 'o3l', 'o4h', 'o5m', 'o5p', 'o5s', 'o5t', 'o5c', 'o5d'], help="Prefixes of object designations to include.") parser.add_argument("--radius", '-r', # FIXME: figure out how to assign this a unit.degree before storage action='store', default=36 * units.arcsec, # about 200 px square help='Radius (arcsec) of circle of cutout postage stamp.') parser.add_argument("--debug", "-d", action="store_true") parser.add_argument("--verbose", "-v", action="store_true") parser.add_argument("--recheck", default=None, action="store", help="A tuple of TNO IDs to rerun") args = parser.parse_args() if args.debug: logging.basicConfig(level=logging.DEBUG) elif args.verbose: logging.basicConfig(level=logging.INFO) else: logging.basicConfig(level=logging.ERROR) astdir = args.astdir flist = os.listdir(astdir) if args.recheck: flist = [args.recheck + '.ast'] for fn in flist: if not fn.endswith('.ast'): continue for block in args.blocks: if fn.startswith(block): obj_dir = '{}/{}/{}'.format(storage.POSTAGE_STAMPS, args.version, fn.partition('.') [0]) # obj.provisional_name logging.info \ ("Processing astrometric files in {}".format(obj_dir)) storage.mkdir(obj_dir) obj = mpc.MPCReader(astdir + fn) # assert storage.exists(obj_dir, force=True) sys.stderr.write('{} beginning...'.format(obj.provisional_name)) # if int(obj.provisional_name[3:]) == 49: assert isinstance(args.radius, Quantity) cutout(obj, obj_dir, args.radius) sys.stderr.write \ ('{} complete.\n\n'.format(obj.provisional_name))
def main(): parser = argparse.ArgumentParser( description='Parse a directory of TNO .ast files and create links in the postage stamp directory ' 'that allow retrieval of cutouts of the FITS images associated with the OSSOS detections. ' 'Cutouts are defined on the WCS RA/DEC of the object position.') parser.add_argument("version", help="The OSSOS data release version these stamps should be assigned to. e.g. v8") parser.add_argument("--ossin", action="store", default="vos:OSSOS/0_OSSOSreleases/OSSOS", help="The vospace containerNode that clones ossin dbaseclone" "holding the .ast files of astrometry/photometry measurements.") parser.add_argument("--blocks", "-b", action="store", default=['o3e', 'o3o', 'o3l', 'o4h', 'o5p', 'o5m', 'o5s', 'o5t'], choices=["o3e", "o3o", "Col3N", 'o3l', 'o4h', 'o5m', 'o5p', 'o5s', 'o5t', 'o5c', 'o5d'], help="Prefixes of object designations to include.") parser.add_argument("--radius", '-r', # FIXME: figure out how to assign this a unit.degree before storage action='store', default=0.01 * units.degree, # about 200 px square help='Radius (degree) of circle of cutout postage stamp.') parser.add_argument("--debug", "-d", action="store_true") parser.add_argument("--verbose", "-v", action="store_true") parser.add_argument("--recheck", default=None, action="store", help="A tuple of TNO IDs to rerun") args = parser.parse_args() print args if args.debug: logging.basicConfig(level=logging.DEBUG) elif args.verbose: logging.basicConfig(level=logging.INFO) astdir = parameters.L7_HOME + 'OSSOS' + args.version + '/ast/' print astdir flist = os.listdir(astdir) if args.recheck: flist = [args.recheck + '.ast'] print flist for fn in flist: for block in args.blocks: if fn.startswith(block): obj_dir = '{}/{}/{}'.format(storage.POSTAGE_STAMPS, args.version, fn.partition('.')[0]) # obj.provisional_name print obj_dir if args.recheck is None: # otherwise if rechecking, it'll have already been started if not storage.exists(obj_dir, force=True): storage.mkdir(obj_dir) else: print(fn) continue # good if the object has already had its stamps cut obj = mpc.MPCReader(astdir + fn) # assert storage.exists(obj_dir, force=True) print('{} beginning...\n'.format(obj.provisional_name)) # if int(obj.provisional_name[3:]) == 49: assert isinstance(args.radius, Quantity) cutout(obj, obj_dir, args.radius) print('{} complete.\n'.format(obj.provisional_name))
def step3(expnums, ccd, version, rate_min, rate_max, angle, width, field=None, prefix=None): '''run the actual step2 on the given exp/ccd combo''' jmp_args = ['step3jmp'] matt_args = ['step3matt'] idx = 0 cmd_args = [] for expnum in expnums: idx += 1 for ext in ['unid.jmp', 'unid.matt', 'trans.jmp']: filename = storage.get_image(expnum, ccd=ccd, version=version, ext=ext, prefix=prefix) image = os.path.splitext( os.path.splitext(os.path.basename(filename))[0])[0] cmd_args.append('-f%d' % (idx)) cmd_args.append(image) cmd_args.extend([ '-rn', str(rate_min), '-rx', str(rate_max), '-a', str(angle), '-w', str(width) ]) jmp_args.extend(cmd_args) matt_args.extend(cmd_args) util.exec_prog(jmp_args) util.exec_prog(matt_args) if field is None: field = str(expnums[0]) storage.mkdir( os.path.dirname( storage.get_uri(field, ccd=ccd, version=version, ext=ext, prefix=prefix))) for ext in ['moving.jmp', 'moving.matt']: uri = storage.get_uri(field, ccd=ccd, version=version, ext=ext, prefix=prefix) filename = '%s%d%s%s.%s' % (prefix, expnums[0], version, str(ccd).zfill(2), ext) storage.copy(filename, uri) return
def run(expnum, ccd, version, dry_run=False, prefix="", force=False): """Run the OSSOS jmpmakepsf script. """ message = storage.SUCCESS if storage.get_status(task, prefix, expnum, version=version, ccd=ccd) and not force: logging.info("{} completed successfully for {} {} {} {}".format(task, prefix, expnum, version, ccd)) return with storage.LoggingManager(task, prefix, expnum, ccd, version, dry_run): try: if not storage.get_status(dependency, prefix, expnum, "p", ccd=ccd): raise IOError("{} not yet run for {}".format(dependency, expnum)) # confirm destination directory exists. destdir = os.path.dirname( storage.dbimages_uri(expnum, ccd, prefix=prefix, version=version, ext='fits')) if not dry_run: storage.mkdir(destdir) # get image from the vospace storage area logging.info("Getting fits image from VOSpace") filename = storage.get_image(expnum, ccd, version=version, prefix=prefix) # get mopheader from the vospace storage area logging.info("Getting mopheader from VOSpace") mopheader_filename = storage.get_file(expnum, ccd, version=version, prefix=prefix, ext='mopheader') # run mkpsf process logging.info("Running mkpsf on %s %d" % (expnum, ccd)) logging.info(util.exec_prog(['jmpmakepsf.csh', './', filename, 'yes', 'yes'])) if dry_run: return # place the results into VOSpace basename = os.path.splitext(filename)[0] for ext in ('mopheader', 'psf.fits', 'zeropoint.used', 'apcor', 'fwhm', 'phot'): dest = storage.dbimages_uri(expnum, ccd, prefix=prefix, version=version, ext=ext) source = basename + "." + str(ext) count = 0 with open(source, 'r'): while True: count += 1 try: logging.info("Attempt {} to copy {} -> {}".format(count, source, dest)) storage.copy(source, dest) break except Exception as ex: if count > 10: raise ex # set some data parameters associated with the image, determined in this step. storage.set_status('fwhm', prefix, expnum, version=version, ccd=ccd, status=str(storage.get_fwhm( expnum, ccd=ccd, prefix=prefix, version=version))) storage.set_status('zeropoint', prefix, expnum, version=version, ccd=ccd, status=str(storage.get_zeropoint( expnum, ccd=ccd, prefix=prefix, version=version))) logging.info(message) except Exception as e: message = str(e) logging.error(message) storage.set_status(task, prefix, expnum, version, ccd=ccd, status=message) return