Comprehensive guide#
This guide covers the options you can choose when building a Cosmicjellyfish Fisher forecast, and what you can do with the result. For a runnable end-to-end example, start with A verified first forecast. For installation, see the installation guide.
Core concepts#
A forecast combines:
a fiducial cosmology: the parameter values at which observables are evaluated;
free parameters, each with a finite-difference step size used for derivatives;
one or more observables, such as
GCph(photometric galaxy clustering) andWL(weak lensing); anda survey specification, loaded from the packaged YAML files.
Choose a cosmology backend#
Set options["code"] to choose where the cosmology comes from:
|
Source |
|---|---|
|
CAMB (the default if |
|
CLASS. |
|
Built-in backend; no Boltzmann solver is run, so it is much faster. |
|
Precomputed tables read from files (see below). |
CAMB and CLASS are installed together with Cosmicjellyfish (as the camb and
classy packages), so camb and class work without extra setup. They run a
Boltzmann solver for every derivative step and are therefore slower than
symbolic. Omit the YAML path to use the default configurations in
cosmicjellyfish/configs/default_boltzmann_yaml_files/.
If the fiducial cosmology has no Neff, both solvers use the standard value
3.044. It is a fixed input: it is only varied if you put it in freepars.
The examples in this guide use symbolic so that they run quickly. To use
CAMB or CLASS, change code; check a small forecast against your solver
setup before using it for science.
Observables and survey settings#
Observable |
Meaning |
Notes |
|---|---|---|
|
Euclid photometric clustering and shear |
Run together or separately. |
|
Euclid spectroscopic clustering |
Run as a separate forecast from |
|
CMB temperature and polarisation |
Use |
|
HI intensity mapping |
Needs |
FisherMatrix.compute() takes the photometric branch if GCph or WL is
requested and the spectroscopic branch if GCsp is requested, so run these as
separate forecasts and add the resulting Fisher objects if appropriate.
For the CMB, do not use TT, EE, BB, TE, survey_name="CMB" or
survey_name_cmb; they are not valid configuration names. See
CMB benchmarks for the Planck, Simons Observatory and
Stage-IV specs, the single-ell-range limitation, and smoke-test scripts.
For a custom survey, pass a complete specifications dictionary to
FisherMatrix. Adding a YAML file alone does not register a new survey name.
Shipped survey files#
Pass a file name (without .yaml) as survey_name_photo, survey_name_spectro
or survey_name_radio_IM. Cosmicjellyfish looks in specs_dir first (by default
cosmicjellyfish/configs/default_survey_specifications) and then in
cosmicjellyfish/configs/other_survey_specifications, so every shipped file below
can be selected by name alone.
default_survey_specifications/
File |
Description |
|---|---|
|
|
|
Same scales, with |
|
As above with |
|
|
|
Same setup, from arXiv:2405.06047. |
|
As above with |
|
CMB: |
|
CMB with Planck low-ell: |
other_survey_specifications/
File |
Description |
|---|---|
|
Photometric, different bins, 2500 deg². |
|
IST:F photometric with |
|
DR1-like |
|
IST:F |
|
IST:F |
|
SKAO photometric: |
|
SKAO HI |
|
SKAO HI intensity mapping ( |
|
MeerKLASS |
For IM forecasts, survey_name_radio_IM defaults to SKAO-IM-Redbook.
options = {
"survey_name_radio_IM": "SKAO-IM-Redbook", # the default
"survey_name_photo": False,
"survey_name_spectro": False,
}
forecast = cff.FisherMatrix(..., options=options, observables=["IM"], surveyName="SKAO")
Note
No Rubin or DESI specification file is shipped. The Rubin and DESI branches in
config.py load whatever file you name in survey_name_photo or
survey_name_spectro.
Derivatives and nuisance parameters#
Select the finite-difference method with options["derivatives"]: 3PT
(default), STEM, POLY or 4PT_FWD. Not every method supports every
observable; see Observable support by method
before using anything other than 3PT for CMB, GCsp or IM.
Nuisance parameters are survey- and model-specific. For example, the default
Euclid spectroscopic specification uses lnbg_1 to lnbg_4 for its logarithmic
galaxy bias. Check the survey YAML before adding nuisance parameters to
freepars. The Nuisance class (cosmicjellyfish.cosmology.nuisance) builds the
bias, shot-noise and intrinsic-alignment functions from these settings; you
rarely need to call it directly.
Advanced options#
These keys go in options; the defaults suit most forecasts.
Option |
Default |
Meaning |
|---|---|---|
|
|
Power spectrum traced by clustering: |
|
|
Modified-gravity lensing term: |
|
|
If |
|
|
Cache cosmologies in |
Two legacy switches, kh_rescaling_bug and kh_rescaling_beforespecerr_bug
(default False), reproduce an old, unphysical h/h_fid rescaling of k in the
spectroscopic power spectrum. Leave them off unless you must reproduce older
results.
Work with the Fisher object#
The returned object holds the matrix and its parameter metadata. Add
compatible Fisher objects with +:
combined = fisher_a + fisher_b
print(combined.get_param_names())
The module cosmicjellyfish.analysis.fisher_operations provides marginalise,
marginalise_over, reshuffle and information_gain (the Fisher approximation
of the Kullback-Leibler divergence between two experiments, given a prior).
To keep Omegam and h and marginalise over everything else:
from cosmicjellyfish.analysis.fisher_operations import marginalise
reduced = marginalise(fisher, ["Omegam", "h"])
To fix parameters at their fiducial values instead (dropping their rows and
columns without marginalising), use eliminate_parameters(fisher, names), or
eliminate_columns_rows(fisher, indexes) with zero-based positions.
A forecast with a non-empty outroot also writes a *_specs.json snapshot next
to the Fisher matrix. cosmicjellyfish.utilities.utils.load_fisher_from_json(path)
rebuilds the FisherMatrix from it and returns (forecast, snapshot); call
forecast.compute() to rerun it.
For debugging, every forecast keeps its raw derivatives in forecast.derivs_dict
(photometric forecasts also expose them as forecast.photo_derivs). Other
intermediate attributes are not a stable API; prefer the returned Fisher object.
The names add_fishers, marginalize, conditionalize and resample_basis
do not exist.
Plot and compare Fisher matrices#
CosmicFish_FisherAnalysis(cosmicjellyfish.analysis.fisher_plot_analysis) holds a list of Fisher matrices, or loads them from files, and appliesmarginalise/reshuffleto all of them at once.fisher_plotting(cosmicjellyfish.analysis.fisher_plotting) draws comparison contour plots for such a group.cosmicjellyfish.analysis.fishconsumerprovidesmake_triangle_plot(Fisher matrices and MCMC chains),fishtable_to_pandasfor error tables, and chain loaders; see Likelihood sampling with Nautilus.
from cosmicjellyfish.analysis.fisher_plot_analysis import CosmicFish_FisherAnalysis
from cosmicjellyfish.analysis.fishconsumer import make_triangle_plot
fisher.name = "WL+GCph"
analysis = CosmicFish_FisherAnalysis(fisher_list=[fisher])
small = analysis.marginalise(["Omegam", "h"]) # applied to every Fisher
fig = make_triangle_plot(fishers=[fisher], fisher_labels=["WL+GCph"], params=["Omegam", "h"])
Advanced topics#
Precomputed cosmologies (code="external")#
With code="external", Cosmicjellyfish reads background, growth and power-spectrum
tables from text files instead of running a solver. Pass extfiles to
FisherMatrix, with a directory holding one folder for the fiducial cosmology
and one for each finite-difference step:
my_cosmologies/
fiducial_eps_0/
Omegam_pl_eps_1p0E-02/ # <folder name>_<pl|mn>_eps_<relative step>
Omegam_mn_eps_1p0E-02/
h_pl_eps_1p0E-02/
h_mn_eps_1p0E-02/
Each folder contains the same files (any extension, read with numpy.loadtxt):
z_values_list, k_values_list, background_Hz, sigma8-z, and the
(n_z, n_k) tables D_Growth-zk, f_GrowthRate-zk, Plin-zk and Pnonlin-zk.
Different names can be set in extfiles["file_names"]. GCsp_Tracer="clustering"
additionally needs the *cb* files.
extfiles = {
"directory": "my_cosmologies",
"fiducial_folder": "fiducial_eps_0",
"paramnames": ["Omegam", "h"], # keys of the cosmological parameters
"folder_paramnames": ["Omegam", "h"], # folder prefixes, same order
"eps_values": [0.01], # relative steps available on disk
"k-units": "1/Mpc", # or "h/Mpc"
"r-units": "1/Mpc", # H(z) units; or "Mpc/h", "km/s/Mpc"
}
forecast = cff.FisherMatrix(..., options={"code": "external"}, extfiles=extfiles)
Only parameters listed in folder_paramnames can be varied.
Cosmology calculator#
cosmo_functions gives direct access to distances, growth and power spectra
without running a Fisher calculation. It reads the global configuration, so call
config.init first:
from cosmicjellyfish.configs import config as cfg
from cosmicjellyfish.cosmology.cosmology import cosmo_functions
cfg.init(
options={"code": "symbolic", "feedback": 0},
observables=["GCph"],
fiducialpars={"Omegam": 0.32, "h": 0.67},
freepars={"Omegam": 0.01, "h": 0.01},
)
cosmo = cosmo_functions(cfg.fiducialparams)
cosmo.Hubble(0.5, physical=True) # H(z) in km/s/Mpc
cosmo.comoving(0.5) # comoving distance, Mpc
cosmo.Pmm(0.5, 0.1, nonlinear=False) # P(k) at z=0.5, k=0.1 1/Mpc
cosmo.sigma8_of_z(0.5) # sigma_8(z)
To avoid global state, cosmicjellyfish.configs.context.build_analysis_context
takes the same arguments as config.init and returns an immutable
AnalysisContext. Pass it as
cosmo_functions(dict(ctx.fiducialparams), configuration=ctx).
Performance#
COSMICFISH_FAST_EFF, COSMICFISH_FAST_P and COSMICFISH_FAST_KERNEL enable
fast implementations in the photometric calculations. They are on by default;
set one to 0 to compare against the slower path.
Project status and citation#
Cosmicjellyfish has a backend-neutral derivative-provider interface. The optional
JAXcosmo backend uses it to supply automatic-differentiation derivatives for the
photometric (GCph, WL) and spectroscopic (GCsp) observables, alongside the
default finite-difference schemes. See JAXcosmo and automatic differentiation for the supported models,
the AD and FD routes, and their known limitations.
To cite the project, use the repository’s CITATION.cff.
Next steps#
Start from the verified photometric example and change one option at a time.
Browse the scripts reference for benchmark, validation and backend-comparison workflows.
Read the API documentation before adding a new survey model or parameterisation.