Advanced usage of the zheng07 model¶
As described in the Zheng et al. (2007) Composite Model tutorial, the zheng07 model
gives you control over whether the \(\langle N_{\rm sat} \rangle\) function
is multiplied by a \(\langle N_{\rm cen} \rangle\) prefactor.
If you are using the PrebuiltHodModelFactory with the zheng07 model name,
then your only choice for how \(\langle N_{\rm cen} \rangle\) prefactor is computed is
the model used in Zheng et al 2007.
However, the cenocc_model keyword of Zheng07Sats allows you
to calculate the \(\langle N_{\rm cen} \rangle\) prefactor
using any OccupationComponent, including one of your own design.
To build a composite HOD model using the cenocc_model keyword,
you must call the HodModelFactory directly, rather than the PrebuiltHodModelFactory.
In the code below, we will demonstrate an explicit example of how to do so.
Note the similarity of the code below to the zheng07_model_dictionary source code.
First we create a new (rather trivial) OccupationComponent sub-class that we will
use for our centrals.
from halotools.empirical_models import OccupationComponent
class MyCenModel(OccupationComponent):
def __init__(self, threshold):
OccupationComponent.__init__(self, gal_type='centrals',
threshold=threshold, upper_occupation_bound=1.)
self.param_dict['new_cen_param'] = 0.5
def mean_occupation(self, **kwargs):
halo_table = kwargs['table']
result = np.zeros(len(halo_table)) + self.param_dict['new_cen_param']
return result
Now we will build an instance of MyCenModel,
and use the cenocc_model keyword of Zheng07Sats to create a custom version
of this satellite model.
centrals_occupation = MyCenModel(threshold=-20)
satellites_occupation = Zheng07Sats(threshold=-20, modulate_with_cenocc=True, cenocc_model=centrals_occupation)
Finally, we make the same choices for the profile modeling as made in the normal
pre-built zheng07 composite model, and then pass the resulting collection
of components to the HodModelFactory.
from halotools.empirical_models import TrivialPhaseSpace, NFWPhaseSpace
centrals_profile = TrivialPhaseSpace()
satellites_profile = NFWPhaseSpace()
from halotools.empirical_models import HodModelFactory
model_dict = {'centrals_occupation': centrals_occupation, 'centrals_profile': centrals_profile, 'satellites_occupation': satellites_occupation, 'satellites_profile': satellites_profile}
composite_model = HodModelFactory(**model_dict)
Note
Halotools provides no checks on the self-consistency between your choice for
centrals_occupation and the model instance bound to the cenocc_model
keyword. If you use the cenocc_model keyword when building a composite HOD model,
then it is your responsibility to self-consistently use the same model for your
centrals as for the cenocc_model argument. If you don’t, then changes to the
values in the param_dict of the composite model that pertain to
centrals_occupation will not propagate through to the behavior of satellites_occupation.