def main(args=None): log = get_logger() if isinstance(args, (list, tuple, type(None))): args = parse(args) if args.obslist.endswith('.ecsv'): obslist = astropy.table.Table.read(args.obslist, format='ascii.ecsv') else: obslist = astropy.table.Table.read(args.obslist) obs = obslist[obslist['EXPID'] == args.expid][0] tileid = obs['TILEID'] night = obs['NIGHT'] program = obs['PROGRAM'] if os.path.isdir(args.fiberassign): #- TODO: move file location logic to desispec / desitarget / fiberassign args.fiberassign = os.path.join(args.fiberassign, 'tile-{:06d}.fits'.format(tileid)) if not os.path.exists(args.fiberassign): #- try previous name args.fiberassign = os.path.join(os.path.dirname(args.fiberassign), 'tile_{:06d}.fits'.format(tileid)) fiberassign = astropy.table.Table.read(args.fiberassign, 'FIBERASSIGN') if args.outdir is None: args.outdir = desisim.io.simdir(night=night, expid=args.expid, mkdir=True) if args.nspec is None: args.nspec = len(fiberassign) elif args.nspec <= len(fiberassign): fiberassign = fiberassign[0:args.nspec] else: log.error('args.nspec {} > len(fiberassign) {}'.format( args.nspec, len(fiberassign))) sys.exit(1) log.info('Simulating night {} expid {} tile {} {}'.format( night, args.expid, tileid, program)) if program.lower() in ('bright', 'sv_bgs', 'sv_mws'): mock_obscon = 'bright' else: mock_obscon = 'dark' #- includes gray for mocks try: flux, wave, meta, objmeta = get_mock_spectra(fiberassign, mockdir=args.mockdir, nside=args.nside, obscon=mock_obscon) except Exception as err: log.fatal('Failed expid {} fiberassign {} tile {}'.format( args.expid, args.fiberassign, tileid)) raise err sim, fibermap = simscience((flux, wave, meta), fiberassign, obsconditions=obs, psfconvolve=False) #- TODO: header keyword code is replicated from obs.new_exposure() telera, teledec = desisim.io.get_tile_radec(tileid) header = dict( NIGHT=(night, 'Night of observation YEARMMDD'), EXPID=(args.expid, 'DESI exposure ID'), TILEID=(tileid, 'DESI tile ID'), PROGRAM=(program, 'program [dark, bright, ...]'), FLAVOR=('science', 'Flavor [arc, flat, science, zero, ...]'), TELRA=(telera, 'Telescope pointing RA [degrees]'), TELDEC=(teledec, 'Telescope pointing dec [degrees]'), AIRMASS=(obs['AIRMASS'], 'Airmass at middle of exposure'), EXPTIME=(obs['EXPTIME'], 'Exposure time [sec]'), SEEING=(obs['SEEING'], 'Seeing FWHM [arcsec]'), MOONFRAC=(obs['MOONFRAC'], 'Moon illumination fraction 0-1; 1=full'), MOONALT=(obs['MOONALT'], 'Moon altitude [degrees]'), MOONSEP=(obs['MOONSEP'], 'Moon:tile separation angle [degrees]'), ) header['DATE-OBS'] = (sim.observation.exposure_start.isot, 'Start of exposure') #- Write fibermap to $DESI_SPECTRO_SIM/$PIXPROD not $DESI_SPECTRO_DATA fibermap.meta.update(header) fibermap.meta['EXTNAME'] = 'FIBERMAP' fibermap.write(desisim.io.findfile('simfibermap', night, args.expid, outdir=args.outdir), overwrite=args.clobber) desisim.io.write_simspec(sim, meta, fibermap, obs, args.expid, night, header=header, objmeta=objmeta, outdir=args.outdir, overwrite=args.clobber)
def main(args=None): log = get_logger() if isinstance(args, (list, tuple, type(None))): args = parse(args) if args.obslist.endswith('.ecsv'): obslist = astropy.table.Table.read(args.obslist, format='ascii.ecsv') else: obslist = astropy.table.Table.read(args.obslist) obs = obslist[obslist['EXPID'] == args.expid][0] tileid = obs['TILEID'] night = obs['NIGHT'] program = obs['PROGRAM'] if os.path.isdir(args.fiberassign): #- TODO: move file location logic to desispec / desitarget / fiberassign args.fiberassign = os.path.join(args.fiberassign, 'tile-{:05d}.fits'.format(tileid)) if not os.path.exists(args.fiberassign): #- try previous name args.fiberassign = os.path.join(args.fiberassign, 'tile_{:05d}.fits'.format(tileid)) fiberassign = astropy.table.Table.read(args.fiberassign, 'FIBERASSIGN') if args.outdir is None: args.outdir = desisim.io.simdir(night=night, expid=args.expid, mkdir=True) if args.nspec is None: args.nspec = len(fiberassign) elif args.nspec <= len(fiberassign): fiberassign = fiberassign[0:args.nspec] else: log.error('args.nspec {} > len(fiberassign) {}'.format( args.nspec, len(fiberassign))) sys.exit(1) log.info('Simulating night {} expid {} tile {}'.format(night, args.expid, tileid)) try: flux, wave, meta, objmeta = get_mock_spectra(fiberassign, mockdir=args.mockdir, nside=args.nside) except Exception as err: log.fatal('Failed expid {} fiberassign {} tile {}'.format( args.expid, args.fiberassign, tileid)) raise err sim, fibermap = simscience((flux, wave, meta), fiberassign, obsconditions=obs, psfconvolve=False) #- TODO: header keyword code is replicated from obs.new_exposure() telera, teledec = desisim.io.get_tile_radec(tileid) header = dict( NIGHT = (night, 'Night of observation YEARMMDD'), EXPID = (args.expid, 'DESI exposure ID'), TILEID = (tileid, 'DESI tile ID'), PROGRAM = (program, 'program [dark, bright, ...]'), FLAVOR = ('science', 'Flavor [arc, flat, science, zero, ...]'), TELRA = (telera, 'Telescope pointing RA [degrees]'), TELDEC = (teledec, 'Telescope pointing dec [degrees]'), AIRMASS = (obs['AIRMASS'], 'Airmass at middle of exposure'), EXPTIME = (obs['EXPTIME'], 'Exposure time [sec]'), SEEING = (obs['SEEING'], 'Seeing FWHM [arcsec]'), MOONFRAC = (obs['MOONFRAC'], 'Moon illumination fraction 0-1; 1=full'), MOONALT = (obs['MOONALT'], 'Moon altitude [degrees]'), MOONSEP = (obs['MOONSEP'], 'Moon:tile separation angle [degrees]'), ) header['DATE-OBS'] = (sim.observation.exposure_start.isot, 'Start of exposure') #- Write fibermap to $DESI_SPECTRO_SIM/$PIXPROD not $DESI_SPECTRO_DATA fibermap.meta.update(header) fibermap.meta['EXTNAME'] = 'FIBERMAP' fibermap.write(desisim.io.findfile('simfibermap', night, args.expid, outdir=args.outdir), overwrite=args.clobber) desisim.io.write_simspec(sim, meta, fibermap, obs, args.expid, night, header=header, objmeta=objmeta, outdir=args.outdir, overwrite=args.clobber)
def main(args=None): log = get_logger() if isinstance(args, (list, tuple, type(None))): args = parse(args) if isinstance(args, (list, tuple, type(None))): args = parse(args) if args.obslist.endswith('.ecsv'): obslist = astropy.table.Table.read(args.obslist, format='ascii.ecsv') else: obslist = astropy.table.Table.read(args.obslist) #---- #- Standardize some column names from surveysim output vs. #- twopct.ecsv from 2% survey data challenge. #- column names should be upper case for col in list(obslist.colnames): obslist.rename_column(col, col.upper()) #- MOONDIST -> MOONSEP if 'MOONDIST' in obslist.colnames: obslist.rename_column('MOONDIST', 'MOONSEP') #- NIGHT = YEARMMDD (not YEAR-MM-DD) of sunset, derived from MJD if needed if 'NIGHT' not in obslist.colnames: #- Derive NIGHT from MJD obslist['NIGHT'] = [ desisim.util.dateobs2night(x) for x in obslist['MJD'] ] else: #- strip dashes from NIGHT string to make YEARMMDD obslist['NIGHT'] = np.char.replace(obslist['NIGHT'], '-', '') #- Fragile: derive PROGRAM from PASS if 'PROGRAM' not in obslist.colnames: obslist['PROGRAM'] = 'BRIGHT' obslist['PROGRAM'][obslist['PASS'] < 4] = 'DARK' obslist['PROGRAM'][obslist['PASS'] == 4] = 'GRAY' #---- end of obslist standardization obs = obslist[args.obsnum] tileid = obs['TILEID'] night = obs['NIGHT'] program = obs['PROGRAM'] if os.path.isdir(args.fiberassign): #- TODO: move file location logic to desispec / desitarget / fiberassign args.fiberassign = os.path.join(args.fiberassign, 'tile_{:05d}.fits'.format(tileid)) fiberassign = astropy.table.Table.read(args.fiberassign, 'FIBER_ASSIGNMENTS') if args.outdir is None: args.outdir = desisim.io.simdir(night=night, mkdir=True) if args.nspec is None: args.nspec = len(fiberassign) log.info('Simulating night {} expid {} tile {}'.format( night, args.expid, tileid)) try: flux, wave, meta = get_mock_spectra(fiberassign, mockdir=args.mockdir) except Exception as err: log.fatal('Failed obsnum {} fiberassign {} tile {}'.format( args.obsnum, args.fiberassign, tileid)) raise err sim, fibermap = simscience((flux, wave, meta), fiberassign, obsconditions=obs, nspec=args.nspec) #- TODO: header keyword code is replicated from obs.new_exposure() telera, teledec = desisim.io.get_tile_radec(tileid) header = dict( NIGHT=(night, 'Night of observation YEARMMDD'), EXPID=(args.expid, 'DESI exposure ID'), TILEID=(tileid, 'DESI tile ID'), PROGRAM=(program, 'program [dark, bright, ...]'), FLAVOR=('science', 'Flavor [arc, flat, science, zero, ...]'), TELRA=(telera, 'Telescope pointing RA [degrees]'), TELDEC=(teledec, 'Telescope pointing dec [degrees]'), AIRMASS=(obs['AIRMASS'], 'Airmass at middle of exposure'), EXPTIME=(obs['EXPTIME'], 'Exposure time [sec]'), SEEING=(obs['SEEING'], 'Seeing FWHM [arcsec]'), MOONFRAC=(obs['MOONFRAC'], 'Moon illumination fraction 0-1; 1=full'), MOONALT=(obs['MOONALT'], 'Moon altitude [degrees]'), MOONSEP=(obs['MOONSEP'], 'Moon:tile separation angle [degrees]'), ) header['DATE-OBS'] = (sim.observation.exposure_start.isot, 'Start of exposure') #- Write fibermap to $DESI_SPECTRO_SIM/$PIXPROD not $DESI_SPECTRO_DATA fibermap.meta.update(header) fibermap.write(desisim.io.findfile('simfibermap', night, args.expid, outdir=args.outdir), overwrite=args.clobber) desisim.io.write_simspec(sim, meta, fibermap, obs, args.expid, night, header=header, outdir=args.outdir, overwrite=args.clobber)