In [8]:
%autosave 10
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from scipy import optimize, integrate
import astropy.units as u
import astropy.constants as c
from astropy import cosmology
from astroquery.vizier import Vizier


Autosaving every 10 seconds

In [7]:
vizier = Vizier(row_limit=1000)
tables = vizier.get_catalogs('J/A+A/568/A22/tablef3')
table = tables[0]
table


Out[7]:
<Table masked=True length=740>
Namezcmbzhelmbe_mbx1e_x1ce_clogMste_logMsttmaxe_tmaxcov_mb_s_cov_mb_c_cov_s_c_setRAJ2000DEJ2000biasSimbadName
magmag[Msun][Msun]dddegdegmag
bytes12float32float32float32float32float32float32float32float32float32float32float64float32float32float32float32uint8float64float64float32bytes17
03D1au0.5030.504323.0020.0881.2730.150-0.0120.0309.5170.11052909.7450.2140.000790.00044-0.00003136.043210-4.0374690.002SNLS 03D1au
03D1aw0.5810.582023.5740.0900.9740.274-0.0250.0379.1690.08852902.8980.3530.002820.000410.00157136.061634-4.5171580.001SNLS 03D1aw
03D1ax0.4950.496022.9600.088-0.7290.102-0.1000.03011.5800.11252915.9240.1120.000540.00047-0.00002136.097287-4.7207740.002SNLS 03D1ax
03D1bp0.3460.347022.3980.087-1.1550.113-0.0410.02710.8210.12452920.2490.1030.001110.000620.00029136.657235-4.8387790.000SNLS 03D1bp
03D1co0.6780.679024.0780.0980.6190.404-0.0390.0678.6470.28452954.4580.4550.011860.000780.00590136.567748-4.935050-0.003SNLS 03D1co
03D1dt0.6110.612023.2850.093-1.1621.641-0.0950.0509.7150.09252962.2530.9770.029670.000950.04436136.629968-4.0523410.000SNLS 03D1dt
03D1ew0.8660.868024.3540.1060.3760.348-0.0630.0688.5300.80552991.7420.6650.00318-0.001600.00409136.058795-4.665852-0.018SNLS 03D1ew
03D1fc0.3310.332021.8610.0860.6500.119-0.0180.02410.3910.03653002.7640.1040.001010.000530.00054136.431648-4.144059-0.001SNLS 03D1fc
03D1fq0.7990.800024.5100.102-1.0570.407-0.0560.06510.6510.12752999.2130.6560.00590-0.001120.00355136.731935-4.302217-0.012SNLS 03D1fq
...............................................................
sn2006td0.0160.015915.7200.153-1.3210.1080.0900.0279.5100.28154098.9800.238-0.000290.00071-0.00019329.56567036.349380-0.009sn2006td
sn2007ae0.0630.064417.7980.1401.8490.293-0.0100.03111.3200.10754153.1230.647-0.002290.00092-0.000313255.46695079.031740-0.020sn2007ae
sn2007bc0.0220.020815.9020.146-1.2240.081-0.0140.02910.8140.16554200.3550.1420.000090.00077-0.000163169.81069020.808960-0.009sn2007bc
sn2007bd0.0320.031016.5810.141-1.3810.064-0.0480.02710.7360.13054206.5440.0560.000000.00066-0.000163127.889060-1.199370-0.011sn2007bd
sn2007ci0.0190.018115.8930.149-2.7240.0990.0270.02811.1170.14854246.6540.0640.000490.000750.000183176.44105019.770480-0.009sn2007ci
sn2007co0.0270.027016.5040.142-0.1380.0610.1050.02010.5200.28154265.2120.0570.000100.000380.000013275.76500029.897050-0.010sn2007co
sn2007cq0.0250.025915.7980.143-0.6580.116-0.0610.0269.7050.28154281.0260.0710.000390.000640.000073333.6684305.080160-0.010sn2007cq
sn2007f0.0240.023615.8960.1440.6190.041-0.0550.02610.0270.11854124.0580.045-0.000050.00064-0.000183195.81275050.618760-0.009sn2007f
sn2007qe0.0240.024016.0680.1440.7610.0460.0520.0266.0005.00054429.8520.0370.000100.00065-0.000083358.55399027.409170-0.009sn2007qe
sn2008bf0.0220.021315.7190.1450.4310.069-0.0380.02111.2120.15654555.1090.0900.000140.00041-0.000103181.01199020.245080-0.009sn2008bf

In [27]:
z = table['zcmb']
mb = table['mb']
x1 = table['x1']
color = table['c']

def mu(mb, x1, color, Mb, alpha, beta):
    return mb - Mb + alpha*x1 - beta*color

def distance(z, H0, o_l):
    """Luminosity distance
    
    Paramters
    ---------
    z: float
        Redshift
    H0: float
        Hubble constant, km/s/Mpc
    o_l: float
        Omega_Lambda
        
    Returns
    -------
    float, pc
    """
    if not isinstance(z, np.ndarray):
        z = np.array([z])
    dist = np.empty(shape=z.shape)
    for i, zi in enumerate(z):
        d = integrate.quad(
            lambda z: 1. / np.sqrt(o_l + (1-o_l)*(1+z)**3),
            0, zi
        )[0] * (1+zi) * c.c.to_value(u.km/u.s) / H0
        dist[i] = d
    return 1e6 * dist

def mu_th(z, H0, o_l):
    return 5 * np.log10(distance(z, H0, o_l)) - 5

def test_distance():
    planck = cosmology.Planck15
    z = 1
    d1 = distance(
        z,
        planck.H0.to_value(u.km/u.s/u.Mpc),
        planck.Ode0
    )
    d2 = planck.luminosity_distance(z).to_value(u.pc)
    eps = 1e-3
    assert abs(d1-d2) < d1*eps

test_distance()

def chi2(H0, mb, x1, color, z):
    mu1 = mu(mb, x1, color, -19, 0.14, 3.1)
    mu2 = mu_th(z, H0, 0.7)
    return np.sum(np.square(mu1-mu2))

optimize.minimize(
   chi2,
   [50.0],
   args=(mb, x1, color, z),
)


Out[27]:
      fun: 21.658101136713267
 hess_inv: array([[ 0.75077332]])
      jac: array([ -3.81469727e-06])
  message: 'Optimization terminated successfully.'
     nfev: 27
      nit: 7
     njev: 9
   status: 0
  success: True
        x: array([ 72.41636836])

In [ ]: