Пример #1
0
def time_test_cluster():
    from popstar import synthetic as syn
    from popstar import atmospheres as atm
    from popstar import evolution
    from popstar import reddening
    from popstar.imf import imf
    from popstar.imf import multiplicity

    logAge = 6.7
    AKs = 2.7
    distance = 4000
    cluster_mass = 10**4

    startTime = time.time()
    
    evo = evolution.MergedBaraffePisaEkstromParsec()
    atm_func = atm.get_merged_atmosphere
    red_law = reddening.RedLawNishiyama09()
    filt_list = ['nirc2,J', 'nirc2,Kp']
    
    iso = syn.IsochronePhot(logAge, AKs, distance,
                            evo_model=evo, atm_func=atm_func,
                            red_law=red_law, filters=filt_list)
    print('Constructed isochrone: %d seconds' % (time.time() - startTime))

    imf_limits = np.array([0.07, 0.5, 150])
    imf_powers = np.array([-1.3, -2.35])
    multi = multiplicity.MultiplicityUnresolved()
    my_imf = imf.IMF_broken_powerlaw(imf_limits, imf_powers, multiplicity=multi)
    print('Constructed IMF with multiples: %d seconds' % (time.time() - startTime))
    
    cluster = syn.ResolvedCluster(iso, my_imf, cluster_mass)
    print('Constructed cluster: %d seconds' % (time.time() - startTime))

    return
Пример #2
0
def test_UnresolvedCluster():
    from popstar import synthetic as syn
    from popstar import atmospheres as atm
    from popstar import evolution
    from popstar.imf import imf
    from popstar.imf import multiplicity
    
    log_age = 6.7
    AKs = 0.0
    distance = 4000
    metallicity=0
    cluster_mass = 10**4.

    startTime = time.time()    
    multi = multiplicity.MultiplicityUnresolved()
    imf_in = imf.Kroupa_2001(multiplicity=multi)
    evo = evolution.MergedBaraffePisaEkstromParsec()
    atm_func = atm.get_merged_atmosphere
    iso = syn.Isochrone(log_age, AKs, distance, metallicity=metallicity,
                            evo_model=evo, atm_func=atm_func, mass_sampling=10)
    print('Made Isochrone: %d seconds' % (time.time() - startTime))

    cluster = syn.UnresolvedCluster(iso, imf_in, cluster_mass)
    print('Constructed unresolved cluster: %d seconds' % (time.time() - startTime))

    # Plot an integrated spectrum of the whole cluster.
    wave = cluster.wave_trim
    flux = cluster.spec_trim
    plt.clf()
    plt.plot(wave, flux, 'k.')

    return
Пример #3
0
def test_UnresolvedCluster():
    from popstar import synthetic as syn
    from popstar import atmospheres as atm
    from popstar import evolution
    from popstar.imf import imf
    from popstar.imf import multiplicity

    log_age = 6.7
    AKs = 0.0
    distance = 4000
    cluster_mass = 30.

    startTime = time.time()
    multi = multiplicity.MultiplicityUnresolved()
    imf_in = imf.Kroupa_2001(multiplicity=multi)
    evo = evolution.MergedBaraffePisaEkstromParsec()
    iso = syn.Isochrone(log_age, AKs, distance, evo, mass_sampling=10)
    print 'Made cluster: %d seconds' % (time.time() - startTime)

    cluster = syn.UnresolvedCluster(iso, imf_in, cluster_mass)
    print 'Constructed unresolved cluster: %d seconds' % (time.time() -
                                                          startTime)

    # Plot an integrated spectrum of the whole cluster.
    wave = cluster.spec_trim.wave
    flux = cluster.spec_trim.flux
    plt.clf()
    plt.plot(wave, flux, 'k.')
    pdb.set_trace()
    return
Пример #4
0
def test_evolution_models():
    """
    Test to make sure the different evolution models work
    """
    from popstar import evolution

    # Age ranges to test
    age_young_arr = [6.7, 7.9]
    age_all_arr = [6.7, 8.0, 9.7]

    # Metallicity ranges to test (if applicable)
    metal_range = [-2.5, 0, 0.4]
    metal_solar = [0]

    # Array of evolution models to test
    evo_models = [
        evolution.MISTv1(version=1.2),
        evolution.MergedBaraffePisaEkstromParsec(),
        evolution.MergedSiessGenevaPadova(),
        evolution.Parsec(),
        evolution.Baraffe15(),
        evolution.Ekstrom12(),
        evolution.Pisa()
    ]

    # Array of age_ranges for the specific evolution models to test
    age_vals = [
        age_all_arr, age_all_arr, age_all_arr, age_all_arr, age_young_arr,
        age_young_arr, age_young_arr
    ]

    # Array of metallicities for the specific evolution models to test
    metal_vals = [
        metal_range, metal_solar, metal_solar, metal_solar, metal_solar,
        metal_solar, metal_solar
    ]

    assert len(evo_models) == len(age_vals) == len(metal_vals)

    # Loop through models, testing if them work
    for ii in range(len(evo_models)):
        evo = evo_models[ii]

        # Loop through metallicities
        for jj in metal_vals[ii]:
            # Loop through ages
            for kk in age_vals[ii]:
                try:
                    test = evo.isochrone(age=10**kk, metallicity=jj)
                except:
                    print('TEST FAILED: {0}, age = {1}, metal = {2}'.format(
                        evo, kk, jj))
                    pdb.set_trace()
        print('Done {0}'.format(evo))

    return
Пример #5
0
def make_sim_cluster():
    work_dir = '/u/jlu/work/gc/jwst/2018_03_19/'

    ages = [4e6, 1e8, 8e9]
    cluster_mass = [1e4, 1e4, 1e7]
    AKs = 2.7
    deltaAKs = 1.0
    distance = 8000
    mass_sampling = 5

    isochrones = []
    clusters = []

    evo = evolution.MergedBaraffePisaEkstromParsec()
    atm_func = atm.get_merged_atmosphere
    red_law = reddening.RedLawHosek18()
    multi = multiplicity.MultiplicityUnresolved()

    imf_mass_limits = np.array([0.07, 0.5, 1, np.inf])
    imf_powers_old = np.array([-1.3, -2.3, -2.3])
    imf_powers_yng = np.array([-1.3, -1.8, -1.8])
    my_imf_old = imf.IMF_broken_powerlaw(imf_mass_limits,
                                         imf_powers_old,
                                         multiplicity=multi)
    my_imf_yng = imf.IMF_broken_powerlaw(imf_mass_limits,
                                         imf_powers_yng,
                                         multiplicity=multi)

    # Test all filters
    filt_list = [
        'wfc3,ir,f127m', 'wfc3,ir,f139m', 'wfc3,ir,f153m', 'acs,wfc1,f814w',
        'wfc3,ir,f125w', 'wfc3,ir,f160w', 'jwst,F090W', 'jwst,F115W',
        'jwst,F164N', 'jwst,F187N', 'jwst,F212N', 'jwst,F323N', 'jwst,F405N',
        'jwst,F466N', 'jwst,F470N', 'jwst,F140M', 'jwst,F162M', 'jwst,F182M',
        'jwst,F210M', 'jwst,F250M', 'jwst,F300M', 'jwst,F335M', 'jwst,F360M',
        'jwst,F410M', 'jwst,F430M', 'jwst,F460M', 'jwst,F480M', 'nirc2,J',
        'nirc2,H', 'nirc2,Kp', 'nirc2,Lp', 'nirc2,Ms'
    ]

    startTime = time.time()
    for ii in range(len(ages)):
        logAge = np.log10(ages[ii])

        iso = syn.IsochronePhot(logAge,
                                AKs,
                                distance,
                                evo_model=evo,
                                atm_func=atm_func,
                                red_law=red_law,
                                filters=filt_list,
                                mass_sampling=mass_sampling,
                                iso_dir=work_dir)

        print('Constructed isochrone: %d seconds' % (time.time() - startTime))

        if ii < 2:
            imf_ii = my_imf_yng
        else:
            imf_ii = my_imf_old

        cluster = syn.ResolvedClusterDiffRedden(iso, imf_ii, cluster_mass[ii],
                                                deltaAKs)

        # Save generated clusters to file.
        save_file_fmt = '{0}/clust_{1:.2f}_{2:4.2f}_{3:4s}.fits'
        save_file_txt = save_file_fmt.format(work_dir, logAge, AKs,
                                             str(distance).zfill(5))
        save_file = open(save_file_txt, 'wb')
        pickle.dump(cluster, save_file)

    return

    return
Пример #6
0
def test_iso_wave():
    """
    Test to make sure isochrones generated have spectra with the proper 
    wavelength range, and that the user has control over that wavelength
    range (propagated through IsochronePhot)
    """
    # Define isochrone parameters
    logAge = np.log10(5 * 10**6.)  # Age in log(years)
    AKs = 0.8  # extinction in mags
    dist = 4000  # distance in parsec

    # Define evolution/atmosphere models and extinction law (optional)
    evo_model = evolution.MergedBaraffePisaEkstromParsec()
    atm_func = atmospheres.get_merged_atmosphere
    red_law = reddening.RedLawHosek18b()

    # Also specify filters for synthetic photometry (optional). Here we use
    # the HST WFC3-IR F127M, F139M, and F153M filters
    filt_list = ['wfc3,ir,f127m']

    # First, let's make sure the vega spectrum has the proper limits
    vega = synthetic.Vega()

    assert np.min(vega.wave) == 995
    assert np.max(vega.wave) == 100200

    # Make Isochrone object. Will use wave_range = [3000,52000].
    # Make sure range matches to resolution of atmosphere.
    wave_range1 = [3000, 52000]
    my_iso = synthetic.IsochronePhot(logAge,
                                     AKs,
                                     dist,
                                     evo_model=evo_model,
                                     atm_func=atm_func,
                                     red_law=red_law,
                                     filters=filt_list,
                                     mass_sampling=10,
                                     wave_range=wave_range1,
                                     recomp=True)

    test = my_iso.spec_list[0]

    assert np.min(test.wave) == 3010
    assert np.max(test.wave) == 51900

    # Now let's try changing the wave range. Is it carried through
    # properly?
    wave_range2 = [1200, 90000]
    my_iso = synthetic.IsochronePhot(logAge,
                                     AKs,
                                     dist,
                                     evo_model=evo_model,
                                     atm_func=atm_func,
                                     red_law=red_law,
                                     filters=filt_list,
                                     mass_sampling=10,
                                     wave_range=wave_range2,
                                     recomp=True)

    test2 = my_iso.spec_list[0]

    assert np.min(test2.wave) == 1205
    assert np.max(test2.wave) == 89800

    # Does the error exception catch the bad wave_range?
    wave_range3 = [1200, 1000000]
    try:
        my_iso = synthetic.IsochronePhot(logAge,
                                         AKs,
                                         dist,
                                         evo_model=evo_model,
                                         atm_func=atm_func,
                                         red_law=red_law,
                                         filters=filt_list,
                                         mass_sampling=10,
                                         wave_range=wave_range3,
                                         recomp=True)
        print(
            'WAVE TEST FAILED!!! Should have crashed here, wavelength range out of bounds'
        )
        pdb.set_trace()
    except:
        print('Wavelength out of bound condition passed. Test is good')
        pass
    return
Пример #7
0
def test_ResolvedClusterDiffRedden():
    from popstar import synthetic as syn
    from popstar import atmospheres as atm
    from popstar import evolution
    from popstar import reddening
    from popstar.imf import imf
    from popstar.imf import multiplicity

    logAge = 6.7
    AKs = 2.4
    distance = 4000
    cluster_mass = 10**5.
    deltaAKs = 0.05
    mass_sampling = 5

    # Test filters
    filt_list = ['nirc2,J', 'nirc2,Kp']

    startTime = time.time()

    evo = evolution.MergedBaraffePisaEkstromParsec()
    atm_func = atm.get_merged_atmosphere

    red_law = reddening.RedLawNishiyama09()

    iso = syn.IsochronePhot(logAge,
                            AKs,
                            distance,
                            evo_model=evo,
                            atm_func=atm_func,
                            red_law=red_law,
                            filters=filt_list,
                            mass_sampling=mass_sampling)

    print('Constructed isochrone: %d seconds' % (time.time() - startTime))

    imf_mass_limits = np.array([0.07, 0.5, 1, np.inf])
    imf_powers = np.array([-1.3, -2.3, -2.3])

    ##########
    # Start without multiplicity
    ##########
    my_imf1 = imf.IMF_broken_powerlaw(imf_mass_limits,
                                      imf_powers,
                                      multiplicity=None)
    print('Constructed IMF: %d seconds' % (time.time() - startTime))

    cluster1 = syn.ResolvedClusterDiffRedden(iso, my_imf1, cluster_mass,
                                             deltaAKs)
    clust1 = cluster1.star_systems
    print('Constructed cluster: %d seconds' % (time.time() - startTime))

    assert len(clust1) > 0

    plt.figure(3)
    plt.clf()
    plt.plot(clust1['m_nirc2_J'] - clust1['m_nirc2_Kp'], clust1['m_nirc2_J'],
             'r.')
    plt.plot(iso.points['m_nirc2_J'] - iso.points['m_nirc2_Kp'],
             iso.points['m_nirc2_J'], 'c.')
    plt.gca().invert_yaxis()

    # *** Visual Inspections: ***
    #  - check that points (red) fall between isochrone points (blue)

    ##########
    # Test with multiplicity
    ##########
    multi = multiplicity.MultiplicityUnresolved()
    my_imf2 = imf.IMF_broken_powerlaw(imf_mass_limits,
                                      imf_powers,
                                      multiplicity=multi)
    print('Constructed IMF with multiples: %d seconds' %
          (time.time() - startTime))

    cluster2 = syn.ResolvedClusterDiffRedden(iso, my_imf2, cluster_mass,
                                             deltaAKs)
    clust2 = cluster2.star_systems
    print('Constructed cluster with multiples: %d seconds' %
          (time.time() - startTime))

    assert len(clust2) > 0
    assert len(cluster2.companions) > 0
    assert np.sum(clust2['N_companions']) == len(cluster2.companions)

    ##########
    # Plots
    ##########
    # Plot an IR CMD and compare cluster members to isochrone.
    plt.figure(1)
    plt.clf()
    plt.plot(clust1['m_nirc2_J'] - clust1['m_nirc2_Kp'], clust1['m_nirc2_J'],
             'r.')
    plt.plot(clust2['m_nirc2_J'] - clust2['m_nirc2_Kp'], clust2['m_nirc2_J'],
             'b.')
    plt.plot(iso.points['m_nirc2_J'] - iso.points['m_nirc2_Kp'],
             iso.points['m_nirc2_J'], 'c-')
    plt.gca().invert_yaxis()
    plt.xlabel('J - Kp (mag)')
    plt.ylabel('J (mag')

    # Plot a mass-magnitude relationship.
    plt.figure(2)
    plt.clf()
    plt.semilogx(clust1['mass'], clust1['m_nirc2_J'], 'r.')
    plt.semilogx(clust2['mass'], clust2['m_nirc2_J'], 'r.')
    plt.gca().invert_yaxis()
    plt.xlabel('Mass (Msun)')
    plt.ylabel('J (mag)')

    return
Пример #8
0
def test_IsochronePhot(plot=False):
    from popstar import synthetic as syn
    from popstar import evolution, atmospheres, reddening

    logAge = 6.7
    AKs = 2.7
    distance = 4000
    filt_list = ['wfc3,ir,f127m', 'nirc2,J']
    mass_sampling = 1
    iso_dir = 'iso/'

    evo_model = evolution.MISTv1()
    atm_func = atmospheres.get_merged_atmosphere
    redlaw = reddening.RedLawNishiyama09()

    startTime = time.time()
    iso = syn.IsochronePhot(logAge,
                            AKs,
                            distance,
                            evo_model=evo_model,
                            atm_func=atm_func,
                            red_law=redlaw,
                            filters=filt_list,
                            mass_sampling=mass_sampling,
                            iso_dir=iso_dir)
    endTime = time.time()
    print('IsochronePhot generated in: %d seconds' % (endTime - startTime))
    # Typically takes 120 seconds if file is regenerated.
    # Limited by pysynphot.Icat call in atmospheres.py

    assert iso.points.meta['LOGAGE'] == logAge
    assert iso.points.meta['AKS'] == AKs
    assert iso.points.meta['DISTANCE'] == distance
    assert len(iso.points) > 100

    assert 'm_nirc2_J' in iso.points.colnames

    if plot:
        plt.figure(1)
        iso.plot_CMD('mag814w', 'mag160w')

        plt.figure(2)
        iso.plot_mass_magnitude('mag160w')

    # Finally, let's test the isochronePhot file generation
    assert os.path.exists('{0}/iso_{1:.2f}_{2:4.2f}_{3:4s}_p00.fits'.format(
        iso_dir, logAge, AKs,
        str(distance).zfill(5)))

    # Check 1: If we try to remake the isochrone, does it read the file rather than
    # making a new one
    iso_new = syn.IsochronePhot(logAge,
                                AKs,
                                distance,
                                evo_model=evo_model,
                                atm_func=atm_func,
                                red_law=redlaw,
                                filters=filt_list,
                                mass_sampling=mass_sampling,
                                iso_dir=iso_dir)

    assert iso_new.recalc == False

    # Check 2: If we change evo model, atmo model, or redlaw,
    # does IsochronePhot regenerate the isochrone and overwrite the existing one?
    evo2 = evolution.MergedBaraffePisaEkstromParsec()
    mass_sampling = 20

    iso_new = syn.IsochronePhot(logAge,
                                AKs,
                                distance,
                                evo_model=evo2,
                                atm_func=atm_func,
                                red_law=redlaw,
                                filters=filt_list,
                                mass_sampling=mass_sampling,
                                iso_dir=iso_dir)

    assert iso_new.recalc == True

    redlaw2 = reddening.RedLawHosek18b()
    iso_new = syn.IsochronePhot(logAge,
                                AKs,
                                distance,
                                evo_model=evo2,
                                atm_func=atm_func,
                                red_law=redlaw2,
                                filters=filt_list,
                                mass_sampling=mass_sampling,
                                iso_dir=iso_dir)

    assert iso_new.recalc == True

    atm2 = atmospheres.get_castelli_atmosphere
    iso_new = syn.IsochronePhot(logAge,
                                AKs,
                                distance,
                                evo_model=evo2,
                                atm_func=atm2,
                                red_law=redlaw2,
                                filters=filt_list,
                                mass_sampling=mass_sampling,
                                iso_dir=iso_dir)

    assert iso_new.recalc == True

    return
Пример #9
0
def test_ResolvedCluster():
    from popstar import synthetic as syn
    from popstar import atmospheres as atm
    from popstar import evolution
    from popstar import reddening
    from popstar.imf import imf
    from popstar.imf import multiplicity

    # Define cluster parameters
    logAge = 6.7
    AKs = 2.4
    distance = 4000
    cluster_mass = 10**5.
    mass_sampling=5

    # Test all filters
    filt_list = ['wfc3,ir,f127m', 'wfc3,ir,f139m', 'wfc3,ir,f153m', 'acs,wfc1,f814w',
                     'wfc3,ir,f125w', 'wfc3,ir,f160w', 'decam,y', 'decam,i', 'decam,z',
                         'decam,u', 'decam,g', 'decam,r', 'vista,Y', 'vista,Z',
                         'vista,J', 'vista,H', 'vista,Ks', 'ps1,z', 'ps1,g', 'ps1,r',
                         'ps1,i', 'ps1,y', 'jwst,F090W', 'jwst,F164N', 'jwst,F212N',
                         'jwst,F323N', 'jwst,F466N', 'nirc2,J', 'nirc2,H', 'nirc2,Kp',
                         'nirc2,K', 'nirc2,Lp', 'nirc2,Ms', 'nirc2,Hcont', 'nirc2,FeII',
                         'nirc2,Brgamma', 'jg,J', 'jg,H', 'jg,K']

    startTime = time.time()
    
    evo = evolution.MergedBaraffePisaEkstromParsec()
    atm_func = atm.get_merged_atmosphere

    red_law = reddening.RedLawNishiyama09()
    
    iso = syn.IsochronePhot(logAge, AKs, distance,
                            evo_model=evo, atm_func=atm_func,
                            red_law=red_law, filters=filt_list,
                            mass_sampling=mass_sampling)

    print('Constructed isochrone: %d seconds' % (time.time() - startTime))

    # Now to create the cluster.
    imf_mass_limits = np.array([0.07, 0.5, 1, np.inf])
    imf_powers = np.array([-1.3, -2.3, -2.3])

    ##########
    # Start without multiplicity
    ##########
    my_imf1 = imf.IMF_broken_powerlaw(imf_mass_limits, imf_powers,
                                      multiplicity=None)
    print('Constructed IMF: %d seconds' % (time.time() - startTime))
    
    cluster1 = syn.ResolvedCluster(iso, my_imf1, cluster_mass)
    clust1 = cluster1.star_systems
    print('Constructed cluster: %d seconds' % (time.time() - startTime))

    plt.figure(3)
    plt.clf()
    plt.plot(clust1['m_nirc2_J'] - clust1['m_nirc2_Kp'], clust1['m_nirc2_J'], 'r.')
    plt.plot(iso.points['m_nirc2_J'] - iso.points['m_nirc2_Kp'], iso.points['m_nirc2_J'], 'c.')
    plt.gca().invert_yaxis()

    # *** Visual Inspections: ***
    #  - check that points (red) fall between isochrone points (blue)

    ##########
    # Test with multiplicity
    ##########
    multi = multiplicity.MultiplicityUnresolved()
    my_imf2 = imf.IMF_broken_powerlaw(imf_mass_limits, imf_powers,
                                      multiplicity=multi)
    print('Constructed IMF with multiples: %d seconds' % (time.time() - startTime))
    
    cluster2 = syn.ResolvedCluster(iso, my_imf2, cluster_mass)
    clust2 = cluster2.star_systems
    print('Constructed cluster with multiples: %d seconds' % (time.time() - startTime))

    ##########
    # Plots 
    ##########
    # Plot an IR CMD and compare cluster members to isochrone.
    plt.figure(1)
    plt.clf()
    plt.plot(clust1['m_nirc2_J'] - clust1['m_nirc2_Kp'], clust1['m_nirc2_J'], 'r.')
    plt.plot(clust2['m_nirc2_J'] - clust2['m_nirc2_Kp'], clust2['m_nirc2_J'], 'b.')
    plt.plot(iso.points['m_nirc2_J'] - iso.points['m_nirc2_Kp'], iso.points['m_nirc2_J'], 'c-')
    plt.gca().invert_yaxis()
    plt.xlabel('J - Kp (mag)')
    plt.ylabel('J (mag')

    # Plot a mass-magnitude relationship.
    plt.figure(2)
    plt.clf()
    plt.semilogx(clust1['mass'], clust1['m_nirc2_J'], 'r.')
    plt.semilogx(clust2['mass'], clust2['m_nirc2_J'], 'r.')
    plt.gca().invert_yaxis()
    plt.xlabel('Mass (Msun)')
    plt.ylabel('J (mag)')
    
    # # Plot the spectrum of the most massive star
    # idx = cluster.mass.argmax()
    # plt.clf()
    # plt.plot(cluster.stars[idx].wave, cluster.stars[idx].flux, 'k.')

    # # Plot an integrated spectrum of the whole cluster.
    # wave, flux = cluster.get_integrated_spectrum()
    # plt.clf()
    # plt.plot(wave, flux, 'k.')

    return
Пример #10
0
def multinest_run(root_dir='/Users/jlu/work/wd1/analysis_2015_01_05/',
                  data_tab='catalog_diffDered_NN_opt_10.fits',
                  comp_tab='completeness_ccmd.fits',
                  out_dir='multinest/fit_0001/'):

    if not os.path.exists(root_dir + out_dir):
        os.makedirs(root_dir + out_dir)

    # Input the observed data
    t = Table.read(root_dir + data_tab)

    # Input the completeness table and bins.
    completeness_map = pyfits.getdata(root_dir + comp_tab)
    completeness_map = completeness_map.T
    _in_bins = open(root_dir + comp_tab.replace('.fits', '_bins.pickle'), 'r')
    bins_mag = pickle.load(_in_bins)
    bins_col1 = pickle.load(_in_bins)
    bins_col2 = pickle.load(_in_bins)

    # Some components of our model are static.
    imf_multi = multiplicity.MultiplicityUnresolved()
    imf_mmin = 0.1  # msun
    imf_mmax = 150.0  # msun
    evo_model = evolution.MergedBaraffePisaEkstromParsec()
    red_law = reddening.RedLawNishiyama09()
    atm_func = atmospheres.get_merged_atmosphere
    Mcl_sim = 5.0e6

    # Our data vs. model comparison will be done in
    # magnitude-color-color space. Models will be binned
    # to construct 3D probability density spaces.
    # These are the bin sizes for the models.
    #
    # Note Dimensions:
    #   mag = m_2010_F160W
    #   col1 = m_2005_F814W - m_2010_F160W
    #   col2 = m_2010_F125W - m_2010_F160W
    #
    bins = np.array([bins_mag, bins_col1, bins_col2])

    def priors(cube, ndim, nparams):
        return

    def likelihood(cube, ndim, nparams):
        ##########
        # Priors (I think order matters)
        ##########
        parName = [
            'distance', 'LogAge', 'AKs', 'dAKs', 'alpha1', 'alpha2', 'mbreak',
            'Mcl'
        ]
        par, par_prior_logp = get_prior_info(cube, parName)

        sysMass = np.zeros(len(t))

        ##########
        # Load up the model cluster.
        ##########
        imf_mass_limits = np.array([imf_mmin, par['mbreak'], imf_mmax])
        imf_powers = np.array([par['alpha2'], par['alpha1']])
        imf_multi = None
        new_imf = imf.IMF_broken_powerlaw(imf_mass_limits, imf_powers,
                                          imf_multi)

        print 'Getting Isochrone'
        new_iso = synthetic.IsochronePhot(par['LogAge'],
                                          par['AKs'],
                                          par['distance'],
                                          evo_model=evo_model,
                                          atm_func=atm_func,
                                          red_law=red_law)

        print 'Getting Cluster'
        cluster = synthetic.ResolvedClusterDiffRedden(new_iso,
                                                      new_imf,
                                                      Mcl_sim,
                                                      par['dAKs'],
                                                      red_law=red_law)

        # Convert simulated cluster into agnitude-color-color histogram
        mag = cluster.star_systems['mag160w']
        col1 = cluster.star_systems['mag814w'] - mag
        col2 = cluster.star_systems['mag125w'] - mag

        data = np.array([mag, col1, col2]).T
        bins = np.array([bins_mag, bins_col1, bins_col2])

        H_sim_c, edges = np.histogramdd(data, bins=bins, normed=True)
        H_sim = H_sim_c * completeness_map

        # Convert Observed cluster into magnitude-color-color histogram
        mag = t['m_2010_F160W']
        col1 = t['m_2005_F814W'] - t['m_2010_F160W']
        col2 = t['m_2010_F125W'] - t['m_2010_F160W']

        data = np.array([mag, col1, col2]).T
        bins = np.array([bins_mag, bins_col1, bins_col2])

        H_obs, edges = np.histogramdd(data, bins=bins)

        # Plotting
        extent = (bins_col1[0], bins_col2[-1], bins_mag[0], bins_mag[-1])
        py.figure(1)
        py.clf()
        py.imshow(H_sim_c.sum(axis=2), extent=extent)
        py.gca().invert_yaxis()
        py.colorbar()
        py.axis('tight')
        py.title('Sim Complete')

        py.figure(2)
        py.clf()
        py.imshow(H_sim.sum(axis=2), extent=extent)
        py.gca().invert_yaxis()
        py.colorbar()
        py.axis('tight')
        py.title('Sim Incomplete')

        py.figure(3)
        py.clf()
        py.imshow(H_obs.sum(axis=2), extent=extent)
        py.gca().invert_yaxis()
        py.colorbar()
        py.axis('tight')
        py.title('Obs Incomplete')

        py.figure(4)
        py.clf()
        py.imshow(completeness_map.mean(axis=2), extent=extent, vmin=0, vmax=1)
        py.gca().invert_yaxis()
        py.colorbar()
        py.axis('tight')
        py.title('Completeness Map')

        pdb.set_trace()

        mcc_cluster = 1

        print likei.sum()
        return likei.sum()

    num_dims = 8
    num_params = 8
    ev_tol = 0.3
    samp_eff = 0.8
    n_live_points = 300

    # pymultinest.run(likelihood, priors, num_dims, n_params=num_params,
    #                 outputfiles_basename=out_dir + 'test',
    #                 verbose=True, resume=False, evidence_tolerance=ev_tol,
    #                 sampling_efficiency=samp_eff, n_live_points=n_live_points,
    #                 multimodal=True, n_clustering_params=num_dims)
    cube_test = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]
    likelihood(cube_test, num_dims, num_params)