Exemplo n.º 1
0
def usage():

    print ' -----------------------------------------------------------------------'

    print ' Martin Still NASA ARC Oct 25, 2013'

    print ' '

    print ' Extract FFI from Cadence Pixel Files'

    print ' '

    print ' Typical usage:'

    print ' CadencePixels2FFI.py --cpf=kplr2010269175646_lcs-targ.fits --pmrf=/Volumes/data/Kepler/PMRF/q5-lc.fits'

    print ' '

    print '   --cpf        Cadence Pixel File name (FITS)'

    print '   --pmrf       Pixel Mapping Reference File (i.e. which pixels are collected)'

    print ' -----------------------------------------------------------------------'

    PyMSG.exit(None)
Exemplo n.º 2
0
def usage():

    print " -----------------------------------------------------------------------"

    print " Martin Still NASA ARC Oct 01, 2013"

    print " "

    print " Extract Target Pixel Files from Cadence Pixel Files"

    print " "

    print " Typical usage:"

    print " CadencePixels.py --cpflist=infiles.lis --pmrf=/Volumes/data/Kepler/PMRF/q5-lc.fits"

    print " "

    print "   --cpflist    ASCII list of input cadence pixel filenames"

    print "   --pmrf       Pixel *** Reference File (i.e. which pixels are collected)"

    print " -----------------------------------------------------------------------"

    PyMSG.exit(None)
Exemplo n.º 3
0
def usage():

    print ' -----------------------------------------------------------------------'
    print ' Martin Still NASA ARC Oct 25, 2013'
    print ' '
    print ' Extract FFI from Cadence Pixel Files'
    print ' '
    print ' Typical usage:'
    print ' CadencePixels2FFI.py --cpf=kplr2010269175646_lcs-targ.fits --pmrf=/Volumes/data/Kepler/PMRF/q5-lc.fits'
    print ' '
    print '   --cpf        Cadence Pixel File name (FITS)'
    print '   --pmrf       Pixel Mapping Reference File (i.e. which pixels are collected)'
    print ' -----------------------------------------------------------------------'
    PyMSG.exit(None)
Exemplo n.º 4
0
def main():

    # input argument

    cpf = '/Volumes/data/Kepler/SecondLight/CPF/kplr2013304171549_lcs-targ.fits'

    pmrf = '/Volumes/data/Kepler/PMRF/oct2013_lcm.fits'

    try:

        opts, args = getopt.getopt(sys.argv[1:], "h:cpa",
                                   ["help", "cpf=", "pmrf=", "cal"])

    except getopt.GetoptError:

        usage()

    cal = False

    for o, a in opts:

        if o in ("-h", "--help"):

            usage()

        if o in ("-c", "--cpf"):

            cpf = str(a)

        if o in ("-p", "--pmrf"):

            pmrf = str(a)

        if o in ("-a", "--cal"):

            cal = True

# output FFI filename

    if cal:

        outname = re.sub('_lcs-targ', '_ffi-cal', cpf)

    else:

        outname = re.sub('_lcs-targ', '_ffi-raw', cpf)

# creation date

    createdate = str(datetime.date.today())

    # calibrated data?

    if cal:

        imagtype = 'SocCal'

        bunit = 'electrons/s'

    else:

        imagtype = 'raw'

        bunit = 'counts'

# create primary FITS extensions

    hdu0 = PrimaryHDU()

    hdu0.header.update('EXTEND', True, 'file may contain standard extensions')

    hdu0.header.update('EXTNAME', 'PRIMARY', 'name of extension')

    hdu0.header.update('EXTVER', 1, 'extension version number')

    hdu0.header.update('ORIGIN', 'NASA/Ames',
                       'organization that generated this file')

    hdu0.header.update('DATE', createdate, 'file creation date')

    hdu0.header.update('CREATOR', 'CadencePixels2FFI.py',
                       'SW used to create this file')

    hdu0.header.update('FILEVER', '2.0', 'file format version')

    hdu0.header.update('PROCVER', 1.0, 'processing script version')

    hdu0.header.update('TIMVERSN', 'OGIP/93-003',
                       'OGIP memo number for file format')

    hdu0.header.update('TELESCOP', 'Kepler', 'telescope')

    hdu0.header.update('INSTRUME', 'Kepler photometer', 'detector type')

    hdu0.header.update('DATA_REL', -1,
                       'version of data release notes describing data')

    hdu0.header.update('OBSMODE', 'full frame image', 'observing mode')

    hdu0.header.update('DATSETNM',
                       os.path.basename(re.sub('_lcs-targ.fits', '', cpf)),
                       'data set name')

    hdu0.header.update(
        'DCT_TIME',
        os.path.basename(re.sub('kplr', '', re.sub('_lcs-targ.fits', '',
                                                   cpf))),
        'data collection time: yyyydddhhss')

    hdu0.header.update('DCT_TYPE', 'FFI', 'data type')

    hdu0.header.update('DCT_PURP', 'cadence image', 'purpose of data')

    hdu0.header.update('IMAGTYPE', imagtype,
                       'FFI image type: raw, SocCal, SocUnc')

    hdu0.header.update('QUARTER', -1,
                       'mission quarter during which data was collected')

    hdu0.header.update('SEASON', -1,
                       'mission season during which data was collected')

    hdu0.header.update('PIXELTYP', 'target',
                       'pixel type: target, bkgd, coll, all')

    hdu0.header.update('VSMRSROW', 1046,
                       'collateral virtual smear region start row')

    hdu0.header.update('VSMREROW', 1057,
                       'collateral virtual smear region row end')

    hdu0.header.update('NROWVSMR', 12,
                       'number of rows binned in virtual smear')

    hdu0.header.update('VSMRSCOL', 12,
                       'collateral virtual smear region start column')

    hdu0.header.update('VSMRECOL', 1111,
                       'collateral virtual smear region end column')

    hdu0.header.update('NCOLVSMR', 1100,
                       'number of columns in virtual smear region')

    hdu0.header.update('MASKSROW', 6,
                       'science collateral masked region start row')

    hdu0.header.update('MASKEROW', 17,
                       'science collateral masked region end row')

    hdu0.header.update('NROWMASK', 12,
                       'number of rows binned in masked region')

    hdu0.header.update('MASKSCOL', 12,
                       'science collateral masked region start')

    hdu0.header.update('MASKECOL', 1111,
                       'science collateral masked region end')

    hdu0.header.update('NCOLMASK', 1100, 'number of columns in masked region')

    hdu0.header.update('BLCKSROW', 0,
                       'science collateral black region start row')

    hdu0.header.update('BLCKEROW', 1069,
                       'science collateral black region end column')

    hdu0.header.update('NROWBLCK', 1070, 'number of rows in black region')

    hdu0.header.update('BLCKSCOL', 1118,
                       'science collateral black region start')

    hdu0.header.update('BLCKECOL', 1131,
                       'science collateral black region end column')

    hdu0.header.update('NCOLBLK', 1070,
                       'number of columns binned in black region')

    hdu0.header.update('RADESYS', 'ICRS',
                       'reference frame of celestial coordinates')

    hdu0.header.update('EQUINOX', 2000.0,
                       'equinox of celestial coordinate system')

    hdu0.header.update('RA_NOM', -1.0, '[deg] RA of spacecraft boresight')

    hdu0.header.update('DEC_NOM', -1.0,
                       '[deg] declination of spacecraft boresight')

    hdu0.header.update('ROLL_NOM', -1.0, '[deg] roll angle of spacecraft')

    hdulist = HDUList(hdu0)

    # open the Pixel Mapping Reference File

    try:

        inpmrf = open(pmrf, mode='readonly', memmap=True)

    except:

        message = 'ERROR -- Cannot read the pixel reference file'

        status = PyMSG.err(None, message)

# open the Cadence Pixel File

    try:

        incpf = open(cpf, mode='readonly', memmap=True)

    except:

        message = 'ERROR -- Cannot read the cadence pixel file'

        status = PyMSG.err(None, message)

# start and stop times of observations from the CPF

    card = incpf[0].header.ascardlist()

    startkey = card['STARTIME'].value

    endkey = card['END_TIME'].value

    dateobs = card['DATE-OBS'].value

    timeobs = card['TIME-OBS'].value

    tstart = startkey + 2400000.5

    tstop = endkey + 2400000.5

    deadc = 0.92063492

    telapse = tstop - tstart

    exposure = telapse * deadc

    # iterate through the FITS extensions of the PMRF and read the data

    for ext in range(1, 85):

        start = ti.time()

        card = incpf[ext].header.ascardlist()

        gain = card['GAIN'].value

        readnois = card['READNOIS'].value

        timslice = card['TIMSLICE'].value

        meanblck = card['MEANBLCK'].value

        card = inpmrf[ext].header.ascardlist()

        chankey = card['CHANNEL'].value

        modkey = card['MODULE'].value

        outkey = card['OUTPUT'].value

        r = inpmrf[ext].data.field('row')[:]

        c = inpmrf[ext].data.field('column')[:]

        k = inpmrf[ext].data.field('target_id')[:]

        if cal:

            f = incpf[ext].data.field('cal_value')[:]

        else:

            f = incpf[ext].data.field('orig_value')[:]

# initialize FFI image

        ffimage = numpy.zeros((1070, 1132), dtype=float32)

        ffimage[:, :] = numpy.nan

        # populate FFI image

        for i in range(len(k)):

            ffimage[r[i], c[i]] = f[i]

# create image extension headers

        hdu1 = ImageHDU(ffimage)

        hdu1.header.update('INHERIT', True, 'inherit primary keywords')

        hdu1.header.update('EXTNAME', 'MOD.OUT %d.%d' % (modkey, outkey),
                           'extension name')

        hdu1.header.update('EXTVER', 1, 'extension version number')

        hdu1.header.update('TELESCOP', 'Kepler', 'telescope')

        hdu1.header.update('INSTRUME', 'Kepler photometer', 'detector type')

        hdu1.header.update('CHANNEL', chankey, 'CCD channel')

        hdu1.header.update('SKYGROUP', -1,
                           'roll-independent location of channel')

        hdu1.header.update('MODULE', modkey, 'CCD module')

        hdu1.header.update('OUTPUT', outkey, 'CCD output')

        hdu1.header.update('TIMEREF', 'SOLARSYSTEM',
                           'barycentric correction applied to times')

        hdu1.header.update('TASSIGN', 'SPACECRAFT', 'where time is assigned')

        hdu1.header.update('TIMESYS', 'TDB', 'time system is barycentric JD')

        hdu1.header.update('MJDSTART', startkey,
                           'observation start time in MJD')

        hdu1.header.update('MJDEND', endkey, 'observation stop time in MJD')

        hdu1.header.update('BJDREFI', 2454833,
                           'integer part of BJD reference date')

        hdu1.header.update('BJDREFF', 0.0,
                           'fraction of day in BJD reference date')

        hdu1.header.update('TIMEUNIT', 'd',
                           'time unit for TIME, TSTART and TSTOP')

        hdu1.header.update('TSTART', tstart,
                           'observation start time in BJD-BJDREF')

        hdu1.header.update('TSTOP', tstop,
                           'observation stop time in BJD-BJDREF')

        hdu1.header.update('TELAPSE', telapse, 'TSTOP - TSTART')

        hdu1.header.update('EXPOSURE', exposure, 'time on source')

        hdu1.header.update('LIVETIME', exposure, 'TELAPSE multiplied by DEADC')

        hdu1.header.update('TIMEPIXR', 0.5,
                           'bin time beginning=0 middle=0.5 end=1')

        hdu1.header.update('TIERRELA', 5.78E-07, 'relative time error')

        hdu1.header.update('INT_TIME', 6.019802903270,
                           '[s] photon accumulation time per frame')

        hdu1.header.update('READTIME', 0.518948526144,
                           'readout time per frame')

        hdu1.header.update('FRAMETIM', 6.5387514294144005,
                           '[s] frame time (INT_TIME + READTIME)')

        hdu1.header.update('NUM_FRM', 270, 'number of frames per time stamp')

        hdu1.header.update('FGSFRPER', 103.7897052288, '[ms] FGS frame period')

        hdu1.header.update('NUMFGSFP', 58,
                           'number of FGS frame periods per exposure')

        hdu1.header.update('TIMEDEL', telapse, '[d] time resolution of data')

        hdu1.header.update('DATE-OBS', '', 'TSTART as UTC calendar date')

        hdu1.header.update('DATE-END', '%sT%sZ' % (dateobs, timeobs),
                           'TSTART as UTC calendar date')

        hdu1.header.update('BTC_PIX1', 536,
                           'reference col for barycentric time correction')

        hdu1.header.update('BTC_PIX2', 567,
                           'reference row for barycentric time correction')

        hdu1.header.update('BUNIT', bunit, 'physical units of image data')

        hdu1.header.update('BARYCORR', -1.0, '[d] barycentric time correction')

        hdu1.header.update('BACKAPP', False, 'background is subtracted')

        hdu1.header.update('DEADAPP', True, 'deadtime applied')

        hdu1.header.update('VIGNAPP', False,
                           'vignetting or collimator correction applied')

        hdu1.header.update('GAIN', gain, '[electrons/ADU] gain')

        hdu1.header.update('READNOIS', readnois, '[electrons] read noise')

        hdu1.header.update('NREADOUT', 270, 'number of read per cadence')

        hdu1.header.update('TIMSLICE', timslice,
                           'time-slice readout sequence section')

        hdu1.header.update('MEANBLCK', meanblck,
                           '[count] FSW mean black level')

        hdu1.header.update('RADESYS', 'ICRS',
                           'reference frame of celestial coordinates')

        hdu1.header.update('EQUINOX', 2000.0,
                           'equinox of celestial coordinate system')

        hdu1.header.update('WCSNAMEP', 'PHYSICAL',
                           'name of world coordinate system alternate P')

        hdu1.header.update('WCSAXESP', 2, 'number of WCS physical axes')

        hdu1.header.update('CTYPE1P', 'RAWX',
                           'physical WCS axis 1 type CCD col')

        hdu1.header.update('CUNIT1P', 'PIXEL', 'physical WCS axis 1 unit')

        hdu1.header.update('CRPIX1P', 1, 'reference CCD column')

        hdu1.header.update('CRVAL1P', 0, 'value at reference CCD column')

        hdu1.header.update('CDELT1P', 1.0, 'physical WCS axis 1 step')

        hdu1.header.update('CTYPE2P', 'RAWY',
                           'physical WCS axis 2 type CCD row')

        hdu1.header.update('CUNIT2P', 'PIXEL', 'physical WCS axis 2 units')

        hdu1.header.update('CRPIX2P', 1, 'reference CCD row')

        hdu1.header.update('CRVAL2P', 0, 'value at reference CCD row')

        hdu1.header.update('CDELT2P', 1.0, 'physical WCS axis 2 step')

        hdulist.append(hdu1)

# close the FFI file

    try:

        os.remove(outname)

    except:

        pass

    hdulist.writeto(outname, checksum=True)

    # close the cadence pixel file

    try:

        incpf.close()

    except:

        message = 'ERROR -- Cannot close the cadence pixel file'

        status = PyMSG.err(None, message)

# close the pixel mapping reference file

    try:

        inpmrf.close()

    except:

        message = 'ERROR -- Cannot close the pixel mapping reference file'

        status = PyMSG.err(None, message)
Exemplo n.º 5
0
def main():

    # input argument

    cpflist = "/Volumes/data/Kepler/2W/1311/CPF/cpf.lis"

    pmrf = "/Volumes/data/Kepler/PMRF/nov2013_lcm.fits"

    try:

        opts, args = getopt.getopt(sys.argv[1:], "h:cpa", ["help", "cpflist=", "pmrf=", "cal"])

    except getopt.GetoptError:

        usage()

    calib = False

    for o, a in opts:

        if o in ("-h", "--help"):

            usage()

        if o in ("-c", "--cpflist"):

            cpflist = str(a)

        if o in ("-p", "--pmrf"):

            pmrf = str(a)

        if o in ("-a", "--cal"):

            calib = True

    # read the list of Cadence Pixel Files

    cpfs = []

    lines, status = PyIO.openascii(cpflist, "r", None)

    if status == 0:

        for line in lines:

            cpfs.append(line.strip())

        ncad = len(cpfs)

        lastcad = re.sub("_lcs-targ.fits", "", os.path.basename(cpfs[-1])).strip("kplr")

    # open the Pixel Mapping Reference File

    try:

        instr = open(pmrf, mode="readonly", memmap=True)

    except:

        message = "ERROR -- Cannot read the pixel reference file"

        status = PyMSG.err(None, message)

    # iterate through the FITS extensions of the PMRF and read the data

    for ext in range(1, 2):

        start = ti.time()

        card = instr[ext].header.ascardlist()

        chankey = card["CHANNEL"].value

        modkey = card["MODULE"].value

        outkey = card["OUTPUT"].value

        r = instr[ext].data.field("row")[:]

        c = instr[ext].data.field("column")[:]

        k = instr[ext].data.field("target_id")[:]

        # populate dictionaries for channel and MORC defintions (module output row column)

        channel = []

        module = []

        output = []

        row = {}

        column = {}

        for line in range(len(r)):

            channel.append((k[line], chankey))

            module.append((k[line], modkey))

            output.append((k[line], outkey))

            try:

                row[k[line]].append(r[line])

                column[k[line]].append(c[line])

            except:

                row[k[line]] = [r[line]]

                column[k[line]] = [c[line]]

        channel = dict(channel)

        module = dict(module)

        output = dict(output)

        # physical wcs information for each target

        dcol = {}

        drow = {}

        eformat = {}

        jformat = {}

        kformat = {}

        coldim = {}

        crval1p = {}

        crval2p = {}

        raw_cnts = {}

        flux = {}

        flux_err = {}

        flux_bkg = {}

        flux_bkg_err = {}

        cosmic_rays = {}

        mask = {}

        for kepid in channel.keys():

            dcol[kepid] = max(column[kepid]) - min(column[kepid]) + 1

            drow[kepid] = max(row[kepid]) - min(row[kepid]) + 1

            coldim[kepid] = "(" + str(dcol[kepid]) + "," + str(drow[kepid]) + ")"

            eformat[kepid] = str(drow[kepid] * dcol[kepid]) + "E"

            jformat[kepid] = str(drow[kepid] * dcol[kepid]) + "J"

            kformat[kepid] = str(drow[kepid] * dcol[kepid]) + "K"

            crval1p[kepid] = min(column[kepid])

            crval2p[kepid] = min(row[kepid])

            # declare pixel data array sizes

            raw_cnts[kepid] = zeros((ncad, drow[kepid], dcol[kepid]), dtype="int")

            flux[kepid] = zeros((ncad, drow[kepid], dcol[kepid]), dtype="float32")

            flux_err[kepid] = zeros((ncad, drow[kepid], dcol[kepid]), dtype="float32")

            flux_bkg[kepid] = zeros((ncad, drow[kepid], dcol[kepid]), dtype="float32")

            flux_bkg_err[kepid] = zeros((ncad, drow[kepid], dcol[kepid]), dtype="float32")

            cosmic_rays[kepid] = zeros((ncad, drow[kepid], dcol[kepid]), dtype="float32")

            mask[kepid] = ones((drow[kepid], dcol[kepid]), dtype="int")

            raw_cnts[kepid][:, :, :] = -1

            flux[kepid][:, :, :] = nan

            flux_err[kepid][:, :, :] = nan

            flux_bkg[kepid][:, :, :] = nan

            flux_bkg_err[kepid][:, :, :] = nan

            cosmic_rays[kepid][:, :, :] = nan

        # declare  array sizes

        mjd = zeros((ncad), dtype="float64")

        time = zeros((ncad), dtype="float64")

        timecorr = zeros((ncad), dtype="float32")

        cadenceno = zeros((ncad), dtype="int")

        quality = zeros((ncad), dtype="int")

        pos_corr1 = zeros((ncad), dtype="float32")

        pos_corr2 = zeros((ncad), dtype="float32")

        # open cadence pixel files

        cadence = 0

        for cpf in cpfs:

            try:

                incpf = open(cpf, mode="readonly", memmap=True)

                card0 = incpf[0].header.ascardlist()

                carde = incpf[ext].header.ascardlist()

            except:

                message = "ERROR -- Cannot read the cadence pixel file " + cpf

                status = PyMSG.err(None, message)

            # read cadence pixel file keywords

            dateobs = card0["DATE-OBS"].value

            timeobs = card0["TIME-OBS"].value

            lcfxdoff = card0["LCFXDOFF"].value

            scfxdoff = card0["SCFXDOFF"].value

            crpix1 = carde["CRPIX1"].value

            crpix2 = carde["CRPIX2"].value

            crval1 = carde["CRVAL1"].value

            crval2 = carde["CRVAL2"].value

            gain = carde["GAIN"].value

            readnois = carde["READNOIS"].value

            timslice = carde["TIMSLICE"].value

            meanblck = carde["MEANBLCK"].value

            # read cadence pixel file tables

            mjd[cadence] = card0["MID_TIME"].value

            time[cadence] = card0["MID_TIME"].value + 2400000.5 - 2454833.0

            timecorr[cadence] = 0.0

            cadenceno[cadence] = card0["LC_COUNT"].value

            raw = incpf[ext].data.field("orig_value")[:]

            if calib:

                cal = incpf[ext].data.field("cal_value")[:]

                unc = incpf[ext].data.field("cal_uncert")[:]

            else:

                cal = incpf[ext].data.field("orig_value")[:]

                unc = numpy.sqrt(cal)

            # populate the pixel data arrays

            for line in range(len(r)):

                i, j = ccd2mask(1.0, 1.0, crval1p[k[line]], crval2p[k[line]], 1.0, 1.0, c[line], r[line])

                raw_cnts[k[line]][cadence, j, i] = raw[line]

                flux[k[line]][cadence, j, i] = cal[line]

                flux_err[k[line]][cadence, j, i] = unc[line]

            # close the cadence pixel file

            try:

                incpf.close()

            except:

                message = "ERROR -- Cannot close the cadence pixel file"

                status = PyMSG.err(None, message)

            cadence += 1

        # iterate through each target in order to create a Target Pixel File

        for kepid in channel.keys():

            #            if drow[kepid] * dcol[kepid] < 1700:

            if drow[kepid] * dcol[kepid] < 1e9:

                # reshape the data arrays for the target pixel files

                raw_cnts[kepid] = numpy.reshape(raw_cnts[kepid], (ncad, dcol[kepid] * drow[kepid]))

                flux[kepid] = numpy.reshape(flux[kepid], (ncad, dcol[kepid] * drow[kepid]))

                flux_err[kepid] = numpy.reshape(flux_err[kepid], (ncad, dcol[kepid] * drow[kepid]))

                flux_bkg[kepid] = numpy.reshape(flux_bkg[kepid], (ncad, dcol[kepid] * drow[kepid]))

                flux_bkg_err[kepid] = numpy.reshape(flux_bkg_err[kepid], (ncad, dcol[kepid] * drow[kepid]))

                cosmic_rays[kepid] = numpy.reshape(cosmic_rays[kepid], (ncad, dcol[kepid] * drow[kepid]))

                # create primary FITS extensions

                hdu0 = PrimaryHDU()

                hdu0.header.update("EXTEND", True, "file may contain standard extensions")

                hdu0.header.update("EXTNAME", "PRIMARY", "name of extension")

                hdu0.header.update("EXTVER", 1, "extension version number")

                hdu0.header.update("ORIGIN", "NASA/Ames", "organization that generated this file")

                hdu0.header.update("DATE", "2010-04-08", "file creation date")

                hdu0.header.update("CREATOR", "CadencePixels.py", "SW version used to create this file")

                hdu0.header.update("PROCVER", 1.0, "processing script version")

                hdu0.header.update("FILEVER", "2.0", "file format version")

                hdu0.header.update("TIMVERSN", "OGIP/93-003", "OGIP memo number for file format")

                hdu0.header.update("TELESCOP", "Kepler", "telescope")

                hdu0.header.update("INSTRUME", "Kepler photometer", "detector type")

                hdu0.header.update("OBJECT", "KIC %s" % kepid, "string version of kepID")

                hdu0.header.update("KEPLERID", str(kepid), "unique Kepler target identifier")

                hdu0.header.update("CHANNEL", channel[kepid], "CCD channel")

                hdu0.header.update("SKYGROUP", 0, "roll-independent location of channel")

                hdu0.header.update("MODULE", module[kepid], "CCD module")

                hdu0.header.update("OUTPUT", output[kepid], "CCD output")

                hdu0.header.update("QUARTER", 0, "mission quarter during which data was collected")

                hdu0.header.update("SEASON", 0, "mission season during which data was collected")

                hdu0.header.update("DATA_REL", 0, "version of data release notes describing data")

                hdu0.header.update("OBSMODE", "long cadence", "observing mode")

                hdu0.header.update("RADESYS", "ICRS", "reference frame of celestial coordinates")

                hdu0.header.update("RA_OBJ", 0.0, "[deg] right ascension from KIC")

                hdu0.header.update("DEC_OBJ", 0.0, "[deg] declination from KIC")

                hdu0.header.update("EQUINOX", 2000.0, "equinox of celestial coordinate system")

                hdu0.header.update("PMRA", 0.0, "[arcsec/yr] RA proper motion")

                hdu0.header.update("PMDEC", 0.0, "[arcsec/yr] Dec proper motion")

                hdu0.header.update("PMTOTAL", 0.0, "[arcsec/yr] total proper motion")

                hdu0.header.update("PARALLAX", 0.0, "[arcsec] parallax")

                hdu0.header.update("GLON", 0.0, "[deg] galactic longitude")

                hdu0.header.update("GLAT", 0.0, "[deg] galactic latitude")

                hdu0.header.update("GMAG", 0.0, "[mag] SDSS g band magnitude from KIC")

                hdu0.header.update("RMAG", 0.0, "[mag] SDSS r band magnitude from KIC")

                hdu0.header.update("IMAG", 0.0, "[mag] SDSS i band magnitude from KIC")

                hdu0.header.update("ZMAG", 0.0, "[mag] SDSS z band magnitude from KIC")

                hdu0.header.update("D51MAG", 0.0, "[mag] D51 magnitude, from KIC")

                hdu0.header.update("JMAG", 0.0, "[mag] J band magnitude from 2MASS")

                hdu0.header.update("HMAG", 0.0, "[mag] H band magnitude from 2MASS")

                hdu0.header.update("KMAG", 0.0, "[mag] K band magnitude from 2MASS")

                hdu0.header.update("KEPMAG", 0.0, "[mag] Kepler magnitude (Kp) from KIC")

                hdu0.header.update("GRCOLOR", 0.0, "[mag] (g-r) color, SDSS bands")

                hdu0.header.update("JKCOLOR", 0.0, "[mag] (J-K) color, 2MASS bands")

                hdu0.header.update("GKCOLOR", 0.0, "[mag] (g-K) color, SDSS g - 2MASS K")

                hdu0.header.update("TEFF", 0.0, "[K] effective temperature from KIC")

                hdu0.header.update("LOGG", 0.0, "[cm/s2] log10 surface gravity from KIC")

                hdu0.header.update("FEH", 0.0, "[log10([Fe/H])] metallicity from KIC")

                hdu0.header.update("EBMINUSV", 0.0, "[mag] E(B-V) redenning from KIC")

                hdu0.header.update("AV", 0.0, "[mag] A_v extinction from KIC")

                hdu0.header.update("RADIUS", 0.0, "[solar radii] stellar radius from KIC")

                hdu0.header.update("TMINDEX", 0, "unique 2MASS catalog ID from KIC")

                hdu0.header.update("SCPID", 0, "unique SCP processing ID from KIC")

                hdulist = HDUList(hdu0)

                # create the outfile table extension

                col1 = Column(name="TIME", format="D", unit="BJD - 2454833", array=time)

                col2 = Column(name="TIMECORR", format="E", unit="D", array=timecorr)

                col3 = Column(name="CADENCENO", format="J", array=cadenceno)

                col4 = Column(
                    name="RAW_CNTS", format=jformat[kepid], unit="counts", dim=coldim[kepid], array=raw_cnts[kepid]
                )

                col5 = Column(name="FLUX", format=eformat[kepid], unit="e-/s", dim=coldim[kepid], array=flux[kepid])

                col6 = Column(
                    name="FLUX_ERR", format=eformat[kepid], unit="e-/s", dim=coldim[kepid], array=flux_err[kepid]
                )

                col7 = Column(
                    name="FLUX_BKG", format=eformat[kepid], unit="e-/s", dim=coldim[kepid], array=flux_bkg[kepid]
                )

                col8 = Column(
                    name="FLUX_BKG_ERR",
                    format=eformat[kepid],
                    unit="e-/s",
                    dim=coldim[kepid],
                    array=flux_bkg_err[kepid],
                )

                col9 = Column(
                    name="COSMIC_RAYS", format=eformat[kepid], unit="e-/s", dim=coldim[kepid], array=cosmic_rays[kepid]
                )

                col10 = Column(name="QUALITY", format="J", array=quality)

                col11 = Column(name="POS_CORR1", format="E", unit="pixels", array=pos_corr1)

                col12 = Column(name="POS_CORR2", format="E", unit="pixels", array=pos_corr2)

                cols = ColDefs([col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12])

                hdu1 = new_table(cols)

                hdu1.header.update("TTYPE1", "TIME", "column title: data time stamps")

                hdu1.header.update("TFORM1", "D", "column format: 64-bit floating point")

                hdu1.header.update("TUNIT1", "BJD - 2454833", "column units: barycenter corrected JD")

                hdu1.header.update("TDISP1", "D14.7", "column display format")

                hdu1.header.update("TTYPE2", "TIMECORR", "column title: barycenter - timeslice correction")

                hdu1.header.update("TFORM2", "E", "column format: 32-bit floating point")

                hdu1.header.update("TUNIT2", "d", "column units: day")

                hdu1.header.update("TDISP2", "E14.7", "column display format")

                hdu1.header.update("TTYPE3", "CADENCENO", "column title: unique cadence number")

                hdu1.header.update("TFORM3", "J", "column format: signed 32-bit integer")

                hdu1.header.update("TTYPE4", "RAW_CNTS", "column title: raw pixel counts")

                hdu1.header.update("TFORM4", jformat[kepid], "column format: signed integer32")

                hdu1.header.update("TUNIT4", "count", "column units: count")

                hdu1.header.update("TDISP4", "I8", "column display format")

                hdu1.header.update("TDIM4", coldim[kepid], "column dimensions: pixel apeture array")

                hdu1.header.update("TNULL4", -1, "column null value indicator")

                hdu1.header.update("WCSN4P", "PHYSICAL", "table column WCS name")

                hdu1.header.update("WCAX4P", 2, "table column physical WCS dimensions")

                hdu1.header.update("1CTY4P", "RAWX", "table column physical WCS axis 1 type, CCD col")

                hdu1.header.update("2CTY4P", "RAWY", "table column physical WCS axis 2 type, CCD row")

                hdu1.header.update("1CUN4P", "PIXEL", "table column physical WCS axis 1 unit")

                hdu1.header.update("2CUN4P", "PIXEL", "table column physical WCS axis 2 unit")

                hdu1.header.update("1CRV4P", crval1p[kepid], "table column physical WCS axis 1 ref value")

                hdu1.header.update("2CRV4P", crval2p[kepid], "table column physical WCS axis 2 ref value")

                hdu1.header.update("1CDL4P", 1.0, "table column physical WCS axis 1 step")

                hdu1.header.update("2CDL4P", 1.0, "table column physical WCS axis 2 step")

                hdu1.header.update("1CRP4P", 1, "table column physical WCS axis 1 reference")

                hdu1.header.update("2CRP4P", 1, "table column physical WCS axis 2 reference")

                hdu1.header.update("WCAX4", 2, "number of WCS axes")

                hdu1.header.update("1CTYP4", "RA---TAN", "right ascension coordinate type")

                hdu1.header.update("2CTYP4", "DEC--TAN", "declination coordinate type")

                hdu1.header.update("1CRPX4", crpix1, "[pixel] reference pixel along image axis 1")

                hdu1.header.update("2CRPX4", crpix2, "[pixel] reference pixel along image axis 2")

                hdu1.header.update("1CRVL4", crval1, "[deg] right ascension at reference pixel")

                hdu1.header.update("2CRVL4", crval2, "[deg] delination at reference pixel")

                hdu1.header.update("1CUNI4", "deg", "physical unit in column dimension")

                hdu1.header.update("2CUNI4", "deg", "physical unit in row dimension")

                hdu1.header.update("1CDLT4", -0.001107921039197, "[deg] pixel scale in RA dimension")

                hdu1.header.update("2CDLT4", 0.001107921039197, "[deg] pixel scale in Dec dimension")

                hdu1.header.update("11PC4", -0.48060068512850346, "linear transformation matrix element cos(th)")

                hdu1.header.update("12PC4", 0.8815429040054924, "linear transformation matrix element -sin(th)")

                hdu1.header.update("21PC4", -0.8748562715817224, "linear transformation matrix element sin(th)")

                hdu1.header.update("22PC4", -0.4760223379649577, "linear transformation matrix element cos(th)")

                hdu1.header.update("TTYPE5", "FLUX", "column title: calibrated pixel flux")

                hdu1.header.update("TFORM5", eformat[kepid], "column format: image of 32-bit floating point")

                hdu1.header.update("TUNIT5", "e-/s", "column units: electrons per second")

                hdu1.header.update("TDISP5", "E14.7", "column display format")

                hdu1.header.update("TDIM5", coldim[kepid], "column dimensions: pixel apeture array")

                hdu1.header.update("WCSN5P", "PHYSICAL", "table column WCS name")

                hdu1.header.update("WCAX5P", 2, "table column physical WCS dimensions")

                hdu1.header.update("1CTY5P", "RAWX", "table column physical WCS axis 1 type, CCD col")

                hdu1.header.update("2CTY5P", "RAWY", "table column physical WCS axis 2 type, CCD row")

                hdu1.header.update("1CUN5P", "PIXEL", "table column physical WCS axis 1 unit")

                hdu1.header.update("2CUN5P", "PIXEL", "table column physical WCS axis 2 unit")

                hdu1.header.update("1CRV5P", crval1p[kepid], "table column physical WCS axis 1 ref value")

                hdu1.header.update("2CRV5P", crval2p[kepid], "table column physical WCS axis 2 ref value")

                hdu1.header.update("1CDL5P", 1.0, "table column physical WCS axis 1 step")

                hdu1.header.update("2CDL5P", 1.0, "table column physical WCS axis 2 step")

                hdu1.header.update("1CRP5P", 1, "table column physical WCS axis 1 reference")

                hdu1.header.update("2CRP5P", 1, "table column physical WCS axis 2 reference")

                hdu1.header.update("WCAX5", 2, "number of WCS axes")

                hdu1.header.update("1CTYP5", "RA---TAN", "right ascension coordinate type")

                hdu1.header.update("2CTYP5", "DEC--TAN", "declination coordinate type")

                hdu1.header.update("1CRPX5", crpix1, "[pixel] reference pixel along image axis 1")

                hdu1.header.update("2CRPX5", crpix2, "[pixel] reference pixel along image axis 2")

                hdu1.header.update("1CRVL5", crval1, "[deg] right ascension at reference pixel")

                hdu1.header.update("2CRVL5", crval2, "[deg] delination at reference pixel")

                hdu1.header.update("1CUNI5", "deg", "physical unit in column dimension")

                hdu1.header.update("2CUNI5", "deg", "physical unit in row dimension")

                hdu1.header.update("1CDLT5", -0.001107921039197, "[deg] pixel scale in RA dimension")

                hdu1.header.update("2CDLT5", 0.001107921039197, "[deg] pixel scale in Dec dimension")

                hdu1.header.update("11PC5", -0.48060068512850346, "linear transformation matrix element cos(th)")

                hdu1.header.update("12PC5", 0.8815429040054924, "linear transformation matrix element -sin(th)")

                hdu1.header.update("21PC5", -0.8748562715817224, "linear transformation matrix element sin(th)")

                hdu1.header.update("22PC5", -0.4760223379649577, "linear transformation matrix element cos(th)")

                hdu1.header.update("TTYPE6", "FLUX_ERR", "column title: 1-sigma calibrated uncertainty")

                hdu1.header.update("TFORM6", eformat[kepid], "column format: image of 32-bit floating point")

                hdu1.header.update("TUNIT6", "e-/s", "column units: electrons per second")

                hdu1.header.update("TDISP6", "E14.7", "column display format")

                hdu1.header.update("TDIM6", coldim[kepid], "column dimensions: pixel apeture array")

                hdu1.header.update("WCSN6P", "PHYSICAL", "table column WCS name")

                hdu1.header.update("WCAX6P", 2, "table column physical WCS dimensions")

                hdu1.header.update("1CTY6P", "RAWX", "table column physical WCS axis 1 type, CCD col")

                hdu1.header.update("2CTY6P", "RAWY", "table column physical WCS axis 2 type, CCD row")

                hdu1.header.update("1CUN6P", "PIXEL", "table column physical WCS axis 1 unit")

                hdu1.header.update("2CUN6P", "PIXEL", "table column physical WCS axis 2 unit")

                hdu1.header.update("1CRV6P", crval1p[kepid], "table column physical WCS axis 1 ref value")

                hdu1.header.update("2CRV6P", crval2p[kepid], "table column physical WCS axis 2 ref value")

                hdu1.header.update("1CDL6P", 1.0, "table column physical WCS axis 1 step")

                hdu1.header.update("2CDL6P", 1.0, "table column physical WCS axis 2 step")

                hdu1.header.update("1CRP6P", 1, "table column physical WCS axis 1 reference")

                hdu1.header.update("2CRP6P", 1, "table column physical WCS axis 2 reference")

                hdu1.header.update("WCAX6", 2, "number of WCS axes")

                hdu1.header.update("1CTYP6", "RA---TAN", "right ascension coordinate type")

                hdu1.header.update("2CTYP6", "DEC--TAN", "declination coordinate type")

                hdu1.header.update("1CRPX6", crpix1, "[pixel] reference pixel along image axis 1")

                hdu1.header.update("2CRPX6", crpix2, "[pixel] reference pixel along image axis 2")

                hdu1.header.update("1CRVL6", crval1, "[deg] right ascension at reference pixel")

                hdu1.header.update("2CRVL6", crval2, "[deg] delination at reference pixel")

                hdu1.header.update("1CUNI6", "deg", "physical unit in column dimension")

                hdu1.header.update("2CUNI6", "deg", "physical unit in row dimension")

                hdu1.header.update("1CDLT6", -0.001107921039197, "[deg] pixel scale in RA dimension")

                hdu1.header.update("2CDLT6", 0.001107921039197, "[deg] pixel scale in Dec dimension")

                hdu1.header.update("11PC6", -0.48060068512850346, "linear transformation matrix element cos(th)")

                hdu1.header.update("12PC6", 0.8815429040054924, "linear transformation matrix element -sin(th)")

                hdu1.header.update("21PC6", -0.8748562715817224, "linear transformation matrix element sin(th)")

                hdu1.header.update("22PC6", -0.4760223379649577, "linear transformation matrix element cos(th)")

                hdu1.header.update("TTYPE7", "FLUX_BKG", "column title: calibrated background flux")

                hdu1.header.update("TFORM7", eformat[kepid], "column format: image of 32-bit floating point")

                hdu1.header.update("TUNIT7", "e-/s", "column units: electrons per second")

                hdu1.header.update("TDISP7", "E14.7", "column display format")

                hdu1.header.update("TDIM7", coldim[kepid], "column dimensions: pixel apeture array")

                hdu1.header.update("WCSN7P", "PHYSICAL", "table column WCS name")

                hdu1.header.update("WCAX7P", 2, "table column physical WCS dimensions")

                hdu1.header.update("1CTY7P", "RAWX", "table column physical WCS axis 1 type, CCD col")

                hdu1.header.update("2CTY7P", "RAWY", "table column physical WCS axis 2 type, CCD row")

                hdu1.header.update("1CUN7P", "PIXEL", "table column physical WCS axis 1 unit")

                hdu1.header.update("2CUN7P", "PIXEL", "table column physical WCS axis 2 unit")

                hdu1.header.update("1CRV7P", crval1p[kepid], "table column physical WCS axis 1 ref value")

                hdu1.header.update("2CRV7P", crval2p[kepid], "table column physical WCS axis 2 ref value")

                hdu1.header.update("1CDL7P", 1.0, "table column physical WCS axis 1 step")

                hdu1.header.update("2CDL7P", 1.0, "table column physical WCS axis 2 step")

                hdu1.header.update("1CRP7P", 1, "table column physical WCS axis 1 reference")

                hdu1.header.update("2CRP7P", 1, "table column physical WCS axis 2 reference")

                hdu1.header.update("WCAX7", 2, "number of WCS axes")

                hdu1.header.update("1CTYP7", "RA---TAN", "right ascension coordinate type")

                hdu1.header.update("2CTYP7", "DEC--TAN", "declination coordinate type")

                hdu1.header.update("1CRPX7", crpix1, "[pixel] reference pixel along image axis 1")

                hdu1.header.update("2CRPX7", crpix2, "[pixel] reference pixel along image axis 2")

                hdu1.header.update("1CRVL7", crval1, "[deg] right ascension at reference pixel")

                hdu1.header.update("2CRVL7", crval2, "[deg] delination at reference pixel")

                hdu1.header.update("1CUNI7", "deg", "physical unit in column dimension")

                hdu1.header.update("2CUNI7", "deg", "physical unit in row dimension")

                hdu1.header.update("1CDLT7", -0.001107921039197, "[deg] pixel scale in RA dimension")

                hdu1.header.update("2CDLT7", 0.001107921039197, "[deg] pixel scale in Dec dimension")

                hdu1.header.update("11PC7", -0.48060068512850346, "linear transformation matrix element cos(th)")

                hdu1.header.update("12PC7", 0.8815429040054924, "linear transformation matrix element -sin(th)")

                hdu1.header.update("21PC7", -0.8748562715817224, "linear transformation matrix element sin(th)")

                hdu1.header.update("22PC7", -0.4760223379649577, "linear transformation matrix element cos(th)")

                hdu1.header.update("TTYPE8", "FLUX_BKG_ERR", "column title: 1-sigma cal. background uncertain")

                hdu1.header.update("TFORM8", eformat[kepid], "column format: image of 32-bit floating point")

                hdu1.header.update("TUNIT8", "e-/s", "column units: electrons per second")

                hdu1.header.update("TDISP8", "E14.7", "column display format")

                hdu1.header.update("TDIM8", coldim[kepid], "column dimensions: pixel apeture array")

                hdu1.header.update("WCSN8P", "PHYSICAL", "table column WCS name")

                hdu1.header.update("WCAX8P", 2, "table column physical WCS dimensions")

                hdu1.header.update("1CTY8P", "RAWX", "table column physical WCS axis 1 type, CCD col")

                hdu1.header.update("2CTY8P", "RAWY", "table column physical WCS axis 2 type, CCD row")

                hdu1.header.update("1CUN8P", "PIXEL", "table column physical WCS axis 1 unit")

                hdu1.header.update("2CUN8P", "PIXEL", "table column physical WCS axis 2 unit")

                hdu1.header.update("1CRV8P", crval1p[kepid], "table column physical WCS axis 1 ref value")

                hdu1.header.update("2CRV8P", crval2p[kepid], "table column physical WCS axis 2 ref value")

                hdu1.header.update("1CDL8P", 1.0, "table column physical WCS axis 1 step")

                hdu1.header.update("2CDL8P", 1.0, "table column physical WCS axis 2 step")

                hdu1.header.update("1CRP8P", 1, "table column physical WCS axis 1 reference")

                hdu1.header.update("2CRP8P", 1, "table column physical WCS axis 2 reference")

                hdu1.header.update("WCAX8", 2, "number of WCS axes")

                hdu1.header.update("1CTYP8", "RA---TAN", "right ascension coordinate type")

                hdu1.header.update("2CTYP8", "DEC--TAN", "declination coordinate type")

                hdu1.header.update("1CRPX8", crpix1, "[pixel] reference pixel along image axis 1")

                hdu1.header.update("2CRPX8", crpix2, "[pixel] reference pixel along image axis 2")

                hdu1.header.update("1CRVL8", crval1, "[deg] right ascension at reference pixel")

                hdu1.header.update("2CRVL8", crval2, "[deg] delination at reference pixel")

                hdu1.header.update("1CUNI8", "deg", "physical unit in column dimension")

                hdu1.header.update("2CUNI8", "deg", "physical unit in row dimension")

                hdu1.header.update("1CDLT8", -0.001107921039197, "[deg] pixel scale in RA dimension")

                hdu1.header.update("2CDLT8", 0.001107921039197, "[deg] pixel scale in Dec dimension")

                hdu1.header.update("11PC8", -0.48060068512850346, "linear transformation matrix element cos(th)")

                hdu1.header.update("12PC8", 0.8815429040054924, "linear transformation matrix element -sin(th)")

                hdu1.header.update("21PC8", -0.8748562715817224, "linear transformation matrix element sin(th)")

                hdu1.header.update("22PC8", -0.4760223379649577, "linear transformation matrix element cos(th)")

                hdu1.header.update("TTYPE9", "COSMIC_RAYS", "column title: cosmic ray detections")

                hdu1.header.update("TFORM9", eformat[kepid], "column format: image of 32-bit floating point")

                hdu1.header.update("TUNIT9", "e-/s", "column units: electrons per second")

                hdu1.header.update("TDISP9", "E14.7", "column display format")

                hdu1.header.update("TDIM9", coldim[kepid], "column dimensions: pixel apeture array")

                hdu1.header.update("WCSN9P", "PHYSICAL", "table column WCS name")

                hdu1.header.update("WCAX9P", 2, "table column physical WCS dimensions")

                hdu1.header.update("1CTY9P", "RAWX", "table column physical WCS axis 1 type, CCD col")

                hdu1.header.update("2CTY9P", "RAWY", "table column physical WCS axis 2 type, CCD row")

                hdu1.header.update("1CUN9P", "PIXEL", "table column physical WCS axis 1 unit")

                hdu1.header.update("2CUN9P", "PIXEL", "table column physical WCS axis 2 unit")

                hdu1.header.update("1CRV9P", crval1p[kepid], "table column physical WCS axis 1 ref value")

                hdu1.header.update("2CRV9P", crval2p[kepid], "table column physical WCS axis 2 ref value")

                hdu1.header.update("1CDL9P", 1.0, "table column physical WCS axis 1 step")

                hdu1.header.update("2CDL9P", 1.0, "table column physical WCS axis 2 step")

                hdu1.header.update("1CRP9P", 1, "table column physical WCS axis 1 reference")

                hdu1.header.update("2CRP9P", 1, "table column physical WCS axis 2 reference")

                hdu1.header.update("WCAX9", 2, "number of WCS axes")

                hdu1.header.update("1CTYP9", "RA---TAN", "right ascension coordinate type")

                hdu1.header.update("2CTYP9", "DEC--TAN", "declination coordinate type")

                hdu1.header.update("1CRPX9", crpix1, "[pixel] reference pixel along image axis 1")

                hdu1.header.update("2CRPX9", crpix2, "[pixel] reference pixel along image axis 2")

                hdu1.header.update("1CRVL9", crval1, "[deg] right ascension at reference pixel")

                hdu1.header.update("2CRVL9", crval2, "[deg] delination at reference pixel")

                hdu1.header.update("1CUNI9", "deg", "physical unit in column dimension")

                hdu1.header.update("2CUNI9", "deg", "physical unit in row dimension")

                hdu1.header.update("1CDLT9", -0.001107921039197, "[deg] pixel scale in RA dimension")

                hdu1.header.update("2CDLT9", 0.001107921039197, "[deg] pixel scale in Dec dimension")

                hdu1.header.update("11PC9", -0.48060068512850346, "linear transformation matrix element cos(th)")

                hdu1.header.update("12PC9", 0.8815429040054924, "linear transformation matrix element -sin(th)")

                hdu1.header.update("21PC9", -0.8748562715817224, "linear transformation matrix element sin(th)")

                hdu1.header.update("22PC9", -0.4760223379649577, "linear transformation matrix element cos(th)")

                hdu1.header.update("TTYPE10", "QUALITY", "column title: pixel quality flags")

                hdu1.header.update("TFORM10", "J", "column format: signed 32-bit integer")

                hdu1.header.update("TDISP10", "B16.16", "column display format")

                hdu1.header.update("TTYPE11", "POS_CORR1", "column title: row position correction")

                hdu1.header.update("TFORM11", "E", "column format: 32-bit floating point")

                hdu1.header.update("TUNIT11", "pixels", "column units: pixels")

                hdu1.header.update("TDISP11", "D14.7", "column display format")

                hdu1.header.update("TTYPE12", "POS_CORR2", "column title: column position correction")

                hdu1.header.update("TFORM12", "E", "column format: 32-bit floating point")

                hdu1.header.update("TUNIT12", "pixels", "column units: pixels")

                hdu1.header.update("TDISP12", "D14.7", "column display format")

                hdu1.header.update("INHERIT", True, "inherit the primary header")

                hdu1.header.update("EXTNAME", "TARGETTABLES", "name of extension")

                hdu1.header.update("EXTVER", 1, "extension version number")

                hdu1.header.update("TELESCOP", "Kepler", "telescope")

                hdu1.header.update("INSTRUME", "Kepler photometer", "detector type")

                hdu0.header.update("OBJECT", "KIC %s" % kepid, "string version of kepID")

                hdu0.header.update("KEPLERID", str(kepid), "unique Kepler target identifier")

                hdu1.header.update("RADESYS", "ICRS", "reference frame of celestial coordinates")

                hdu1.header.update("RA_OBJ", 0.0, "[deg] right ascension from KIC")

                hdu1.header.update("DEC_OBJ", 0.0, "[deg] declination from KIC")

                hdu1.header.update("EQUINOX", 2000.0, "equinox of celestial coordinate system")

                hdu1.header.update("EXPOSURE", (time[-1] - time[0]) * 0.92063492, "[d] time on source")

                hdu1.header.update("TIMEREF", "SOLARSYSTEM", "barycentric correction applied to times")

                hdu1.header.update("TASSIGN", "SPACECRAFT", "where time is assigned")

                hdu1.header.update("TIMESYS", "TDB", "time system is barycentric JD")

                hdu1.header.update("BJDREFI", 2454833, "integer part of BJD reference date")

                hdu1.header.update("BJDREFF", 0.0, "fraction of day in BJD reference date")

                hdu1.header.update("TIMEUNIT", "d", "time unit for TIME, TSTART and TSTOP")

                hdu1.header.update("TELAPSE", time[-1] - time[0], "[d] TSTOP - TSTART")

                hdu1.header.update("LIVETIME", (time[-1] - time[0]) * 0.92063492, "[d] TELAPSE multiplied by DEADC")

                hdu1.header.update("TSTART", time[0], "observation start time in BJD - BJDREF")

                hdu1.header.update("TSTOP", time[-1], "observation stop time in BJD - BJDREF")

                hdu1.header.update("LC_START", mjd[0], "observation start time in MJD")

                hdu1.header.update("LC_END", mjd[-1], "observation stop time in MJD")

                hdu1.header.update("DEADC", 0.92063492, "deadtime correction")

                hdu1.header.update("TIMEPIXR", 0.5, "bin time beginning=0 middle=0.5 end=1")

                hdu1.header.update("IERRELA", 5.78e-07, "[d] relative time error")

                hdu1.header.update("TIERABSO", 1.0e-07, "[d] absolute time error")

                hdu1.header.update("INT_TIME", 6.019802903270, "[s] photon accumulation time per frame")

                hdu1.header.update("READTIME", 0.518948526144, "[s] readout time per frame")

                hdu1.header.update("FRAMETIM", 6.538751429414, "[s] frame time (INT_TIME + READTIME)")

                hdu1.header.update("NUM_FRM", 270, "number of frames per time stamp")

                hdu1.header.update("TIMEDEL", 0.02043359821692, "[d] time resolution of data")

                hdu1.header.update("DATE-OBS", dateobs + ":" + timeobs + "Z", "TSTART as UTC calendar date")

                hdu1.header.update("DATE-END", "", "TSTOP as UTC calendar date")

                hdu1.header.update("BACKAPP", True, "background is subtracted")

                hdu1.header.update("DEADAPP", True, "deadtime applied")

                hdu1.header.update("VIGNAPP", True, "vignetting or collimator correction applied")

                hdu1.header.update("GAIN", gain, "[electrons/count] channel gain")

                hdu1.header.update("READNOIS", readnois, "[electrons] read noise")

                hdu1.header.update("NREADOUT", 270, "number of read per cadence")

                hdu1.header.update("TIMSLICE", timslice, "time-slice readout sequence section")

                hdu1.header.update("MEANBLCK", meanblck, "[count] FSW mean black level")

                hdu1.header.update("LCFXDOFF", lcfxdoff, "long cadence fixed offset")

                hdu1.header.update("SCFXDOFF", scfxdoff, "short cadence fixed offset")

                hdulist.append(hdu1)

                # create the outfile image extension

                hdu2 = ImageHDU(mask[kepid])

                hdu2.header.update("INHERIT", True, "inherit primary keywords")

                hdu2.header.update("EXTNAME", "APERTURE", "extension name")

                hdu2.header.update("EXTVER", 1, "extension version number")

                hdu2.header.update("TELESCOP", "Kepler", "telescope")

                hdu2.header.update("INSTRUME", "Kepler photometer", "detector type")

                hdu2.header.update("OBJECT", "KIC %s" % kepid, "string version of kepID")

                hdu2.header.update("KEPLERID", str(kepid), "unique Kepler target identifier")

                hdu2.header.update("RADESYS", "ICRS", "reference frame of celestial coordinates")

                hdu2.header.update("RA_OBJ", 0.0, "[deg] right ascension from KIC")

                hdu2.header.update("DEC_OBJ", 0.0, "[deg] declination from KIC")

                hdu2.header.update("EQUINOX", 2000.0, "equinox of celestial coordinate system")

                hdu2.header.update("WCSAXES", 2, "number of WCS axes")

                hdu2.header.update("CTYPE1", "RA---TAN", "right ascension coordinate type")

                hdu2.header.update("CTYPE2", "DEC--TAN", "declination coordinate type")

                hdu2.header.update("CRPIX1", crpix1, "[pixel] reference pixel along image axis 1")

                hdu2.header.update("CRPIX2", crpix2, "[pixel] reference pixel along image axis 2")

                hdu2.header.update("CRVAL1", crval1, "[deg] right ascension at reference pixel")

                hdu2.header.update("CRVAL2", crval2, "[deg] delination at reference pixel")

                hdu2.header.update("CUNIT1", "deg", "physical unit in column dimension")

                hdu2.header.update("CUNIT2", "deg", "physical unit in row dimension")

                hdu2.header.update("CDELT1", -0.001107921039197, "[deg] pixel scale in RA dimension")

                hdu2.header.update("CDELT2", 0.001107921039197, "[deg] pixel scale in Dec dimension")

                hdu2.header.update("PC1_1", -0.48060068512850346, "linear transformation matrix element cos(th)")

                hdu2.header.update("PC1_2", 0.8815429040054924, "linear transformation matrix element -sin(th)")

                hdu2.header.update("PC2_1", -0.8748562715817224, "linear transformation matrix element sin(th)")

                hdu2.header.update("PC2_2", -0.4760223379649577, "linear transformation matrix element cos(th)")

                hdu2.header.update("WCSNAMEP", "PHYSICAL", "name of world coordinate system alternate P")

                hdu2.header.update("WCSAXESP", 2, "table column physical WCS dimensions")

                hdu2.header.update("CTYPE1P", "RAWX", "table column physical WCS axis 1 type, CCD col")

                hdu2.header.update("CTYPE2P", "RAWY", "table column physical WCS axis 2 type, CCD row")

                hdu2.header.update("CUNIT1P", "PIXEL", "table column physical WCS axis 1 unit")

                hdu2.header.update("CUNIT2P", "PIXEL", "table column physical WCS axis 2 unit")

                hdu2.header.update("CRVAL1P", crval1p[kepid], "table column physical WCS axis 1 ref value")

                hdu2.header.update("CRVAL2P", crval2p[kepid], "table column physical WCS axis 2 ref value")

                hdu2.header.update("CDELT1P", 1.0, "table column physical WCS axis 1 step")

                hdu2.header.update("CDELT2P", 1.0, "table column physical WCS axis 2 step")

                hdu2.header.update("CRPIX1P", 1, "table column physical WCS axis 1 reference")

                hdu2.header.update("CRPIX2P", 1, "table column physical WCS axis 2 reference")

                hdulist.append(hdu2)

                # write output files

                outname = str(kepid)

                if kepid < 10:
                    outname = "0" + outname

                if kepid < 100:
                    outname = "0" + outname

                if kepid < 1000:
                    outname = "0" + outname

                if kepid < 10000:
                    outname = "0" + outname

                if kepid < 100000:
                    outname = "0" + outname

                if kepid < 1000000:
                    outname = "0" + outname

                if kepid < 10000000:
                    outname = "0" + outname

                if kepid < 100000000:
                    outname = "0" + outname

                outname = "mod%s.%s_kplr%9s-%13s_lpd-targ.fits" % (module[kepid], output[kepid], outname, lastcad)

                try:

                    os.remove(outname)

                except:

                    pass

                hdulist.writeto(outname, checksum=True)

        # runtime

        print "Channel #%2d - no of targets: %5d - time taken: %4dm" % (
            ext,
            len(channel.keys()),
            (ti.time() - start) / 60,
        )

    # close the Pixel Mapping Reference File

    try:

        instr.close()

    except:

        message = "ERROR -- Cannot close the pixel reference file"

        status = PyMSG.err(None, message)
Exemplo n.º 6
0
def main():

# input argument

    cpf = '/Volumes/data/Kepler/SecondLight/CPF/kplr2013304171549_lcs-targ.fits'
    pmrf = '/Volumes/data/Kepler/PMRF/oct2013_lcm.fits'
    try:
	opts, args = getopt.getopt(sys.argv[1:],"h:cpa",["help","cpf=","pmrf=","cal"])
    except getopt.GetoptError:
	usage()
    cal = False
    for o, a in opts:
	if o in ("-h", "--help"):
	    usage()
	if o in ("-c", "--cpf"):
            cpf = str(a)
	if o in ("-p", "--pmrf"):
            pmrf = str(a)
	if o in ("-a", "--cal"):
            cal = True

# output FFI filename

    if cal:
        outname = re.sub('_lcs-targ','_ffi-cal',cpf)
    else:
        outname = re.sub('_lcs-targ','_ffi-raw',cpf)

# creation date
            
    createdate = str(datetime.date.today())

# calibrated data?

    if cal:
        imagtype = 'SocCal'
        bunit = 'electrons/s'
    else:
        imagtype = 'raw'
        bunit = 'counts'

# create primary FITS extensions

    hdu0 = PrimaryHDU()
    hdu0.header.update('EXTEND',True,'file may contain standard extensions')
    hdu0.header.update('EXTNAME','PRIMARY','name of extension')
    hdu0.header.update('EXTVER',1,'extension version number')
    hdu0.header.update('ORIGIN','NASA/Ames','organization that generated this file')
    hdu0.header.update('DATE',createdate,'file creation date')
    hdu0.header.update('CREATOR','CadencePixels2FFI.py','SW used to create this file')
    hdu0.header.update('FILEVER','2.0','file format version')
    hdu0.header.update('PROCVER',1.0,'processing script version')
    hdu0.header.update('TIMVERSN','OGIP/93-003','OGIP memo number for file format')
    hdu0.header.update('TELESCOP','Kepler','telescope')
    hdu0.header.update('INSTRUME','Kepler photometer','detector type')
    hdu0.header.update('DATA_REL',-1,'version of data release notes describing data')
    hdu0.header.update('OBSMODE','full frame image','observing mode')
    hdu0.header.update('DATSETNM',os.path.basename(re.sub('_lcs-targ.fits','',cpf)),'data set name')
    hdu0.header.update('DCT_TIME',os.path.basename(re.sub('kplr','',re.sub('_lcs-targ.fits','',cpf))),
                       'data collection time: yyyydddhhss')
    hdu0.header.update('DCT_TYPE','FFI','data type')
    hdu0.header.update('DCT_PURP','cadence image','purpose of data')
    hdu0.header.update('IMAGTYPE',imagtype,'FFI image type: raw, SocCal, SocUnc')
    hdu0.header.update('QUARTER',-1,'mission quarter during which data was collected')
    hdu0.header.update('SEASON',-1,'mission season during which data was collected')
    hdu0.header.update('PIXELTYP','target','pixel type: target, bkgd, coll, all')
    hdu0.header.update('VSMRSROW',1046,'collateral virtual smear region start row')
    hdu0.header.update('VSMREROW',1057,'collateral virtual smear region row end')
    hdu0.header.update('NROWVSMR',12,'number of rows binned in virtual smear')
    hdu0.header.update('VSMRSCOL',12,'collateral virtual smear region start column')
    hdu0.header.update('VSMRECOL',1111,'collateral virtual smear region end column')
    hdu0.header.update('NCOLVSMR',1100,'number of columns in virtual smear region')
    hdu0.header.update('MASKSROW',6,'science collateral masked region start row')
    hdu0.header.update('MASKEROW',17,'science collateral masked region end row')
    hdu0.header.update('NROWMASK',12,'number of rows binned in masked region')
    hdu0.header.update('MASKSCOL',12,'science collateral masked region start')
    hdu0.header.update('MASKECOL',1111,'science collateral masked region end')
    hdu0.header.update('NCOLMASK',1100,'number of columns in masked region')
    hdu0.header.update('BLCKSROW',0,'science collateral black region start row')
    hdu0.header.update('BLCKEROW',1069,'science collateral black region end column')
    hdu0.header.update('NROWBLCK',1070,'number of rows in black region')
    hdu0.header.update('BLCKSCOL',1118,'science collateral black region start')
    hdu0.header.update('BLCKECOL',1131,'science collateral black region end column')
    hdu0.header.update('NCOLBLK',1070,'number of columns binned in black region')
    hdu0.header.update('RADESYS','ICRS','reference frame of celestial coordinates')
    hdu0.header.update('EQUINOX',2000.0,'equinox of celestial coordinate system')
    hdu0.header.update('RA_NOM',-1.0,'[deg] RA of spacecraft boresight')
    hdu0.header.update('DEC_NOM',-1.0,'[deg] declination of spacecraft boresight')
    hdu0.header.update('ROLL_NOM',-1.0,'[deg] roll angle of spacecraft')
    hdulist = HDUList(hdu0)
             
# open the Pixel Mapping Reference File

    try:
        inpmrf = open(pmrf,mode='readonly',memmap=True)
    except:
        message =  'ERROR -- Cannot read the pixel reference file'
        status = PyMSG.err(None,message)

# open the Cadence Pixel File

    try:
        incpf = open(cpf,mode='readonly',memmap=True)
    except:
        message =  'ERROR -- Cannot read the cadence pixel file'
        status = PyMSG.err(None,message)

# start and stop times of observations from the CPF

    card = incpf[0].header.ascardlist()
    startkey = card['STARTIME'].value
    endkey = card['END_TIME'].value
    dateobs = card['DATE-OBS'].value
    timeobs = card['TIME-OBS'].value
    tstart = startkey + 2400000.5
    tstop = endkey + 2400000.5
    deadc = 0.92063492
    telapse = tstop - tstart
    exposure = telapse * deadc

# iterate through the FITS extensions of the PMRF and read the data 

    for ext in range(1,85):
        start = ti.time()
        card = incpf[ext].header.ascardlist()
        gain = card['GAIN'].value
        readnois = card['READNOIS'].value
        timslice = card['TIMSLICE'].value
        meanblck = card['MEANBLCK'].value
        card = inpmrf[ext].header.ascardlist()
        chankey = card['CHANNEL'].value
        modkey = card['MODULE'].value
        outkey = card['OUTPUT'].value
        r = inpmrf[ext].data.field('row')[:]
        c = inpmrf[ext].data.field('column')[:]
        k = inpmrf[ext].data.field('target_id')[:]
        if cal:
            f = incpf[ext].data.field('cal_value')[:]
        else:
            f = incpf[ext].data.field('orig_value')[:]

# initialize FFI image

        ffimage = numpy.zeros((1070,1132),dtype=float32)
        ffimage[:,:] = numpy.nan

# populate FFI image

        for i in range(len(k)):
            ffimage[r[i],c[i]] = f[i]

# create image extension headers
   
        hdu1 = ImageHDU(ffimage)
        hdu1.header.update('INHERIT',True,'inherit primary keywords')
        hdu1.header.update('EXTNAME','MOD.OUT %d.%d' % (modkey,outkey),'extension name')
        hdu1.header.update('EXTVER',1,'extension version number')
        hdu1.header.update('TELESCOP','Kepler','telescope')
        hdu1.header.update('INSTRUME','Kepler photometer','detector type')
        hdu1.header.update('CHANNEL',chankey,'CCD channel')
        hdu1.header.update('SKYGROUP',-1,'roll-independent location of channel')
        hdu1.header.update('MODULE',modkey,'CCD module')
        hdu1.header.update('OUTPUT',outkey,'CCD output')
        hdu1.header.update('TIMEREF','SOLARSYSTEM','barycentric correction applied to times')
        hdu1.header.update('TASSIGN','SPACECRAFT','where time is assigned')
        hdu1.header.update('TIMESYS','TDB','time system is barycentric JD')
        hdu1.header.update('MJDSTART',startkey,'observation start time in MJD')
        hdu1.header.update('MJDEND',endkey,'observation stop time in MJD')
        hdu1.header.update('BJDREFI',2454833,'integer part of BJD reference date')
        hdu1.header.update('BJDREFF',0.0,'fraction of day in BJD reference date')
        hdu1.header.update('TIMEUNIT','d','time unit for TIME, TSTART and TSTOP')
        hdu1.header.update('TSTART',tstart,'observation start time in BJD-BJDREF')
        hdu1.header.update('TSTOP',tstop,'observation stop time in BJD-BJDREF')
        hdu1.header.update('TELAPSE',telapse,'TSTOP - TSTART')
        hdu1.header.update('EXPOSURE',exposure,'time on source')
        hdu1.header.update('LIVETIME',exposure,'TELAPSE multiplied by DEADC')
        hdu1.header.update('TIMEPIXR',0.5,'bin time beginning=0 middle=0.5 end=1')
        hdu1.header.update('TIERRELA',5.78E-07,'relative time error')
        hdu1.header.update('INT_TIME',6.019802903270,'[s] photon accumulation time per frame')
        hdu1.header.update('READTIME',0.518948526144,'readout time per frame')
        hdu1.header.update('FRAMETIM',6.5387514294144005,'[s] frame time (INT_TIME + READTIME)')
        hdu1.header.update('NUM_FRM',270,'number of frames per time stamp')
        hdu1.header.update('FGSFRPER',103.7897052288,'[ms] FGS frame period')
        hdu1.header.update('NUMFGSFP',58,'number of FGS frame periods per exposure')
        hdu1.header.update('TIMEDEL',telapse,'[d] time resolution of data')
        hdu1.header.update('DATE-OBS','','TSTART as UTC calendar date')
        hdu1.header.update('DATE-END','%sT%sZ' % (dateobs,timeobs),'TSTART as UTC calendar date')
        hdu1.header.update('BTC_PIX1',536,'reference col for barycentric time correction')
        hdu1.header.update('BTC_PIX2',567,'reference row for barycentric time correction')
        hdu1.header.update('BUNIT',bunit,'physical units of image data')
        hdu1.header.update('BARYCORR',-1.0,'[d] barycentric time correction')
        hdu1.header.update('BACKAPP',False,'background is subtracted')
        hdu1.header.update('DEADAPP',True,'deadtime applied')
        hdu1.header.update('VIGNAPP',False,'vignetting or collimator correction applied')
        hdu1.header.update('GAIN',gain,'[electrons/ADU] gain')
        hdu1.header.update('READNOIS',readnois,'[electrons] read noise')
        hdu1.header.update('NREADOUT',270,'number of read per cadence')
        hdu1.header.update('TIMSLICE',timslice,'time-slice readout sequence section')
        hdu1.header.update('MEANBLCK',meanblck,'[count] FSW mean black level')
        hdu1.header.update('RADESYS','ICRS','reference frame of celestial coordinates')
        hdu1.header.update('EQUINOX',2000.0,'equinox of celestial coordinate system')
        hdu1.header.update('WCSNAMEP','PHYSICAL','name of world coordinate system alternate P')
        hdu1.header.update('WCSAXESP',2,'number of WCS physical axes')
        hdu1.header.update('CTYPE1P','RAWX','physical WCS axis 1 type CCD col')
        hdu1.header.update('CUNIT1P','PIXEL','physical WCS axis 1 unit')
        hdu1.header.update('CRPIX1P',1,'reference CCD column')
        hdu1.header.update('CRVAL1P',0,'value at reference CCD column')
        hdu1.header.update('CDELT1P',1.0,'physical WCS axis 1 step')
        hdu1.header.update('CTYPE2P','RAWY','physical WCS axis 2 type CCD row')
        hdu1.header.update('CUNIT2P','PIXEL','physical WCS axis 2 units')
        hdu1.header.update('CRPIX2P',1,'reference CCD row')
        hdu1.header.update('CRVAL2P',0,'value at reference CCD row')
        hdu1.header.update('CDELT2P',1.0,'physical WCS axis 2 step')
        hdulist.append(hdu1)

# close the FFI file

    try:
        os.remove(outname)
    except:
        pass
    hdulist.writeto(outname,checksum=True)
        
# close the cadence pixel file

    try:
        incpf.close()
    except:
        message =  'ERROR -- Cannot close the cadence pixel file'
        status = PyMSG.err(None,message)
        
# close the pixel mapping reference file

    try:
        inpmrf.close()
    except:
        message =  'ERROR -- Cannot close the pixel mapping reference file'
        status = PyMSG.err(None,message)