diff options
| -rw-r--r-- | fg21sim/extragalactic/clusters/formation.py | 33 | ||||
| -rw-r--r-- | fg21sim/extragalactic/clusters/mergertree.py | 43 | 
2 files changed, 46 insertions, 30 deletions
| diff --git a/fg21sim/extragalactic/clusters/formation.py b/fg21sim/extragalactic/clusters/formation.py index 65e32b6..dc39b62 100644 --- a/fg21sim/extragalactic/clusters/formation.py +++ b/fg21sim/extragalactic/clusters/formation.py @@ -17,14 +17,13 @@ References  """  import logging -import operator as op  import numpy as np  import scipy.integrate  import scipy.special  import scipy.optimize -from .mergertree import MergerTree +from .mergertree import MergerTree, get_history  from ...share import COSMO @@ -256,14 +255,10 @@ class ClusterFormation:      def history(self, mtree=None, merger_only=False):          """ -        Extract and return all the formation events, e.g., merger and -        accretion. +        Extract all the formation history (merger and accretion events).          Parameters          ---------- -        mtree : `~MergerTree`, optional -            The simulated merger tree from which to extract the history. -            Default: ``self.mtree``          merger_only : bool, optional              If ``True``, only extract the merger events. @@ -275,29 +270,7 @@ class ClusterFormation:          """          if mtree is None:              mtree = self.mtree - -        evlist = [] -        for main, sub in mtree.itermain(): -            z, age, M_main = op.itemgetter("z", "age", "mass")(main) -            if sub: -                # merger -                M_sub = sub["mass"] -                R_mass = M_main / M_sub -            else: -                # accretion -                if merger_only: -                    continue -                M_sub, R_mass = None, None - -            evlist.append({ -                "z": z, -                "age": age, -                "M_main": M_main, -                "M_sub": M_sub, -                "R_mass": R_mass, -            }) - -        return evlist +        return get_history(mtree=mtree, merger_only=merger_only)      def mergers(self, mtree=None):          """ diff --git a/fg21sim/extragalactic/clusters/mergertree.py b/fg21sim/extragalactic/clusters/mergertree.py index 609dbee..1df7b2f 100644 --- a/fg21sim/extragalactic/clusters/mergertree.py +++ b/fg21sim/extragalactic/clusters/mergertree.py @@ -6,6 +6,7 @@ Merger tree that represents the merging history of a cluster using  the binary tree data structure.  """ +import operator as op  import logging  from ...utils.io import pickle_dump, pickle_load @@ -105,6 +106,48 @@ def read_mtree(infile):      return mtree +def get_history(mtree, merger_only=False): +    """ +    Extract all the formation history (merger and accretion events). + +    Parameters +    ---------- +    mtree : `~MergerTree` +        The simulated merger tree from which to extract the history. +        Default: ``self.mtree`` +    merger_only : bool, optional +        If ``True``, only extract the merger events. + +    Returns +    ------- +    evlist : list[event] +        List of events with each element being a dictionary of the +        event properties. +    """ +    evlist = [] +    for main, sub in mtree.itermain(): +        z, age, M_main = op.itemgetter("z", "age", "mass")(main) +        if sub: +            # merger +            M_sub = sub["mass"] +            R_mass = M_main / M_sub +        else: +            # accretion +            if merger_only: +                continue +            M_sub, R_mass = None, None + +        evlist.append({ +            "z": z, +            "age": age, +            "M_main": M_main, +            "M_sub": M_sub, +            "R_mass": R_mass, +        }) + +    return evlist + +  def show_mtree(mtree):      """      Trace the main cluster and show its formation history. | 
