Пример #1
0
    def test_evaluate(self, temperature):

        bolometric_flux = 1000 * u.L_sun / (4 * np.pi * (1.5 * u.pc)**2)

        b = BlackBody1D(temperature=temperature,
                        bolometric_flux=bolometric_flux)

        assert_quantity_allclose(b(1.4 * u.micron), 4734463.93280426 * u.Jy)
        assert_quantity_allclose(b(214.13747 * u.THz), 4734463.93280426 * u.Jy)
Пример #2
0
    def test_fit(self):

        fitter = LevMarLSQFitter()

        b = BlackBody1D(3000 * u.K)

        wav = np.array([0.5, 5, 10]) * u.micron
        fnu = np.array([1, 10, 5]) * u.Jy

        b_fit = fitter(b, wav, fnu)

        assert_quantity_allclose(b_fit.temperature, 2840.7438339457754 * u.K)
        assert_quantity_allclose(b_fit.bolometric_flux, 6.821837075583734e-08 * u.erg / u.cm**2 / u.s)
Пример #3
0
    def func(params, return_model=False):
        bb = BlackBody1D(params[3] * u.K)(wav).to(FLAM,
                                                  u.spectral_density(wav))
        bb /= np.trapz(bb, wav)
        sens = sens_raw * bb.value
        sens /= np.nanmedian(sens)

        model = params[2] * np.interp(
            x * params[0] + params[1] + meanw,
            wav.value,
            sens,
        )
        if return_model:
            return model
        return np.nansum((data - model)**2) / (np.isfinite(model).sum())
Пример #4
0
def wavelength_calibrate(visit):
    hdu = fits.open(CALIPATH + f"WFC3.IR.{visit.filter}.1st.sens.2.fits")
    x = (np.arange(visit.trace.shape[0]) / visit.trace.shape[0]) - 0.5
    data = np.copy(visit.trace) / np.median(visit.trace)
    cent = np.average(np.arange(data.shape[0]), weights=data)

    sens_raw = hdu[1].data["SENSITIVITY"]
    wav = hdu[1].data["WAVELENGTH"] * u.angstrom
    bb = BlackBody1D(visit.st_teff * u.K)(wav).to(FLAM,
                                                  u.spectral_density(wav))
    bb /= np.trapz(bb, wav)
    sens = sens_raw * bb.value
    sens /= np.nanmedian(sens)

    if visit.filter == "G141":
        dw = 17000 - 10500
        meanw = (10500 + 17000) / 2
    else:
        dw = 11500 - 7700
        meanw = (11500 + 7700) / 2

    x = x * dw

    def func(params, return_model=False):
        bb = BlackBody1D(params[3] * u.K)(wav).to(FLAM,
                                                  u.spectral_density(wav))
        bb /= np.trapz(bb, wav)
        sens = sens_raw * bb.value
        sens /= np.nanmedian(sens)

        model = params[2] * np.interp(
            x * params[0] + params[1] + meanw,
            wav.value,
            sens,
        )
        if return_model:
            return model
        return np.nansum((data - model)**2) / (np.isfinite(model).sum())

    r = minimize(
        func,
        [1, 0, 1, visit.st_teff],
        method="Powell",
        bounds=[
            (0.1, 2),
            (-1000, 1000),
            (0.4, 3),
            (visit.st_teff - 2000, visit.st_teff + 2000),
        ],
    )
    wavelength = (x * r.x[0] + r.x[1] + meanw) * u.angstrom
    sensitivity_t = func(r.x, True)
    sensitivity = np.interp(
        x * r.x[0] + r.x[1] + meanw,
        wav.value,
        sens_raw,
    )
    sensitivity_raw = sensitivity.copy()
    sensitivity /= np.median(sensitivity)
    return (
        wavelength[~visit.trace_mask],
        sensitivity[~visit.trace_mask],
        sensitivity_t[~visit.trace_mask],
        sensitivity_raw[~visit.trace_mask],
    )