Source code for treecorr.exec_corr3

# Copyright (c) 2003-2024 by Mike Jarvis
#
# TreeCorr is free software: redistribution and use in source and binary forms,
# with or without modification, are permitted provided that the following
# conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
#    list of conditions, and the disclaimer given in the accompanying LICENSE
#    file.
# 2. Redistributions in binary form must reproduce the above copyright notice,
#    this list of conditions, and the disclaimer given in the documentation
#    and/or other materials provided with the distribution.

"""
.. module:: corr3
"""

from .catalog import Catalog, read_catalogs
from .corr3base import Corr3
from .config import setup_logger, check_config, print_params
from .util import set_omp_threads
from .nnncorrelation import NNNCorrelation
from .kkkcorrelation import KKKCorrelation
from .gggcorrelation import GGGCorrelation


# Dict describing the valid parameters, what types they are, and a description:
# Each value is a tuple with the following elements:
#    type
#    may_be_list
#    default value
#    list of valid values
#    description
corr3_valid_params = {

    # Parameters about the input catlogs

    'file_name' : (str, True, None, None,
            'The file(s) with the galaxy data.'),
    'rand_file_name' : (str, True, None, None,
            'For NNN correlations, a list of random files.'),
    'file_list' : (str, False, None, None,
            'A text file with file names in lieu of file_name.'),
    'rand_file_list' : (str, False, None, None,
            'A text file with file names in lieu of rand_file_name.'),

    # Parameters about the output file(s)

    'nnn_file_name' : (str, False, None, None,
            'The output filename for point-point correlation function.'),
    'nnn_statistic' : (str, False, 'compensated', ['compensated','simple'],
            'Which statistic to use for omega as the estimator fo the NN correlation function. '),
    'kkk_file_name' : (str, False, None, None,
            'The output filename for scalar-scalar-scalar correlation function.'),
    'ggg_file_name' : (str, False, None, None,
            'The output filename for shear-shear-shear correlation function.'),

    # Derived output quantities

    'm3_file_name' : (str, False, None, None,
            'The output filename for the aperture mass skewness.'),
}

# Add in the valid parameters for the relevant classes
for c in [ Catalog, Corr3 ]:
    corr3_valid_params.update(c._valid_params)


corr3_aliases = {
}

[docs]def corr3(config, logger=None): """Run the full three-point correlation function code based on the parameters in the given config dict. The function `print_corr3_params` will output information about the valid parameters that are expected to be in the config dict. Optionally a logger parameter maybe given, in which case it is used for logging. If not given, the logging will be based on the verbose and log_file parameters. :param config: The configuration dict which defines what to do. :param logger: If desired, a logger object for logging. (default: None, in which case one will be built according to the config dict's verbose level.) """ # Setup logger based on config verbose value if logger is None: logger = setup_logger(config.get('verbose',1), config.get('log_file',None)) # Check that config doesn't have any extra parameters. # (Such values are probably typos.) # Also convert the given parameters to the correct type, etc. config = check_config(config, corr3_valid_params, corr3_aliases, logger) import pprint logger.debug('Using configuration dict:\n%s',pprint.pformat(config)) if ('output_dots' not in config and config.get('log_file',None) is None and config['verbose'] >= 2): config['output_dots'] = True # Set the number of threads num_threads = config.get('num_threads',None) logger.debug('From config dict, num_threads = %s',num_threads) set_omp_threads(num_threads, logger) # Read in the input files. Each of these is a list. cat1 = read_catalogs(config, 'file_name', 'file_list', num=0, logger=logger) # TODO: when giving file_name2, file_name3, should now do the real CrossCorrelation process. rand1 = read_catalogs(config, 'rand_file_name', 'rand_file_list', num=0, logger=logger) if len(cat1) == 0: raise TypeError("Either file_name or file_list is required") if len(rand1) == 0: rand1 = None logger.info("Done creating input catalogs") # Do GGG correlation function if necessary if 'ggg_file_name' in config or 'm3_file_name' in config: logger.warning("Performing GGG calculations...") ggg = GGGCorrelation(config, logger=logger) ggg.process(cat1) logger.info("Done GGG calculations.") if 'ggg_file_name' in config: ggg.write(config['ggg_file_name']) logger.warning("Wrote GGG correlation to %s",config['ggg_file_name']) if 'm3_file_name' in config: ggg.writeMap3(config['m3_file_name']) logger.warning("Wrote Map3 values to %s",config['m3_file_name']) # Do NNN correlation function if necessary if 'nnn_file_name' in config: logger.warning("Performing DDD calculations...") ddd = NNNCorrelation(config, logger=logger) ddd.process(cat1) logger.info("Done DDD calculations.") drr = None rdd = None if rand1 is None: logger.warning("No random catalogs given. Only doing ntri calculation.") rrr = None else: logger.warning("Performing RRR calculations...") rrr = NNNCorrelation(config, logger=logger) rrr.process(rand1) logger.info("Done RRR calculations.") if rrr is not None and config['nnn_statistic'] == 'compensated': logger.warning("Performing DRR calculations...") drr = NNNCorrelation(config, logger=logger) drr.process(cat1,rand1, ordered=False) logger.info("Done DRR calculations.") logger.warning("Performing DDR calculations...") rdd = NNNCorrelation(config, logger=logger) rdd.process(rand1,cat1, ordered=False) logger.info("Done DDR calculations.") ddd.write(config['nnn_file_name'], rrr=rrr, drr=drr, rdd=rdd) logger.warning("Wrote NNN correlation to %s",config['nnn_file_name']) # Do KKK correlation function if necessary if 'kkk_file_name' in config: logger.warning("Performing KKK calculations...") kkk = KKKCorrelation(config, logger=logger) kkk.process(cat1) logger.info("Done KKK calculations.") kkk.write(config['kkk_file_name']) logger.warning("Wrote KKK correlation to %s",config['kkk_file_name'])