# Configurations for "fg21sim"
# -*- mode: conf -*-
#
# Syntax: `ConfigObj`, https://github.com/DiffSK/configobj
#
# This file contains the options corresponding the extragalactic emission
# components, which currently includes the following components:
# - clusters: halos
# - pointsources


[extragalactic]

  # Press-Schechter formalism to determine the dark matter halos
  # distribution with respect to masses and redshifts, from which
  # to further determine the total number of halos within a sky
  # patch and to sample the masses and redshifts for each halo.
  # NOTE: only consider the *dark matter* mass within the halo!
  [[psformalism]]
  # The model of the fitting function for halo mass distribution
  # For all models and more details:
  # https://hmf.readthedocs.io/en/latest/_autosummary/hmf.fitting_functions.html
  model = option("smt", "jenkins", "ps", default="ps")

  # The minimum (inclusive) and maximum (exclusive!) halo mass (dark
  # matter only) within which to calculate the halo mass distribution.
  # Unit: [Msun]
  M_min = float(default=1e12, min=1e10, max=1e14)
  M_max = float(default=1e16, min=1e14, max=1e18)
  # The logarithmic (base 10) step size for the halo masses; therefore
  # the number of intervals is: (log10(M_max) - log10(M_min)) / M_step
  M_step = float(default=0.01, min=0.001, max=0.1)

  # The minimum and maximum redshift within which to calculate the
  # halo mass distribution; as well as the step size.
  z_min = float(default=0.01, min=0.001, max=1.0)
  z_max = float(default=4.0, min=1.0, max=100)
  z_step = float(default=0.01, min=0.001, max=1.0)

  # Output file (NumPy ".npz" format) to save the calculated halo mass
  # distributions at every redshift.
  #
  # This file packs the following 3 NumPy arrays:
  # * ``dndlnm``:
  #   Shape: (len(z), len(mass))
  #   Differential mass function in terms of natural log of M.
  #   Unit: [Mpc^-3] (the little "h" is folded into the values)
  # * ``z``:
  #   Redshifts where the halo mass distribution is calculated.
  # * ``mass``:
  #   (Logarithmic-distributed) masses points.
  #   Unit: [Msun] (the little "h" is folded into the values)
  dndlnm_outfile = string(default=None)

  # Extended emissions from the clusters of galaxies
  # The configurations in this ``[[clusters]]`` section may also be
  # used by the following ``[[halos]]`` section.
  [[clusters]]
  # Output CSV file of the clusters catalog containing the simulated
  # mass, redshift, position, shape, and the recent major merger info.
  catalog_outfile = string(default=None)

  # Whether to directly use the (previously simulated) catalog file
  # specified as the above "catalog_outfile" option?
  # NOTE:
  # By using an existing catalog, the steps to derive these data are
  # simply skipped.
  # Due to the small number density of the galaxy clusters, the simulated
  # results within a small patch of sky (e.g., 100 [deg^2]) show
  # significant fluctuations (several or even several tens of times
  # of differences between simulations).  Therefore, one may run many
  # tests and only create images at some frequencies necessary for
  # testing, then select the satisfying one to continue the simulation
  # to generate images at all frequencies.
  use_output_catalog = boolean(default=False)

  # Output CSV file of the halos catalog containing the calculated
  # properties of the simulated halos.
  halos_catalog_outfile = string(default=None)

  # Whether to dump the whole data of the simulated halos in Python
  # native pickle format (i.e., ".pkl") to a file with the same basename
  # as the above ``halos_catalog_outfile``?
  # The dumped data also includes the derived electron spectrum for
  # each halo, therefore this file can be reloaded back in order to
  # calculate the emissions at other frequencies.
  dump_halos_data = boolean(default=True)

  # Whether to directly use the (previously dumped) halos data (".pkl")
  # as specified by the above ``halos_catalog_outfile`` and
  # ``dump_halos_data`` options?
  # In this way, the radio emissions at additional frequencies can be
  # easily (and consistently) calculated.
  use_dump_halos_data = boolean(default=False)

  # The minimum mass for clusters when to determine the galaxy clusters
  # total counts and their distributions.
  # Unit: [Msun]
  mass_min = float(default=1e14, min=1e12)

  # Boost the number of expected cluster number within the sky coverage
  # by the specified times.
  # (NOTE: mainly for testing purpose.)
  boost = float(default=1.0, min=0.1, max=1e4)

  # Minimum mass change of the main cluster to be regarded as a merger
  # event instead of an accretion event.
  # Unit: [Msun]
  merger_mass_min = float(default=1e12, min=1e10, max=1e14)

  # The merger timescale, which roughly describes the duration of the
  # merger-induced disturbance (~2-3 Gyr).  This timescale is much longer
  # the merger crossing time (~1 Gyr), and is also longer than the lifetime
  # of radio halos.
  # Unit: [Gyr]
  tau_merger = float(default=2.0, min=1.0, max=5.0)

  # Mass ratio of the main and sub clusters, below which is regarded as
  # a major merger event.
  ratio_major = float(default=5.0, min=1.0, max=10.0)

  # Whether to use the maximum merger event (i.e., biggest mass of the
  # sub cluster) within the above ``tau_merger`` timescale to simulate the
  # subsequent radio halo simulation?  Otherwise only the most recent major
  # merger event will be used.
  use_max_merger = boolean(default=False)

  # The fraction of the magnetic field energy density w.r.t. the ICM
  # thermal energy density, which is used to determine the mean magnetic
  # field strength within the ICM and is also assumed to be uniform.
  eta_b = float(default=0.001, min=1e-5, max=0.1)

  # The temperature of the outer gas surrounding the cluster.  Accretion
  # shocks form near the cluster virial radius during the cluster formation,
  # which can heat the cluster ICM to have a higher temperature than the
  # virial temperature:
  #     kT_icm ~ kT_vir + 1.5 * kT_out
  # Reference: Fujita et al. 2003, ApJ, 584, 190; Eq.(49)
  # Unit: [keV]
  kT_out = float(default=0.5, min=0, max=1)

  # Filename prefix for this component
  prefix = string(default="cluster")
  # Output directory to save the simulated results
  output_dir = string(default=None)


  # Giant radio halos for clusters with recent major mergers
  [[halos]]
  # The turbulence is generally injected at the cluster center during
  # a merger.  This option parameterize the turbulence injection scale
  # to be a fraction of the virial radius of the (main) cluster, which
  # is also used to determine the radio halo radius.
  f_lturb = float(default=0.33, min=0.1, max=1.0)

  # The custom option to tune the turbulent acceleration timescale, which
  # controls the relativistic particle acceleration efficiencies.
  # NOTE: The smaller this parameter, the shorter the acceleration
  #       timescale, therefore the more efficient the turbulent acceleration.
  f_acc = float(default=1.5, min=0.1, max=10)

  # The fraction of cluster thermal energy originating from turbulent
  # dissipation, which describes the turbulence intensity in the ICM,
  # and determines its Mach number.
  # NOTE: Currently, this parameter only determines the turbulence Mach
  #       number, which affects only the turbulent acceleration efficiency,
  #       which is also controlled by the above ``f_acc`` parameter.
  #       So we can just *fix* this parameter to its default value.
  eta_turb = float(default=0.2, min=0.1, max=1.0)

  # Ratio of the total energy injected into cosmic-ray electrons during
  # the cluster life to its total thermal energy.
  eta_e = float(default=0.001, min=0.001, max=0.1)

  # Electron injection, which is assumed to have a constant injection
  # rate and a power-law spectrum.
  injection_index = float(default=2.3, min=2.1, max=3.5)

  # Minimum and maximum Lorentz factor (i.e., energy) of the relativistic
  # electron spectrum.
  gamma_min = float(default=1)
  gamma_max = float(default=1e5)
  # Number of cells on the logarithmic momentum grid used to solve the
  # Fokker-Planck equation.
  gamma_np = integer(default=200, min=100)

  # Number of cells used as the buffer regions near both the lower
  # and upper boundaries, within which the values will be replaced by
  # extrapolating from the inner-region data, in order to avoid the
  # unphysical particle pile-ups.
  # It is suggested to be about 5%-10% of the above ``gamma_np``.
  # NOTE: * set to 0 to disable boundary fixes;
  #       * otherwise, set to a number >= 2.
  buffer_np = integer(default=10, min=0)

  # Time step for solving the Fokker-Planck equation
  # Unit: [Gyr]
  time_step = float(default=0.01, min=1e-4, max=0.1)

  # How long the period before the merger begins, which is used to derive
  # an approximately steady initial electron spectrum.  During this period,
  # the acceleration is turned off and only leaves energy loss mechanisms.
  # Unit: [Gyr]
  time_init = float(default=0.6, min=0)


  # Extragalactic point sources
  [[pointsources]]
  # Output directory to save the simulated catalog
  output_dir = string(default="PS_tables")
  # PS components to be simulated
  pscomponents = string_list(default=list())
  # Resolution [arcmin]
  resolution = float(default=0.6, min=0.0)

    [[[starforming]]]
    # Number of samples
    numps = integer(default=1000)
    # Prefix
    prefix = string(default="SF")

    [[[starbursting]]]
    # Number of samples
    numps = integer(default=1000)
    # Prefix
    prefix = string(default="SB")

    [[[radioquiet]]]
    # Number of samples
    numps = integer(default=1000)
    # Prefix
    prefix = string(default="RQ")

    [[[FRI]]]
    # Number of samples
    numps = integer(default=1000)
    # Prefix
    prefix = string(default="FRI")

    [[[FRII]]]
    # Number of samples
    numps = integer(default=1000)
    # Prefix
    prefix = string(default="FRII")