def test_agreement_with_sigma8():
    """test sigma8 works basic to jdem"""
    cosmo_base = defaults.cosmology_wmap.copy()
    cosmo_base = cp.add_derived_pars(cosmo_base, 'jdem')
    cosmo_base['de_model'] = 'constant_w'
    cosmo_base['w'] = -1.
    cosmo_base['sigma8'] = 0.7925070693605805
    power_params = defaults.power_params.copy()
    power_params.camb['maxkh'] = 3.
    power_params.camb['kmax'] = 10.
    power_params.camb['npoints'] = 1000
    power_params.camb['accuracy'] = 2
    power_params.camb['leave_h'] = False
    power_params_jdem = deepcopy(power_params)
    power_params_jdem.camb['force_sigma8'] = False
    power_params_basi = deepcopy(power_params)
    power_params_basi.camb['force_sigma8'] = True

    cosmo_jdem = cosmo_base.copy()
    cosmo_jdem['p_space'] = 'jdem'
    C_fid_jdem = cp.CosmoPie(cosmo_jdem, 'jdem')
    P_jdem = mps.MatterPower(C_fid_jdem, power_params_jdem)
    C_fid_jdem.set_power(P_jdem)

    cosmo_basi = cosmo_base.copy()
    cosmo_basi['p_space'] = 'basic'
    C_fid_basi = cp.CosmoPie(cosmo_basi, 'basic')
    P_basi = mps.MatterPower(C_fid_basi, power_params_basi)
    C_fid_basi.set_power(P_basi)

    zs = np.arange(0.2, 1.41, 0.40)
    z_fine = np.linspace(0.001, 1.4, 1000)

    geo_jdem = FullSkyGeo(zs, C_fid_jdem, z_fine)
    geo_basi = FullSkyGeo(zs, C_fid_basi, z_fine)

    jdem_pars = np.array(
        ['ns', 'Omegamh2', 'Omegabh2', 'OmegaLh2', 'LogAs', 'w'])
    jdem_eps = np.array([0.002, 0.00025, 0.0001, 0.00025, 0.01, 0.01])

    basi_pars = np.array(['ns', 'Omegamh2', 'Omegabh2', 'h', 'sigma8', 'w'])
    basi_eps = np.array([0.002, 0.00025, 0.0001, 0.00025, 0.001, 0.01])

    sw_params = defaults.sw_survey_params.copy()
    len_params = defaults.lensing_params.copy()
    sw_observable_list = defaults.sw_observable_list.copy()
    nz_wfirst_lens = NZWFirstEff(defaults.nz_params_wfirst_lens.copy())
    prior_params = defaults.prior_fisher_params.copy()
    basis_params = defaults.basis_params.copy()

    sw_survey_jdem = sws.SWSurvey(geo_jdem, 'wfirst', C_fid_jdem, sw_params,
                                  jdem_pars, jdem_eps, sw_observable_list,
                                  len_params, nz_wfirst_lens)

    sw_survey_basi = sws.SWSurvey(geo_basi, 'wfirst', C_fid_basi, sw_params,
                                  basi_pars, basi_eps, sw_observable_list,
                                  len_params, nz_wfirst_lens)
    #need to fix As because the code cannot presently do this
    for itr in range(0, basi_pars.size):
        for i in range(0, 2):
            cosmo_alt_basi = sw_survey_basi.len_pow.Cs_pert[
                itr, i].cosmology.copy()
            n_As = 10
            logAs = np.linspace(cosmo_alt_basi['LogAs'] * 0.9,
                                cosmo_alt_basi['LogAs'] * 1.1, n_As)
            As = np.exp(logAs)
            sigma8s = np.zeros(n_As)
            for itr2 in xrange(0, n_As):
                cosmo_alt_basi['As'] = As[itr2]
                cosmo_alt_basi['LogAs'] = logAs[itr2]
                sigma8s[itr2] = camb_sigma8(cosmo_alt_basi,
                                            power_params_basi.camb)
            logAs_interp = InterpolatedUnivariateSpline(sigma8s[::-1],
                                                        logAs[::-1],
                                                        ext=2,
                                                        k=3)

            sw_survey_basi.len_pow.Cs_pert[
                itr, i].cosmology['LogAs'] = logAs_interp(
                    sw_survey_basi.len_pow.Cs_pert[itr, i].cosmology['sigma8'])
            sw_survey_basi.len_pow.Cs_pert[itr, i].cosmology['As'] = np.exp(
                sw_survey_basi.len_pow.Cs_pert[itr, i].cosmology['LogAs'])

    dO_dpar_jdem = sw_survey_jdem.get_dO_I_dpar_array()
    dO_dpar_basi = sw_survey_basi.get_dO_I_dpar_array()

    response_pars = np.array([
        'ns', 'Omegach2', 'Omegabh2', 'Omegamh2', 'OmegaLh2', 'h', 'LogAs',
        'w', 'sigma8'
    ])

    l_max = 24

    r_max_jdem = geo_jdem.r_fine[-1]
    k_cut_jdem = 30. / r_max_jdem
    basis_jdem = SphBasisK(r_max_jdem,
                           C_fid_jdem,
                           k_cut_jdem,
                           basis_params,
                           l_ceil=l_max,
                           needs_m=True)
    SS_jdem = SuperSurvey(np.array([sw_survey_jdem]),
                          np.array([]),
                          basis_jdem,
                          C_fid_jdem,
                          prior_params,
                          get_a=False,
                          do_unmitigated=True,
                          do_mitigated=False)

    r_max_basi = geo_basi.r_fine[-1]
    k_cut_basi = 30. / r_max_basi
    basis_basi = SphBasisK(r_max_basi,
                           C_fid_basi,
                           k_cut_basi,
                           basis_params,
                           l_ceil=l_max,
                           needs_m=True)
    SS_basi = SuperSurvey(np.array([sw_survey_basi]),
                          np.array([]),
                          basis_basi,
                          C_fid_basi,
                          prior_params,
                          get_a=False,
                          do_unmitigated=True,
                          do_mitigated=False)

    #dO_dpar_jdem_to_basi = np.zeros_like(dO_dpar_jdem)
    #dO_dpar_basi_to_jdem = np.zeros_like(dO_dpar_basi)

    project_basi_to_jdem = np.zeros((jdem_pars.size, basi_pars.size))

    response_derivs_jdem = np.zeros((response_pars.size, jdem_pars.size))
    response_derivs_basi = np.zeros((response_pars.size, basi_pars.size))
    for i in range(0, response_pars.size):
        for j in range(0, jdem_pars.size):
            response_derivs_jdem[i, j] = (
                sw_survey_jdem.len_pow.Cs_pert[j,
                                               0].cosmology[response_pars[i]] -
                sw_survey_jdem.len_pow.Cs_pert[j, 1].cosmology[
                    response_pars[i]]) / (jdem_eps[j] * 2.)
            response_derivs_basi[i, j] = (
                sw_survey_basi.len_pow.Cs_pert[j,
                                               0].cosmology[response_pars[i]] -
                sw_survey_basi.len_pow.Cs_pert[j, 1].cosmology[
                    response_pars[i]]) / (basi_eps[j] * 2.)

    project_jdem_to_basi = np.zeros((basi_pars.size, jdem_pars.size))
    project_basi_to_jdem = np.zeros((jdem_pars.size, basi_pars.size))
    for itr1 in range(0, basi_pars.size):
        for itr2 in range(0, response_pars.size):
            if response_pars[itr2] in jdem_pars:
                name = response_pars[itr2]
                i = np.argwhere(jdem_pars == name)[0, 0]
                project_jdem_to_basi[itr1, i] = response_derivs_basi[itr2,
                                                                     itr1]
    for itr1 in range(0, jdem_pars.size):
        for itr2 in range(0, response_pars.size):
            if response_pars[itr2] in basi_pars:
                name = response_pars[itr2]
                i = np.argwhere(basi_pars == name)[0, 0]
                project_basi_to_jdem[itr1, i] = response_derivs_jdem[itr2,
                                                                     itr1]
    assert np.allclose(np.dot(dO_dpar_jdem, project_jdem_to_basi.T),
                       dO_dpar_basi,
                       rtol=1.e-3,
                       atol=np.max(dO_dpar_basi) * 1.e-4)
    assert np.allclose(np.dot(dO_dpar_basi, project_basi_to_jdem.T),
                       dO_dpar_jdem,
                       rtol=1.e-3,
                       atol=np.max(dO_dpar_jdem) * 1.e-4)

    #basi p_space cannot currently do priors by itself
    f_p_priors_basi = np.dot(
        project_jdem_to_basi,
        np.dot(SS_jdem.multi_f.fisher_priors.get_fisher(),
               project_jdem_to_basi.T))

    for i in range(0, 1):
        f_np_jdem = SS_jdem.f_set_nopriors[i][2].get_fisher().copy()
        f_np_basi = SS_basi.f_set_nopriors[i][2].get_fisher().copy()
        f_np_jdem_to_basi = np.dot(project_jdem_to_basi,
                                   np.dot(f_np_jdem, project_jdem_to_basi.T))
        f_np_basi_to_jdem = np.dot(project_basi_to_jdem,
                                   np.dot(f_np_basi, project_basi_to_jdem.T))
        assert np.allclose(f_np_jdem_to_basi, f_np_basi, rtol=1.e-2)
        assert np.allclose(f_np_basi_to_jdem, f_np_jdem, rtol=1.e-2)

        f_p_jdem = SS_jdem.f_set[i][2].get_fisher().copy()
        f_p_basi = SS_basi.f_set_nopriors[i][2].get_fisher().copy(
        ) + f_p_priors_basi.copy()
        f_p_jdem_to_basi = np.dot(project_jdem_to_basi,
                                  np.dot(f_p_jdem, project_jdem_to_basi.T))
        f_p_basi_to_jdem = np.dot(project_basi_to_jdem,
                                  np.dot(f_p_basi, project_basi_to_jdem.T))
        assert np.allclose(f_p_jdem_to_basi, f_p_basi, rtol=1.e-2)
        assert np.allclose(f_p_basi_to_jdem, f_p_jdem, rtol=1.e-2)
    print(f_np_jdem / f_np_basi_to_jdem)
    print(f_np_basi / f_np_jdem_to_basi)
    #z_fine = np.arange(0.0001,z_max,0.0001)
    z_fine = np.linspace(0.001, z_max, 2)

    print("main: building basis")
    basis_params = defaults.basis_params.copy()
    basis_params['n_bessel_oversample'] = 400000
    basis_params['x_grid_size'] = 100000

    r_max = C.D_comov(z_max)
    k_cut = x_cut / r_max
    k_tests = np.linspace(20. / r_max, k_cut, 25)
    n_basis = np.zeros(k_tests.size)
    variances = np.zeros((k_tests.size, z_coarse.size - 1, z_coarse.size - 1))

    time4 = time()
    basis = SphBasisK(r_max, C, k_cut, basis_params, l_ceil=l_max)
    time5 = time()

    time2 = time()
    pixelated = True
    if pixelated:
        res_healpix = 9
        max_n_pixels = 12 * (2**res_healpix)**2
        #n_pixels = np.unique(np.hstack([np.logspace(3,np.log10(max_n_pixels),40).astype(np.int),np.linspace(1000,max_n_pixels,40).astype(np.int)]))
        n_pixels = np.array([max_n_pixels / 2]).astype(np.int)
        #n_pixels = np.array([1000,2000,3000,4000,5000,10000,20000,30000,40000,49152])
        n_bins = n_pixels.size
        all_pixels = get_healpix_pixelation(res_choose=res_healpix)
        #n_pixels = np.linspace(1,max_n_pixels,80).astype(np.int)#np.unique(np.hstack([np.logspace(0,np.log10(max_n_pixels),40).astype(np.int),np.linspace(1,max_n_pixels,40).astype(np.int)]))
    else:
        radii = np.array([0.1, 0.2, 0.3, 0.4, 0.8, 1.6, 3.])
def test_pipeline_consistency():
    """test full pipeline consistency with rotation jdem vs lihu"""
    cosmo_base = defaults.cosmology_wmap.copy()
    cosmo_base = cp.add_derived_pars(cosmo_base, 'jdem')
    cosmo_base['de_model'] = 'constant_w'
    cosmo_base['w'] = -1.
    power_params = defaults.power_params.copy()
    power_params.camb['maxkh'] = 1.
    power_params.camb['kmax'] = 1.
    power_params.camb['npoints'] = 1000
    power_params.camb['accuracy'] = 2
    power_params.camb['leave_h'] = False

    cosmo_jdem = cosmo_base.copy()
    cosmo_jdem['p_space'] = 'jdem'
    C_fid_jdem = cp.CosmoPie(cosmo_jdem, 'jdem')
    P_jdem = mps.MatterPower(C_fid_jdem, power_params.copy())
    C_fid_jdem.set_power(P_jdem)

    cosmo_lihu = cosmo_base.copy()
    cosmo_lihu['p_space'] = 'lihu'
    C_fid_lihu = cp.CosmoPie(cosmo_lihu, 'lihu')
    P_lihu = mps.MatterPower(C_fid_lihu, power_params.copy())
    C_fid_lihu.set_power(P_lihu)

    zs = np.arange(0.2, 1.41, 0.40)
    z_fine = np.linspace(0.001, 1.4, 1000)

    geo_jdem = FullSkyGeo(zs, C_fid_jdem, z_fine)
    geo_lihu = FullSkyGeo(zs, C_fid_lihu, z_fine)

    jdem_pars = np.array(
        ['ns', 'Omegamh2', 'Omegabh2', 'OmegaLh2', 'LogAs', 'w'])
    jdem_eps = np.array([0.002, 0.00025, 0.0001, 0.00025, 0.1, 0.01])

    lihu_pars = np.array(['ns', 'Omegach2', 'Omegabh2', 'h', 'LogAs', 'w'])
    lihu_eps = np.array([0.002, 0.00025, 0.0001, 0.00025, 0.1, 0.01])

    sw_params = defaults.sw_survey_params.copy()
    len_params = defaults.lensing_params.copy()
    sw_observable_list = defaults.sw_observable_list.copy()
    nz_wfirst_lens = NZWFirstEff(defaults.nz_params_wfirst_lens.copy())
    prior_params = defaults.prior_fisher_params.copy()
    basis_params = defaults.basis_params.copy()

    sw_survey_jdem = sws.SWSurvey(geo_jdem, 'wfirst', C_fid_jdem, sw_params,
                                  jdem_pars, jdem_eps, sw_observable_list,
                                  len_params, nz_wfirst_lens)
    sw_survey_lihu = sws.SWSurvey(geo_lihu, 'wfirst', C_fid_lihu, sw_params,
                                  lihu_pars, lihu_eps, sw_observable_list,
                                  len_params, nz_wfirst_lens)

    #dO_dpar_jdem = sw_survey_jdem.get_dO_I_dpar_array()
    #dO_dpar_lihu = sw_survey_lihu.get_dO_I_dpar_array()

    response_pars = np.array([
        'ns', 'Omegach2', 'Omegabh2', 'Omegamh2', 'OmegaLh2', 'h', 'LogAs', 'w'
    ])
    response_derivs_jdem_pred = np.array(
        [[1., 0., 0., 0., 0., 0., 0., 0.],
         [0., 1., 0., 1., 0., 1. / (2. * C_fid_jdem.cosmology['h']), 0., 0.],
         [0., -1., 1., 0., 0., 0., 0., 0.],
         [0., 0., 0., 0., 1., 1. / (2. * C_fid_jdem.cosmology['h']), 0., 0.],
         [0., 0., 0., 0., 0., 0., 1., 0.], [0., 0., 0., 0., 0., 0., 0., 1.]]).T
    response_derivs_lihu_pred = np.array(
        [[1., 0., 0., 0., 0., 0., 0., 0.], [0., 1., 0., 1., -1., 0., 0., 0.],
         [0., 0., 1., 1., -1., 0., 0., 0.],
         [0., 0., 0., 0., 2. * C_fid_lihu.cosmology['h'], 1., 0., 0.],
         [0., 0., 0., 0., 0., 0., 1., 0.], [0., 0., 0., 0., 0., 0., 0., 1.]]).T

    l_max = 24

    r_max_jdem = geo_jdem.r_fine[-1]
    k_cut_jdem = 30. / r_max_jdem
    basis_jdem = SphBasisK(r_max_jdem,
                           C_fid_jdem,
                           k_cut_jdem,
                           basis_params,
                           l_ceil=l_max,
                           needs_m=True)
    SS_jdem = SuperSurvey(np.array([sw_survey_jdem]),
                          np.array([]),
                          basis_jdem,
                          C_fid_jdem,
                          prior_params,
                          get_a=False,
                          do_unmitigated=True,
                          do_mitigated=False)

    r_max_lihu = geo_lihu.r_fine[-1]
    k_cut_lihu = 30. / r_max_lihu
    basis_lihu = SphBasisK(r_max_lihu,
                           C_fid_lihu,
                           k_cut_lihu,
                           basis_params,
                           l_ceil=l_max,
                           needs_m=True)
    SS_lihu = SuperSurvey(np.array([sw_survey_lihu]),
                          np.array([]),
                          basis_lihu,
                          C_fid_lihu,
                          prior_params,
                          get_a=False,
                          do_unmitigated=True,
                          do_mitigated=False)

    #dO_dpar_jdem_to_lihu = np.zeros_like(dO_dpar_jdem)
    #dO_dpar_lihu_to_jdem = np.zeros_like(dO_dpar_lihu)

    project_lihu_to_jdem = np.zeros((jdem_pars.size, lihu_pars.size))

    #f_g_jdem_to_lihu = np.zeros((lihu_pars.size,lihu_pars.size))
    #f_g_lihu_to_jdem = np.zeros((jdem_pars.size,jdem_pars.size))
    response_derivs_jdem = np.zeros((response_pars.size, jdem_pars.size))
    response_derivs_lihu = np.zeros((response_pars.size, lihu_pars.size))
    for i in range(0, response_pars.size):
        for j in range(0, jdem_pars.size):
            response_derivs_jdem[i, j] = (
                sw_survey_jdem.len_pow.Cs_pert[j,
                                               0].cosmology[response_pars[i]] -
                sw_survey_jdem.len_pow.Cs_pert[j, 1].cosmology[
                    response_pars[i]]) / (jdem_eps[j] * 2.)
            response_derivs_lihu[i, j] = (
                sw_survey_lihu.len_pow.Cs_pert[j,
                                               0].cosmology[response_pars[i]] -
                sw_survey_lihu.len_pow.Cs_pert[j, 1].cosmology[
                    response_pars[i]]) / (lihu_eps[j] * 2.)
    assert np.allclose(response_derivs_jdem, response_derivs_jdem_pred)
    assert np.allclose(response_derivs_lihu, response_derivs_lihu_pred)

    project_jdem_to_lihu = np.zeros((lihu_pars.size, jdem_pars.size))
    project_lihu_to_jdem = np.zeros((jdem_pars.size, lihu_pars.size))
    for itr1 in range(0, lihu_pars.size):
        for itr2 in range(0, response_pars.size):
            if response_pars[itr2] in jdem_pars:
                name = response_pars[itr2]
                i = np.argwhere(jdem_pars == name)[0, 0]
                project_jdem_to_lihu[itr1, i] = response_derivs_lihu[itr2,
                                                                     itr1]
    for itr1 in range(0, jdem_pars.size):
        for itr2 in range(0, response_pars.size):
            if response_pars[itr2] in lihu_pars:
                name = response_pars[itr2]
                i = np.argwhere(lihu_pars == name)[0, 0]
                project_lihu_to_jdem[itr1, i] = response_derivs_jdem[itr2,
                                                                     itr1]
    #assert np.allclose(np.dot(dO_dpar_jdem,project_jdem_to_lihu.T),dO_dpar_lihu,rtol=1.e-3,atol=np.max(dO_dpar_lihu)*1.e-4)
    #assert np.allclose(np.dot(dO_dpar_lihu,project_lihu_to_jdem.T),dO_dpar_jdem,rtol=1.e-3,atol=np.max(dO_dpar_jdem)*1.e-4)

    #lihu p_space cannot currently do priors by itself
    f_p_priors_lihu = np.dot(
        project_jdem_to_lihu,
        np.dot(SS_jdem.multi_f.fisher_priors.get_fisher(),
               project_jdem_to_lihu.T))

    f_set_jdem_in = np.zeros(3, dtype=object)
    f_set_lihu_in = np.zeros(3, dtype=object)
    for i in range(0, 3):
        f_set_jdem_in[i] = SS_jdem.f_set_nopriors[i][2].get_fisher().copy()
        f_set_lihu_in[i] = SS_lihu.f_set_nopriors[i][2].get_fisher().copy()

    f_np_lihu2 = rotate_jdem_to_lihu(f_set_jdem_in, C_fid_jdem)
    f_np_jdem2 = rotate_lihu_to_jdem(f_set_lihu_in, C_fid_lihu)
    f_np_lihu3 = rotate_jdem_to_lihu(f_np_jdem2, C_fid_jdem)
    f_np_jdem3 = rotate_lihu_to_jdem(f_np_lihu2, C_fid_lihu)

    for i in range(0, 3):
        f_np_jdem = SS_jdem.f_set_nopriors[i][2].get_fisher().copy()
        f_np_lihu = SS_lihu.f_set_nopriors[i][2].get_fisher().copy()
        f_np_jdem_to_lihu = np.dot(project_jdem_to_lihu,
                                   np.dot(f_np_jdem, project_jdem_to_lihu.T))
        f_np_lihu_to_jdem = np.dot(project_lihu_to_jdem,
                                   np.dot(f_np_lihu, project_lihu_to_jdem.T))
        assert np.allclose(f_set_lihu_in[i], f_np_lihu3[i])
        assert np.allclose(f_set_jdem_in[i], f_np_jdem3[i])
        assert np.allclose(f_np_jdem_to_lihu, f_np_lihu2[i])
        assert np.allclose(f_np_lihu_to_jdem, f_np_jdem2[i])
        assert np.allclose(f_np_jdem_to_lihu, f_np_lihu, rtol=1.e-3)
        assert np.allclose(f_np_lihu_to_jdem, f_np_jdem, rtol=1.e-3)
        assert np.allclose(f_set_lihu_in[i], f_np_lihu2[i], rtol=1.e-3)
        assert np.allclose(f_set_jdem_in[i], f_np_jdem2[i], rtol=1.e-3)
        assert np.allclose(f_np_jdem3[i], f_np_jdem2[i], rtol=1.e-3)
        assert np.allclose(f_np_lihu3[i], f_np_lihu2[i], rtol=1.e-3)
        f_p_jdem = SS_jdem.f_set[i][2].get_fisher().copy()
        f_p_lihu = SS_lihu.f_set_nopriors[i][2].get_fisher().copy(
        ) + f_p_priors_lihu.copy()
        f_p_jdem_to_lihu = np.dot(project_jdem_to_lihu,
                                  np.dot(f_p_jdem, project_jdem_to_lihu.T))
        f_p_lihu_to_jdem = np.dot(project_lihu_to_jdem,
                                  np.dot(f_p_lihu, project_lihu_to_jdem.T))
        assert np.allclose(f_p_jdem_to_lihu, f_p_lihu, rtol=1.e-3)
        assert np.allclose(f_p_lihu_to_jdem, f_p_jdem, rtol=1.e-3)
Esempio n. 4
0
def test_full_sky():
    """do some tests with a full sky geo known results"""
    #get dictionaries of parameters that various functions will need
    #cosmo = defaults.cosmology_wmap.copy()
    cosmo = {   'Omegabh2':0.02223,
                'Omegach2':0.1153,
                'Omegab'  :0.04283392714316876,
                'Omegac'  :0.22216607285683124,
                'Omegamh2':0.13752999999999999,
                'OmegaL'  :0.735,
                'OmegaLh2':0.38145113207547166,
                'Omegam'  :0.265,
                'H0'      :72.04034509047493,
                'sigma8'  : 0.8269877678406697, #from the code
                'h'       :0.7204034509047493,
                'Omegak'  : 0.0,
                'Omegakh2': 0.0,
                'Omegar'  : 0.0,
                'Omegarh2': 0.0,
                'ns'      : 0.9608,
                'tau'     : 0.081,
                'Yp'      :0.299,
                'As'      : 2.464*10**-9,
                'LogAs'   :-19.821479791275138,
                'w'       :-1.0,
                'de_model':'constant_w',#dark energy model
                'mnu'     :0.}
    cosmo['de_model'] = 'constant_w'
    cosmo['wa'] = 0.
    cosmo['w0'] = -1.
    cosmo['w'] = -1.
    p_space = 'jdem'
    camb_params = defaults.camb_params.copy()
    camb_params['force_sigma8'] = False
    camb_params['maxkh'] = 100.
    camb_params['kmax'] = 30.
    camb_params['npoints'] = 10000
    camb_params['pivot_scalar'] = 0.002

    power_params = defaults.power_params.copy()
    power_params.camb = camb_params
    power_params.camb['accuracy'] = 1
    #prior_params = defaults.prior_fisher_params.copy()


    zs = np.array([0.0001,3.])
    z_fine = np.linspace(0.0001,zs[-1],10000)

    basis_params = defaults.basis_params.copy()
    basis_params['n_bessel_oversample'] = 400000*10

    C = CosmoPie(cosmo,p_space=p_space)
    l_max = 0
    x_cut = 10*np.pi

    z_max = z_fine[-1]+0.000001
    r_max = C.D_comov(z_max)
    k_cut = x_cut/r_max
    P = MatterPower(C,power_params)
    C.set_power(P)
    geo1 = FullSkyGeo(zs,C,z_fine)

    basis = SphBasisK(r_max,C,k_cut,basis_params,l_ceil=l_max,needs_m=True)

    ddbar = basis.get_ddelta_bar_ddelta_alpha(geo1,tomography=True)
    ns = np.arange(1,ddbar.size+1)
    ddbar_pred = -3./(2.*np.pi**(5./2.))*(-1)**ns/ns**2
    assert np.allclose(ddbar,ddbar_pred)
    cov_pred = np.zeros((ns.size,ns.size))
    xs = P.k*r_max
    P_in = P.get_matter_power(np.array([0.]),pmodel='linear')[:,0]
    for i1 in range(0,ns.size):
        for i2 in range(i1,ns.size):
            integrand1 = 8.*np.pi**3*(-1)**(ns[i1]+ns[i2])*ns[i1]**2*ns[i2]**2/r_max**3*np.sin(xs)**2/((ns[i1]**2*np.pi**2-xs**2)*(ns[i2]**2*np.pi**2-xs**2))
            cov_pred[i1,i2] = np.trapz(integrand1*P_in,xs)
            if i1!=i2:
                cov_pred[i2,i1] = cov_pred[i1,i2]
    cov_got = basis.get_covar_array()
    var_pred = np.dot(ddbar_pred.T,np.dot(cov_pred,ddbar_pred))
    var_got = basis.get_variance(geo1)
    assert np.all(cov_got==cov_got.T)
    assert np.allclose(basis.C_id[:,1],ns*np.pi/r_max)
    assert np.allclose(cov_pred,cov_got,atol=1.e-15,rtol=1.e-3)
    assert np.isclose(var_got[0,0],var_pred,atol=1.e-15,rtol=1.e-3)
    ddbar_got2 = basis.get_dO_I_ddelta_alpha(geo1,geo1.r_fine**2)*3./r_max**3
    assert np.allclose(ddbar,ddbar_got2,rtol=1.e-3)
Esempio n. 5
0
    #set some parameters for lensing
    len_params['smodel'] = 'nzmatcher'
    len_params['pmodel'] = 'halofit'

    #create the lw basis
    #z_max is the maximum radial extent of the basis
    z_max = z_fine[-1] + 0.001
    r_max = C.D_comov(z_max)
    #k_cut is the maximum k value for the bessel function zeros that define the basis
    x_cut = 80.
    k_cut = x_cut / r_max
    #l_max caps maximum l regardless of k
    print("main: begin constructing basis for long wavelength fluctuations")
    basis = SphBasisK(r_max,
                      C,
                      k_cut,
                      basis_params,
                      l_ceil=l_max,
                      needs_m=True)
    print("main: finish constructing basis for long wavelength fluctuations")

    #create the lw survey
    geos = np.array([geo_wfirst, geo_lsst], dtype=object)
    print("main: begin constructing LWSurvey for mitigation")
    survey_lw = LWSurvey(geos,
                         'combined_survey',
                         basis,
                         C,
                         lw_params,
                         observable_list=lw_observable_list,
                         param_list=lw_param_list)
    print("main: finish constructing LWSurvey for mitigation")
Esempio n. 6
0
def test_half_sky():
    """do some tests with a half sky geo known results"""
    #get dictionaries of parameters that various functions will need
    cosmo = {   'Omegabh2':0.0222,
                'Omegach2':0.1153,
                'Omegab'  :0.04283392714316876,
                'Omegac'  :0.22216607285683124,
                'Omegamh2':0.13752999999999999,
                'OmegaL'  :0.735,
                'OmegaLh2':0.38145113207547166,
                'Omegam'  :0.265,
                'H0'      :72.04034509047493,
                'sigma8'  : 0.8269877678406697, #from the code
                'h'       :0.7204034509047493,
                'Omegak'  : 0.0,
                'Omegakh2': 0.0,
                'Omegar'  : 0.0,
                'Omegarh2': 0.0,
                'ns'      : 0.9608,
                'tau'     : 0.081,
                'Yp'      :0.299,
                'As'      : 2.464*10**-9,
                'LogAs'   :-19.821479791275138,
                'w'       :-1.0,
                'de_model':'constant_w',#dark energy model
                'mnu'     :0.}
    cosmo['de_model'] = 'constant_w'
    cosmo['wa'] = 0.
    cosmo['w0'] = -1.
    cosmo['w'] = -1.
    p_space = 'jdem'
    camb_params = defaults.camb_params.copy()
    camb_params['force_sigma8'] = False
    camb_params['maxkh'] = 100.
    camb_params['kmax'] = 30.
    camb_params['npoints'] = 10000
    camb_params['pivot_scalar'] = 0.002

    power_params = defaults.power_params.copy()
    power_params.camb = camb_params
    power_params.camb['accuracy'] = 1
    #prior_params = defaults.prior_fisher_params.copy()


    zs = np.array([0.0001,3.])
    z_fine = np.linspace(0.0001,zs[-1],10000)

    basis_params = defaults.basis_params.copy()
    basis_params['n_bessel_oversample'] = 400000*10
    #test with half sky using results calculated in mathematica
    basis_params = defaults.basis_params.copy()
    basis_params['n_bessel_oversample'] = 400000*10

    C = CosmoPie(cosmo,p_space=p_space)
    l_max = 4
    x_cut = 10

    z_max = z_fine[-1]+0.000001
    r_max = C.D_comov(z_max)
    k_cut = x_cut/r_max

    geo1 = HalfSkyGeo(zs,C,z_fine)

    P = MatterPower(C,power_params)
    P.P_lin = 1./(P.k*r_max)
    C.set_power(P)

    basis = SphBasisK(r_max,C,k_cut,basis_params,l_ceil=l_max,needs_m=False)
    basis2 = SphBasisK(r_max,C,k_cut,basis_params,l_ceil=l_max,needs_m=True)

    ddbar = basis.get_ddelta_bar_ddelta_alpha(geo1,tomography=True)
    ddbar2 = basis2.get_ddelta_bar_ddelta_alpha(geo1,tomography=True)
    ddbar_got2 = basis.get_dO_I_ddelta_alpha(geo1,geo1.r_fine**2)*3./r_max**3

    #ns = np.arange(1,ddbar.size+1)
    cov_got = basis.get_covar_array()
    cov_got2 = basis2.get_covar_array()
    var_got = basis.get_variance(geo1)
    var_got2 = basis2.get_variance(geo1)
    cov_pred0 = np.array([[3.220393570704632e-11,-9.51309537893619e-12,9.955267964241254e-12],[-9.51309537893619e-12,5.937410951604845e-11,-1.2342996089442917e-11],[9.955267964241254e-12,-1.2342996089442917e-11,8.524795995567036e-11]])
    cov_pred1 = np.array([[4.306831299006748e-11,-7.977015797357624e-12],[-7.977015797357624e-12,6.907871421795387e-11]])
    cov_pred2 = np.array([[5.467066924435653e-11,-7.056047462103054e-12],[-7.056047462103054e-12,7.984696153964485e-11]])
    cov_pred3 = np.array([[6.70079506270691e-11]])
    cov_pred4 = np.array([[7.985214180284307e-11]])
    cov_pred = np.zeros((ddbar.size,ddbar.size))
    cov_pred[0:3,0:3] = cov_pred0
    cov_pred[3:5,3:5] = cov_pred1
    cov_pred[5:7,5:7] = cov_pred2
    cov_pred[7,7] = cov_pred3
    cov_pred[8,8] = cov_pred4
    var_pred = np.dot(ddbar,np.dot(cov_pred,ddbar.T))
    var_pred2 = np.dot(ddbar2,np.dot(cov_got2,ddbar2.T))
    assert np.all(cov_got==cov_got.T)
    assert np.all(cov_got2==cov_got2.T)
    assert np.isclose(var_got[0,0],var_pred,atol=1.e-15,rtol=1.e-3)
    assert np.isclose(var_got2[0,0],var_pred2,atol=1.e-15,rtol=1.e-3)
    assert np.isclose(var_got2[0,0],var_pred,atol=1.e-15,rtol=1.e-3)
    assert np.allclose(cov_pred,cov_got,atol=1.e-15,rtol=1.e-3)
    assert np.allclose(ddbar,ddbar_got2,rtol=1.e-3,atol=1.e-15)
    for itr in range(0,basis.C_id.shape[0]):
        if basis.C_id[itr,0]>0 and np.mod(basis.C_id[itr,0],2)==0.:
            assert ddbar[0,itr] == 0.
    for itr in range(0,basis2.C_id.shape[0]):
        if basis2.C_id[itr,0]>0 and np.mod(basis2.C_id[itr,0],2)==0.:
            assert ddbar2[0,itr] == 0.
        elif basis2.C_id[itr,2]!=0:
            assert ddbar2[0,itr] == 0.
Esempio n. 7
0
#    geo2 = PolygonGeo(z_coarse,thetas,phis+phi1,theta_in,phi_in+phi1,C,z_fine,l_max,polygon_params)
#    #geo1 = RectGeo(z_coarse,np.array([theta0,theta1]),np.array([phi0,phi1]),C,z_fine)
#    #geo2 = RectGeo(z_coarse,np.array([theta0,theta1]),np.array([phi0,phi1])+phi1,C,z_fine)

    print("main: building basis")
    basis_params = defaults.basis_params.copy()
    basis_params['n_bessel_oversample']*=1
    basis_params['x_grid_size']*=10

    r_max = C.D_comov(z_max)
    k_cut = x_cut/r_max
    k_tests = np.linspace(20./r_max,k_cut,100)
    n_basis = np.zeros(k_tests.size)
    variances = np.zeros(k_tests.size)

    basis = SphBasisK(r_max,C,k_cut,basis_params,l_ceil=l_max)
    for i in range(0,k_tests.size):
        print("r_max,k_cut",r_max,k_tests[i])
        n_basis[i] = np.sum(basis.C_id[:,1]<=k_tests[i])
        variances[i] = basis.get_variance(geo1,k_cut_in=k_tests[i])
        print("main: with k_cut="+str(k_tests[i])+" size="+str(n_basis[i])+" got variance="+str(variances[i]))

    if do_plot:
        import matplotlib.pyplot as plt
        plt.plot(n_basis,variances)
        plt.show()
    print("main: getting variance")
    variance_res = basis.get_variance(geo1)
    time1 = time()
    print("main: finished building in "+str(time1-time0)+"s")
Esempio n. 8
0
    print("main: building basis")
    basis_params = defaults.basis_params.copy()
    basis_params['n_bessel_oversample'] = 400000
    basis_params['x_grid_size'] = 100000

    r_max = C.D_comov(z_max)
    k_cut = x_cut / r_max
    k_tests = np.linspace(20. / r_max, k_cut, 25)
    n_basis = np.zeros(k_tests.size)
    variances = np.zeros((k_tests.size, z_coarse.size - 1, z_coarse.size - 1))

    time4 = time()
    basis = SphBasisK(r_max,
                      C,
                      k_cut,
                      basis_params,
                      l_ceil=l_max,
                      needs_m=False)
    time5 = time()
    time2 = time()
    #geo1 = LSSTGeoSimpl(z_coarse,C,z_fine,l_max,polygon_params,phi0=0.,phi1=0.9202821591024097,deg0=-59,deg1=-10)#WFIRSTGeo(z_coarse,C,z_fine,l_max,polygon_params) #best con 2.43117008e-06
    #geo1 = FullSkyGeo(z_coarse,C,z_fine)
    geo1 = HalfSkyGeo(z_coarse, C, z_fine)
    #geo1 = FullSkyPixelGeo(z_coarse,C,z_fine,l_max,6)
    time3 = time()

    #geo1 = WFIRSTGeo(z_coarse,C,z_fine,l_max,polygon_params) #best con 2.43117008e-06
    #geo1 = CircleGeo(z_coarse,C,0.45509788222857989,100,z_fine,l_max,polygon_params)
    #geo1 = LSSTGeoSimpl(z_coarse,C,z_fine,l_max,defaults.polygon_params.copy()) #best con 2.43117008e-06
    print('main: r diffs', np.diff(geo1.rs))
    print('main: theta width',
Esempio n. 9
0
def test_rotational_invariance():
    """test invariance of results under global rotations"""
    camb_params = { 'npoints':2000,
                    'minkh':1.1e-4,
                    'maxkh':1.476511342960e+02,
                    'kmax':1.476511342960e+02,
                    'leave_h':False,
                    'force_sigma8':False,
                    'return_sigma8':False,
                    'accuracy':1,
                    'pivot_scalar':0.002
                  }
    print("main: building cosmology")
    power_params = defaults.power_params.copy()
    power_params.camb = camb_params
    power_params.camb['accuracy'] = 1
    power_params.camb['maxkh'] = 100.
    power_params.camb['kmax'] = 30.
    power_params.camb['npoints'] = 1000
    C = CosmoPie(defaults.cosmology.copy(),p_space='jdem')
    P_lin = mps.MatterPower(C,power_params)
    C.set_power(P_lin)

    l_max = 23
    x_cut = 30.

    print("main: building geometries")
    polygon_params = defaults.polygon_params.copy()
    polygon_params['n_double'] = 80
    z_coarse = np.array([0.2,1.,2.,3.])
    zs_lsst = np.linspace(0.,1.2,3)
    #z_max = np.max(z_coarse)
    #z_fine = np.arange(0.0001,z_max,0.0001)
    z_fine = np.linspace(0.001,3.,500)
    z_max = z_fine[-1]+0.001

    print("main: building basis")
    basis_params = defaults.basis_params.copy()
    basis_params['n_bessel_oversample'] = 400000
    basis_params['x_grid_size'] = 100000

    r_max = C.D_comov(z_max)
    k_cut = x_cut/r_max

    basis = SphBasisK(r_max,C,k_cut,basis_params,l_ceil=l_max)

    geo1 = WFIRSTGeo(z_coarse,C,z_fine,l_max,polygon_params)#HalfSkyGeo(z_coarse,C,z_fine)
    geo2 = LSSTGeo(zs_lsst,C,z_fine,l_max,polygon_params)#HalfSkyGeo(z_coarse,C,z_fine)
    geo1_rot1 = AlmRotGeo(geo1,C,z_coarse,z_fine,np.array([0.,np.pi/2.,np.pi]),polygon_params['n_double'])
    geo1_rot2 = AlmRotGeo(geo1_rot1,C,z_coarse,z_fine,np.array([0.,np.pi/2.,np.pi]),polygon_params['n_double'])
    geo1_rot3 = AlmRotGeo(geo1_rot2,C,z_coarse,z_fine,np.array([0.005,1.2496,1.72]),polygon_params['n_double'])
    geo2_rot1 = AlmRotGeo(geo2,C,zs_lsst,z_fine,np.array([0.,np.pi/2.,np.pi]),polygon_params['n_double'])
    geo2_rot2 = AlmRotGeo(geo2_rot1,C,zs_lsst,z_fine,np.array([0.,np.pi/2.,np.pi]),polygon_params['n_double'])
    geo2_rot3 = AlmRotGeo(geo2_rot2,C,zs_lsst,z_fine,np.array([0.005,1.2496,1.72]),polygon_params['n_double'])
    assert np.allclose(geo1.get_alm_array(l_max),geo1_rot2.get_alm_array(l_max))
    var_geo1 = basis.get_variance(geo1,k_cut_in=k_cut)
    var_geo1_rot1 = basis.get_variance(geo1_rot1,k_cut_in=k_cut)
    var_geo1_rot2 = basis.get_variance(geo1_rot2,k_cut_in=k_cut)
    var_geo1_rot3 = basis.get_variance(geo1_rot3,k_cut_in=k_cut)
    assert np.allclose(var_geo1,var_geo1_rot1,atol=1.e-20,rtol=1.e-8)
    assert np.allclose(var_geo1,var_geo1_rot2,atol=1.e-20,rtol=1.e-8)
    assert np.allclose(var_geo1,var_geo1_rot3,atol=1.e-20,rtol=1.e-8)
    var_geo2 = basis.get_variance(geo2,k_cut_in=k_cut)
    var_geo2_rot1 = basis.get_variance(geo2_rot1,k_cut_in=k_cut)
    var_geo2_rot2 = basis.get_variance(geo2_rot2,k_cut_in=k_cut)
    var_geo2_rot3 = basis.get_variance(geo2_rot3,k_cut_in=k_cut)
    assert np.allclose(var_geo2,var_geo2_rot1,atol=1.e-20,rtol=1.e-8)
    assert np.allclose(var_geo2,var_geo2_rot2,atol=1.e-20,rtol=1.e-8)
    assert np.allclose(var_geo2,var_geo2_rot3,atol=1.e-20,rtol=1.e-8)

    cosmo_par_list = np.array(['ns','Omegamh2','Omegabh2','OmegaLh2','LogAs','w'])
    cosmo_par_eps = np.array([0.002,0.00025,0.0001,0.00025,0.1,0.01])

    nz_params_wfirst_lens = defaults.nz_params_wfirst_lens.copy()
    nz_params_wfirst_lens['i_cut'] = 26.3
    nz_params_wfirst_lens['data_source'] = './data/CANDELS-GOODSS2.dat'
    nz_wfirst_lens = NZWFirstEff(nz_params_wfirst_lens)
    sw_params = defaults.sw_survey_params.copy()
    lw_params = defaults.lw_survey_params.copy()
    sw_observable_list = defaults.sw_observable_list.copy()
    lw_observable_list = defaults.lw_observable_list.copy()
    len_params = defaults.lensing_params.copy()
    mf_params = defaults.hmf_params.copy()
    mf_params['n_grid'] = 2000
    mf_params['log10_min_mass'] = 10.
    n_params_lsst = defaults.nz_params_lsst_use.copy()
    n_params_lsst['i_cut'] = 24.1 #gold standard subset of LSST 1 year (10 year 25.3)

    dn_params = defaults.dn_params.copy()
    dn_params['nz_select'] = 'LSST'
    dn_params['sigma0'] = 0.1
    lw_param_list = np.array([{'dn_params':dn_params,'n_params':n_params_lsst,'mf_params':mf_params}])
    prior_params = defaults.prior_fisher_params.copy()

    sw_survey_geo1 = SWSurvey(geo1,'geo1',C,sw_params,cosmo_par_list,cosmo_par_eps,sw_observable_list,len_params,nz_wfirst_lens)
    sw_survey_geo1_rot1 = SWSurvey(geo1_rot1,'geo1_rot1',C,sw_params,cosmo_par_list,cosmo_par_eps,sw_observable_list,len_params,nz_wfirst_lens)
    sw_survey_geo1_rot2 = SWSurvey(geo1_rot2,'geo1_rot2',C,sw_params,cosmo_par_list,cosmo_par_eps,sw_observable_list,len_params,nz_wfirst_lens)
    sw_survey_geo1_rot3 = SWSurvey(geo1_rot3,'geo1_rot3',C,sw_params,cosmo_par_list,cosmo_par_eps,sw_observable_list,len_params,nz_wfirst_lens)

    survey_lw1 = LWSurvey(np.array([geo1,geo2]),'lw1',basis,C,lw_params,observable_list=lw_observable_list,param_list=lw_param_list)
    survey_lw1_rot1 = LWSurvey(np.array([geo1_rot1,geo2_rot1]),'lw1',basis,C,lw_params,observable_list=lw_observable_list,param_list=lw_param_list)
    survey_lw1_rot2 = LWSurvey(np.array([geo1_rot2,geo2_rot2]),'lw1',basis,C,lw_params,observable_list=lw_observable_list,param_list=lw_param_list)
    survey_lw1_rot3 = LWSurvey(np.array([geo1_rot3,geo2_rot3]),'lw1',basis,C,lw_params,observable_list=lw_observable_list,param_list=lw_param_list)
    SS_geo1 = SuperSurvey(np.array([sw_survey_geo1]),np.array([survey_lw1]),basis,C,prior_params,get_a=True,do_unmitigated=True,do_mitigated=True,include_sw=True)
    SS_geo1_rot1 = SuperSurvey(np.array([sw_survey_geo1_rot1]),np.array([survey_lw1_rot1]),basis,C,prior_params,get_a=True,do_unmitigated=True,do_mitigated=True,include_sw=True)
    SS_geo1_rot2 = SuperSurvey(np.array([sw_survey_geo1_rot2]),np.array([survey_lw1_rot2]),basis,C,prior_params,get_a=True,do_unmitigated=True,do_mitigated=True,include_sw=True)
    SS_geo1_rot3 = SuperSurvey(np.array([sw_survey_geo1_rot3]),np.array([survey_lw1_rot3]),basis,C,prior_params,get_a=True,do_unmitigated=True,do_mitigated=True,include_sw=True)

    for i in xrange(0,3):
        for j in xrange(1,3):
            assert np.allclose(SS_geo1.f_set_nopriors[i][j].get_covar(),SS_geo1_rot1.f_set_nopriors[i][j].get_covar(),atol=1.e-30,rtol=1.e-8)
            assert np.allclose(SS_geo1.f_set_nopriors[i][j].get_covar(),SS_geo1_rot2.f_set_nopriors[i][j].get_covar(),atol=1.e-30,rtol=1.e-8)
            assert np.allclose(SS_geo1.f_set_nopriors[i][j].get_covar(),SS_geo1_rot3.f_set_nopriors[i][j].get_covar(),atol=1.e-30,rtol=1.e-8)
    a_geo1 = SS_geo1.multi_f.get_a_lw()
    a_geo1_rot1 = SS_geo1_rot1.multi_f.get_a_lw()
    a_geo1_rot2 = SS_geo1_rot2.multi_f.get_a_lw()
    a_geo1_rot3 = SS_geo1_rot3.multi_f.get_a_lw()
    assert np.allclose(a_geo1[0],a_geo1_rot1[0],atol=1.e-20,rtol=1.e-8)
    assert np.allclose(a_geo1[1],a_geo1_rot1[1],atol=1.e-20,rtol=1.e-8)
    assert np.allclose(a_geo1[0],a_geo1_rot2[0],atol=1.e-20,rtol=1.e-8)
    assert np.allclose(a_geo1[1],a_geo1_rot2[1],atol=1.e-20,rtol=1.e-8)
    assert np.allclose(a_geo1[0],a_geo1_rot3[0],atol=1.e-20,rtol=1.e-8)
    assert np.allclose(a_geo1[1],a_geo1_rot3[1],atol=1.e-20,rtol=1.e-8)
    assert np.allclose(a_geo1[0],var_geo1,atol=1.e-30,rtol=1.e-13)
    assert np.allclose(a_geo1_rot1[0],var_geo1_rot1,atol=1.e-30,rtol=1.e-11)
    assert np.allclose(a_geo1_rot2[0],var_geo1_rot2,atol=1.e-30,rtol=1.e-11)
    assert np.allclose(a_geo1_rot3[0],var_geo1_rot3,atol=1.e-30,rtol=1.e-11)

    for i in xrange(0,2):
        for j in xrange(0,2):
            eig_geo1 = SS_geo1.eig_set[i][j][0]
            eig_geo1_rot1 = SS_geo1_rot1.eig_set[i][j][0]
            eig_geo1_rot2 = SS_geo1_rot2.eig_set[i][j][0]
            eig_geo1_rot3 = SS_geo1_rot3.eig_set[i][j][0]
            assert np.allclose(eig_geo1,eig_geo1_rot1)
            assert np.allclose(eig_geo1,eig_geo1_rot2)
            assert np.allclose(eig_geo1,eig_geo1_rot3)
Esempio n. 10
0
def test_super_survey(de_model):
    """run some eigenvalue tests of SuperSurvey pipeline"""
    t1 = time()
    z_max = 1.35
    l_max = 50

    camb_params = defaults.camb_params.copy()
    camb_params['force_sigma8'] = False
    camb_params['kmax'] = 5.
    camb_params['npoints'] = 1000
    cosmo_fid = defaults.cosmology_jdem.copy()
    cosmo_fid['w'] = -1.
    cosmo_fid['w0'] = cosmo_fid['w']
    cosmo_fid['wa'] = 0.
    cosmo_fid['de_model'] = de_model
    if cosmo_fid['de_model'] == 'jdem':
        for i in range(0, 36):
            cosmo_fid['ws36_' + str(i).zfill(2)] = cosmo_fid['w']

    C = cp.CosmoPie(cosmology=cosmo_fid, p_space='jdem')
    power_params = defaults.power_params.copy()
    power_params.camb = camb_params
    P = mps.MatterPower(C, power_params)
    C.set_power(P)
    r_max = C.D_comov(z_max)
    print('this is r max and l_max', r_max, l_max)

    phi1s = np.array([
        -19., -19., -11., -11., 7., 25., 25., 43., 43., 50., 50., 50., 24., 5.,
        5., 7., 7., -19.
    ]) * np.pi / 180.
    theta1s = np.array([
        -50., -35., -35., -19., -19., -19., -15.8, -15.8, -40., -40., -55.,
        -78., -78., -78., -55., -55., -50., -50.
    ]) * np.pi / 180. + np.pi / 2.
    phi_in1 = 7. / 180. * np.pi
    theta_in1 = -35. * np.pi / 180. + np.pi / 2.

    theta0 = np.pi / 4.
    theta1 = 3. * np.pi / 4.
    phi0 = 0.
    phi1 = 3.074096023740458
    phi2 = np.pi / 3.
    phi3 = phi2 + (phi1 - phi0)
    theta2s = np.array([theta0, theta1, theta1, theta0, theta0])
    phi2s = np.array([phi0, phi0, phi1, phi1, phi0]) - phi1 / 2.
    theta_in2 = np.pi / 2.
    phi_in2 = 0.
    res_choose = 7

    Theta1 = [theta0, theta1]
    Phi1 = [phi0, phi1]
    Theta2 = [theta0, theta1]
    Phi2 = [phi2, phi3]

    zs = np.array([0.2, 0.43, .63, 0.9, 1.3])
    z_fine = np.linspace(0.001, np.max(zs), 2000)  #use linspace
    use_poly = True
    use_poly2 = True
    if use_poly:
        if use_poly2:
            geo1 = PolygonGeo(zs, theta1s, phi1s, theta_in1, phi_in1, C,
                              z_fine, l_max, defaults.polygon_params.copy())
            geo2 = PolygonGeo(zs, theta2s, phi2s, theta_in2, phi_in2, C,
                              z_fine, l_max, defaults.polygon_params.copy())
        else:
            geo1 = PolygonPixelGeo(zs, theta1s, phi1s, theta_in1, phi_in1, C,
                                   z_fine, l_max, res_choose)
            geo2 = PolygonPixelGeo(zs, theta2s, phi2s, theta_in2, phi_in2, C,
                                   z_fine, l_max, res_choose)
    else:
        geo1 = RectGeo(zs, Theta1, Phi1, C, z_fine)
        geo2 = RectGeo(zs, Theta2, Phi2, C, z_fine)

    len_params = defaults.lensing_params.copy()
    len_params['pmodel'] = 'halofit'

    lenless_defaults = defaults.sw_survey_params.copy()
    lenless_defaults['needs_lensing'] = False
    if cosmo_fid['de_model'] == 'w0wa':
        cosmo_par_list = np.array(
            ['ns', 'Omegamh2', 'Omegabh2', 'OmegaLh2', 'LogAs', 'w0', 'wa'])
        cosmo_par_eps = np.array(
            [0.002, 0.0005, 0.0001, 0.0005, 0.1, 0.01, 0.07])
    elif cosmo_fid['de_model'] == 'constant_w':
        cosmo_par_list = np.array(
            ['ns', 'Omegamh2', 'Omegabh2', 'OmegaLh2', 'LogAs', 'w'])
        cosmo_par_eps = np.array([0.002, 0.0005, 0.0001, 0.0005, 0.1, 0.01])
    elif cosmo_fid['de_model'] == 'jdem':
        cosmo_par_list = ['ns', 'Omegamh2', 'Omegabh2', 'OmegaLh2', 'LogAs']
        cosmo_par_list.extend(cp.JDEM_LIST)
        cosmo_par_list = np.array(cosmo_par_list, dtype=object)
        cosmo_par_eps = np.full(41, 0.5)
        cosmo_par_eps[0:5] = np.array([0.002, 0.0005, 0.0001, 0.0005, 0.1])

    else:
        raise ValueError('not prepared to handle ' +
                         str(cosmo_fid['de_model']))

    #note that currently (poorly implemented derivative) in jdem,
    #OmegaLh2 and LogAs are both almost completely unconstrained but nondegenerate,
    #while in basic, h and sigma8 are not constrained but are almost completely degenerate
    nz_params = defaults.nz_params_wfirst_lens.copy()

    from nz_wfirst import NZWFirst
    nz_matcher = NZWFirst(nz_params)
    len_params['smodel'] = 'nzmatcher'
    sw_params = defaults.sw_survey_params.copy()
    obs_list = defaults.sw_observable_list.copy()
    survey_1 = SWSurvey(geo1, 's1', C, sw_params, cosmo_par_list,
                        cosmo_par_eps, obs_list, len_params, nz_matcher)

    surveys_sw = np.array([survey_1])

    geos = np.array([geo1, geo2])
    k_cut = 0.005

    basis = SphBasisK(r_max,
                      C,
                      k_cut,
                      defaults.basis_params.copy(),
                      l_ceil=100)
    lw_param_list = defaults.lw_param_list.copy()
    lw_observable_list = defaults.lw_observable_list.copy()
    survey_3 = LWSurvey(geos,
                        'lw_survey1',
                        basis,
                        C,
                        defaults.lw_survey_params.copy(),
                        observable_list=lw_observable_list,
                        param_list=lw_param_list)
    surveys_lw = np.array([survey_3])

    print('main: this is r_max: ' + str(r_max))
    SS = SuperSurvey(surveys_sw,
                     surveys_lw,
                     basis,
                     C,
                     defaults.prior_fisher_params.copy(),
                     get_a=False,
                     do_unmitigated=True,
                     do_mitigated=True,
                     include_sw=True)

    t2 = time()
    print("main: total run time " + str(t2 - t1) + " s")

    mit_eigs_sw = SS.eig_set[0, 1]
    no_mit_eigs_sw = SS.eig_set[0, 0]
    mit_eigs_par = SS.eig_set[1, 1]
    no_mit_eigs_par = SS.eig_set[1, 0]
    #TODO check eigenvalue interlace for this projection
    SS.print_standard_analysis()
    #    print("main: unmitigated sw lambda1,2: "+str(no_mit_eigs_sw[0][-1])+","+str(no_mit_eigs_sw[0][-2]))
    #    print("main: mitigated sw lambda1,2: "+str(mit_eigs_sw[0][-1])+","+str(mit_eigs_sw[0][-2]))
    #    print("main: n sw mit lambda>1.00000001: "+str(np.sum(np.abs(mit_eigs_sw[0])>1.00000001)))
    #    print("main: n sw no mit lambda>1.00000001: "+str(np.sum(np.abs(no_mit_eigs_sw[0])>1.00000001)))
    #    print("main: unmitigated par lambda1,2: "+str(no_mit_eigs_par[0][-1])+","+str(no_mit_eigs_par[0][-2]))
    #    print("main: mitigated par lambda1,2: "+str(mit_eigs_par[0][-1])+","+str(mit_eigs_par[0][-2]))
    #    print("main: n par mit lambda>1.00000001: "+str(np.sum(np.abs(mit_eigs_par[0])>1.00000001)))
    #    print("main: n par no mit lambda>1.00000001: "+str(np.sum(np.abs(no_mit_eigs_par[0])>1.00000001)))
    v_no_mit_par = np.dot(SS.f_set_nopriors[0][2].get_cov_cholesky(),
                          no_mit_eigs_par[1])
    v_mit_par = np.dot(SS.f_set_nopriors[0][2].get_cov_cholesky(),
                       mit_eigs_par[1])

    v_no_mit_sw = np.dot(SS.f_set_nopriors[0][1].get_cov_cholesky(),
                         no_mit_eigs_sw[1])
    v_mit_sw = np.dot(SS.f_set_nopriors[0][1].get_cov_cholesky(),
                      mit_eigs_sw[1])

    test_v = True
    v_test_fails = 0
    if test_v:
        m_mat_no_mit_par = np.identity(mit_eigs_par[0].size) + np.dot(
            SS.f_set_nopriors[1][2].get_covar(),
            SS.f_set_nopriors[0][2].get_fisher())
        m_mat_mit_par = np.identity(mit_eigs_par[0].size) + np.dot(
            SS.f_set_nopriors[2][2].get_covar(),
            SS.f_set_nopriors[0][2].get_fisher())

        if not np.allclose(
                np.dot(m_mat_no_mit_par, v_no_mit_par) /
            (1. + no_mit_eigs_par[0]), v_no_mit_par):
            v_test_fails += 1
            warn('some no mit eig vectors may be bad')
        if not np.allclose(
                np.dot(m_mat_mit_par, v_mit_par) /
            (1. + mit_eigs_par[0]), v_mit_par):
            v_test_fails += 1
            warn('some mit eig vectors may be bad')
    if v_test_fails == 0:
        print("PASS: eigenvector decomposition checks passed")
    else:
        raise RuntimeError('FAIL: ' + str(v_test_fails) +
                           ' eigenvector decomposition checks failed')

    get_hold_mats = False
    if get_hold_mats:
        no_prior_hold = SS.f_set[0][2].get_fisher()
        if C.de_model == 'jdem':
            no_prior_project = prior_fisher.project_w0wa(
                no_prior_hold, defaults.prior_fisher_params.copy(),
                prior_fisher.JDEM_LABELS)

    print('main: r diffs', np.diff(geo1.rs))
    print('main: theta width',
          (geo1.rs[1] + geo1.rs[0]) / 2. * (Theta1[1] - Theta1[0]))
    print('main: phi width',
          (geo1.rs[1] + geo1.rs[0]) / 2. * (Phi1[1] - Phi1[0]) * np.sin(
              (Theta1[1] + Theta1[0]) / 2))

    test_perturbation = True
    pert_test_fails = 0
    if test_perturbation:
        #TOLERANCE below which an eigenvalue less than TOLERANCE*max eigenvalue is considered 0
        REL_TOLERANCE = 10**-8
        f0 = SS.multi_f.get_fisher(mf.f_spec_no_mit,
                                   mf.f_return_lw)[0].get_fisher()
        f1 = SS.multi_f.get_fisher(mf.f_spec_mit,
                                   mf.f_return_lw)[0].get_fisher()
        if not np.all(f0.T == f0):
            pert_test_fails += 1
            warn("unperturbed fisher matrix not symmetric, unacceptable")
        if not np.all(f1.T == f1):
            pert_test_fails += 1
            warn("perturbed fisher matrix not symmetric, unacceptable")
        #get eigenvalues and set numerically zero values to 0
        eigf0 = np.linalg.eigh(f0)[0]
        eigf0[np.abs(eigf0) < REL_TOLERANCE * np.max(np.abs(eigf0))] = 0.
        eigf1 = np.linalg.eigh(f1)[0]
        eigf1[np.abs(eigf1) < REL_TOLERANCE * np.max(np.abs(eigf1))] = 0.
        #check positive semidefinite
        if np.any(eigf0 < 0.):
            pert_test_fails += 1
            warn(
                "unperturbed fisher matrix not positive definite within tolerance, unacceptable"
            )
        if np.any(eigf1 < 0.):
            pert_test_fails += 1
            warn(
                "perturbed fisher matrix not positive definite within tolerance, unacceptable"
            )

        #check nondecresasing
        diff_eig = eigf1 - eigf0
        diff_eig[np.abs(diff_eig) < REL_TOLERANCE *
                 np.max(np.abs(diff_eig))] = 0
        if np.any(diff_eig < 0):
            pert_test_fails += 1
            warn("some eigenvalues decreased within tolerance, unacceptable")

        #check interlace theorem satisfied (eigenvalues cannot be reordered by more than rank of perturbation)
        n_offset = SS.surveys_lw[0].get_total_rank()
        rolled_eig = (eigf1[::-1][n_offset:eigf0.size] -
                      eigf0[::-1][0:eigf0.size - n_offset])
        rolled_eig[np.abs(rolled_eig) < REL_TOLERANCE *
                   np.max(np.abs(rolled_eig))] = 0.
        if np.any(rolled_eig > 0):
            pert_test_fails += 1
            warn("some eigenvalues fail interlace theorem, unacceptable")

        c0 = SS.multi_f.get_fisher(mf.f_spec_no_mit,
                                   mf.f_return_lw)[0].get_covar()
        c1 = SS.multi_f.get_fisher(mf.f_spec_mit,
                                   mf.f_return_lw)[0].get_covar()
        if not np.all(c0 == c0.T):
            pert_test_fails += 1
            warn("unperturbed covariance not symmetric, unacceptable")
        if not np.all(c1 == c1.T):
            warn("perturbed covariance not symmetric, unacceptable")
        eigc0 = np.linalg.eigh(c0)[0]
        eigc1 = np.linalg.eigh(c1)[0]
        if np.any(eigc0 < 0):
            pert_test_fails += 1
            warn(
                "unperturbed covariance not positive semidefinite, unacceptable"
            )
        if np.any(eigc1 < 0):
            pert_test_fails += 1
            warn(
                "perturbed covariance not positive semidefinite, unacceptable")
        fdiff_eigc = (eigc1 - eigc0) / eigc0
        fdiff_eigc[np.abs(fdiff_eigc) < REL_TOLERANCE] = 0.
        if np.any(fdiff_eigc > 0):
            pert_test_fails += 1
            warn("some covariance eigenvalues increase, unacceptable")

        if pert_test_fails == 0:
            print("PASS: All fisher matrix sanity checks passed")
        else:
            raise RuntimeError("FAIL: " + str(pert_test_fails) +
                               " fisher matrix sanity checks failed")
    test_eigs = True
    eig_test_fails = 0
    if test_eigs:
        REL_TOLERANCE = 10**-8
        c_ssc0 = SS.multi_f.get_fisher(
            mf.f_spec_SSC_no_mit,
            mf.f_return_sw)[1].get_covar()  #SS.covs_sw[0].get_ssc_covar()
        if not np.allclose(c_ssc0, c_ssc0.T):
            eig_test_fails += 1
            warn("unperturbed result covariance not symmetric, unacceptable")
        c_ssc1 = SS.multi_f.get_fisher(
            mf.f_spec_SSC_mit,
            mf.f_return_sw)[1].get_covar()  #SS.covs_sw[0].get_ssc_covar()
        if not np.allclose(c_ssc1, c_ssc1.T):
            eig_test_fails += 1
            warn("perturbed result covariance not symmetric, unacceptable")
        eigsys_ssc0 = np.linalg.eigh(c_ssc0)
        eigsys_ssc1 = np.linalg.eigh(c_ssc1)
        eig_ssc0 = eigsys_ssc0[0].copy()
        eig_ssc1 = eigsys_ssc1[0].copy()
        eig_ssc0[np.abs(eig_ssc0) < np.max(np.abs(eig_ssc0)) *
                 REL_TOLERANCE] = 0
        eig_ssc1[np.abs(eig_ssc0) < np.max(np.abs(eig_ssc0)) *
                 REL_TOLERANCE] = 0
        if np.any(eig_ssc0 < 0):
            eig_test_fails += 1
            warn(
                "unperturbed result cov not positive semidefinite, unacceptable"
            )
        if np.any(eig_ssc1 < 0):
            eig_test_fails += 1
            warn(
                "perturbed result cov not positive semidefinite, unacceptable")
        cg = SS.f_set_nopriors[0][1].get_covar()
        eigsys_cg = np.linalg.eigh(cg)
        eig_mitprod = np.real(
            np.linalg.eig(np.dot(np.linalg.inv(c_ssc0 + cg), c_ssc1 + cg))[0])
        eig_mitprod[np.abs(eig_mitprod - 1.) < REL_TOLERANCE] = 1.
        if np.any(eig_mitprod > 1):
            eig_test_fails += 1
            warn("mitigation making covariance worse, unacceptable")
        n_offset = SS.surveys_lw[0].get_total_rank()
        if np.sum(eig_mitprod < 1.) > n_offset:
            eig_test_fails += 1
            warn("mitigation changing too many eigenvalues, unacceptable")
        eig_diff = eig_ssc1 - eig_ssc0
        eig_diff[np.abs(eig_diff) < np.max(np.abs(eig_diff)) *
                 REL_TOLERANCE] = 0.
        if np.any(eig_diff > 0):
            eig_test_fails += 1
            warn("mitigation making covariance worse, unacceptable")

        if eig_test_fails == 0:
            print("PASS: All sw eigenvalue sanity checks passed")
        else:
            raise RuntimeError("FAIL: " + str(pert_test_fails) +
                               " eigenvalue sanity checks failed")

        do_eig_interlace_check = True
        if do_eig_interlace_check:
            eig_interlace_fails_mit = 0
            eig_interlace_fails_no_mit = 0
            n_sw = mit_eigs_sw[0].size
            n_par = mit_eigs_par[0].size
            d_n = n_sw - n_par
            eig_l_mit_par = mit_eigs_par[0][::-1]
            eig_l_no_mit_par = no_mit_eigs_par[0][::-1]
            eig_l_mit_sw = mit_eigs_sw[0][::-1]
            eig_l_no_mit_sw = no_mit_eigs_sw[0][::-1]
            for i in range(0, n_par):
                if eig_l_mit_par[i] > eig_l_mit_sw[i]:
                    eig_interlace_fails_mit += 1
                if eig_l_no_mit_par[i] > eig_l_no_mit_sw[i]:
                    eig_interlace_fails_no_mit += 1
                if eig_l_mit_par[i] < eig_l_mit_sw[i + d_n]:
                    eig_interlace_fails_mit += 1
                if eig_l_no_mit_par[i] < eig_l_no_mit_sw[i + d_n]:
                    eig_interlace_fails_no_mit += 1
            if eig_interlace_fails_mit == 0 and eig_interlace_fails_no_mit == 0:
                print("PASS: All parameter eigenvalue interlace tests passed")
            else:
                raise RuntimeError(
                    "FAIL: " + str(eig_interlace_fails_mit) +
                    " mitigation and " + str(eig_interlace_fails_no_mit) +
                    " no mitigation failures in parameter eigenvalue interlace tests"
                )