from __future__ import absolute_import, division, print_function
import sys, os
import argparse
import datetime
import time
import warnings
import numpy as np
import astropy.table
# See pixsim.py
import astropy.time
from astropy.io import fits
import astropy.units as u
import desimodel.io
import desisim.simexp
import desisim.io
import desispec.io
import desiutil.depend
def parse(options=None):
parser=argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
if 'DESI_ROOT' in os.environ:
_default_flatfile = os.path.join(os.getenv('DESI_ROOT'),
'spectro', 'templates', 'calib', 'v0.4', 'flat-3100K-quartz-iodine.fits')
else:
_default_flatfile = None
#- Required
parser.add_argument('--expid', type=int, help="exposure ID")
parser.add_argument('--night', type=str, help="YEARMMDD")
#- Optional
parser.add_argument('--flatfile', type=str, help="input flatlamp calib spec file",
default=_default_flatfile)
parser.add_argument('--simspec', type=str, help="output simspec file")
parser.add_argument('--fibermap', type=str, help="output fibermap file")
parser.add_argument('--outdir', type=str, help="output directory")
parser.add_argument('--nspec', type=int, default=5000, help="number of spectra to include")
parser.add_argument('--nonuniform', action='store_true', help="Include calibration screen non-uniformity")
parser.add_argument('--clobber', action='store_true', help="overwrite any pre-existing output files")
if len(sys.argv) == 1:
parser.print_help()
sys.exit(1)
if options is None:
args = parser.parse_args()
else:
args = parser.parse_args(options)
if args.simspec is None:
args.simspec = desisim.io.findfile('simspec', args.night, args.expid,
outdir=args.outdir)
if args.fibermap is None:
#- put in same directory as simspec by default
filedir = os.path.dirname(os.path.abspath(args.simspec))
filename = os.path.basename(desispec.io.findfile('fibermap', args.night, args.expid))
args.fibermap = os.path.join(filedir, filename)
return args
[docs]def main(args=None):
'''
Generates a new flat exposure; see newflat --help for usage options
'''
import desiutil.log
log = desiutil.log.get_logger()
from desiutil.iers import freeze_iers
freeze_iers()
if isinstance(args, (list, tuple, type(None))):
args = parse(args)
sim, fibermap = \
desisim.simexp.simflat(args.flatfile, nspec=args.nspec, nonuniform=args.nonuniform)
log.info('Writing {}'.format(args.fibermap))
fibermap.meta['NIGHT'] = args.night
fibermap.meta['EXPID'] = args.expid
fibermap.meta['EXTNAME'] = 'FIBERMAP'
fibermap.write(args.fibermap, overwrite=args.clobber)
header = fits.Header()
desiutil.depend.add_dependencies(header)
header['EXPID'] = args.expid
header['NIGHT'] = args.night
header['FLAVOR'] = 'flat'
header['DOSVER'] = 'SIM'
#- Set calibrations as happening at 15:00 AZ local time = 22:00 UTC
year = int(args.night[0:4])
month = int(args.night[4:6])
day = int(args.night[6:8])
tx = astropy.time.Time(datetime.datetime(year, month, day, 22, 0, 0))
header['DATE-OBS'] = tx.utc.isot
#- metadata truth and obs dictionary are None
desisim.io.write_simspec(sim, None, fibermap, None, args.expid, args.night,
filename=args.simspec, header=header, overwrite=args.clobber)