Source code for pypeit.scripts.flux_calib

"""
Script for fluxing PYPEIT 1d spectra

.. include common links, assuming primary doc root is up one directory
.. include:: ../include/links.rst
"""
from IPython import embed

from astropy.io import fits

from pypeit import msgs
from pypeit import inputfiles
from pypeit.spectrographs.util import load_spectrograph
from pypeit import fluxcalibrate
from pypeit.par import pypeitpar
from pypeit.scripts import scriptbase
from pypeit.sensfilearchive import SensFileArchive


[docs]class FluxCalib(scriptbase.ScriptBase):
[docs] @classmethod def get_parser(cls, width=None): parser = super().get_parser(description='Flux calibrate 1D spectra produced by PypeIt', width=width, formatter=scriptbase.SmartFormatter) parser.add_argument("flux_file", type=str, help="R|File to guide fluxing process. This file must have the " "following format: \n\n" "F|flux read\n" "F| filename | sensfile\n" "F| spec1dfile1 | sensfile1\n" "F| spec1dfile2 | \n" "F| ... \n" "F|flux end\n" "\nOR\n\n" "F|flux read\n" "F| filename | sensfile\n" "F| spec1dfile1 | sensfile1\n" "F| spec1dfile2 | sensfile2\n" "F| spec1dfile3 | sensfile3\n" "F| ... \n" "F|flux end\n" "\nOR\n\n" "F|[fluxcalib]\n" "F| use_archived_sens = True\n" "F|flux read\n" "F| filename\n" "F| spec1dfile1\n" "F| spec1dfile2\n" "F| spec1dfile3\n" "F| ... \n" "F|flux end\n" "\n" "That is, you must specify either a sensfile for all spec1dfiles " "on the first line, specify one sensfile for each spec1dfile, or " "specify no sensfiles and use an archived one.\n" "Archived sensfiles are available for the following spectrographs: " + ",".join(SensFileArchive.supported_spectrographs()) + "\n\n") # parser.add_argument("--debug", default=False, action="store_true", # help="show debug plots?") parser.add_argument("--par_outfile", default='fluxing.par', action="store_true", help="Output to save the parameters") parser.add_argument('-v', '--verbosity', type=int, default=1, help='Verbosity level between 0 [none] and 2 [all]. Default: 1. ' 'Level 2 writes a log with filename flux_calib_YYYYMMDD-HHMM.log') # parser.add_argument("--plot", default=False, action="store_true", # help="Show the sensitivity function?") parser.add_argument('--try_old', default=False, action='store_true', help='Attempt to load old datamodel versions. A crash may ensue..') return parser
[docs] @staticmethod def main(args): """ Runs fluxing steps """ chk_version = not args.try_old # Set the verbosity, and create a logfile if verbosity == 2 msgs.set_logfile_and_verbosity('flux_calib', args.verbosity) # Load the file fluxFile = inputfiles.FluxFile.from_file(args.flux_file) # Read in spectrograph from spec1dfile header header = fits.getheader(fluxFile.filenames[0]) spectrograph = load_spectrograph(header['PYP_SPEC']) # Parameters spectrograph_def_par = spectrograph.default_pypeit_par() par = pypeitpar.PypeItPar.from_cfg_lines(cfg_lines=spectrograph_def_par.to_config(), merge_with=(fluxFile.cfg_lines,)) # Write the par to disk print("Writing the parameters to {}".format(args.par_outfile)) par.to_config(args.par_outfile) # Chck the sizes of the inputs nspec = len(fluxFile.filenames) # Archived solution? if len(fluxFile.sensfiles) > 0: sensfiles = fluxFile.sensfiles elif len(fluxFile.sensfiles) == 0 and par['fluxcalib']['use_archived_sens'] == True: # No sensfile specified, but an archived sensfunc can be used. sf_archive = SensFileArchive.get_instance(spectrograph.name) sensfiles = nspec*[sf_archive.get_archived_sensfile(fluxFile.filenames[0])] else: msgs.error('Invalid format for .flux file.' + msgs.newline() + 'You must specify a single sensfile on the first line of the flux block,' + msgs.newline() + 'or specify a sensfile for every spec1dfile in the flux block,' + msgs.newline() + 'or specify "use_archived_sens = True" to use an archived sensfile.' + msgs.newline() + 'Run pypeit_flux_calib --help for information on the format') # Instantiate fluxcalibrate.flux_calibrate(fluxFile.filenames, sensfiles, par=par['fluxcalib'], chk_version=chk_version) msgs.info('Flux calibration complete') return 0