示例#1
0
文件: kepler.py 项目: nespinoza/VESPA
def modelshift_weaksec(koi):
    """
    Max secondary depth based on model-shift secondary test from Jeff Coughlin

    secondary metric: D_sec_dv * (1 + 3*F_red_dv / sig_sec_dv)
    """
    num = KOIDATA.ix[ku.koiname(koi), 'koi_tce_plnt_num']
    if np.isnan(num):
        num = 1
    kid = KOIDATA.ix[ku.koiname(koi), 'kepid']
    tce = '{:09.0f}-{:02.0f}'.format(kid, num)

    #return largest depth between DV detrending and alternate detrending
    try:
        r = ROBOVETDATA.ix[tce]
    except KeyError:
        raise NoWeakSecondaryError(koi)

    depth_dv = r['D_sec_dv'] * (1 + 3 * r['F_red_dv'] / r['sig_sec_dv'])
    depth_alt = r['D_sec_alt'] * (1 + 3 * r['F_red_alt'] / r['sig_sec_alt'])

    logging.debug(r[['D_sec_dv', 'F_red_dv', 'sig_sec_dv']])
    logging.debug(r[['D_sec_alt', 'F_red_alt', 'sig_sec_alt']])

    if np.isnan(depth_dv) and np.isnan(depth_alt):
        #return weaksec_vv2(koi)
        raise NoWeakSecondaryError(koi)
    elif np.isnan(depth_dv):
        return depth_alt
    elif np.isnan(depth_alt):
        return depth_dv
    else:
        return max(depth_dv, depth_alt)
示例#2
0
文件: kepler.py 项目: nespinoza/VESPA
def fpp_config(koi, **kwargs):
    """returns config object for given KOI
    """
    folder = os.path.join(KOI_FPPDIR, ku.koiname(koi))
    if not os.path.exists(folder):
        os.makedirs(folder)
    config = ConfigObj(os.path.join(folder, "fpp.ini"))

    koi = ku.koiname(koi)

    rowefit = jrowe_fit(koi)

    config["name"] = koi
    ra, dec = ku.radec(koi)
    config["ra"] = ra
    config["dec"] = dec
    config["rprs"] = rowefit.ix["RD1", "val"]
    config["period"] = rowefit.ix["PE1", "val"]

    config["starfield"] = kepler_starfield_file(koi)

    for kw, val in kwargs.items():
        config[kw] = val

    config["constraints"] = {}
    config["constraints"]["maxrad"] = default_r_exclusion(koi)
    try:
        config["constraints"]["secthresh"] = pipeline_weaksec(koi)
    except NoWeakSecondaryError:
        pass

    return config
示例#3
0
文件: kepler.py 项目: nespinoza/VESPA
def fpp_config(koi, **kwargs):
    """returns config object for given KOI
    """
    folder = os.path.join(KOI_FPPDIR, ku.koiname(koi))
    if not os.path.exists(folder):
        os.makedirs(folder)
    config = ConfigObj(os.path.join(folder, 'fpp.ini'))

    koi = ku.koiname(koi)

    rowefit = jrowe_fit(koi)

    config['name'] = koi
    ra, dec = ku.radec(koi)
    config['ra'] = ra
    config['dec'] = dec
    config['rprs'] = rowefit.ix['RD1', 'val']
    config['period'] = rowefit.ix['PE1', 'val']

    config['starfield'] = kepler_starfield_file(koi)

    for kw, val in kwargs.items():
        config[kw] = val

    config['constraints'] = {}
    config['constraints']['maxrad'] = default_r_exclusion(koi)
    try:
        config['constraints']['secthresh'] = pipeline_weaksec(koi)
    except NoWeakSecondaryError:
        pass

    return config
示例#4
0
文件: kepler.py 项目: nespinoza/VESPA
def weaksec_vv2(koi):
    try:
        weaksec = WEAKSECDATA.ix[ku.koiname(koi)]
        secthresh = (weaksec["depth"] + 3 * weaksec["e_depth"]) * 1e-6
        if weaksec["depth"] <= 0:
            raise KeyError

    except KeyError:
        koi = ku.koiname(koi)
        secthresh = 10 * KOIDATA.ix[koi, "koi_depth_err1"] * 1e-6
        if np.isnan(secthresh):
            secthresh = KOIDATA.ix[koi, "koi_depth"] / 2 * 1e-6
            logging.warning(
                "No (or bad) weak secondary info for {}, and no reported depth error. Defaulting to 1/2 reported depth = {}".format(
                    koi, secthresh
                )
            )
        else:
            logging.warning(
                "No (or bad) weak secondary info for {}. Defaulting to 10x reported depth error = {}".format(
                    koi, secthresh
                )
            )

    if np.isnan(secthresh):
        raise NoWeakSecondaryError(koi)

    return secthresh
示例#5
0
def fpp_config(koi, **kwargs):
    """returns config object for given KOI
    """
    folder = os.path.join(KOI_FPPDIR, ku.koiname(koi))
    if not os.path.exists(folder):
        os.makedirs(folder)
    config = ConfigObj(os.path.join(folder,'fpp.ini'))

    koi = ku.koiname(koi)

    rowefit = jrowe_fit(koi)

    config['name'] = koi
    ra,dec = ku.radec(koi)
    config['ra'] = ra
    config['dec'] = dec
    config['rprs'] = rowefit.ix['RD1','val']
    config['period'] = rowefit.ix['PE1', 'val']
    
    config['starfield'] = kepler_starfield_file(koi)

    for kw,val in kwargs.items():
        config[kw] = val

    config['constraints'] = {}
    config['constraints']['maxrad'] = default_r_exclusion(koi)
    try:
        config['constraints']['secthresh'] = pipeline_weaksec(koi)
    except NoWeakSecondaryError:
        pass

    return config
示例#6
0
def modelshift_weaksec(koi):
    """
    Max secondary depth based on model-shift secondary test from Jeff Coughlin

    secondary metric: D_sec_dv * (1 + 3*F_red_dv / sig_sec_dv)
    """
    num = ku.DATA.ix[ku.koiname(koi), 'koi_tce_plnt_num']
    if np.isnan(num):
        num = 1
    kid = ku.DATA.ix[ku.koiname(koi), 'kepid']
    tce = '{:09.0f}-{:02.0f}'.format(kid,num)

    #return largest depth between DV detrending and alternate detrending
    try:
        r = ROBOVETDATA.ix[tce]
    except KeyError:
        raise NoWeakSecondaryError(koi)

    depth_dv = r['D_sec_dv'] * (1 + 3*r['F_red_dv'] / r['sig_sec_dv'])
    depth_alt = r['D_sec_alt'] * (1 + 3*r['F_red_alt'] / r['sig_sec_alt'])
    
    logging.debug(r[['D_sec_dv','F_red_dv','sig_sec_dv']])
    logging.debug(r[['D_sec_alt','F_red_alt','sig_sec_alt']])

    if np.isnan(depth_dv) and np.isnan(depth_alt):
        #return weaksec_vv2(koi)
        raise NoWeakSecondaryError(koi)
    elif np.isnan(depth_dv):
        return depth_alt
    elif np.isnan(depth_alt):
        return depth_dv
    else:
        return max(depth_dv, depth_alt)
示例#7
0
文件: kepler.py 项目: nespinoza/VESPA
def star_config(koi,
                bands=['g', 'r', 'i', 'z', 'J', 'H', 'K'],
                unc=dict(g=0.05,
                         r=0.05,
                         i=0.05,
                         z=0.05,
                         J=0.02,
                         H=0.02,
                         K=0.02),
                **kwargs):
    """returns star config object for given KOI
    """
    folder = os.path.join(KOI_FPPDIR, ku.koiname(koi))
    if not os.path.exists(folder):
        os.makedirs(folder)

    config = ConfigObj(os.path.join(folder, 'star.ini'))

    koi = ku.koiname(koi)

    maxAV = koi_maxAV(koi)
    config['maxAV'] = maxAV

    mags = ku.KICmags(koi)
    for band in bands:
        if not np.isnan(mags[band]):
            config[band] = (mags[band], unc[band])
    config['Kepler'] = mags['Kepler']

    kepid = KOIDATA.ix[koi, 'kepid']
    try:
        m = re.match('SPE', kicu.DATA.ix[kepid, 'teff_prov'])
    except KeyError:
        raise MissingStellarError('{} not in stellar table?'.format(kepid))
    if m:
        teff, e_teff = (kicu.DATA.ix[kepid, 'teff'], kicu.DATA.ix[kepid,
                                                                  'teff_err1'])
        if not any(np.isnan([teff, e_teff])):
            config['Teff'] = (teff, e_teff)

        feh, e_feh = (kicu.DATA.ix[kepid, 'feh'], kicu.DATA.ix[kepid,
                                                               'feh_err1'])
        if not any(np.isnan([feh, e_feh])):
            config['feh'] = (feh, e_feh)
        try:
            logg, e_logg = (kicu.DATA.ix[kepid,
                                         'logg'], kicu.DATA.ix[kepid,
                                                               'logg_err1'])
            if not any(np.isnan([logg, e_logg])):
                config['logg'] = (logg, e_logg)
        except:
            pass

    for kw, val in kwargs.items():
        config[kw] = val

    return config
示例#8
0
def jrowe_fit_old(koi):
    koinum = koiname(koi, star=True, koinum=True)
    folder = os.path.join(JROWE_DIR, 'koi{}.n'.format(koinum))

    num = np.round(koiname(koi,koinum=True) % 1 * 100)
    fitfile = os.path.join(folder, 'n{:.0f}.dat'.format(num))

    logging.debug('JRowe fitfile: {}'.format(fitfile))    

    return pd.read_table(fitfile,index_col=0,usecols=(0,1,3),
                         names=['par','val','a','err','c'],
                         delimiter='\s+')
示例#9
0
文件: kepler.py 项目: nespinoza/VESPA
def jrowe_fit_old(koi):
    koinum = koiname(koi, star=True, koinum=True)
    folder = os.path.join(JROWE_DIR, "koi{}.n".format(koinum))

    num = np.round(koiname(koi, koinum=True) % 1 * 100)
    fitfile = os.path.join(folder, "n{:.0f}.dat".format(num))

    logging.debug("JRowe fitfile: {}".format(fitfile))

    return pd.read_table(
        fitfile, index_col=0, usecols=(0, 1, 3), names=["par", "val", "a", "err", "c"], delimiter="\s+"
    )
示例#10
0
def jrowe_fit_old(koi):
    koinum = koiname(koi, star=True, koinum=True)
    folder = os.path.join(JROWE_DIR, 'koi{}.n'.format(koinum))

    num = np.round(koiname(koi,koinum=True) % 1 * 100)
    fitfile = os.path.join(folder, 'n{:.0f}.dat'.format(num))

    logging.debug('JRowe fitfile: {}'.format(fitfile))

    return pd.read_table(fitfile,index_col=0,usecols=(0,1,3),
                         names=['par','val','a','err','c'],
                         delimiter='\s+')
示例#11
0
def star_config(koi, bands=['g','r','i','z','J','H','K'], 
                unc=dict(g=0.05, r=0.05, i=0.05, z=0.05,
                         J=0.02, H=0.02, K=0.02), **kwargs):

    """returns star config object for given KOI
    """
    folder = os.path.join(KOI_FPPDIR, ku.koiname(koi))
    if not os.path.exists(folder):
        os.makedirs(folder)

    config = ConfigObj(os.path.join(folder,'star.ini'))

    koi = ku.koiname(koi)

    maxAV = koi_maxAV(koi)
    config['maxAV'] = maxAV

    mags = ku.KICmags(koi)
    for band in bands:
        if not np.isnan(mags[band]):
            config[band] = (mags[band], unc[band])
    config['Kepler'] = mags['Kepler']

    kepid = ku.DATA.ix[koi,'kepid']
    try:
        m = re.match('SPE', kicu.DATA.ix[kepid, 'teff_prov'])
    except KeyError:
        raise MissingStellarError('{} not in stellar table?'.format(kepid))
    if m:
        teff, e_teff = (kicu.DATA.ix[kepid, 'teff'],
                          kicu.DATA.ix[kepid, 'teff_err1'])
        if not any(np.isnan([teff, e_teff])):
            config['Teff'] = (teff, e_teff)

        feh, e_feh = (kicu.DATA.ix[kepid, 'feh'],
                         kicu.DATA.ix[kepid, 'feh_err1'])
        if not any(np.isnan([feh, e_feh])):
            config['feh'] = (feh, e_feh)
        try:
            logg, e_logg = (kicu.DATA.ix[kepid, 'logg'],
                              kicu.DATA.ix[kepid, 'logg_err1'])
            if not any(np.isnan([logg, e_logg])):
                config['logg'] = (logg, e_logg)
        except:
            pass


    for kw,val in kwargs.items():
        config[kw] = val

    return config
示例#12
0
文件: kepler.py 项目: nespinoza/VESPA
def star_config(
    koi,
    bands=["g", "r", "i", "z", "J", "H", "K"],
    unc=dict(g=0.05, r=0.05, i=0.05, z=0.05, J=0.02, H=0.02, K=0.02),
    **kwargs
):

    """returns star config object for given KOI
    """
    folder = os.path.join(KOI_FPPDIR, ku.koiname(koi))
    if not os.path.exists(folder):
        os.makedirs(folder)

    config = ConfigObj(os.path.join(folder, "star.ini"))

    koi = ku.koiname(koi)

    maxAV = koi_maxAV(koi)
    config["maxAV"] = maxAV

    mags = ku.KICmags(koi)
    for band in bands:
        if not np.isnan(mags[band]):
            config[band] = (mags[band], unc[band])
    config["Kepler"] = mags["Kepler"]

    kepid = KOIDATA.ix[koi, "kepid"]
    try:
        m = re.match("SPE", kicu.DATA.ix[kepid, "teff_prov"])
    except KeyError:
        raise MissingStellarError("{} not in stellar table?".format(kepid))
    if m:
        teff, e_teff = (kicu.DATA.ix[kepid, "teff"], kicu.DATA.ix[kepid, "teff_err1"])
        if not any(np.isnan([teff, e_teff])):
            config["Teff"] = (teff, e_teff)

        feh, e_feh = (kicu.DATA.ix[kepid, "feh"], kicu.DATA.ix[kepid, "feh_err1"])
        if not any(np.isnan([feh, e_feh])):
            config["feh"] = (feh, e_feh)
        try:
            logg, e_logg = (kicu.DATA.ix[kepid, "logg"], kicu.DATA.ix[kepid, "logg_err1"])
            if not any(np.isnan([logg, e_logg])):
                config["logg"] = (logg, e_logg)
        except:
            pass

    for kw, val in kwargs.items():
        config[kw] = val

    return config
示例#13
0
文件: kepler.py 项目: nespinoza/VESPA
def koi_maxAV(koi):
    try:
        maxAV = MAXAV.ix[ku.koiname(koi), 'maxAV']
    except KeyError:
        ra, dec = ku.radec(koi)
        maxAV = get_AV_infinity(ra, dec)
    return maxAV
示例#14
0
文件: kepler.py 项目: nespinoza/VESPA
def setup_fpp(koi,
              bands=['g', 'r', 'i', 'z', 'J', 'H', 'K'],
              unc=dict(g=0.05, r=0.05, i=0.05, z=0.05, J=0.02, H=0.02, K=0.02),
              star_kws=None,
              fpp_kws=None,
              trsig_kws=None,
              trsig_overwrite=False,
              star_only=False,
              fpp_only=False):
    if star_kws is None:
        star_kws = {}
    if fpp_kws is None:
        fpp_kws = {}
    if trsig_kws is None:
        trsig_kws = {}

    if not star_only:
        #save transit signal
        folder = os.path.join(KOI_FPPDIR, ku.koiname(koi))
        trsig_file = os.path.join(folder, 'trsig.pkl')
        if os.path.exists(trsig_file):
            if os.path.getsize(trsig_file) == 0:
                os.remove(trsig_file)
        if not os.path.exists(trsig_file) or\
                trsig_overwrite:
            sig = JRowe_KeplerTransitSignal(koi, refit_mcmc=True, **trsig_kws)
            sig.save(os.path.join(folder, 'trsig.pkl'))
        fpp = fpp_config(koi, **fpp_kws)
        fpp.write()

    if not fpp_only:
        star = star_config(koi, bands=bands, unc=unc, **star_kws)
        star.write()
示例#15
0
def jrowe_fit(koi):
    koi = koiname(koi)

    pars = ['RHO', 'EP1','PE1', 'BB1', 'RD1']
    vals = list(JROWE_DATA.ix[koi,['rhostar','T0','P','b','rdr']])

    return pd.DataFrame({'val':vals}, index=pars)
示例#16
0
文件: kepler.py 项目: lavjams/VESPA
def koi_propdist(koi, prop):
    """
    """
    koi = ku.koiname(koi)
    kepid = ku.DATA.ix[koi, 'kepid']
    try:
        #first try cumulative table
        val = ku.DATA.ix[koi, prop]
        u1 = ku.DATA.ix[koi, prop + '_err1']
        u2 = ku.DATA.ix[koi, prop + '_err2']
    except KeyError:
        try:
            #try Huber table
            val = kicu.DATA.ix[kepid, prop]
            u1 = kicu.DATA.ix[kepid, prop + '_err1']
            u2 = kicu.DATA.ix[kepid, prop + '_err2']
        except KeyError:
            raise NoStellarPropError(koi)
    if np.isnan(val) or np.isnan(u2) or np.isnan(u1):
        raise MissingStellarPropError('{}: {} = ({},{},{})'.format(
            koi, prop, val, u1, u2))
    try:
        return dists.fit_doublegauss(val, -u2, u1)
    except:
        raise StellarPropError('{}: {} = ({},{},{})'.format(
            koi, prop, val, u1, u2))
示例#17
0
def setup_fpp(koi, bands=['g','r','i','z','J','H','K'], 
              unc=dict(g=0.05, r=0.05, i=0.05, z=0.05,
                       J=0.02, H=0.02, K=0.02), 
              star_kws=None, fpp_kws=None, trsig_kws=None,
              trsig_overwrite=False, 
              star_only=False, fpp_only=False):
    if star_kws is None:
        star_kws = {}
    if fpp_kws is None:
        fpp_kws = {}
    if trsig_kws is None:
        trsig_kws = {}
        
    if not star_only:
        #save transit signal
        folder = os.path.join(KOI_FPPDIR, ku.koiname(koi))
        trsig_file = os.path.join(folder,'trsig.pkl')
        if os.path.exists(trsig_file):
            if os.path.getsize(trsig_file)==0:
                os.remove(trsig_file)
        if not os.path.exists(trsig_file) or\
                trsig_overwrite:
            sig = JRowe_KeplerTransitSignal(koi, refit_mcmc=True,
                                            **trsig_kws)
            sig.save(os.path.join(folder,'trsig.pkl'))
        fpp = fpp_config(koi, **fpp_kws)
        fpp.write()

    if not fpp_only:
        star = star_config(koi, bands=bands, unc=unc, **star_kws)
        star.write()
示例#18
0
def koi_maxAV(koi):
    try:
        maxAV = MAXAV.ix[ku.koiname(koi),'maxAV']
    except KeyError:
        ra,dec = ku.radec(koi)
        maxAV = get_AV_infinity(ra,dec)
    return maxAV
示例#19
0
def koi_propdist(koi, prop):
    """
    """
    koi = ku.koiname(koi)
    kepid = ku.DATA.ix[koi, 'kepid']
    try:
        #first try cumulative table
        val = ku.DATA.ix[koi, prop]
        u1 = ku.DATA.ix[koi, prop+'_err1']
        u2 = ku.DATA.ix[koi, prop+'_err2']
    except KeyError:
        try:
            #try Huber table
            val = kicu.DATA.ix[kepid, prop]
            u1 = kicu.DATA.ix[kepid, prop+'_err1']
            u2 = kicu.DATA.ix[kepid, prop+'_err2']
        except KeyError:
            raise NoStellarPropError(koi)
    if np.isnan(val) or np.isnan(u2) or np.isnan(u1):
        raise MissingStellarPropError('{}: {} = ({},{},{})'.format(koi,
                                                                   prop,
                                                                   val,u1,u2))
    try:
        return dists.fit_doublegauss(val, -u2, u1)
    except:
        raise StellarPropError('{}: {} = ({},{},{})'.format(koi,
                                                            prop,
                                                            val,u1,u2))
示例#20
0
def star_config(koi, bands=['g','r','i','z','J','H','K'],
                unc=dict(g=0.05, r=0.05, i=0.05, z=0.05,
                         J=0.02, H=0.02, K=0.02), **kwargs):

    """returns star config object for given KOI
    """
    folder = os.path.join(KOI_FPPDIR, ku.koiname(koi))
    if not os.path.exists(folder):
        os.makedirs(folder)

    config = ConfigObj(os.path.join(folder,'star.ini'))

    koi = ku.koiname(koi)

    maxAV = koi_maxAV(koi)
    config['maxAV'] = maxAV

    mags = ku.KICmags(koi)
    for band in bands:
        if not np.isnan(mags[band]):
            config[band] = (mags[band], unc[band])
    config['Kepler'] = mags['Kepler']

    kepid = KOIDATA.ix[koi,'kepid']

    if use_property(kepid, 'teff'):
        teff, e_teff = (kicu.DATA.ix[kepid, 'teff'],
                          kicu.DATA.ix[kepid, 'teff_err1'])
        if not any(np.isnan([teff, e_teff])):
            config['Teff'] = (teff, e_teff)

    if use_property(kepid, 'logg'):
        logg, e_logg = (kicu.DATA.ix[kepid, 'logg'],
                          kicu.DATA.ix[kepid, 'logg_err1'])
        if not any(np.isnan([logg, e_logg])):
            config['logg'] = (logg, e_logg)

    if use_property(kepid, 'feh'):
        feh, e_feh = (kicu.DATA.ix[kepid, 'feh'],
                          kicu.DATA.ix[kepid, 'feh_err1'])
        if not any(np.isnan([feh, e_feh])):
            config['feh'] = (feh, e_feh)

    for kw,val in kwargs.items():
        config[kw] = val

    return config
示例#21
0
def jrowe_fit(koi):
    koi = koiname(koi)

    pars = ['RHO', 'EP1','PE1', 'BB1', 'RD1']
    vals = list(JROWE_DATA.ix[koi,['rhostar','T0','P','b','rdr']])

    old = jrowe_fit_old(koi)
    vals[1] = old.ix['EP1','val'] # hack to make sure epoch matches old photometry.

    return pd.DataFrame({'val':vals}, index=pars)
示例#22
0
文件: kepler.py 项目: nespinoza/VESPA
def jrowe_fit(koi):
    koi = koiname(koi)

    pars = ["RHO", "EP1", "PE1", "BB1", "RD1"]
    vals = list(JROWE_DATA.ix[koi, ["rhostar", "T0", "P", "b", "rdr"]])

    old = jrowe_fit_old(koi)
    vals[1] = old.ix["EP1", "val"]  # hack to make sure epoch matches old photometry.

    return pd.DataFrame({"val": vals}, index=pars)
示例#23
0
文件: kepler.py 项目: nespinoza/VESPA
def jrowe_fit(koi):
    koi = koiname(koi)

    pars = ['RHO', 'EP1', 'PE1', 'BB1', 'RD1']
    vals = list(JROWE_DATA.ix[koi, ['rhostar', 'T0', 'P', 'b', 'rdr']])

    old = jrowe_fit_old(koi)
    vals[1] = old.ix['EP1',
                     'val']  # hack to make sure epoch matches old photometry.

    return pd.DataFrame({'val': vals}, index=pars)
示例#24
0
def weaksec_vv2(koi):
    try:
        raise KeyError # just skip this, as WEAKSECDATA is obselete
        
        weaksec = WEAKSECDATA.ix[ku.koiname(koi)]
        secthresh = (weaksec['depth'] + 3*weaksec['e_depth'])*1e-6
        if weaksec['depth'] <= 0:
            raise KeyError

    except KeyError:
        koi = ku.koiname(koi)
        secthresh = 10*KOIDATA.ix[koi,'koi_depth_err1'] * 1e-6
        if np.isnan(secthresh):
            secthresh = KOIDATA.ix[koi,'koi_depth'] / 2 * 1e-6
            logging.warning('No (or bad) weak secondary info for {}, and no reported depth error. Defaulting to 1/2 reported depth = {}'.format(koi, secthresh))
        else:
            logging.warning('No (or bad) weak secondary info for {}. Defaulting to 10x reported depth error = {}'.format(koi, secthresh))

    if np.isnan(secthresh):
        raise NoWeakSecondaryError(koi)

    return secthresh
示例#25
0
文件: kepler.py 项目: lavjams/VESPA
    def __init__(self, koi, data_root=KPLR_ROOT):
        self.koi = koiname(koi)

        client = kplr.API(data_root=data_root)
        koinum = koiname(koi, koinum=True)
        k = client.koi(koinum)

        #get all data
        df = k.all_LCdata

        time = np.array(df['TIME'])
        flux = np.array(df['SAP_FLUX'])
        err = np.array(df['SAP_FLUX_ERR'])
        qual = np.array(df['SAP_QUALITY'])
        m = np.isfinite(time) * np.isfinite(flux) * np.isfinite(err)
        m *= qual == 0

        time = time[m]
        flux = flux[m]
        err = err[m]

        period = k.koi_period
        epoch = k.koi_time0bk
        duration = k.koi_duration
示例#26
0
    def __init__(self, koi, data_root=KPLR_ROOT):
        self.koi = koiname(koi)
        
        client = kplr.API(data_root=data_root)
        koinum = koiname(koi, koinum=True)
        k = client.koi(koinum)
        
        #get all data
        df = k.all_LCdata

        time = np.array(df['TIME'])
        flux = np.array(df['SAP_FLUX'])
        err = np.array(df['SAP_FLUX_ERR'])
        qual = np.array(df['SAP_QUALITY'])
        m = np.isfinite(time)*np.isfinite(flux)*np.isfinite(err)
        m *= qual==0

        time = time[m]
        flux = flux[m]
        err = err[m]

        period = k.koi_period
        epoch = k.koi_time0bk
        duration = k.koi_duration
示例#27
0
def pipeline_weaksec(koi):
    try:
        weaksec = WEAKSECDATA.ix[ku.koiname(koi)]
        secthresh = (weaksec['depth'] + 3*weaksec['e_depth'])*1e-6
        if weaksec['depth'] <= 0:
            raise KeyError

    except KeyError:
        secthresh = 10*ku.DATA.ix[koi,'koi_depth_err1'] * 1e-6
        if np.isnan(secthresh):
            secthresh = ku.DATA.ix[koi,'koi_depth'] / 2 * 1e-6
            logging.warning('No (or bad) weak secondary info for {}, and no reported depth error. Defaulting to 1/2 reported depth = {}'.format(koi, secthresh))
        else:
            logging.warning('No (or bad) weak secondary info for {}. Defaulting to 10x reported depth error = {}'.format(koi, secthresh))

    if np.isnan(secthresh):
        raise NoWeakSecondaryError(koi)

    return secthresh
示例#28
0
文件: kepler.py 项目: lavjams/VESPA
def pipeline_weaksec(koi):
    try:
        weaksec = WEAKSECDATA.ix[ku.koiname(koi)]
        secthresh = (weaksec['depth'] + 3 * weaksec['e_depth']) * 1e-6
        if weaksec['depth'] <= 0:
            raise KeyError

    except KeyError:
        secthresh = 10 * ku.DATA.ix[koi, 'koi_depth_err1'] * 1e-6
        if np.isnan(secthresh):
            secthresh = ku.DATA.ix[koi, 'koi_depth'] / 2 * 1e-6
            logging.warning(
                'No (or bad) weak secondary info for {}, and no reported depth error. Defaulting to 1/2 reported depth = {}'
                .format(koi, secthresh))
        else:
            logging.warning(
                'No (or bad) weak secondary info for {}. Defaulting to 10x reported depth error = {}'
                .format(koi, secthresh))

    if np.isnan(secthresh):
        raise NoWeakSecondaryError(koi)

    return secthresh
示例#29
0
文件: kepler.py 项目: lavjams/VESPA
    def __init__(self,
                 koi,
                 recalc=False,
                 use_JRowe=True,
                 trsig_kws=None,
                 tag=None,
                 starmodel_mcmc_kws=None,
                 **kwargs):

        koi = koiname(koi)

        #if saved popset exists, load
        folder = os.path.join(KOI_FPPDIR, koi)
        if tag is not None:
            folder += '_{}'.format(tag)

        if not os.path.exists(folder):
            os.makedirs(folder)

        if trsig_kws is None:
            trsig_kws = {}

        #first check if pickled signal is there to be loaded
        trsigfile = os.path.join(folder, 'trsig.pkl')
        if os.path.exists(trsigfile):
            trsig = pickle.load(open(trsigfile, 'rb'))
        else:
            if use_JRowe:
                trsig = JRowe_KeplerTransitSignal(koi, **trsig_kws)
            else:
                trsig = KeplerTransitSignal(koi, **trsig_kws)

        popsetfile = os.path.join(folder, 'popset.h5')
        if os.path.exists(popsetfile) and not recalc:
            popset = PopulationSet(popsetfile, **kwargs)

        else:
            koinum = koiname(koi, koinum=True)
            kepid = ku.DATA.ix[koi, 'kepid']

            if 'mass' not in kwargs:
                kwargs['mass'] = koi_propdist(koi, 'mass')
            if 'radius' not in kwargs:
                kwargs['radius'] = koi_propdist(koi, 'radius')
            if 'feh' not in kwargs:
                kwargs['feh'] = koi_propdist(koi, 'feh')
            if 'age' not in kwargs:
                try:
                    kwargs['age'] = koi_propdist(koi, 'age')
                except:
                    kwargs['age'] = (9.7, 0.1)  #default age
            if 'Teff' not in kwargs:
                kwargs['Teff'] = kicu.DATA.ix[kepid, 'teff']
            if 'logg' not in kwargs:
                kwargs['logg'] = kicu.DATA.ix[kepid, 'logg']
            if 'rprs' not in kwargs:
                if use_JRowe:
                    kwargs['rprs'] = trsig.rowefit.ix['RD1', 'val']
                else:
                    kwargs['rprs'] = ku.DATA.ix[koi, 'koi_ror']

            #if stellar properties are determined spectroscopically,
            # fit stellar model
            if 'starmodel' not in kwargs:
                if re.match('SPE', kicu.DATA.ix[kepid, 'teff_prov']):
                    logging.info(
                        'Spectroscopically determined stellar properties.')
                    #first, see if there already is a starmodel to load

                    #fit star model
                    Teff = kicu.DATA.ix[kepid, 'teff']
                    e_Teff = kicu.DATA.ix[kepid, 'teff_err1']
                    logg = kicu.DATA.ix[kepid, 'logg']
                    e_logg = kicu.DATA.ix[kepid, 'logg_err1']
                    feh = kicu.DATA.ix[kepid, 'feh']
                    e_feh = kicu.DATA.ix[kepid, 'feh_err1']
                    logging.info(
                        'fitting StarModel (Teff=({},{}), logg=({},{}), feh=({},{}))...'
                        .format(Teff, e_Teff, logg, e_logg, feh, e_feh))

                    dar = Dartmouth_Isochrone()
                    starmodel = StarModel(dar,
                                          Teff=(Teff, e_Teff),
                                          logg=(logg, e_logg),
                                          feh=(feh, e_feh))
                    if starmodel_mcmc_kws is None:
                        starmodel_mcmc_kws = {}
                    starmodel.fit_mcmc(**starmodel_mcmc_kws)
                    logging.info('Done.')
                    kwargs['starmodel'] = starmodel

            if 'mags' not in kwargs:
                kwargs['mags'] = ku.KICmags(koi)
            if 'ra' not in kwargs:
                kwargs['ra'], kwargs['dec'] = ku.radec(koi)
            if 'period' not in kwargs:
                kwargs['period'] = ku.DATA.ix[koi, 'koi_period']

            if 'pl_kws' not in kwargs:
                kwargs['pl_kws'] = {}

            if 'fp_specific' not in kwargs['pl_kws']:
                rp = kwargs['radius'].mu * kwargs['rprs'] * RSUN / REARTH
                kwargs['pl_kws']['fp_specific'] = fp_fressin(rp)

            #trilegal_filename = os.path.join(folder,'starfield.h5')
            trilegal_filename = kepler_starfield_file(koi)
            popset = PopulationSet(trilegal_filename=trilegal_filename,
                                   **kwargs)
            #popset.save_hdf('{}/popset.h5'.format(folder), overwrite=True)

        lhoodcachefile = os.path.join(folder, 'lhoodcache.dat')
        self.koi = koi
        FPPCalculation.__init__(self, trsig, popset, folder=folder)
        self.save()
        self.apply_default_constraints()
示例#30
0
文件: kepler.py 项目: nespinoza/VESPA
    def __init__(self, koi, recalc=False, use_JRowe=True, trsig_kws=None, tag=None, starmodel_mcmc_kws=None, **kwargs):

        koi = koiname(koi)

        # if saved popset exists, load
        folder = os.path.join(KOI_FPPDIR, koi)
        if tag is not None:
            folder += "_{}".format(tag)

        if not os.path.exists(folder):
            os.makedirs(folder)

        if trsig_kws is None:
            trsig_kws = {}

        # first check if pickled signal is there to be loaded
        trsigfile = os.path.join(folder, "trsig.pkl")
        if os.path.exists(trsigfile):
            trsig = pickle.load(open(trsigfile, "rb"))
        else:
            if use_JRowe:
                trsig = JRowe_KeplerTransitSignal(koi, **trsig_kws)
            else:
                trsig = KeplerTransitSignal(koi, **trsig_kws)

        popsetfile = os.path.join(folder, "popset.h5")
        if os.path.exists(popsetfile) and not recalc:
            popset = PopulationSet(popsetfile, **kwargs)

        else:
            koinum = koiname(koi, koinum=True)
            kepid = KOIDATA.ix[koi, "kepid"]

            if "mass" not in kwargs:
                kwargs["mass"] = koi_propdist(koi, "mass")
            if "radius" not in kwargs:
                kwargs["radius"] = koi_propdist(koi, "radius")
            if "feh" not in kwargs:
                kwargs["feh"] = koi_propdist(koi, "feh")
            if "age" not in kwargs:
                try:
                    kwargs["age"] = koi_propdist(koi, "age")
                except:
                    kwargs["age"] = (9.7, 0.1)  # default age
            if "Teff" not in kwargs:
                kwargs["Teff"] = kicu.DATA.ix[kepid, "teff"]
            if "logg" not in kwargs:
                kwargs["logg"] = kicu.DATA.ix[kepid, "logg"]
            if "rprs" not in kwargs:
                if use_JRowe:
                    kwargs["rprs"] = trsig.rowefit.ix["RD1", "val"]
                else:
                    kwargs["rprs"] = KOIDATA.ix[koi, "koi_ror"]

            # if stellar properties are determined spectroscopically,
            # fit stellar model
            if "starmodel" not in kwargs:
                if re.match("SPE", kicu.DATA.ix[kepid, "teff_prov"]):
                    logging.info("Spectroscopically determined stellar properties.")
                    # first, see if there already is a starmodel to load

                    # fit star model
                    Teff = kicu.DATA.ix[kepid, "teff"]
                    e_Teff = kicu.DATA.ix[kepid, "teff_err1"]
                    logg = kicu.DATA.ix[kepid, "logg"]
                    e_logg = kicu.DATA.ix[kepid, "logg_err1"]
                    feh = kicu.DATA.ix[kepid, "feh"]
                    e_feh = kicu.DATA.ix[kepid, "feh_err1"]
                    logging.info(
                        "fitting StarModel (Teff=({},{}), logg=({},{}), feh=({},{}))...".format(
                            Teff, e_Teff, logg, e_logg, feh, e_feh
                        )
                    )

                    dar = Dartmouth_Isochrone()
                    starmodel = StarModel(dar, Teff=(Teff, e_Teff), logg=(logg, e_logg), feh=(feh, e_feh))
                    if starmodel_mcmc_kws is None:
                        starmodel_mcmc_kws = {}
                    starmodel.fit(**starmodel_mcmc_kws)
                    logging.info("Done.")
                    kwargs["starmodel"] = starmodel

            if "mags" not in kwargs:
                kwargs["mags"] = ku.KICmags(koi)
            if "ra" not in kwargs:
                kwargs["ra"], kwargs["dec"] = ku.radec(koi)
            if "period" not in kwargs:
                kwargs["period"] = KOIDATA.ix[koi, "koi_period"]

            if "pl_kws" not in kwargs:
                kwargs["pl_kws"] = {}

            if "fp_specific" not in kwargs["pl_kws"]:
                rp = kwargs["radius"].mu * kwargs["rprs"] * RSUN / REARTH
                kwargs["pl_kws"]["fp_specific"] = fp_fressin(rp)

            # trilegal_filename = os.path.join(folder,'starfield.h5')
            trilegal_filename = kepler_starfield_file(koi)
            popset = PopulationSet(trilegal_filename=trilegal_filename, **kwargs)
            # popset.save_hdf('{}/popset.h5'.format(folder), overwrite=True)

        lhoodcachefile = os.path.join(folder, "lhoodcache.dat")
        self.koi = koi
        FPPCalculation.__init__(self, trsig, popset, folder=folder)
        self.save()
        self.apply_default_constraints()
示例#31
0
    def __init__(self,koi,mcmc=True,maxslope=None,refit_mcmc=False,
                 **kwargs):

        self.folder = '%s/koi%i.n' % (JROWE_DIR,
                                      koiname(koi,star=True,
                                                 koinum=True))
        num = np.round(koiname(koi,koinum=True) % 1 * 100)

        self.lcfile = '%s/tremove.%i.dat' % (self.folder,num)
        if (not os.path.exists(self.lcfile)) or (os.stat(self.lcfile)[6]==0):
            kepid = ku.kepid(koi)
            self.lcfile = '{}/klc{08.0f}.dct.dat'.format(self.folder,kepid)
            if not os.path.exists(self.lcfile):
                raise MissingKOIError('{} does not exist.'.format(self.lcfile))
            if os.stat(self.lcfile)[6]==0:
                raise EmptyPhotometryError('{} photometry file ({}) is empty'.format(koiname(koi),
                                                                                  self.lcfile))

        logging.debug('Reading photometry from {}'.format(self.lcfile))

        lc = pd.read_table(self.lcfile,names=['t','f','df'],
                                                  delimiter='\s+')
        self.ttfile = '%s/koi%07.2f.tt' % (self.folder,koiname(koi,koinum=True))
        self.has_ttvs = os.path.exists(self.ttfile)
        if self.has_ttvs:            
            if os.stat(self.ttfile)[6]==0:
                self.has_ttvs = False
                logging.warning('TTV file exists for {}, but is empty.  No TTVs applied.'.format(koiname(koi)))
            else:
                logging.debug('Reading transit times from {}'.format(self.ttfile))
                tts = pd.read_table(self.ttfile,names=['tc','foo1','foo2'],delimiter='\s+')

        #self.rowefitfile = '%s/n%i.dat' % (self.folder,num)

        #self.rowefit = pd.read_table(self.rowefitfile,index_col=0,usecols=(0,1,3),
        #                            names=['par','val','a','err','c'],
        #                            delimiter='\s+')
        self.rowefit = jrowe_fit(koi)


        P = self.rowefit.ix['PE1','val']
        RR = self.rowefit.ix['RD1','val']
        aR = (self.rowefit.ix['RHO','val']*G*(P*DAY)**2/(3*np.pi))**(1./3)
        cosi = self.rowefit.ix['BB1','val']/aR
        Tdur = P*DAY/np.pi*np.arcsin(1/aR * (((1+RR)**2 - (aR*cosi)**2)/(1 - cosi**2))**(0.5))/DAY

        if 1/aR * (((1+RR)**2 - (aR*cosi)**2)/(1 - cosi**2))**(0.5) > 1:
            logging.warning('arcsin argument in Tdur calculation > 1; setting to 1 for purposes of rough Tdur calculation...')
            Tdur = P*DAY/np.pi*np.arcsin(1)/DAY

        if (1+RR) < (self.rowefit.ix['BB1','val']):
            #Tdur = P*DAY/np.pi*np.arcsin(1/aR * (((1+RR)**2 - (aR*0)**2)/(1 - 0**2))**(0.5))/DAY/2.
            raise BadRoweFitError('best-fit impact parameter ({:.2f}) inconsistent with best-fit radius ratio ({}).'.format(self.rowefit.ix['BB1','val'],RR))

        if RR < 0:
            raise BadRoweFitError('{0} has negative RoR ({1}) from JRowe MCMC fit'.format(koiname(koi),RR))
        if RR > 1:
            raise BadRoweFitError('{0} has RoR > 1 ({1}) from JRowe MCMC fit'.format(koiname(koi),RR))            
        if aR < 1:
            raise BadRoweFitError('{} has a/Rstar < 1 ({}) from JRowe MCMC fit'.format(koiname(koi),aR))


        self.P = P
        self.aR = aR
        self.Tdur = Tdur
        self.epoch = self.rowefit.ix['EP1','val'] + 2504900

        logging.debug('Tdur = {:.2f}'.format(self.Tdur))
        logging.debug('aR={0}, cosi={1}, RR={2}'.format(aR,cosi,RR))
        logging.debug('arcsin arg={}'.format(1/aR * (((1+RR)**2 - (aR*cosi)**2)/(1 - cosi**2))**(0.5)))
        logging.debug('inside sqrt in arcsin arg={}'.format((((1+RR)**2 - (aR*cosi)**2)/(1 - cosi**2))))
        logging.debug('best-fit impact parameter={:.2f}'.format(self.rowefit.ix['BB1','val']))

        lc['t'] += (2450000+0.5)
        lc['f'] += 1 # - self.rowefit.ix['ZPT','val']

        if self.has_ttvs:
            tts['tc'] += 2504900

        ts = pd.Series()
        fs = pd.Series()
        dfs = pd.Series()

        if self.has_ttvs:
            for t0 in tts['tc']:
                t = lc['t'] - t0
                ok = np.absolute(t) < 2*self.Tdur
                ts = ts.append(t[ok])
                fs = fs.append(lc['f'][ok])
                dfs = dfs.append(lc['df'][ok])
        else:
            center = self.epoch % self.P
            t = np.mod(lc['t'] - center + self.P/2,self.P) - self.P/2
            ok = np.absolute(t) < 2*self.Tdur
            ts = t[ok]
            fs = lc['f'][ok]
            dfs = lc['df'][ok]

        logging.debug('{0}: has_ttvs is {1}'.format(koi,self.has_ttvs))
        logging.debug('{} light curve points used'.format(ok.sum()))


        if maxslope is None:
            #set maxslope using duration
            maxslope = max(Tdur*24/0.5 * 2, 30) #hardcoded in transitFPP as default=30

        p0 = [Tdur,RR**2,3,0]
        self.p0 = p0
        logging.debug('initial trapezoid parameters guess: {}'.format(p0))
        TransitSignal.__init__(self,np.array(ts),np.array(fs),
                               np.array(dfs),p0=p0,
                               name=koiname(koi),
                               P=P,maxslope=maxslope)
        
        if mcmc:
            self.MCMC(refit=refit_mcmc)

        if self.hasMCMC and not self.fit_converged:
            logging.warning('Trapezoidal MCMC fit did not converge for {}.'.format(self.name))
示例#32
0
文件: kepler.py 项目: lavjams/VESPA
    def __init__(self,
                 koi,
                 mcmc=True,
                 maxslope=None,
                 refit_mcmc=False,
                 **kwargs):

        self.folder = '%s/koi%i.n' % (JROWE_DIR,
                                      koiname(koi, star=True, koinum=True))
        num = np.round(koiname(koi, koinum=True) % 1 * 100)

        self.lcfile = '%s/tremove.%i.dat' % (self.folder, num)
        if not os.path.exists(self.lcfile):
            raise MissingKOIError('{} does not exist.'.format(self.lcfile))
        logging.debug('Reading photometry from {}'.format(self.lcfile))

        #break if photometry file is empty
        if os.stat(self.lcfile)[6] == 0:
            raise EmptyPhotometryError(
                '{} photometry file ({}) is empty'.format(
                    koiname(koi), self.lcfile))

        lc = pd.read_table(self.lcfile,
                           names=['t', 'f', 'df'],
                           delimiter='\s+')
        self.ttfile = '%s/koi%07.2f.tt' % (self.folder,
                                           koiname(koi, koinum=True))
        self.has_ttvs = os.path.exists(self.ttfile)
        if self.has_ttvs:
            if os.stat(self.ttfile)[6] == 0:
                self.has_ttvs = False
                logging.warning(
                    'TTV file exists for {}, but is empty.  No TTVs applied.'.
                    format(koiname(koi)))
            else:
                logging.debug('Reading transit times from {}'.format(
                    self.ttfile))
                tts = pd.read_table(self.ttfile,
                                    names=['tc', 'foo1', 'foo2'],
                                    delimiter='\s+')

        self.rowefitfile = '%s/n%i.dat' % (self.folder, num)

        self.rowefit = pd.read_table(self.rowefitfile,
                                     index_col=0,
                                     usecols=(0, 1, 3),
                                     names=['par', 'val', 'a', 'err', 'c'],
                                     delimiter='\s+')

        logging.debug('JRowe fitfile: {}'.format(self.rowefitfile))

        P = self.rowefit.ix['PE1', 'val']
        RR = self.rowefit.ix['RD1', 'val']
        aR = (self.rowefit.ix['RHO', 'val'] * G * (P * DAY)**2 /
              (3 * np.pi))**(1. / 3)
        cosi = self.rowefit.ix['BB1', 'val'] / aR
        Tdur = P * DAY / np.pi * np.arcsin(1 / aR *
                                           (((1 + RR)**2 - (aR * cosi)**2) /
                                            (1 - cosi**2))**(0.5)) / DAY

        if 1 / aR * (((1 + RR)**2 - (aR * cosi)**2) /
                     (1 - cosi**2))**(0.5) > 1:
            logging.warning(
                'arcsin argument in Tdur calculation > 1; setting to 1 for purposes of rough Tdur calculation...'
            )
            Tdur = P * DAY / np.pi * np.arcsin(1) / DAY

        if (1 + RR) < (self.rowefit.ix['BB1', 'val']):
            #Tdur = P*DAY/np.pi*np.arcsin(1/aR * (((1+RR)**2 - (aR*0)**2)/(1 - 0**2))**(0.5))/DAY/2.
            raise BadRoweFitError(
                'best-fit impact parameter ({:.2f}) inconsistent with best-fit radius ratio ({}).'
                .format(self.rowefit.ix['BB1', 'val'], RR))

        if RR < 0:
            raise BadRoweFitError(
                '{0} has negative RoR ({1}) from JRowe MCMC fit'.format(
                    koiname(koi), RR))
        if RR > 1:
            raise BadRoweFitError(
                '{0} has RoR > 1 ({1}) from JRowe MCMC fit'.format(
                    koiname(koi), RR))
        if aR < 1:
            raise BadRoweFitError(
                '{} has a/Rstar < 1 ({}) from JRowe MCMC fit'.format(
                    koiname(koi), aR))

        self.P = P
        self.aR = aR
        self.Tdur = Tdur
        self.epoch = self.rowefit.ix['EP1', 'val'] + 2504900

        logging.debug('Tdur = {:.2f}'.format(self.Tdur))
        logging.debug('aR={0}, cosi={1}, RR={2}'.format(aR, cosi, RR))
        logging.debug('arcsin arg={}'.format(
            1 / aR * (((1 + RR)**2 - (aR * cosi)**2) / (1 - cosi**2))**(0.5)))
        logging.debug('inside sqrt in arcsin arg={}'.format(
            (((1 + RR)**2 - (aR * cosi)**2) / (1 - cosi**2))))
        logging.debug('best-fit impact parameter={:.2f}'.format(
            self.rowefit.ix['BB1', 'val']))

        lc['t'] += (2450000 + 0.5)
        lc['f'] += 1 - self.rowefit.ix['ZPT', 'val']

        if self.has_ttvs:
            tts['tc'] += 2504900

        ts = pd.Series()
        fs = pd.Series()
        dfs = pd.Series()

        if self.has_ttvs:
            for t0 in tts['tc']:
                t = lc['t'] - t0
                ok = np.absolute(t) < 2 * self.Tdur
                ts = ts.append(t[ok])
                fs = fs.append(lc['f'][ok])
                dfs = dfs.append(lc['df'][ok])
        else:
            center = self.epoch % self.P
            t = np.mod(lc['t'] - center + self.P / 2, self.P) - self.P / 2
            ok = np.absolute(t) < 2 * self.Tdur
            ts = t[ok]
            fs = lc['f'][ok]
            dfs = lc['df'][ok]

        logging.debug('{0}: has_ttvs is {1}'.format(koi, self.has_ttvs))
        logging.debug('{} light curve points used'.format(ok.sum()))

        if maxslope is None:
            #set maxslope using duration
            maxslope = max(Tdur * 24 / 0.5 * 2,
                           30)  #hardcoded in transitFPP as default=30

        p0 = [Tdur, RR**2, 3, 0]
        self.p0 = p0
        logging.debug('initial trapezoid parameters guess: {}'.format(p0))
        TransitSignal.__init__(self,
                               np.array(ts),
                               np.array(fs),
                               np.array(dfs),
                               p0=p0,
                               name=koiname(koi),
                               P=P,
                               maxslope=maxslope)

        if mcmc:
            self.MCMC(refit=refit_mcmc)

        if self.hasMCMC and not self.fit_converged:
            logging.warning(
                'Trapezoidal MCMC fit did not converge for {}.'.format(
                    self.name))
示例#33
0
    def __init__(self, koi, recalc=False,
                 use_JRowe=True, trsig_kws=None,
                 tag=None, starmodel_mcmc_kws=None,
                 **kwargs):

        koi = koiname(koi)

        #if saved popset exists, load
        folder = os.path.join(KOI_FPPDIR,koi)
        if tag is not None:
            folder += '_{}'.format(tag)

        if not os.path.exists(folder):
            os.makedirs(folder)

        if trsig_kws is None:
            trsig_kws = {}

        #first check if pickled signal is there to be loaded
        trsigfile = os.path.join(folder,'trsig.pkl')
        if os.path.exists(trsigfile):
            trsig = pickle.load(open(trsigfile,'rb'))
        else:
            if use_JRowe:
                trsig = JRowe_KeplerTransitSignal(koi, **trsig_kws)
            else:
                trsig = KeplerTransitSignal(koi, **trsig_kws)

        popsetfile = os.path.join(folder,'popset.h5')
        if os.path.exists(popsetfile) and not recalc:
            popset = PopulationSet(popsetfile, **kwargs)

        else:
            koinum = koiname(koi, koinum=True)
            kepid = ku.DATA.ix[koi,'kepid']

            if 'mass' not in kwargs:
                kwargs['mass'] = koi_propdist(koi, 'mass')
            if 'radius' not in kwargs:
                kwargs['radius'] = koi_propdist(koi, 'radius')
            if 'feh' not in kwargs:
                kwargs['feh'] = koi_propdist(koi, 'feh')
            if 'age' not in kwargs:
                try:
                    kwargs['age'] = koi_propdist(koi, 'age')
                except:
                    kwargs['age'] = (9.7,0.1) #default age
            if 'Teff' not in kwargs:
                kwargs['Teff'] = kicu.DATA.ix[kepid,'teff']
            if 'logg' not in kwargs:
                kwargs['logg'] = kicu.DATA.ix[kepid,'logg']
            if 'rprs' not in kwargs:
                if use_JRowe:
                    kwargs['rprs'] = trsig.rowefit.ix['RD1','val']
                else:
                    kwargs['rprs'] = ku.DATA.ix[koi,'koi_ror']
                    
            #if stellar properties are determined spectroscopically,
            # fit stellar model
            if 'starmodel' not in kwargs:
                if re.match('SPE', kicu.DATA.ix[kepid, 'teff_prov']):
                    logging.info('Spectroscopically determined stellar properties.')
                    #first, see if there already is a starmodel to load

                    #fit star model
                    Teff = kicu.DATA.ix[kepid, 'teff']
                    e_Teff = kicu.DATA.ix[kepid, 'teff_err1']
                    logg = kicu.DATA.ix[kepid, 'logg']
                    e_logg = kicu.DATA.ix[kepid, 'logg_err1']
                    feh = kicu.DATA.ix[kepid, 'feh']
                    e_feh = kicu.DATA.ix[kepid, 'feh_err1']
                    logging.info('fitting StarModel (Teff=({},{}), logg=({},{}), feh=({},{}))...'.format(Teff, e_Teff, logg, e_logg, feh, e_feh))

                    dar = Dartmouth_Isochrone()
                    starmodel = StarModel(dar, Teff=(Teff, e_Teff),
                                          logg=(logg, e_logg),
                                          feh=(feh, e_feh))
                    if starmodel_mcmc_kws is None:
                        starmodel_mcmc_kws = {}
                    starmodel.fit(**starmodel_mcmc_kws)
                    logging.info('Done.')
                    kwargs['starmodel'] = starmodel
                


            if 'mags' not in kwargs:
                kwargs['mags'] = ku.KICmags(koi)
            if 'ra' not in kwargs:
                kwargs['ra'], kwargs['dec'] = ku.radec(koi)
            if 'period' not in kwargs:
                kwargs['period'] = ku.DATA.ix[koi,'koi_period']

            if 'pl_kws' not in kwargs:
                kwargs['pl_kws'] = {}

            if 'fp_specific' not in kwargs['pl_kws']:
                rp = kwargs['radius'].mu * kwargs['rprs'] * RSUN/REARTH
                kwargs['pl_kws']['fp_specific'] = fp_fressin(rp)

            #trilegal_filename = os.path.join(folder,'starfield.h5')
            trilegal_filename = kepler_starfield_file(koi)
            popset = PopulationSet(trilegal_filename=trilegal_filename,
                                   **kwargs)
            #popset.save_hdf('{}/popset.h5'.format(folder), overwrite=True)


        lhoodcachefile = os.path.join(folder,'lhoodcache.dat')
        self.koi = koi
        FPPCalculation.__init__(self, trsig, popset,
                                folder=folder)
        self.save()
        self.apply_default_constraints()