Source code for ytree.data_structures.load

"""
load function



"""

#-----------------------------------------------------------------------------
# Copyright (c) ytree development team. All rights reserved.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------

from ytree.data_structures.arbor import \
    arbor_registry
from ytree.utilities.loading import \
    get_path

global load_warn
load_warn = True

[docs]def load(filename, method=None, **kwargs): """ Load an Arbor, determine the type automatically. Parameters ---------- filename : string Input filename. method : optional, string The type of Arbor to be loaded. Existing types are: ConsistentTrees, Rockstar, TreeFarm, YTree. If not given, the type will be determined based on characteristics of the input file. kwargs : optional, dict Additional keyword arguments are passed to _is_valid and the determined type. Returns ------- Arbor Examples -------- >>> import ytree >>> # saved Arbor (ytree format) >>> a = ytree.load("arbor/arbor.h5") >>> # Amiga Halo Finder >>> a = ytree.load("ahf_halos/snap_N64L16_000.parameter", ... hubble_constant=0.7) >>> # consistent-trees >>> a = ytree.load("tiny_ctrees/locations.dat") >>> a = ytree.load("consistent_trees/tree_0_0_0.dat") >>> a = ytree.load("ctrees_hlists/hlists/hlist_0.12521.list") >>> # consistent-trees-hdf5 >>> a = ytree.load("consistent_trees_hdf5/soa/forest.h5") >>> # LHaloTree >>> a = ytree.load("my_halos/trees_063.0") >>> # LHaloTree-hdf5 >>> a = ytree.load("TNG50-4-Dark/trees_sf1_099.0.hdf5", ... box_size=35, hubble_constant=0.6774, ... omega_matter=0.3089, omega_lambda=0.6911) >>> # Moria >>> a = ytree.load("moria/moria_tree_testsim050.hdf5") >>> # Rockstar >>> a = ytree.load("rockstar_halos/out_0.list") >>> # treefarm >>> a = ytree.load("my_halos/fof_subhalo_tab_025.0.h5") >>> # TreeFrog >>> a = ytree.load("treefrog/VELOCIraptor.tree.t4.0-131.walkabletree.sage.forestID.foreststats.hdf5") """ filename = get_path(filename) if method is None: candidates = [] for candidate, c in arbor_registry.items(): try: if c._is_valid(filename, **kwargs): candidates.append(candidate) except BaseException: pass if len(candidates) == 0: raise IOError(f"Could not determine arbor type for {filename}.") elif len(candidates) > 1: errmsg = "Could not distinguish between these arbor types:\n" for candidate in candidates: errmsg += f"Possible: {candidate}.\n" errmsg += "Provide one of these types using the \"method\" keyword." raise IOError(errmsg) else: method = candidates[0] else: if method not in arbor_registry: raise IOError( f"Invalid method: {method}. Available: {arbor_registry.keys()}.") global load_warn if method not in ["YTree"] and load_warn: print( f"""Additional features and improved performance (usually) by saving this arbor with \"save_arbor\" and reloading: \t>>> a = ytree.load(\"{filename}\") \t>>> fn = a.save_arbor() \t>>> a = ytree.load(fn)""" ) load_warn = False return arbor_registry[method](filename, **kwargs)