# Zheng et al. (2007) Composite Model¶

This section of the documentation describes the basic behavior of
the `zheng07`

composite HOD model. To see how this composite
model is built by the `PrebuiltHodModelFactory`

class,
see `zheng07_model_dictionary`

.

## Overview of the Zheng et al. (2007) Model Features¶

This HOD-style model is based on Zheng et al. (2007), arXiv:0703457.
There are two populations, centrals and satellites.
Central occupation statistics are given by a nearest integer distribution
with first moment given by an `erf`

function; the class governing this
behavior is `Zheng07Cens`

.
Central galaxies are assumed to reside at the exact center of the host halo;
the class governing this behavior is `TrivialPhaseSpace`

.

Satellite occupation statistics are given by a Poisson distribution
with first moment given by a power law that has been truncated at the low-mass end;
the class governing this behavior is `Zheng07Sats`

;
satellites in this model follow an (unbiased) NFW profile, as governed by the
`NFWPhaseSpace`

class.

## Building the Zheng et al. (2007) Model¶

You can build an instance of this model using the
`PrebuiltHodModelFactory`

class as follows:

```
>>> from halotools.empirical_models import PrebuiltHodModelFactory
>>> model = PrebuiltHodModelFactory('zheng07')
```

## Customizing the Zheng et al. (2007) Model¶

There are three keyword arguments you can use to customize
the instance returned by the factory, `threshold`

, `redshift`

and
`modulate_with_cenocc`

. In this section, we cover each of these keywords in turn.

### Role of the `threshold`

keyword¶

The `threshold`

keyword argument pertains to the r-band absolute magnitude
of the luminosity of the galaxy sample:

```
>>> model = PrebuiltHodModelFactory('zheng07', threshold = -20)
```

The only purpose of this keyword is to allow you
to instantiate your model according to the best-fit values of the parameters
taken from Table 1 of Zheng et al. (2007). After instantiation, the
`threshold`

attribute has no impact whatsoever on the behavior of the model.
If you choose a different value for `threshold`

than one of the values in Table 1
of Zheng et al. (2007), the model behavior will be set to the best-fit parameters
of the `default_luminosity_threshold`

variable set in the
`model_defaults`

module, and you can proceed to
alter the `param_dict`

however you like (see below).

As described in Changing Composite Model Parameters, you can always change the model parameters
after instantiation by changing the values in the `param_dict`

dictionary. For example,

```
>>> model.param_dict['logMmin'] = 12.5
```

The above line of code changes the minimum mass for a halo to host a central galaxy to \(10^{12.5}M_{\odot}\). See Parameters of the Zheng et al. (2007) model for a description of all parameters of this model.

### Role of the `redshift`

keyword¶

The `redshift`

keyword argument must be set to the redshift of the
halo catalog you might populate with this model.

```
>>> model = PrebuiltHodModelFactory('zheng07', threshold = -20, redshift = 2)
```

For the `zheng07`

model, the `redshift`

attribute has no impact whatsoever on
the behavior of the model; the purpose of this keyword for factory standardization purposes only,
and also to remind users that this model has only been calibrated against *z=0* observational data.

### Role of the `modulate_with_cenocc`

keyword¶

Note

As described in the docstring, if you are trying to strictly reproduce
the results in Zheng et al 2007.
you should set the `modulate_with_cenocc`

keyword to True.
Note that the default value is False, which for typical regions of parameter
space gives very similar behavior to the published results.

The `modulate_with_cenocc`

keyword argument controls how the
`Zheng07Sats.mean_occupation`

function is calculated.
The default value is False, in which case the `Zheng07Sats.mean_occupation`

function is calculated according to the following equation:

When `modulate_with_cenocc`

is True, then the value of
\(\langle N_{\rm sat}\rangle(M_{\rm vir})\) as calculated above
will be multiplied by an overall factor of
\(\langle N_{\rm cen}\rangle(M_{\rm vir})\),
where the factor of \(\langle N_{\rm cen}\rangle\) is defined
according to `Zheng07Cens.mean_occupation`

:

If you wish to modulate your satellite occupation statistics using alternative models for \(\langle N_{\rm cen}\rangle(M_{\rm vir})\), see Advanced usage of the zheng07 model.

## Populating Mocks and Generating Zheng et al. (2007) Model Predictions¶

As with any Halotools composite model, the model instance
can populate N-body simulations with mock galaxy catalogs.
In the following, we’ll show how to do this
with fake simulation data via the `halocat`

argument.

```
>>> from halotools.sim_manager import FakeSim
>>> halocat = FakeSim()
>>> model = PrebuiltHodModelFactory('zheng07')
>>> model.populate_mock(halocat = halocat)
```

See `ModelFactory.populate_mock`

for information about how to
populate your model into different simulations.
See Tutorials on analyzing galaxy catalogs for a sequence of worked examples
on how to use the `mock_observables`

sub-package
to study a wide range of astronomical statistics predicted by your model.

## Studying the Zheng et al. (2007) Model Features¶

In addition to populating mocks, the `zheng07`

model also gives you access to
its underlying analytical relations. Here are a few examples:

```
>>> import numpy as np
>>> halo_mass = np.logspace(11, 15, 100)
```

To compute the mean number of each galaxy type as a function of halo mass:

```
>>> mean_ncen = model.mean_occupation_centrals(prim_haloprop = halo_mass)
>>> mean_nsat = model.mean_occupation_satellites(prim_haloprop = halo_mass)
```

## Parameters of the Zheng et al. (2007) model¶

The best way to learn what the parameters of a model do is to just play with the code: change parameter values, make plots of how the underying analytical relations vary, and also of how the mock observables vary. Here we just give a simple description of the meaning of each parameter. You can also refer to the original publication, arXiv:0703457, for further details.

To see how the following parameters are implemented, see `Zheng07Cens.mean_occupation`

.

- param_dict[‘logMmin’] - Minimum mass required for a halo to host a central galaxy.
- param_dict[‘sigma_logM’] - Rate of transition from \(\langle N_{\rm cen} \rangle = 0 \Rightarrow \langle N_{\rm cen} = 1 \rangle\).

To see how the following parameters are implemented, see `Zheng07Sats.mean_occupation`

.

- param_dict[‘alpha’] - Power law slope of the relation between halo mass and \(\langle N_{\rm sat} \rangle\).
- param_dict[‘logM0’] - Low-mass cutoff in \(\langle N_{\rm sat} \rangle\).
- param_dict[‘logM1’] - Characteristic halo mass where \(\langle N_{\rm sat} \rangle\) begins to assume a power law form.