def test_ancestors_without_descendant(nsnap_ancestor = 20, scatter = 0.0, source='li-drory-march'): 
    '''
    What happens to ancestors that do not have descendants at nsnap = 1


    Notes
    -----
    * More than 50% of the subhalos at nsnap=20 do not have descendants at nsnap = 1. 
        What happens to them? 
    * Do they become satellites? --> Some become satellites, others 
        with no mass subhalos don't stay in the catalog at all
    '''
    prettyplot()
    pretty_colors = prettycolors()

    fig = plt.figure(figsize=(10,10))
    sub = fig.add_subplot(111)
    
    # Central subhalo at nsnap_ancestor (ancesotr)
    anc = CentralSubhalos()
    anc.read(nsnap_ancestor, scatter=scatter, source=source)
    
    # Centrals subhalo at nsnap = 1 (descendant)
    des = CentralSubhalos()
    des.read(1, scatter=scatter, source=source)
    
    no_descendants = np.invert(np.in1d(anc.index, des.ancestor20))
    massive_nodescendants = np.where(anc.mass[no_descendants] > 0.0)
    print 'N_SH no descendants ', len(anc.mass[no_descendants])
    print 'N_SH total ', len(anc.mass)
    print np.float(len(anc.mass[no_descendants]))/np.float(len(anc.mass))

    no_des_index = anc.index[no_descendants][massive_nodescendants][:5]
    print anc.mass[no_descendants][massive_nodescendants][:5]
    for isnap in range(1, nsnap_ancestor)[::-1]: 
        i_des = CentralSubhalos()
        i_des.read(isnap, scatter=scatter, source=source)
    
        #print isnap, np.in1d(no_des_index, i_des.ancestor20)

        #if not np.in1d(no_des_index, i_des.ancestor20)[0]: 
        des_sh = Subhalos()
        des_sh.read(isnap, scatter=scatter, source=source)
        #if np.sum(np.in1d(des_sh.ancestor20, no_des_index)) != len(no_des_index): 
        #    raise ValueError
        print des_sh.ilk[np.in1d(des_sh.ancestor20, no_des_index)][np.argsort(des_sh.ancestor20[np.in1d(des_sh.ancestor20, no_des_index)])]
        print 'M* ', des_sh.mass[np.in1d(des_sh.ancestor20, no_des_index)][np.argsort(des_sh.ancestor20[np.in1d(des_sh.ancestor20, no_des_index)])]
        print 'M_halo ', getattr(des_sh, 'halo.m')[np.in1d(des_sh.ancestor20, no_des_index)][np.argsort(des_sh.ancestor20[np.in1d(des_sh.ancestor20, no_des_index)])]
        #print des_sh.mass[np.in1d(des_sh.index, no_des_index)]
        #np.in1d(i_des.ancestor20, no_des_index)

    sub.set_yscale('log')
    sub.set_ylim([10**-5, 10**-1])
    sub.set_xlim([6.0, 12.0])
    sub.legend(loc='upper right')
예제 #2
0
    def CentralSubhalo(self, nsnap, subhalo_prop=None):
        ''' Plot SMF of Central Subhalos
        '''
        if subhalo_prop is None: 
            raise ValueError

        censub = CentralSubhalos()
        censub.Read(nsnap, 
                scatter=subhalo_prop['scatter'], 
                source=subhalo_prop['source'], 
                nsnap_ancestor=subhalo_prop['nsnap_ancestor'])
        
        self.plot(mass=censub.mass, 
                line_color='k', line_style='-', label='Central Subhalos')

        return None
예제 #3
0
def LineageSMF(nsnap_ancestor,
               descendants=None,
               subhalo_prop={
                   'scatter': 0.0,
                   'source': 'li-march'
               },
               sfr_prop={
                   'fq': {
                       'name': 'wetzelsmooth'
                   },
                   'sfr': {
                       'name': 'average'
                   }
               }):
    ''' Plot the SMF of lineage galaxy population (both ancestor and descendants).
    Compare the lineage SMF to the central subhalo and analytic SMFs for all 
    subhalos. The main agreement, is between the lineage SMF and the central subhalo
    SMF. If nsnap_ancestor is high, then there should be more discrepancy 
    between LIneage SMF and CentralSubhalos SMF because more galaxies are lost. 
    '''
    # read in desendants from the lineage object
    if descendants is None:
        descendants = range(1, nsnap_ancestor)
    bloodline = Lineage(nsnap_ancestor=nsnap_ancestor,
                        subhalo_prop=subhalo_prop)
    bloodline.Read(descendants)

    smf_plot = plots.PlotSMF()
    # plot ancestor against the analytic SMF
    ancestor = getattr(bloodline, 'ancestor')
    #smf_plot.cenque(ancestor)   # SMF of lineage ancestor
    #smf_plot.analytic(
    #        ancestor.zsnap,
    #        source=ancestor.subhalo_prop['source'],
    #        line_style='-', lw=1,
    #        label='All Subhalos')

    #smf = SMF()
    #subh = CentralSubhalos()
    #subh.Read(
    #        nsnap_ancestor,
    #        scatter=ancestor.subhalo_prop['scatter'],
    #        source=ancestor.subhalo_prop['source'])
    #subh_mass, subh_phi = smf.centralsubhalos(subh)
    #smf_plot.sub.plot(subh_mass, subh_phi, lw=4, ls='--', c='gray', label='Central Subhalos')

    for isnap in descendants:
        descendant = getattr(bloodline, 'descendant_snapshot' + str(isnap))
        smf = SMF()
        subh = CentralSubhalos()
        subh.Read(isnap,
                  scatter=descendant.subhalo_prop['scatter'],
                  source=descendant.subhalo_prop['source'])
        subh_mass, subh_phi = smf.Obj(subh)
        smf_plot.sub.plot(subh_mass, subh_phi, lw=4, ls='--', c='gray')
        #print (subh_phi - d_phi)/d_phi

        #smf_plot.analytic(
        #        descendant.zsnap,
        #        source=descendant.subhalo_prop['source'],
        #        line_style='-', lw=1,
        #        label=None)

    smf_plot.set_axes()
    plt.show()
    smf_plot_file = ''.join([
        'figure/test/', 'LineageSMF', '.ancestor',
        str(nsnap_ancestor),
        bloodline._file_spec(subhalo_prop=bloodline.subhalo_prop,
                             sfr_prop=bloodline.sfr_prop), '.png'
    ])
    smf_plot.save_fig(smf_plot_file)
    return None
def test_ancestors_without_descendant(nsnap_ancestor=20,
                                      scatter=0.0,
                                      source='li-drory-march'):
    '''
    What happens to ancestors that do not have descendants at nsnap = 1


    Notes
    -----
    * More than 50% of the subhalos at nsnap=20 do not have descendants at nsnap = 1. 
        What happens to them? 
    * Do they become satellites? --> Some become satellites, others 
        with no mass subhalos don't stay in the catalog at all
    '''
    prettyplot()
    pretty_colors = prettycolors()

    fig = plt.figure(figsize=(10, 10))
    sub = fig.add_subplot(111)

    # Central subhalo at nsnap_ancestor (ancesotr)
    anc = CentralSubhalos()
    anc.read(nsnap_ancestor, scatter=scatter, source=source)

    # Centrals subhalo at nsnap = 1 (descendant)
    des = CentralSubhalos()
    des.read(1, scatter=scatter, source=source)

    no_descendants = np.invert(np.in1d(anc.index, des.ancestor20))
    massive_nodescendants = np.where(anc.mass[no_descendants] > 0.0)
    print 'N_SH no descendants ', len(anc.mass[no_descendants])
    print 'N_SH total ', len(anc.mass)
    print np.float(len(anc.mass[no_descendants])) / np.float(len(anc.mass))

    no_des_index = anc.index[no_descendants][massive_nodescendants][:5]
    print anc.mass[no_descendants][massive_nodescendants][:5]
    for isnap in range(1, nsnap_ancestor)[::-1]:
        i_des = CentralSubhalos()
        i_des.read(isnap, scatter=scatter, source=source)

        #print isnap, np.in1d(no_des_index, i_des.ancestor20)

        #if not np.in1d(no_des_index, i_des.ancestor20)[0]:
        des_sh = Subhalos()
        des_sh.read(isnap, scatter=scatter, source=source)
        #if np.sum(np.in1d(des_sh.ancestor20, no_des_index)) != len(no_des_index):
        #    raise ValueError
        print des_sh.ilk[np.in1d(des_sh.ancestor20, no_des_index)][np.argsort(
            des_sh.ancestor20[np.in1d(des_sh.ancestor20, no_des_index)])]
        print 'M* ', des_sh.mass[np.in1d(
            des_sh.ancestor20, no_des_index)][np.argsort(
                des_sh.ancestor20[np.in1d(des_sh.ancestor20, no_des_index)])]
        print 'M_halo ', getattr(des_sh, 'halo.m')[np.in1d(
            des_sh.ancestor20,
            no_des_index)][np.argsort(des_sh.ancestor20[np.in1d(
                des_sh.ancestor20, no_des_index)])]
        #print des_sh.mass[np.in1d(des_sh.index, no_des_index)]
        #np.in1d(i_des.ancestor20, no_des_index)

    sub.set_yscale('log')
    sub.set_ylim([10**-5, 10**-1])
    sub.set_xlim([6.0, 12.0])
    sub.legend(loc='upper right')
def OrphanSubhaloSMF(type,
                     nsnap_ancestor=20,
                     scatter=0.0,
                     source='li-drory-march'):
    ''' SMF for orphan central subhalos that do not have ancestors at snapshot 
    nsnap_ancestor.
    '''
    prettyplot()
    pretty_colors = prettycolors()

    fig = plt.figure(figsize=(10, 10))
    sub = fig.add_subplot(111)

    # Central subhalo at nsnap_ancestor
    if type == 'central':
        subh = CentralSubhalos()
    elif type == 'all':
        subh = Subhalos()
    subh.Read(nsnap_ancestor,
              scatter=scatter,
              source=source,
              nsnap_ancestor=nsnap_ancestor)
    ancestor_index = subh.index
    ancestor_mass = subh.mass

    for i_snap in [1, 5, 10, 15]:
        if i_snap >= nsnap_ancestor:
            continue

        smf = SMF()
        if type == 'central':
            subh = CentralSubhalos()
        elif type == 'all':
            subh = Subhalos()
        subh.Read(i_snap,
                  scatter=scatter,
                  source=source,
                  nsnap_ancestor=nsnap_ancestor)

        # total central subhalo SMF
        subh_mass, subh_phi = smf.centralsubhalos(subh)
        sub.plot(subh_mass, subh_phi, lw=4, c=pretty_colors[i_snap], alpha=0.5)

        # SMF of central subhalos who's ancestors are centrals at snapshot 20
        if i_snap == 1:
            label = 'Galaxies that do not have Ancestors'
        else:
            label = None
        orphan = np.invert(
            np.in1d(getattr(subh, 'ancestor' + str(nsnap_ancestor)),
                    ancestor_index))
        orph_mass, orph_phi = smf.smf(subh.mass[orphan])
        sub.plot(orph_mass,
                 orph_phi,
                 lw=2,
                 ls='--',
                 c=pretty_colors[i_snap],
                 label=label)

    anc_mass, anc_phi = smf.smf(ancestor_mass)
    sub.plot(anc_mass, anc_phi, lw=4, c='gray', label='Total')

    sub.set_yscale('log')
    sub.set_ylim([10**-5, 10**-1])
    sub.set_xlim([6.0, 12.0])
    sub.legend(loc='upper right')

    fig_file = ''.join([
        'figure/test/'
        'OrphanSubhaloSMF', '.', type, '_subhalo', '.scatter',
        str(round(scatter, 2)), '.ancestor',
        str(nsnap_ancestor), '.', source, '.png'
    ])
    fig.savefig(fig_file, bbox_inches='tight')
    plt.close()
    return None
def SubhaloSMF(type, scatter=0.0, source='li-drory-march', nsnap_ancestor=20):
    ''' Test the Subhalos/CentralSubhalos imported from TreePM by 
    comparing their measured SMFs to the analytic SMFs 

    Parameters
    ----------
    type : string 
        String that specifies whether we're interested in CentralSubhalos 
        or all Subhalos.
    scatter : float
        Float that specifies the scatter in the SMHM relation, which 
        affects the SHAM masses
    source : string
        String that specifies which SMF is used for SHAM
    '''
    prettyplot()
    pretty_colors = prettycolors()

    fig = plt.figure(figsize=(10, 10))
    sub = fig.add_subplot(111)
    for i_snap in range(1, nsnap_ancestor + 1):
        smf = SMF()
        if type == 'all':
            subh = Subhalos()
        elif type == 'central':
            subh = CentralSubhalos()
        else:
            raise ValueError

        subh.Read(i_snap,
                  scatter=scatter,
                  source=source,
                  nsnap_ancestor=nsnap_ancestor)

        subh_mass, subh_phi = smf.Obj(subh, dlogm=0.1, LF=False)
        sub.plot(subh_mass,
                 subh_phi,
                 lw=4,
                 c=pretty_colors[i_snap % 19],
                 alpha=0.5)

        analytic_mass, analytic_phi = smf.analytic(get_z_nsnap(i_snap),
                                                   source=source)
        sub.plot(analytic_mass,
                 analytic_phi,
                 lw=4,
                 ls='--',
                 c=pretty_colors[i_snap % 19],
                 label=r"$ z = " + str(round(get_z_nsnap(i_snap), 2)) + "$")

    sub.set_yscale('log')
    sub.set_ylim([10**-5, 10**-1])
    sub.set_xlim([6.0, 12.0])
    #sub.legend(loc='upper right')
    if type == 'all':
        subhalo_str = 'subhalo'
    elif type == 'central':
        subhalo_str = 'central_subhalo'
    else:
        raise ValueError
    plt.show()
    fig_file = ''.join([
        'figure/test/'
        'SubhaloSMF', '.', subhalo_str, '.scatter',
        str(round(scatter, 2)), '.ancestor',
        str(nsnap_ancestor), '.', source, '.png'
    ])
    fig.savefig(fig_file, bbox_inches='tight')
    plt.close()
def DescendantSubhaloSMF(type,
                         nsnap_ancestor=20,
                         scatter=0.0,
                         source='li-drory-march',
                         nomass=False):
    ''' SMF for 'descendant' all/central subhalos that have ancestors. If nomass is 
    specified, then we highlight the portion of the SMF from galaxies whose 
    ancestors have M* = 0 at snapshot nsnap_ancestor. 
    '''
    prettyplot()
    pretty_colors = prettycolors()

    fig = plt.figure(figsize=(10, 10))
    sub = fig.add_subplot(111)

    # Central subhalo at nsnap_ancestor
    if type == 'central':
        subh = CentralSubhalos()
    elif type == 'all':
        subh = Subhalos()

    # read in ancestor snapshot
    subh.Read(nsnap_ancestor,
              scatter=scatter,
              source=source,
              nsnap_ancestor=nsnap_ancestor)
    ancestor_index = subh.index
    ancestor_mass = subh.mass

    # galaxy has M* = 0 at nsnap_ancestor
    nomass = np.where(subh.mass == 0.0)
    nomass_anc_index = subh.index[nomass]
    nomass_anc_mass = subh.mass[nomass]
    # galaxy has M* > 0 at nsnap_ancestor
    massive = np.where(subh.mass > 0.0)
    massive_anc_index = subh.index[massive]
    massive_anc_mass = subh.mass[massive]

    for i_snap in [1, 5, 10, 15]:
        if i_snap == 1:
            massive_label = 'Galaxies whose Ancestors have M* > 0'
            nomass_label = 'Galaxies whose Ancestors have M* = 0'
            label = 'Total'
        elif i_snap >= nsnap_ancestor:
            continue
        else:
            massive_label = None
            nomass_label = None
            label = None

        smf = SMF()
        # total central subhalo SMF
        if type == 'central':
            subh = CentralSubhalos()
        elif type == 'all':
            subh = Subhalos()

        subh.Read(i_snap,
                  scatter=scatter,
                  source=source,
                  nsnap_ancestor=nsnap_ancestor)
        subh_mass, subh_phi = smf.centralsubhalos(subh)
        sub.plot(subh_mass,
                 subh_phi,
                 lw=3,
                 c=pretty_colors[i_snap],
                 label=label)

        anc_ind = getattr(subh, 'ancestor' + str(nsnap_ancestor))
        if not nomass:
            # SMF of central subhalos who's ancestors are massive centrals at snapshot 20
            if i_snap == 1:
                has_ancestor, has_descendant = intersection_index(
                    anc_ind, massive_anc_index)
            else:
                has_ancestor, has_d = intersection_index(
                    anc_ind, massive_anc_index)
            mass, phi = smf.smf(subh.mass[has_ancestor])
            sub.plot(mass,
                     phi,
                     lw=2,
                     ls='--',
                     c=pretty_colors[i_snap],
                     label=massive_label)

        if nomass:
            # SMF of central subhalos who's ancestors have M*=0 centrals at snapshot 20
            if i_snap == 1:
                has_ancestor, has_descendant = intersection_index(
                    anc_ind, nomass_anc_index)
            else:
                has_ancestor, has_d = intersection_index(
                    anc_ind, nomass_anc_index)
            mass, phi = smf.smf(subh.mass[has_ancestor])
            sub.plot(mass,
                     phi,
                     lw=2,
                     ls='--',
                     c=pretty_colors[i_snap],
                     label=nomass_label)

        del subh

    anc_mass, anc_phi = smf.smf(ancestor_mass)
    sub.plot(anc_mass, anc_phi, lw=2, c='k', label='Initial Redshift')
    #print 'With descendants at snapshot 1', len(ancestor_mass[has_descendant])
    #anc_massive = np.where(ancestor_mass[has_descendant] > 0.)
    #print 'With mass greater than 0', len(ancestor_mass[has_descendant[anc_massive]])
    #anc_mass, anc_phi = smf.smf(ancestor_mass[has_descendant])
    #sub.plot(anc_mass, anc_phi, ls='--', lw=4, c='k')
    #anc_mass, anc_phi = smf.smf(ancestor_mass[has_descendant[anc_massive]])
    #sub.plot(anc_mass, anc_phi, ls='--', lw=2, c='green')

    sub.set_yscale('log')
    sub.set_ylim([10**-5, 10**-1])
    sub.set_xlim([6.0, 12.0])
    sub.legend(loc='upper right')
    if nomass:
        nomass_str = '.ancestor_Mstar0'
    else:
        nomass_str = ''

    fig_file = ''.join([
        'figure/test/'
        'DescendantSubhaloSMF', '.', type, '_subhalo', '.scatter',
        str(round(scatter, 2)), '.ancestor',
        str(nsnap_ancestor), '.', source, nomass_str, '.png'
    ])

    fig.savefig(fig_file, bbox_inches='tight')
    plt.close()
    return None
def DescendantQAplot(nsnap_descendants, **sfinh_kwargs):
    ''' The ultimate QAplot t rule them all. 4 panels showing all the properties.
    '''
    sfinherit_file = InheritSF_file(nsnap_descendants, **sfinh_kwargs)
    bloodline = Lineage(nsnap_ancestor=sfinh_kwargs['nsnap_ancestor'],
                        subhalo_prop=sfinh_kwargs['subhalo_prop'])
    if not isinstance(nsnap_descendants, list):
        nsnap_descendants = [nsnap_descendants]
    bloodline.Read(nsnap_descendants, filename=sfinherit_file)

    for nsnap_descendant in nsnap_descendants:
        descendant = getattr(bloodline,
                             'descendant_snapshot' + str(nsnap_descendant))
        descendant.sfr_prop = sfinh_kwargs['sfr_prop']
        started_here = np.where(
            descendant.nsnap_genesis == sfinh_kwargs['nsnap_ancestor'])
        start_mass = descendant.mass_genesis[started_here]

        # Mass bins
        mass_bins = np.arange(7., 12.5, 0.5)
        mass_bin_low = mass_bins[:-1]
        mass_bin_high = mass_bins[1:]

        plt.close()
        prettyplot()
        fig = plt.figure(1, figsize=[25, 6])
        for i_sub in range(1, 5):
            sub_i = fig.add_subplot(1, 4, i_sub)

            if i_sub == 1:  # SMF
                mf = SMF()
                mass, phi = mf.Obj(descendant)

                sub_i.plot(mass,
                           phi,
                           lw=4,
                           c=pretty_colors[descendant.nsnap],
                           label=r'Simulated')

                censub = CentralSubhalos()
                censub.Read(descendant.nsnap,
                            scatter=sfinh_kwargs['subhalo_prop']['scatter'],
                            source=sfinh_kwargs['subhalo_prop']['source'],
                            nsnap_ancestor=sfinh_kwargs['nsnap_ancestor'])

                mass, phi = mf._smf(censub.mass)
                sub_i.plot(mass,
                           phi,
                           c='k',
                           lw=4,
                           ls='--',
                           label='Central Subhalos')

                sub_i.set_ylim([10**-5, 10**-1])
                sub_i.set_xlim([7.5, 12.0])
                plt.xticks([8., 9., 10., 11., 12.])
                sub_i.set_yscale('log')

                # x,y labels
                sub_i.set_xlabel(r'Mass $\mathtt{M_*}$', fontsize=25)
                sub_i.set_ylabel(r'Stellar Mass Function $\mathtt{\Phi}$',
                                 fontsize=25)
                sub_i.legend(loc='upper right', frameon=False)

            elif i_sub == 2:  # SFMS
                # SMF composition based on their initial mass at nsnap_ancestor
                for i_m in range(len(mass_bin_low)):
                    mbin = np.where((start_mass > mass_bin_low[i_m])
                                    & (start_mass <= mass_bin_high[i_m]))

                    sub_i.scatter(descendant.mass[started_here[0][mbin]],
                                  descendant.sfr[started_here[0][mbin]],
                                  color=pretty_colors[i_m],
                                  label=r"$\mathtt{M_{*,i}=}$" +
                                  str(round(mass_bin_low[i_m], 2)) + "-" +
                                  str(round(mass_bin_high[i_m], 2)))

                qfrac = Fq()
                m_arr = np.arange(9.0, 12.5, 0.5)
                sub_i.plot(m_arr,
                           qfrac.SFRcut(
                               m_arr,
                               descendant.zsnap,
                               sfms_prop=(sfinh_kwargs['sfr_prop'])['sfms']),
                           c='k',
                           ls='--',
                           lw=4)

                sub_i.set_xlim([9.0, 12.0])
                sub_i.set_ylim([-5.0, 2.0])
                sub_i.set_xlabel(r'$\mathtt{log\;M_*}$', fontsize=25)
                sub_i.set_ylabel(r'$\mathtt{log\;SFR}$', fontsize=25)

            elif i_sub == 3:  #SMHM
                for i_m in range(len(mass_bin_low)):
                    mbin = np.where((start_mass > mass_bin_low[i_m])
                                    & (start_mass <= mass_bin_high[i_m]))

                    sub_i.scatter(descendant.halo_mass[started_here[0][mbin]],
                                  descendant.mass[started_here[0][mbin]],
                                  color=pretty_colors[i_m],
                                  label=r"$\mathtt{M_{*,i}=}$" +
                                  str(round(mass_bin_low[i_m], 2)) + "-" +
                                  str(round(mass_bin_high[i_m], 2)))

                stellarmass = descendant.mass[started_here]
                halomass = descendant.halo_mass[started_here]
                mbin = np.arange(halomass.min(), halomass.max(), 0.25)
                mlow = mbin[:-1]
                mhigh = mbin[1:]

                muMstar = np.zeros(len(mlow))
                sigMstar = np.zeros(len(mlow))

                for im in range(len(mlow)):
                    mbin = np.where((halomass > mlow[im])
                                    & (halomass <= mhigh[im]))
                    muMstar[im] = np.mean(stellarmass[mbin])
                    sigMstar[im] = np.std(stellarmass[mbin])
                sub_i.errorbar(0.5 * (mlow + mhigh),
                               muMstar,
                               yerr=sigMstar,
                               color='k',
                               lw=3,
                               fmt='o',
                               capthick=2)

                sub_i.set_ylim([9.0, 12.0])
                sub_i.set_xlim([10.0, 15.0])
                sub_i.set_ylabel(r'Stellar Mass $\mathtt{M_*}$', fontsize=25)
                sub_i.set_xlabel(r'Halo Mass $\mathtt{M_{Halo}}$', fontsize=25)

                #sub_i.legend(loc='upper left', frameon=False, scatterpoints=1)
            elif i_sub == 4:  # Fq
                #mass, fq = descendant.Fq()
                sfq = qfrac.Classify(descendant.mass,
                                     descendant.sfr,
                                     descendant.zsnap,
                                     sfms_prop=descendant.sfr_prop['sfms'])
                gc = GroupCat(Mrcut=18, position='central')
                gc.Read()
                gc_sfq = qfrac.Classify(gc.mass,
                                        gc.sfr,
                                        np.mean(gc.z),
                                        sfms_prop=descendant.sfr_prop['sfms'])
                #sub_i.plot(mass, fq, color=pretty_colors[descendant.nsnap], lw=3, ls='--',
                #        label=r'$\mathtt{z =} '+str(descendant.zsnap)+'$')
                M_bin = np.array([9.7, 10.1, 10.5, 10.9, 11.3])
                M_low = M_bin[:-1]
                M_high = M_bin[1:]
                M_mid = 0.5 * (M_low + M_high)

                fq = np.zeros(len(M_low))
                gc_fq = np.zeros(len(M_low))
                for i_m in xrange(len(M_low)):
                    mlim = np.where((descendant.mass > M_low[i_m])
                                    & (descendant.mass <= M_high[i_m]))
                    gc_mlim = np.where((gc.mass > M_low[i_m])
                                       & (gc.mass <= M_high[i_m]))
                    ngal = np.float(len(mlim[0]))
                    gc_ngal = np.float(len(gc_mlim[0]))

                    if ngal != 0:  # no galaxy in mass bin
                        ngal_q = np.float(
                            len(np.where(sfq[mlim] == 'quiescent')[0]))
                        fq[i_m] = ngal_q / ngal
                    if gc_ngal != 0:
                        gc_ngal_q = np.float(
                            len(np.where(gc_sfq[gc_mlim] == 'quiescent')[0]))
                        gc_fq[i_m] = gc_ngal_q / gc_ngal

                sub_i.plot(M_mid,
                           fq,
                           color=pretty_colors[descendant.nsnap],
                           lw=3,
                           label=r'$\mathtt{z =} ' + str(descendant.zsnap) +
                           '$')

                fq_model = qfrac.model(
                    M_bin,
                    descendant.zsnap,
                    lit=sfinh_kwargs['sfr_prop']['fq']['name'])
                sub_i.plot(M_bin,
                           fq_model,
                           color='k',
                           lw=4,
                           ls='--',
                           label=sfinh_kwargs['sfr_prop']['fq']['name'])
                sub_i.scatter(M_mid,
                              gc_fq,
                              color='k',
                              s=100,
                              lw=0,
                              label='Group Catalog')

                sub_i.set_xlim([9.0, 12.0])
                sub_i.set_ylim([0.0, 1.0])

                sub_i.set_xlabel(r'Mass $\mathtt{M_*}$')
                sub_i.set_ylabel(r'Quiescent Fraction $\mathtt{f_Q}$',
                                 fontsize=20)

                sub_i.legend(loc='upper left',
                             frameon=False,
                             scatterpoints=1,
                             markerscale=0.75)

        plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0)
        fig_name = ''.join([
            'figure/test/', 'QAplot.', '.nsnap',
            str(nsnap_descendant), '.'.join(
                (sfinherit_file.rsplit('/')[-1]).rsplit('.')[:-1]), '.png'
        ])
        fig.savefig(fig_name, bbox_inches='tight')
        plt.close()
    return None
예제 #9
0
    def ImportSubhalo(self, nsnap, subhalo_prop=None):
        ''' Import Central Subhalo Snapshots with SHAM M* through the CentralSubhalos class 
        object. The CentralSubhalos class is a wrapper for Andrew Wetzel's TreePM code.
        
        Parameters
        ----------
        nsnap : int
            Subhalo Snapshot number. Each snapshot represents a different redshift. 
            Higher number are at higher redshifts. 
        
        subhalo_prop : dict (optional) 
            Optional dictionary that specifies the subhalo snapshot properties. 
            The properties include, 
            - scatter : float
                Scatter between SMF and HMF in SHAM 
            - source : str
                Specifies which analytic SMF to use for SHAM

        Notes 
        -----
        Also imports snapshot, redshift and t_cosmic metadata. 
        * SHAM stellar mass 
        * parent index 
        * child index 
        * halo mass 
        '''
        if self.subhalo_prop is None:
            self.subhalo_prop = subhalo_prop
        else:
            if subhalo_prop and self.subhalo_prop != subhalo_prop:
                # subhalo_prop values do not match
                raise ValueError

        centsub = CentralSubhalos()
        centsub.Read(
            nsnap,  # snapshot 
            scatter=self.subhalo_prop['scatter'],  # scatter
            source=self.subhalo_prop['source'],  # SMF source
            nsnap_ancestor=self.subhalo_prop['nsnap_ancestor'])
        #print centsub.file_name

        # pass CentralSubhalos class attributes to
        self.data_columns = self.get_datacol()
        for col in centsub.data_columns:
            if col == 'halo.m.max':
                newcol = 'halo_mass_max'
            elif col == 'index':
                newcol = 'snap_index'
            elif col == 'halo.m':
                newcol = 'halo_mass'
            else:
                newcol = col
            setattr(self, newcol, getattr(centsub, col))
            if newcol not in self.data_columns:
                self.data_columns.append(newcol)

        # Meta data
        self.metadata = [
            'nsnap', 'zsnap', 't_cosmic', 't_step', 'subhalo_prop'
        ]
        # get snapshot redshift/cosmic time data using Andrew's table
        n_snaps, z_snap, t_snap, t_wid = np.loadtxt(Util.snapshottable(),
                                                    unpack=True,
                                                    usecols=[0, 2, 3, 4])
        self.nsnap = nsnap
        self.zsnap = z_snap[(
            n_snaps.tolist()).index(nsnap)]  # redshift of snapshot
        self.t_cosmic = t_snap[(
            n_snaps.tolist()).index(nsnap)]  # t_cosmic of snapshot
        self.t_step = t_wid[(
            n_snaps.tolist()).index(nsnap)]  # Gyrs until next snapshot
        #print "import_treepm takes ", time.time() - start_time
        return None
예제 #10
0
def QAplot(descendant, sfinh_kwargs, fig_name=None, **kwargs):
    ''' Given galpop object and the SF Inheritance parametes, 
    plot its SMF, 
    '''
    # Mass bins
    mass_bins = np.arange(7., 12.5, 0.5)
    mass_bin_low = mass_bins[:-1]
    mass_bin_high = mass_bins[1:]

    plt.close()
    prettyplot()
    fig = plt.figure(1, figsize=[20,12])
    for i_sub in range(1,6): 
        sub_i = fig.add_subplot(2,3,i_sub) 
    
        if i_sub == 1:  # SMF
            mf = SMF()
            mass, phi = mf.Obj(descendant)

            sub_i.plot(mass, phi, lw=4, c='r', label=r'Simulated')

            censub = CentralSubhalos()
            censub.Read(descendant.nsnap, 
                    scatter=sfinh_kwargs['subhalo_prop']['scatter'], 
                    source=sfinh_kwargs['subhalo_prop']['source'], 
                    nsnap_ancestor=sfinh_kwargs['nsnap_ancestor'])

            mass, phi = mf._smf(censub.mass)
            sub_i.plot(mass, phi, c='k', lw=4, ls='--', label='Central Subhalos') 

            sub_i.set_ylim([10**-5, 10**-1])
            sub_i.set_xlim([7.5, 12.0])
            plt.xticks([8., 9., 10., 11., 12.])
            sub_i.set_yscale('log')

            # x,y labels
            sub_i.set_ylabel(r'Stellar Mass ($\mathtt{log\; M_*}$)', fontsize=20) 
            sub_i.set_ylabel(r'Stellar Mass Function $\mathtt{\Phi}$', fontsize=20) 
            sub_i.legend(loc='upper right', frameon=False)

        elif i_sub == 2: # SFMS
            # SMF composition based on their initial mass at nsnap_ancestor 

            # random subsample 
            n_tot = len(descendant.mass)
            r_subsample = np.random.choice(n_tot, size=100000)
            sub_i.scatter(descendant.mass[r_subsample], descendant.sfr[r_subsample], color='b', s=0.5) 

            qfrac = Fq()
            m_arr = np.arange(9.0, 12.5, 0.5)
            sub_i.plot(
                    m_arr, 
                    qfrac.SFRcut(m_arr, descendant.zsnap, sfms_prop=(sfinh_kwargs['sfr_prop'])['sfms']), 
                    c='k', ls='--', lw=4)

            sub_i.text(10.5, -4., r'$\mathtt{z='+str(descendant.zsnap)+'}$', fontsize=25)

            sub_i.set_xlim([9.0, 12.0])
            sub_i.set_ylim([-5.0, 2.0])
            sub_i.set_ylabel(r'Stellar Mass ($\mathtt{log\; M_*}$)', fontsize=20) 
            sub_i.set_ylabel(r'$\mathtt{log\;SFR}$', fontsize=20)

        elif i_sub == 3: #SMHM
            #corner.hist2d(descendant.halo_mass, descendant.mass, ax=sub_i, c='b', fill_contours=True, smooth=1.0)
            n_tot = len(descendant.mass)
            r_subsample = np.random.choice(n_tot, size=100000)
            sub_i.scatter(descendant.halo_mass[r_subsample], descendant.mass[r_subsample], color='b', s=0.5)

            stellarmass = descendant.mass
            halomass = descendant.halo_mass
            mbin = np.arange(halomass.min(), halomass.max(), 0.25) 
            mlow = mbin[:-1]
            mhigh = mbin[1:]
            
            muMstar = np.zeros(len(mlow))
            sigMstar = np.zeros(len(mlow))

            for im in range(len(mlow)): 
                mbin = np.where((halomass > mlow[im]) & (halomass <= mhigh[im]))
                muMstar[im] = np.mean(stellarmass[mbin])
                sigMstar[im] = np.std(stellarmass[mbin])
            sub_i.errorbar(0.5*(mlow+mhigh), muMstar, yerr=sigMstar, color='k', lw=3, fmt='o', capthick=2)

            sub_i.set_ylim([9.0, 12.0])
            sub_i.set_xlim([10.0, 15.0])
            sub_i.set_ylabel(r'Stellar Mass ($\mathtt{log\; M_*}$)', fontsize=20) 
            sub_i.set_xlabel(r'Halo Mass ($\mathtt{log\;M_{Halo}}$)', fontsize=20) 

        elif i_sub == 4: # Fq
            sfq = qfrac.Classify(descendant.mass, descendant.sfr, descendant.zsnap, 
                    sfms_prop=descendant.sfr_prop['sfms'])
            gc = GroupCat(Mrcut=18, position='central')
            gc.Read()
            gc_sfq = qfrac.Classify(gc.mass, gc.sfr, np.mean(gc.z), 
                    sfms_prop=descendant.sfr_prop['sfms'])
            #sub_i.plot(mass, fq, color=pretty_colors[descendant.nsnap], lw=3, ls='--', 
            #        label=r'$\mathtt{z =} '+str(descendant.zsnap)+'$')
            M_bin = np.array([9.7, 10.1, 10.5, 10.9, 11.3])
            M_low = M_bin[:-1]
            M_high = M_bin[1:]
            M_mid = 0.5 * (M_low + M_high)

            fq = np.zeros(len(M_low))
            gc_fq = np.zeros(len(M_low))
            for i_m in xrange(len(M_low)):
                mlim = np.where((descendant.mass > M_low[i_m]) & (descendant.mass <= M_high[i_m]))
                gc_mlim = np.where((gc.mass > M_low[i_m]) & (gc.mass <= M_high[i_m]))
                ngal = np.float(len(mlim[0]))
                gc_ngal = np.float(len(gc_mlim[0]))

                if ngal != 0:  # no galaxy in mass bin 
                    ngal_q = np.float(len(np.where(sfq[mlim] == 'quiescent')[0]))
                    fq[i_m] = ngal_q/ngal
                if gc_ngal != 0:
                    gc_ngal_q = np.float(len(np.where(gc_sfq[gc_mlim] == 'quiescent')[0]))
                    gc_fq[i_m] = gc_ngal_q/gc_ngal

            sub_i.plot(M_mid, fq, color='r', lw=3, label=r'Simulated')
            
            # fQ of the Group Catalog 
            sub_i.scatter(M_mid, gc_fq, color='k', s=100, lw=0, label='Group Catalog')
            # fQ of the model (input) fQ
            fq_model = qfrac.model(M_bin, descendant.zsnap, lit=sfinh_kwargs['sfr_prop']['fq']['name'])
            sub_i.plot(M_bin, fq_model, 
                    color='k', lw=4, ls='--', 
                    label=sfinh_kwargs['sfr_prop']['fq']['name'].replace('_', ' ').title() 
                    )

            sub_i.set_xlim([9.0, 12.0])
            sub_i.set_ylim([0.0, 1.0])

            sub_i.set_ylabel(r'Stellar Mass ($\mathtt{log\; M_*}$)', fontsize=20) 
            sub_i.set_ylabel(r'Quiescent Fraction $\mathtt{f_Q}$', fontsize=20) 

            sub_i.legend(loc='upper left', frameon=False, scatterpoints=1, markerscale=0.75)

        elif i_sub == 5: # Tau_Q(M*)
            mass_bin = np.arange(9.0, 12.0, 0.1)

            tau_m = getTauQ(mass_bin, tau_prop=sfinh_kwargs['evol_prop']['tau']) 
            sub_i.plot(10**mass_bin, tau_m, color='r', lw=4, label='Simulated') 

            if 'taus' in kwargs: 
                tau_slopes, tau_offsets = kwargs['taus']

                i_tau_ms = np.zeros((len(mass_bin), len(tau_slopes)))
                for i_tau in range(len(tau_slopes)): 
                    i_tau_prop = sfinh_kwargs['evol_prop']['tau'].copy()
                    i_tau_prop['slope'] = tau_slopes[i_tau]
                    i_tau_prop['yint'] = tau_offsets[i_tau]

                    i_tau_m = getTauQ(mass_bin, tau_prop=i_tau_prop) 
                    #sub_i.plot(10**mass_bin, i_tau_m, color='r', alpha=0.1, lw=2) 
                    i_tau_ms[:,i_tau] = i_tau_m
            
                sig_tau = np.zeros(len(mass_bin))
                for im in range(len(mass_bin)):
                    sig_tau[im] = np.std(i_tau_ms[im,:])
                
                sub_i.errorbar(10**mass_bin, tau_m, yerr=sig_tau, color='r', lw=4) 

            # satellite quenching fraction for comparison 
            tau_sat = getTauQ(mass_bin, tau_prop={'name': 'satellite'}) 

            sub_i.plot(10**mass_bin, tau_sat, color='black', lw=4, ls='--', label=r'Satellite (Wetzel+ 2013)') 

            sub_i.set_xlim([10**9.5, 10**11.75])
            sub_i.set_ylim([0.0, 2.0])
            sub_i.set_xscale('log')

            sub_i.set_xlabel(r'Stellar Mass $[\mathtt{M_\odot}]$',fontsize=20) 
            sub_i.legend(loc='upper right') 

            sub_i.set_ylabel(r'Quenching Timescales $(\tau_\mathtt{Q})$ [Gyr]',fontsize=20) 
        
    plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.0) 
    if fig_name is None: 
        plt.show()
        plt.close()
    else: 
        fig.savefig(fig_name, bbox_inches='tight') 
        plt.close()
    return None