GWForge.population_fisher.compare ================================= .. py:module:: GWForge.population_fisher.compare .. autoapi-nested-parse:: Fit a population block to the injections and report what came back. Attributes ---------- .. autoapisummary:: GWForge.population_fisher.compare.BLOCK_ROLE Functions --------- .. autoapisummary:: GWForge.population_fisher.compare.compare_block Module Contents --------------- .. py:data:: BLOCK_ROLE .. py:function:: compare_block(model, block, injections, free_parameters=None) Fit one block to the injections and format the comparison. :param model: Fitted **in place**: on return ``model.fiducial`` holds the fitted values, so the Fisher that follows is evaluated at them. :type model: GWForge.population_fisher.base.PopulationModel :param block: ``"mass"``, ``"redshift"`` or ``"spin"``. :type block: str :param injections: Every injection, detected or not. :type injections: dict :param free_parameters: Vary only these, holding the rest at their config values. Defaults to every parameter the model has. The driver passes the *Fisher's* free list, so the fit varies exactly what the forecast will vary. That matters when a parameter is pinned because the data cannot constrain it: ``delta_m`` for a taper narrower than the sampling grid has no maximum to find, so an optimiser given it rails against whichever bound it was handed and drags the correlated parameters with it. Since the catalogue was *generated* here, such parameters are known exactly and there is nothing to fit. :type free_parameters: sequence of str or None :returns: Lines for the summary file. :rtype: list of str