Exemplo n.º 1
0
    def obyo(y, tag, nusdx, nus, mdbCO, mdbH2O, cdbH2H2, cdbH2He):
        #CO
        SijM_CO, ngammaLM_CO, nsigmaDl_CO = exomol(mdbCO, Tarr, Parr, R_CO,
                                                   molmassCO)
        xsm_CO = xsmatrix(cnu_CO, indexnu_CO, R_CO, pmarray_CO, nsigmaDl_CO,
                          ngammaLM_CO, SijM_CO, nus, dgm_ngammaL_CO)
        dtaumCO = dtauM(dParr, jnp.abs(xsm_CO), MMR_CO * ONEARR, molmassCO, g)

        #H2O
        SijM_H2O, ngammaLM_H2O, nsigmaDl_H2O = exomol(mdbH2O, Tarr, Parr,
                                                      R_H2O, molmassH2O)
        xsm_H2O = xsmatrix(cnu_H2O, indexnu_H2O, R_H2O, pmarray_H2O,
                           nsigmaDl_H2O, ngammaLM_H2O, SijM_H2O, nus,
                           dgm_ngammaL_H2O)
        dtaumH2O = dtauM(dParr, jnp.abs(xsm_H2O), MMR_H2O * ONEARR, molmassH2O,
                         g)

        #CIA
        dtaucH2H2=dtauCIA(nus,Tarr,Parr,dParr,vmrH2,vmrH2,\
                          mmw,g,cdbH2H2.nucia,cdbH2H2.tcia,cdbH2H2.logac)
        dtaucH2He=dtauCIA(nus,Tarr,Parr,dParr,vmrH2,vmrHe,\
                          mmw,g,cdbH2He.nucia,cdbH2He.tcia,cdbH2He.logac)

        dtau = dtaumCO + dtaumH2O + dtaucH2H2 + dtaucH2He
        sourcef = planck.piBarr(Tarr, nus)

        Ftoa = Fref / Rp**2
        F0 = rtrun(dtau, sourcef) / baseline / Ftoa

        Frot = response.rigidrot(nus, F0, vsini, u1, u2)
        mu = response.ipgauss_sampling(nusdx, nus, Frot, beta, RV)

        errall = jnp.sqrt(e1**2 + sigma**2)
        numpyro.sample(tag, dist.Normal(mu, errall), obs=y)
Exemplo n.º 2
0
def model_c(nu1, y1, e1):
    Rp = sample('Rp', dist.Uniform(0.5, 1.5))
    Mp = sample('Mp', dist.Normal(33.5, 0.3))
    RV = sample('RV', dist.Uniform(26.0, 30.0))
    MMR_CO = sample('MMR_CO', dist.Uniform(0.0, maxMMR_CO))
    MMR_H2O = sample('MMR_H2O', dist.Uniform(0.0, maxMMR_H2O))
    T0 = sample('T0', dist.Uniform(1000.0, 1700.0))
    alpha = sample('alpha', dist.Uniform(0.05, 0.15))
    vsini = sample('vsini', dist.Uniform(10.0, 20.0))

    # Kipping Limb Darkening Prior
    q1 = sample('q1', dist.Uniform(0.0, 1.0))
    q2 = sample('q2', dist.Uniform(0.0, 1.0))
    u1, u2 = ld_kipping(q1, q2)

    #GP
    logtau = sample('logtau', dist.Uniform(-1.5, 0.5))  #tau=1 <=> 5A
    tau = 10**(logtau)
    loga = sample('loga', dist.Uniform(-4.0, -2.0))
    a = 10**(loga)

    #gravity
    g = getjov_gravity(Rp, Mp)

    #T-P model//
    Tarr = T0 * (Parr / Pref)**alpha

    #CO
    SijM_CO, gammaLM_CO, sigmaDM_CO = exomol(mdbCO, Tarr, Parr, molmassCO)
    xsm_CO = xsmatrix(numatrix_CO, sigmaDM_CO, gammaLM_CO, SijM_CO)
    dtaumCO = dtauM(dParr, xsm_CO, MMR_CO * ONEARR, molmassCO, g)

    #H2O
    SijM_H2O, gammaLM_H2O, sigmaDM_H2O = exomol(mdbH2O, Tarr, Parr, molmassH2O)
    xsm_H2O = xsmatrix(numatrix_H2O, sigmaDM_H2O, gammaLM_H2O, SijM_H2O)
    dtaumH2O = dtauM(dParr, xsm_H2O, MMR_H2O * ONEARR, molmassH2O, g)

    #CIA
    dtaucH2H2=dtauCIA(nus,Tarr,Parr,dParr,vmrH2,vmrH2,\
                      mmw,g,cdbH2H2.nucia,cdbH2H2.tcia,cdbH2H2.logac)
    dtaucH2He=dtauCIA(nus,Tarr,Parr,dParr,vmrH2,vmrHe,\
                      mmw,g,cdbH2He.nucia,cdbH2He.tcia,cdbH2He.logac)

    dtau = dtaumCO + dtaumH2O + dtaucH2H2 + dtaucH2He
    sourcef = planck.piBarr(Tarr, nus)
    Ftoa = Fref / Rp**2
    F0 = rtrun(dtau, sourcef) / baseline / Ftoa

    Frot = response.rigidrot(nus, F0, vsini, u1, u2)
    mu = response.ipgauss_sampling(nu1, nus, Frot, beta, RV)
    cov = gpkernel_RBF(nu1, tau, a, e1)
    sample("y1",
           dist.MultivariateNormal(loc=mu, covariance_matrix=cov),
           obs=y1)
Exemplo n.º 3
0
    def obyo(y, tag, nusd, nus, numatrix_CO, numatrix_H2O, mdbCO, mdbH2O,
             cdbH2H2, cdbH2He):
        #CO
        SijM_CO=jit(vmap(SijT,(0,None,None,None,0)))\
            (Tarr,mdbCO.logsij0,mdbCO.dev_nu_lines,mdbCO.elower,qt_CO)

        gammaLMP_CO = jit(vmap(gamma_hitran,(0,0,0,None,None,None)))\
                    (Parr*0.99,Tarr,Parr*0.01,mdbCO.n_air,mdbCO.gamma_air,mdbCO.gamma_self)
        gammaLMN_CO = gamma_natural(mdbCO.A)
        gammaLM_CO = gammaLMP_CO + gammaLMN_CO[None, :]
        sigmaDM_CO=jit(vmap(doppler_sigma,(None,0,None)))\
            (mdbCO.dev_nu_lines,Tarr,molmassCO)
        xsm_CO = xsmatrix(numatrix_CO, sigmaDM_CO, gammaLM_CO, SijM_CO)
        dtaumCO = dtauM(dParr, xsm_CO, MMR_CO * ONEARR, molmassCO, g)

        #H2O
        SijM_H2O=jit(vmap(SijT,(0,None,None,None,0)))\
            (Tarr,mdbH2O.logsij0,mdbH2O.dev_nu_lines,mdbH2O.elower,qt_H2O)
        gammaLMP_H2O = jit(vmap(gamma_exomol,(0,0,None,None)))\
            (Parr,Tarr,mdbH2O.n_Texp,mdbH2O.alpha_ref)
        gammaLMN_H2O = gamma_natural(mdbH2O.A)
        gammaLM_H2O = gammaLMP_H2O + gammaLMN_H2O[None, :]
        sigmaDM_H2O=jit(vmap(doppler_sigma,(None,0,None)))\
            (mdbH2O.dev_nu_lines,Tarr,molmassH2O)
        xsm_H2O = xsmatrix(numatrix_H2O, sigmaDM_H2O, gammaLM_H2O, SijM_H2O)
        dtaumH2O = dtauM(dParr, xsm_H2O, MMR_H2O * ONEARR, molmassH2O, g)
        #CIA
        dtaucH2H2=dtauCIA(nus,Tarr,Parr,dParr,vmrH2,vmrH2,\
                          mmw,g,cdbH2H2.nucia,cdbH2H2.tcia,cdbH2H2.logac)
        dtaucH2He=dtauCIA(nus,Tarr,Parr,dParr,vmrH2,vmrHe,\
                          mmw,g,cdbH2He.nucia,cdbH2He.tcia,cdbH2He.logac)

        dtau = dtaumCO + dtaumH2O + dtaucH2H2 + dtaucH2He
        sourcef = planck.piBarr(Tarr, nus)

        Ftoa = Fref / (Rp**2)
        F0 = rtrun(dtau, sourcef) / baseline / Ftoa

        Frot = response.rigidrot(nus, F0, vsini, u1, u2)
        mu = response.ipgauss_sampling(nusd, nus, Frot, beta, RV)

        #errall=jnp.sqrt(e1**2+sigma**2)
        errall = e1
        cov = modelcov(nusd, tau, a, errall)
        #cov = modelcov(nusd,tau,a,e1)
        #numpyro.sample(tag, dist.Normal(mu, e1), obs=y)
        numpyro.sample(tag,
                       dist.MultivariateNormal(loc=mu, covariance_matrix=cov),
                       obs=y)
Exemplo n.º 4
0
    def obyo(y, tag, nusd, nus, numatrix_CO, mdbCO, cdbH2H2):
        # CO
        SijM_CO = jit(vmap(SijT,
                           (0, None, None, None, 0)))(Tarr, mdbCO.logsij0,
                                                      mdbCO.dev_nu_lines,
                                                      mdbCO.elower, qt_CO)
        gammaLMP_CO = jit(vmap(gamma_exomol,
                               (0, 0, None, None)))(Parr, Tarr, mdbCO.n_Texp,
                                                    mdbCO.alpha_ref)
        gammaLMN_CO = gamma_natural(mdbCO.A)
        gammaLM_CO = gammaLMP_CO + gammaLMN_CO[None, :]

        sigmaDM_CO = jit(vmap(doppler_sigma,
                              (None, 0, None)))(mdbCO.dev_nu_lines, Tarr,
                                                molmassCO)
        xsm_CO = xsmatrix(numatrix_CO, sigmaDM_CO, gammaLM_CO, SijM_CO)
        dtaumCO = dtauM(dParr, xsm_CO, MMR_CO * ONEARR, molmassCO, g)
        # CIA
        dtaucH2H2 = dtauCIA(nus, Tarr, Parr, dParr, vmrH2, vmrH2, mmw, g,
                            cdbH2H2.nucia, cdbH2H2.tcia, cdbH2H2.logac)
        dtau = dtaumCO + dtaucH2H2
        sourcef = planck.piBarr(Tarr, nus)
        F0 = rtrun(dtau, sourcef) / norm

        Frot = response.rigidrot(nus, F0, vsini, u1, u2)
        mu = response.ipgauss_sampling(nusd, nus, Frot, beta, RV)
        numpyro.sample(tag, dist.Normal(mu, sigmain), obs=y)
Exemplo n.º 5
0
    def obyo(y, tag, nusd, nus, numatrix_CO, numatrix_H2O, mdbCO, mdbH2O,
             cdbH2H2, cdbH2He):
        #CO
        SijM_CO=jit(vmap(SijT,(0,None,None,None,0)))\
            (Tarr,mdbCO.logsij0,mdbCO.dev_nu_lines,mdbCO.elower,qt_CO)
        gammaLMP_CO = jit(vmap(gamma_exomol,(0,0,None,None)))\
            (Parr,Tarr,mdbCO.n_Texp,mdbCO.alpha_ref)
        gammaLMN_CO = gamma_natural(mdbCO.A)
        gammaLM_CO = gammaLMP_CO + gammaLMN_CO[None, :]
        sigmaDM_CO=jit(vmap(doppler_sigma,(None,0,None)))\
            (mdbCO.dev_nu_lines,Tarr,molmassCO)
        xsm_CO = xsmatrix(numatrix_CO, sigmaDM_CO, gammaLM_CO, SijM_CO)
        dtaumCO = dtauM(dParr, xsm_CO, MMR_CO * ONEARR, molmassCO, g)
        #H2O
        SijM_H2O=jit(vmap(SijT,(0,None,None,None,0)))\
            (Tarr,mdbH2O.logsij0,mdbH2O.dev_nu_lines,mdbH2O.elower,qt_H2O)
        gammaLMP_H2O = jit(vmap(gamma_exomol,(0,0,None,None)))\
            (Parr,Tarr,mdbH2O.n_Texp,mdbH2O.alpha_ref)
        gammaLMN_H2O = gamma_natural(mdbH2O.A)
        gammaLM_H2O = gammaLMP_H2O + gammaLMN_H2O[None, :]
        sigmaDM_H2O=jit(vmap(doppler_sigma,(None,0,None)))\
            (mdbH2O.dev_nu_lines,Tarr,molmassH2O)
        xsm_H2O = xsmatrix(numatrix_H2O, sigmaDM_H2O, gammaLM_H2O, SijM_H2O)
        dtaumH2O = dtauM(dParr, xsm_H2O, MMR_H2O * ONEARR, molmassH2O, g)
        #CIA
        dtaucH2H2=dtauCIA(nus,Tarr,Parr,dParr,vmrH2,vmrH2,\
                          mmw,g,cdbH2H2.nucia,cdbH2H2.tcia,cdbH2H2.logac)
        dtaucH2He=dtauCIA(nus,Tarr,Parr,dParr,vmrH2,vmrHe,\
                          mmw,g,cdbH2He.nucia,cdbH2He.tcia,cdbH2He.logac)

        dtau = dtaumCO + dtaumH2O + dtaucH2H2 + dtaucH2He
        sourcef = planck.piBarr(Tarr, nus)

        Ftoa = Fref / Rp**2
        F0 = rtrun(dtau, sourcef) / baseline / Ftoa

        Frot = response.rigidrot(nus, F0, vsini, u1, u2)
        mu = response.ipgauss_sampling(nusd, nus, Frot, beta, RV)
        np.savez("dtau_lpf.npz", [nus, dtaumCO, dtaumH2O])
        return mu
Exemplo n.º 6
0
    def obyo(y, tag, nusdx, nus, mdbCO, mdbH2O, cdbH2H2, cdbH2He):
        #CO
        SijM_CO, ngammaLM_CO, nsigmaDl_CO = exomol(mdbCO, Tarr, Parr, R_CO,
                                                   molmassCO)
        xsm_CO = xsmatrix(cnu_CO, indexnu_CO, R_CO, pmarray_CO, nsigmaDl_CO,
                          ngammaLM_CO, SijM_CO, nus, dgm_ngammaL_CO)
        dtaumCO = dtauM(dParr, jnp.abs(xsm_CO), MMR_CO * ONEARR, molmassCO, g)

        #H2O
        SijM_H2O, ngammaLM_H2O, nsigmaDl_H2O = exomol(mdbH2O, Tarr, Parr,
                                                      R_H2O, molmassH2O)
        xsm_H2O = xsmatrix(cnu_H2O, indexnu_H2O, R_H2O, pmarray_H2O,
                           nsigmaDl_H2O, ngammaLM_H2O, SijM_H2O, nus,
                           dgm_ngammaL_H2O)
        dtaumH2O = dtauM(dParr, jnp.abs(xsm_H2O), MMR_H2O * ONEARR, molmassH2O,
                         g)

        #CIA
        dtaucH2H2=dtauCIA(nus,Tarr,Parr,dParr,vmrH2,vmrH2,\
                          mmw,g,cdbH2H2.nucia,cdbH2H2.tcia,cdbH2H2.logac)
        dtaucH2He=dtauCIA(nus,Tarr,Parr,dParr,vmrH2,vmrHe,\
                          mmw,g,cdbH2He.nucia,cdbH2He.tcia,cdbH2He.logac)

        dtau = dtaumCO + dtaumH2O + dtaucH2H2 + dtaucH2He
        sourcef = planck.piBarr(Tarr, nus)

        Ftoa = Fref / Rp**2
        F0 = rtrun(dtau, sourcef) / baseline / Ftoa

        Frot = response.rigidrot(nus, F0, vsini, u1, u2)
        mu = response.ipgauss_sampling(nusdx, nus, Frot, beta, RV)
        if FP64 == True:

            np.savez("dtau_modit" + str(N) + "_64.npz",
                     [nus, dtaumCO, dtaumH2O])
        else:
            np.savez("dtau_modit" + str(N) + ".npz", [nus, dtaumCO, dtaumH2O])

        return mu
Exemplo n.º 7
0
def frun(Tarr, MMR_CH4, Mp, Rp, u1, u2, RV, vsini):
    g = 2478.57730044555 * Mp / Rp**2
    SijM_CH4, ngammaLM_CH4, nsigmaDl_CH4 = modit.exomol(
        mdbCH4, Tarr, Parr, R, molmassCH4)
    xsm_CH4 = modit.xsmatrix(cnu, indexnu, R, pmarray, nsigmaDl_CH4,
                             ngammaLM_CH4, SijM_CH4, nus, dgm_ngammaL)
    # abs is used to remove negative values in xsv
    dtaumCH4 = dtauM(dParr, jnp.abs(xsm_CH4), MMR_CH4 * ONEARR, molmassCH4, g)
    # CIA
    dtaucH2H2 = dtauCIA(nus, Tarr, Parr, dParr, vmrH2, vmrH2, mmw, g,
                        cdbH2H2.nucia, cdbH2H2.tcia, cdbH2H2.logac)
    dtau = dtaumCH4 + dtaucH2H2
    sourcef = planck.piBarr(Tarr, nus)
    F0 = rtrun(dtau, sourcef) / norm
    Frot = response.rigidrot(nus, F0, vsini, u1, u2)
    mu = response.ipgauss_sampling(nusd, nus, Frot, beta_inst, RV)
    return mu
Exemplo n.º 8
0
    def addcia(self, interaction, mmr1, mmr2):
        """
        Args:
           interaction: e.g. H2-H2, H2-He
           mmr1: mass mixing ratio for molecule 1
           mmr2: mass mixing ratio for molecule 2

        """
        mol1, mol2 = defcia.interaction2mols(interaction)
        molmass1 = molinfo.molmass(mol1)
        molmass2 = molinfo.molmass(mol2)
        vmr1 = (mmr1 * self.mmw / molmass1)
        vmr2 = (mmr2 * self.mmw / molmass2)
        ciapath = pathlib.Path(self.databasedir) / \
            pathlib.Path(defcia.ciafile(interaction))
        cdb = contdb.CdbCIA(str(ciapath), [self.nus[0], self.nus[-1]])
        dtauc = dtauCIA(self.nus, self.Tarr, self.Parr, self.dParr, vmr1, vmr2,
                        self.mmw, self.gravity, cdb.nucia, cdb.tcia, cdb.logac)
        self.dtau = self.dtau + dtauc
Exemplo n.º 9
0
def frun(Tarr, MMR_H2O, MMR_CO, Mp, Rp, u1, u2, RV, vsini):
    g = 2478.57730044555 * Mp / Rp**2
    SijM_H2O, ngammaLM_H2O, nsigmaDl_H2O = modit.exomol(
        mdbH2O, Tarr, Parr, R, molmassH2O)
    xsm_H2O = modit.xsmatrix(cnu_H2O, indexnu_H2O, R_H2O, pmarray_H2O,
                             nsigmaDl_H2O, ngammaLM_H2O, SijM_H2O, nus,
                             dgm_ngammaL_H2O)
    dtaumH2O = dtauM(dParr, jnp.abs(xsm_H2O), MMR_H2O * ONEARR, molmassH2O, g)

    SijM_CO, ngammaLM_CO, nsigmaDl_CO = modit.exomol(mdbCO, Tarr, Parr, R,
                                                     molmassCO)
    xsm_CO = modit.xsmatrix(cnu_CO, indexnu_CO, R_CO, pmarray_CO, nsigmaDl_CO,
                            ngammaLM_CO, SijM_CO, nus, dgm_ngammaL_CO)
    dtaumCO = dtauM(dParr, jnp.abs(xsm_CO), MMR_CO * ONEARR, molmassCO, g)

    # CIA
    dtaucH2H2 = dtauCIA(nus, Tarr, Parr, dParr, vmrH2, vmrH2, mmw, g,
                        cdbH2H2.nucia, cdbH2H2.tcia, cdbH2H2.logac)
    dtau = dtaumH2O + dtaumCO + dtaucH2H2
    sourcef = planck.piBarr(Tarr, nus)
    F0 = rtrun(dtau, sourcef) / norm
    Frot = response.rigidrot(nus, F0, vsini, u1, u2)
    mu = response.ipgauss_sampling(nusd, nus, Frot, beta_inst, RV)
    return mu
Exemplo n.º 10
0
def mask_weakline(mdb_mol,
                  Parr,
                  dParr,
                  Tarr,
                  SijM,
                  gammaLM,
                  sigmaDM,
                  MMR_mol,
                  molmass_mol,
                  mmw,
                  g,
                  vmrH2,
                  cdbH2H2,
                  margin=2,
                  mask=None,
                  Nlim=1000):
    """masking weak lines compared to CIA H2-H2 continuum.

    Args:
       mdb_mol: mdb
       Parr: pressure layer (bar)
       dParr: delta pressure layer (bar)
       Tarr: temperature layer (K)
       SijM: Sij matrix
       gammaLM: gamma coefficient matrix
       sigmaDM: Doppler broadening matrix
       MMR_mol: Mass Mixing Ratio of the molecule
       molmass_mol: molecualr mass of the molecule
       mmw: mean molecular weight of the atmosphere
       gravity: gravity (cm/s2)
       vmrH2: volume mixing ratio of H2
       cdbH2H2: cdb

    Returns:
       mask (weak line mask), maxcf (P at max contribution function for the molecule), maxcia (P at max contribution function for CIA)
    """

    xsm0 = xsmatrix0(sigmaDM, gammaLM, SijM)  # cross section at line centers
    dtaumol = dtauM(dParr, xsm0, MMR_mol, molmass_mol, g)
    ndtaumol = np.asarray(dtaumol)
    dtaucH2H2 = dtauCIA(mdb_mol.nu_lines, Tarr, Parr, dParr, vmrH2, vmrH2, mmw,
                        g, cdbH2H2.nucia, cdbH2H2.tcia, cdbH2H2.logac)
    ndtaucH2H2 = np.asarray(dtaucH2H2)

    Nl = len(mdb_mol.nu_lines)

    if Nl < Nlim:
        cf_mol = contfunc(dtaumol, mdb_mol.nu_lines, Parr, dParr, Tarr)
        maxcf = np.argmax(cf_mol, axis=0)
    else:
        M = int(float(Nl) / float(Nlim)) + 1
        maxcf = np.array([], dtype=np.int)
        for n in range(0, M):
            i = n * Nlim
            j = min((n + 1) * Nlim, Nl)
            cf_mol = contfunc(ndtaumol[:, i:j], mdb_mol.nu_lines[i:j], Parr,
                              dParr, Tarr)
            maxcf_tmp = np.argmax(cf_mol, axis=0)
            maxcf = np.concatenate([maxcf, maxcf_tmp])

    if Nl < Nlim:
        cfCIA = contfunc(dtaucH2H2, mdb_mol.nu_lines, Parr, dParr, Tarr)
        maxcia = np.argmax(cfCIA, axis=0)
    else:
        M = int(float(Nl) / float(Nlim)) + 1
        maxcia = np.array([], dtype=np.int)
        for n in range(0, M):
            i = n * Nlim
            j = min((n + 1) * Nlim, Nl)
            cfCIA = contfunc(ndtaucH2H2[:, i:j], mdb_mol.nu_lines[i:j], Parr,
                             dParr, Tarr)
            maxcia_tmp = np.argmax(cfCIA, axis=0)
            maxcia = np.concatenate([maxcia, maxcia_tmp])

    mask1 = (maxcf > 0) * (maxcf < maxcia + margin)
    if mask is None:
        mask = mask1
    else:
        mask = mask1 + mask

    return mask, maxcf, maxcia
Exemplo n.º 11
0
# MMR=0.0059 #mass mixing ratio

# 0-padding for negative values
xsmnp = np.array(xsmmodit)
print(len(xsmnp[xsmnp < 0.0]))
xsmnp[xsmnp < 0.0] = 0.0
xsmditc = jnp.array(xsmnp)
# -------------------------------

dtaum = dtauM(dParr, xsmditc, MMR * np.ones_like(Tarr), molmassCH4, g)

mmw = 2.33  # mean molecular weight
mmrH2 = 0.74
molmassH2 = molinfo.molmass('H2')
vmrH2 = (mmrH2 * mmw / molmassH2)  # VMR
dtaucH2H2 = dtauCIA(nus, Tarr, Parr, dParr, vmrH2, vmrH2, mmw, g,
                    cdbH2H2.nucia, cdbH2H2.tcia, cdbH2H2.logac)

dtau = dtaum + dtaucH2H2

plotcf(nus, dtau, Tarr, Parr, dParr)
plt.show()

# radiative transfering...

# In[26]:

sourcef = planck.piBarr(Tarr, nus)
F0 = rtrun(dtau, sourcef)

wavd = jnp.linspace(15910, 16290, 1500)  # observational wavelength grid
nusd = 1.e8 / wavd[::-1]