CompaSO Halo Finder

All group finding in AbacusSummit is done on the fly. We are using a hybrid FoF-SO algorithm, dubbed CompaSO, summarized as follows.

First, we compute a kernel density estimate around all particles. This uses a weighting \((1-r^2/b^2)\), where \(b\) is 0.4 of the interparticle spacing. We note that the effective volume of this kernel is equivalent to a top-hat of \(0.737b\), so 85 kpc/h comoving, and that the mean weighted counts at an overdensity \(\delta\) is about \(\delta/10\) with a variance of 4/7 of the mean.

Second, we segment the particle set into what we call L0 halos. This is done with the FOF algorithm with linking length 0.25 of the interparticle spacing, but only for particles with Delta>60. We note that b_FOF=0.25 normally would percolate at a noticeably lower density, Delta~41 (More et al. 2011, ApJS, 195, 4). The intention is that the bounds of the L0 halo set be set by the kernel density estimate, which has lower variance than the nearest neighbor method of FOF and imposes a physical smoothing scale.


In Abacus, L0 groups are large, “fluffy” sets of particles that typically encompass several L1 groups. L1 groups correspond to classical “halos”. L2 groups correspond to “halo cores” or perhaps “subhalos”. Only L1 halos are in the catalog.

We stress that all L1/L2 finding and all halo statistics are based solely on the particles in the L0 halo.

Third, within each L0 halo, we construct L1 halos by a competitive spherical overdensity algorithm. We begin by selecting the particle with the highest kernel density; this is a nucleus. We then search outward to find the innermost radius in which the enclosed density (of L0 particles only!) dips below 200. Particles interior to that radius are tentatively assigned to that group. Particles interior to 80% of R200 are marked as ineligible to be a future nucleus. We then search the remaining eligible particles to find the one with the highest remaining kernel density that also meets the criteria of being a density maximum. This latter condition is that a particle must be denser than all other particles (eligible or not) within 0.4 of the interparticle spacing. Once located, if this particle has a high enough density (a condition set by estimating what density would be generated by a singular isothermal sphere of M200=35 particles), we start another nucleus.

With each successive nucleus, we again search for the SO(200) radius, using all L0 particles. Now a particle is assigned to the new group if is previously unassigned or if it is estimated to have an enclosed density with respect to the new group that is twice that of the enclosed density with respect to its assigned group. In detail, these enclosed densities are not computed exactly, but rather scaled from the SO radius assuming a inverse square density profile.

The idea here is to allow nearby nuclei to divide particles by a principle similar to that of tidal radii. However, we stress that it is not our goal to find subhalos, and so we do not allow new nuclei to form inside 80% of the SO(200) radius of other L1 halos. That said, large substructure just inside this radius may yield a nucleus away from the center of the secondary object, and the subsequent enclosed density competition can result in some deblending of the two objects.

We do not perform any unbinding of particles, such as is sometimes done with estimates of the gravitational potential and resulting particle energy.

Fourth, within each L1 halo (and limited to only those particles), we repeat the SO algorithm to find L2 halos with an enclosed radius of 800. We store the masses of the 5 largest such subhalos, which may help to mark cases of over-merged L1 halos. But the main purpose is that we use the center of mass of the largest L2 subhalo to define a center for the output of the L1 statistics. We do not otherwise store information about the L2 subhalos.

All density thresholds are scaled upward as the cosmology departs from Einstein-deSitter, in keeping with spherical collapse estimates for low density universes. The FOF linking length is scaled as the inverse cube root of that change. The kernel density scale is not changed.


Use the SODensityL1 field in the header to get the exact density threshold at any epoch.

We output properties for all L1 halos with more than 35 particles.