Add Quijote (#61)

* Rename paths object

* Remove redshift calculation

* Explicit keywrod arg

* Rename box units

* Basic renaming

* Little docs

* Rename paths

* add imports

* Sort imports

* Add Quijote cat

* Split boxes

* add Quijote path

* Add origin argument

* Update nbs
This commit is contained in:
Richard Stiskalek 2023-05-13 17:37:34 +01:00 committed by GitHub
parent b3fd14b81f
commit 1d847cbd06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 1401 additions and 292 deletions

View File

@ -14,7 +14,8 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
from csiborgtools import clustering, field, fits, match, read # noqa from csiborgtools import clustering, field, fits, match, read # noqa
# Arguments to csiborgtools.read.CSiBORGPaths. # Arguments to csiborgtools.read.Paths.
paths_glamdring = {"srcdir": "/mnt/extraspace/hdesmond/", paths_glamdring = {"srcdir": "/mnt/extraspace/hdesmond/",
"postdir": "/mnt/extraspace/rstiskalek/CSiBORG/", "postdir": "/mnt/extraspace/rstiskalek/CSiBORG/",
"quijote_dir": "/mnt/extraspace/rstiskalek/Quijote",
} }

View File

@ -52,7 +52,7 @@ class BaseField(ABC):
Returns Returns
------- -------
box : :py:class:`csiborgtools.units.BoxUnits` box : :py:class:`csiborgtools.units.CSiBORGBox`
""" """
return self._box return self._box
@ -94,7 +94,7 @@ class DensityField(BaseField):
Parameters Parameters
---------- ----------
box : :py:class:`csiborgtools.read.BoxUnits` box : :py:class:`csiborgtools.read.CSiBORGBox`
The simulation box information and transformations. The simulation box information and transformations.
MAS : str MAS : str
Mass assignment scheme. Options are Options are: 'NGP' (nearest grid Mass assignment scheme. Options are Options are: 'NGP' (nearest grid
@ -204,7 +204,7 @@ class VelocityField(BaseField):
Parameters Parameters
---------- ----------
box : :py:class:`csiborgtools.read.BoxUnits` box : :py:class:`csiborgtools.read.CSiBORGBox`
The simulation box information and transformations. The simulation box information and transformations.
MAS : str MAS : str
Mass assignment scheme. Options are Options are: 'NGP' (nearest grid Mass assignment scheme. Options are Options are: 'NGP' (nearest grid
@ -295,7 +295,7 @@ class PotentialField(BaseField):
Parameters Parameters
---------- ----------
box : :py:class:`csiborgtools.read.BoxUnits` box : :py:class:`csiborgtools.read.CSiBORGBox`
The simulation box information and transformations. The simulation box information and transformations.
MAS : str MAS : str
Mass assignment scheme. Options are Options are: 'NGP' (nearest grid Mass assignment scheme. Options are Options are: 'NGP' (nearest grid
@ -334,7 +334,7 @@ class TidalTensorField(BaseField):
Parameters Parameters
---------- ----------
box : :py:class:`csiborgtools.read.BoxUnits` box : :py:class:`csiborgtools.read.CSiBORGBox`
The simulation box information and transformations. The simulation box information and transformations.
MAS : str MAS : str
Mass assignment scheme. Options are Options are: 'NGP' (nearest grid Mass assignment scheme. Options are Options are: 'NGP' (nearest grid

View File

@ -67,7 +67,7 @@ def evaluate_sky(*fields, pos, box, isdeg=True):
pos : 2-dimensional array of shape `(n_samples, 3)` pos : 2-dimensional array of shape `(n_samples, 3)`
Spherical coordinates to evaluate the field. Columns are distance, Spherical coordinates to evaluate the field. Columns are distance,
right ascension, declination, respectively. right ascension, declination, respectively.
box : :py:class:`csiborgtools.read.BoxUnits` box : :py:class:`csiborgtools.read.CSiBORGBox`
The simulation box information and transformations. The simulation box information and transformations.
isdeg : bool, optional isdeg : bool, optional
Whether `ra` and `dec` are in degres. By default `True`. Whether `ra` and `dec` are in degres. By default `True`.

View File

@ -67,7 +67,7 @@ class BaseStructure(ABC):
Returns Returns
------- -------
box : :py:class:`csiborgtools.units.BoxUnits` box : :py:class:`csiborgtools.units.CSiBORGBox`
""" """
return self._box return self._box
@ -280,7 +280,7 @@ class Clump(BaseStructure):
Particle array. Must contain `['x', 'y', 'z', 'vx', 'vy', 'vz', 'M']`. Particle array. Must contain `['x', 'y', 'z', 'vx', 'vy', 'vz', 'M']`.
info : structured array info : structured array
Array containing information from the clump finder. Array containing information from the clump finder.
box : :py:class:`csiborgtools.read.BoxUnits` box : :py:class:`csiborgtools.read.CSiBORGBox`
Box units object. Box units object.
""" """
@ -301,7 +301,7 @@ class Halo(BaseStructure):
Particle array. Must contain `['x', 'y', 'z', 'vx', 'vy', 'vz', 'M']`. Particle array. Must contain `['x', 'y', 'z', 'vx', 'vy', 'vz', 'M']`.
info : structured array info : structured array
Array containing information from the clump finder. Array containing information from the clump finder.
box : :py:class:`csiborgtools.read.BoxUnits` box : :py:class:`csiborgtools.read.CSiBORGBox`
Box units object. Box units object.
""" """

View File

@ -12,14 +12,14 @@
# You should have received a copy of the GNU General Public License along # You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc., # with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
from .box_units import BoxUnits # noqa from .box_units import CSiBORGBox, QuijoteBox # noqa
from .halo_cat import ClumpsCatalogue, HaloCatalogue # noqa from .halo_cat import ClumpsCatalogue, HaloCatalogue, QuijoteHaloCatalogue # noqa
from .knn_summary import kNNCDFReader # noqa from .knn_summary import kNNCDFReader # noqa
from .obs import (SDSS, MCXCClusters, PlanckClusters, TwoMPPGalaxies, # noqa from .obs import (SDSS, MCXCClusters, PlanckClusters, TwoMPPGalaxies, # noqa
TwoMPPGroups) TwoMPPGroups)
from .overlap_summary import (NPairsOverlap, PairOverlap, # noqa from .overlap_summary import (NPairsOverlap, PairOverlap, # noqa
binned_resample_mean) binned_resample_mean)
from .paths import CSiBORGPaths # noqa from .paths import Paths # noqa
from .pk_summary import PKReader # noqa from .pk_summary import PKReader # noqa
from .readsim import (MmainReader, ParticleReader, halfwidth_mask, # noqa from .readsim import (MmainReader, ParticleReader, halfwidth_mask, # noqa
load_clump_particles, load_parent_particles, read_initcm) load_clump_particles, load_parent_particles, read_initcm)

View File

@ -15,14 +15,15 @@
""" """
Simulation box unit transformations. Simulation box unit transformations.
""" """
from abc import ABC
import numpy import numpy
from astropy import constants, units from astropy import constants, units
from astropy.cosmology import LambdaCDM from astropy.cosmology import LambdaCDM
from scipy.interpolate import interp1d
from .readsim import ParticleReader from .readsim import ParticleReader
# Map of unit conversions # Map of CSiBORG unit conversions
CONV_NAME = { CONV_NAME = {
"length": ["x", "y", "z", "peak_x", "peak_y", "peak_z", "Rs", "rmin", "length": ["x", "y", "z", "peak_x", "peak_y", "peak_z", "Rs", "rmin",
"rmax", "r200c", "r500c", "r200m", "x0", "y0", "z0", "rmax", "r200c", "r500c", "r200m", "x0", "y0", "z0",
@ -33,53 +34,18 @@ CONV_NAME = {
"density": ["rho0"]} "density": ["rho0"]}
class BoxUnits: ###############################################################################
r""" # Base box #
Box units class for converting between box and physical units. ###############################################################################
Paramaters
---------- class BaseBox(ABC):
nsnap : int """
Snapshot index. Base class for box units.
nsim : int
IC realisation index.
paths : py:class`csiborgtools.read.CSiBORGPaths`
CSiBORG paths object.
""" """
_name = "box_units" _name = "box_units"
_cosmo = None _cosmo = None
def __init__(self, nsnap, nsim, paths):
"""
Read in the snapshot info file and set the units from it.
"""
partreader = ParticleReader(paths)
info = partreader.read_info(nsnap, nsim)
pars = [
"boxlen",
"time",
"aexp",
"H0",
"omega_m",
"omega_l",
"omega_k",
"omega_b",
"unit_l",
"unit_d",
"unit_t",
]
for par in pars:
setattr(self, "_" + par, float(info[par]))
self._cosmo = LambdaCDM(
H0=self._H0,
Om0=self._omega_m,
Ode0=self._omega_l,
Tcmb0=2.725 * units.K,
Ob0=self._omega_b,
)
self._Msuncgs = constants.M_sun.cgs.value # Solar mass in grams
@property @property
def cosmo(self): def cosmo(self):
""" """
@ -89,6 +55,8 @@ class BoxUnits:
------- -------
cosmo : `astropy.cosmology.LambdaCDM` cosmo : `astropy.cosmology.LambdaCDM`
""" """
if self._cosmo is None:
raise ValueError("Cosmology not set.")
return self._cosmo return self._cosmo
@property @property
@ -101,7 +69,7 @@ class BoxUnits:
------- -------
H0 : float H0 : float
""" """
return self._H0 return self.cosmo.H0.value
@property @property
def h(self): def h(self):
@ -112,7 +80,54 @@ class BoxUnits:
------- -------
h : float h : float
""" """
return self._H0 / 100 return self.H0 / 100
@property
def Om0(self):
r"""
The matter density parameter.
Returns
-------
Om0 : float
"""
return self.cosmo.Om0
###############################################################################
# CSiBORG box #
###############################################################################
class CSiBORGBox(BaseBox):
r"""
CSiBORG box units class for converting between box and physical units.
Paramaters
----------
nsnap : int
Snapshot index.
nsim : int
IC realisation index.
paths : py:class`csiborgtools.read.Paths`
CSiBORG paths object.
"""
def __init__(self, nsnap, nsim, paths):
"""
Read in the snapshot info file and set the units from it.
"""
partreader = ParticleReader(paths)
info = partreader.read_info(nsnap, nsim)
pars = ["boxlen", "time", "aexp", "H0", "omega_m", "omega_l",
"omega_k", "omega_b", "unit_l", "unit_d", "unit_t"]
for par in pars:
setattr(self, "_" + par, float(info[par]))
self._cosmo = LambdaCDM(H0=self._H0, Om0=self._omega_m,
Ode0=self._omega_l, Tcmb0=2.725 * units.K,
Ob0=self._omega_b)
self._Msuncgs = constants.M_sun.cgs.value # Solar mass in grams
@property @property
def box_G(self): def box_G(self):
@ -157,7 +172,6 @@ class BoxUnits:
------- -------
rhoc : float rhoc : float
""" """
return 3 * self.box_H0**2 / (8 * numpy.pi * self.box_G) return 3 * self.box_H0**2 / (8 * numpy.pi * self.box_G)
def box2kpc(self, length): def box2kpc(self, length):
@ -244,83 +258,6 @@ class BoxUnits:
""" """
return vel * (1e-2 * self._unit_l / self._unit_t / self._aexp) * 1e-3 return vel * (1e-2 * self._unit_l / self._unit_t / self._aexp) * 1e-3
def box2cosmoredshift(self, dist):
r"""
Convert the box comoving distance to cosmological redshift.
NOTE: this likely is already the observed redshift.
Parameters
----------
dist : float
Distance in box units.
Returns
-------
cosmo_redshift : foat
Cosmological redshift.
"""
x = numpy.linspace(0.0, 1.0, 5001)
y = self.cosmo.comoving_distance(x)
return interp1d(y, x)(self.box2mpc(dist))
def box2pecredshift(self, vx, vy, vz, px, py, pz, p0x=0, p0y=0, p0z=0):
"""
Convert the box phase-space information to a peculiar redshift.
NOTE: there is some confusion about this.
Parameters
----------
vx, vy, vz : 1-dimensional arrays
Cartesian velocity components.
px, py, pz : 1-dimensional arrays
Cartesian position vectors components.
p0x, p0y, p0z : floats
Centre of the box coordinates. By default 0, in which it is assumed
that the coordinates are already centred.
Returns
-------
pec_redshift : 1-dimensional array
Peculiar redshift.
"""
# Peculiar velocity along the radial distance
r = numpy.vstack([px - p0x, py - p0y, pz - p0z]).T
norm = numpy.sum(r**2, axis=1) ** 0.5
v = numpy.vstack([vx, vy, vz]).T
vpec = numpy.sum(r * v, axis=1) / norm
# Ratio between the peculiar velocity and speed of light
x = self.box2vel(vpec) / constants.c.value
# Doppler shift
return numpy.sqrt((1 + x) / (1 - x)) - 1
def box2obsredshift(self, vx, vy, vz, px, py, pz, p0x=0, p0y=0, p0z=0):
"""
Convert the box phase-space information to an 'observed' redshift.
NOTE: there is some confusion about this.
Parameters
----------
vx, vy, vz : 1-dimensional arrays
Cartesian velocity components.
px, py, pz : 1-dimensional arrays
Cartesian position vectors components.
p0x, p0y, p0z : floats
Centre of the box coordinates. By default 0, in which it is assumed
that the coordinates are already centred.
Returns
-------
obs_redshift : 1-dimensional array
Observed redshift.
"""
r = numpy.vstack([px - p0x, py - p0y, pz - p0z]).T
zcosmo = self.box2cosmoredshift(numpy.sum(r**2, axis=1) ** 0.5)
zpec = self.box2pecredshift(vx, vy, vz, px, py, pz, p0x, p0y, p0z)
return (1 + zpec) * (1 + zcosmo) - 1
def solarmass2box(self, mass): def solarmass2box(self, mass):
r""" r"""
Convert mass from :math:`M_\odot` (with :math:`h=0.705`) to box units. Convert mass from :math:`M_\odot` (with :math:`h=0.705`) to box units.
@ -391,7 +328,7 @@ class BoxUnits:
return (density / self._unit_d * self._Msuncgs return (density / self._unit_d * self._Msuncgs
/ (units.Mpc.to(units.cm)) ** 3) / (units.Mpc.to(units.cm)) ** 3)
def convert_from_boxunits(self, data, names): def convert_from_box(self, data, names):
r""" r"""
Convert columns named `names` in array `data` from box units to Convert columns named `names` in array `data` from box units to
physical units, such that physical units, such that
@ -421,13 +358,12 @@ class BoxUnits:
transforms = {"length": self.box2mpc, transforms = {"length": self.box2mpc,
"mass": self.box2solarmass, "mass": self.box2solarmass,
"velocity": self.box2vel, "velocity": self.box2vel,
"density": self.box2dens, "density": self.box2dens}
}
for name in names: for name in names:
# Check that the name is even in the array # Check that the name is even in the array
if name not in data.dtype.names: if name not in data.dtype.names:
raise ValueError("Name `{}` not in `data` array.".format(name)) raise ValueError(f"Name `{name}` not in `data` array.")
# Convert # Convert
found = False found = False
@ -439,11 +375,36 @@ class BoxUnits:
# If nothing found # If nothing found
if not found: if not found:
raise NotImplementedError( raise NotImplementedError(
"Conversion of `{}` is not defined.".format(name) f"Conversion of `{name}` is not defined.")
)
# Center at the observer # Center at the observer
if name in ["peak_x", "peak_y", "peak_z", "x0", "y0", "z0"]: if name in ["peak_x", "peak_y", "peak_z", "x0", "y0", "z0"]:
data[name] -= transforms["length"](0.5) data[name] -= transforms["length"](0.5)
return data return data
###############################################################################
# Quijote fiducial cosmology box #
###############################################################################
class QuijoteBox(BaseBox):
"""
Quijote fiducial cosmology box.
Parameters
----------
nsnap : int
Snapshot number.
**kwargs : dict
Empty keyword arguments. For backwards compatibility.
"""
def __init__(self, nsnap, **kwargs):
zdict = {4: 0.0, 3: 0.5, 2: 1.0, 1: 2.0, 0: 3.0}
assert nsnap in zdict.keys(), f"`nsnap` must be in {zdict.keys()}."
self._aexp = 1 / (1 + zdict[nsnap])
self._cosmo = LambdaCDM(H0=67.11, Om0=0.3175, Ode0=0.6825,
Tcmb0=2.725 * units.K, Ob0=0.049)

View File

@ -12,24 +12,29 @@
# You should have received a copy of the GNU General Public License along # You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc., # with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
"""CSiBORG halo and clumps catalogues.""" """
from abc import ABC Simulation catalogues:
- CSiBORG: halo and clump catalogue.
- Quijote: halo catalogue.
"""
from abc import ABC, abstractproperty
from os.path import join
import numpy import numpy
from readfof import FoF_catalog
from sklearn.neighbors import NearestNeighbors from sklearn.neighbors import NearestNeighbors
from .box_units import BoxUnits from .box_units import CSiBORGBox, QuijoteBox
from .paths import CSiBORGPaths from .paths import Paths
from .readsim import ParticleReader from .readsim import ParticleReader
from .utils import (add_columns, cartesian_to_radec, flip_cols, from .utils import (add_columns, cartesian_to_radec, cols_to_structured,
radec_to_cartesian, real2redshift) flip_cols, radec_to_cartesian, real2redshift)
class BaseCatalogue(ABC): class BaseCatalogue(ABC):
""" """
Base (sub)halo catalogue. Base (sub)halo catalogue.
""" """
_data = None _data = None
_paths = None _paths = None
_nsim = None _nsim = None
@ -51,14 +56,25 @@ class BaseCatalogue(ABC):
def nsim(self, nsim): def nsim(self, nsim):
self._nsim = nsim self._nsim = nsim
@property @abstractproperty
def paths(self): def nsnap(self):
""" """
CSiBORG paths manager. Catalogue's snapshot index.
Returns Returns
------- -------
paths : :py:class:`csiborgtools.read.CSiBORGPaths` nsnap : int
"""
pass
@property
def paths(self):
"""
Paths manager.
Returns
-------
paths : :py:class:`csiborgtools.read.Paths`
""" """
if self._paths is None: if self._paths is None:
raise RuntimeError("`paths` is not set!") raise RuntimeError("`paths` is not set!")
@ -66,7 +82,7 @@ class BaseCatalogue(ABC):
@paths.setter @paths.setter
def paths(self, paths): def paths(self, paths):
assert isinstance(paths, CSiBORGPaths) assert isinstance(paths, Paths)
self._paths = paths self._paths = paths
@property @property
@ -82,36 +98,16 @@ class BaseCatalogue(ABC):
raise RuntimeError("Catalogue data not loaded!") raise RuntimeError("Catalogue data not loaded!")
return self._data return self._data
@property @abstractproperty
def nsnap(self):
"""
Catalogue's snapshot index corresponding to the maximum simulation
snapshot index.
Returns
-------
nsnap : int
"""
return max(self.paths.get_snapshots(self.nsim))
@property
def box(self): def box(self):
""" """
CSiBORG box object handling unit conversion. Box object.
Returns Returns
------- -------
box : :py:class:`csiborgtools.units.BoxUnits` box : instance of :py:class:`csiborgtools.units.BoxUnits`
""" """
return BoxUnits(self.nsnap, self.nsim, self.paths) pass
@box.setter
def box(self, box):
try:
assert box._name == "box_units"
self._box = box
except AttributeError as err:
raise TypeError from err
def position(self, in_initial=False, cartesian=True): def position(self, in_initial=False, cartesian=True):
r""" r"""
@ -143,8 +139,8 @@ class BaseCatalogue(ABC):
return pos return pos
def velocity(self): def velocity(self):
""" r"""
Cartesian velocity components in box units. Cartesian velocity components in :math:`\mathrm{km} / \mathrm{s}`.
Returns Returns
------- -------
@ -204,7 +200,7 @@ class BaseCatalogue(ABC):
knn : :py:class:`sklearn.neighbors.NearestNeighbors` knn : :py:class:`sklearn.neighbors.NearestNeighbors`
""" """
knn = NearestNeighbors() knn = NearestNeighbors()
return knn.fit(self.position(in_initial)) return knn.fit(self.position(in_initial=in_initial))
def radius_neigbours(self, X, radius, in_initial): def radius_neigbours(self, X, radius, in_initial):
r""" r"""
@ -299,20 +295,56 @@ class BaseCatalogue(ABC):
@property @property
def keys(self): def keys(self):
"""Catalogue keys.""" """
Catalogue keys.
Returns
-------
keys : list of strings
"""
return self.data.dtype.names return self.data.dtype.names
def __getitem__(self, key): def __getitem__(self, key):
initpars = ["x0", "y0", "z0"] if key not in self.keys:
if key in initpars and key not in self.keys: raise KeyError(f"Key '{key}' not in catalogue.")
raise RuntimeError("Initial positions are not set!")
return self.data[key] return self.data[key]
def __len__(self): def __len__(self):
return self.data.size return self.data.size
class ClumpsCatalogue(BaseCatalogue): ###############################################################################
# CSiBORG base catalogue #
###############################################################################
class BaseCSiBORG(BaseCatalogue):
"""
Base CSiBORG catalogue class.
"""
@property
def nsnap(self):
return max(self.paths.get_snapshots(self.nsim))
@property
def box(self):
"""
CSiBORG box object handling unit conversion.
Returns
-------
box : instance of :py:class:`csiborgtools.units.BaseBox`
"""
return CSiBORGBox(self.nsnap, self.nsim, self.paths)
###############################################################################
# CSiBORG clumps catalogue #
###############################################################################
class ClumpsCatalogue(BaseCSiBORG):
r""" r"""
Clumps catalogue, defined in the final snapshot. Clumps catalogue, defined in the final snapshot.
@ -320,8 +352,8 @@ class ClumpsCatalogue(BaseCatalogue):
---------- ----------
sim : int sim : int
IC realisation index. IC realisation index.
paths : py:class`csiborgtools.read.CSiBORGPaths` paths : py:class`csiborgtools.read.Paths`
CSiBORG paths object. Paths object.
maxdist : float, optional maxdist : float, optional
The maximum comoving distance of a halo. By default The maximum comoving distance of a halo. By default
:math:`155.5 / 0.705 ~ \mathrm{Mpc}` with assumed :math:`h = 0.705`, :math:`155.5 / 0.705 ~ \mathrm{Mpc}` with assumed :math:`h = 0.705`,
@ -363,7 +395,7 @@ class ClumpsCatalogue(BaseCatalogue):
names = ["x", "y", "z", "mass_cl", "totpartmass", "rho0", "r200c", names = ["x", "y", "z", "mass_cl", "totpartmass", "rho0", "r200c",
"r500c", "m200c", "m500c", "r200m", "m200m", "r500c", "m200c", "m500c", "r200m", "m200m",
"vx", "vy", "vz"] "vx", "vy", "vz"]
self._data = self.box.convert_from_boxunits(self._data, names) self._data = self.box.convert_from_box(self._data, names)
if maxdist is not None: if maxdist is not None:
dist = numpy.sqrt(self._data["x"]**2 + self._data["y"]**2 dist = numpy.sqrt(self._data["x"]**2 + self._data["y"]**2
+ self._data["z"]**2) + self._data["z"]**2)
@ -383,7 +415,12 @@ class ClumpsCatalogue(BaseCatalogue):
return self["index"] == self["parent"] return self["index"] == self["parent"]
class HaloCatalogue(BaseCatalogue): ###############################################################################
# CSiBORG halo catalogue #
###############################################################################
class HaloCatalogue(BaseCSiBORG):
r""" r"""
Halo catalogue, i.e. parent halos with summed substructure, defined in the Halo catalogue, i.e. parent halos with summed substructure, defined in the
final snapshot. final snapshot.
@ -392,8 +429,8 @@ class HaloCatalogue(BaseCatalogue):
---------- ----------
nsim : int nsim : int
IC realisation index. IC realisation index.
paths : py:class`csiborgtools.read.CSiBORGPaths` paths : py:class`csiborgtools.read.Paths`
CSiBORG paths object. Paths object.
maxdist : float, optional maxdist : float, optional
The maximum comoving distance of a halo. By default The maximum comoving distance of a halo. By default
:math:`155.5 / 0.705 ~ \mathrm{Mpc}` with assumed :math:`h = 0.705`, :math:`155.5 / 0.705 ~ \mathrm{Mpc}` with assumed :math:`h = 0.705`,
@ -455,11 +492,11 @@ class HaloCatalogue(BaseCatalogue):
names = ["x", "y", "z", "M", "totpartmass", "rho0", "r200c", names = ["x", "y", "z", "M", "totpartmass", "rho0", "r200c",
"r500c", "m200c", "m500c", "r200m", "m200m", "r500c", "m200c", "m500c", "r200m", "m200m",
"vx", "vy", "vz"] "vx", "vy", "vz"]
self._data = self.box.convert_from_boxunits(self._data, names) self._data = self.box.convert_from_box(self._data, names)
if load_initial: if load_initial:
names = ["x0", "y0", "z0", "lagpatch"] names = ["x0", "y0", "z0", "lagpatch"]
self._data = self.box.convert_from_boxunits(self._data, names) self._data = self.box.convert_from_box(self._data, names)
if maxdist is not None: if maxdist is not None:
dist = numpy.sqrt(self._data["x"]**2 + self._data["y"]**2 dist = numpy.sqrt(self._data["x"]**2 + self._data["y"]**2
@ -480,3 +517,112 @@ class HaloCatalogue(BaseCatalogue):
if self._clumps_cat is None: if self._clumps_cat is None:
raise ValueError("`clumps_cat` is not loaded.") raise ValueError("`clumps_cat` is not loaded.")
return self._clumps_cat return self._clumps_cat
###############################################################################
# Quijote halo catalogue #
###############################################################################
class QuijoteHaloCatalogue(BaseCatalogue):
"""
Quijote halo catalogue.
Parameters
----------
nsim : int
IC realisation index.
paths : py:class`csiborgtools.read.Paths`
Paths object.
nsnap : int
Snapshot index.
origin : len-3 tuple, optional
Where to place the origin of the box. By default the centre of the box.
In units of :math:`cMpc`.
maxdist : float, optional
The maximum comoving distance of a halo in the new reference frame, in
units of :math:`cMpc`.
minmass : len-2 tuple
Minimum mass. The first element is the catalogue key and the second is
the value.
rawdata : bool, optional
Whether to return the raw data. In this case applies no cuts and
transformations.
**kwargs : dict
Keyword arguments for backward compatibility.
"""
_nsnap = None
def __init__(self, nsim, paths, nsnap,
origin=[500 / 0.6711, 500 / 0.6711, 500 / 0.6711],
maxdist=None, minmass=("group_mass", 1e12), rawdata=False,
**kwargs):
self.paths = paths
self.nsnap = nsnap
fpath = join(self.paths.quijote_dir, "halos", str(nsim))
fof = FoF_catalog(fpath, self.nsnap, long_ids=False, swap=False,
SFR=False, read_IDs=False)
cols = [("x", numpy.float32), ("y", numpy.float32),
("z", numpy.float32), ("vx", numpy.float32),
("vy", numpy.float32), ("vz", numpy.float32),
("group_mass", numpy.float32), ("npart", numpy.int32)]
data = cols_to_structured(fof.GroupLen.size, cols)
pos = fof.GroupPos / 1e3 / self.box.h
for i in range(3):
pos -= origin[i]
vel = fof.GroupVel * (1 + self.redshift)
for i, p in enumerate(["x", "y", "z"]):
data[p] = pos[:, i]
data["v" + p] = vel[:, i]
data["group_mass"] = fof.GroupMass * 1e10 / self.box.h
data["npart"] = fof.GroupLen
if not rawdata:
if maxdist is not None:
pos = numpy.vstack([data["x"], data["y"], data["z"]]).T
data = data[numpy.linalg.norm(pos, axis=1) < maxdist]
if minmass is not None:
data = data[data[minmass[0]] > minmass[1]]
self._data = data
@property
def nsnap(self):
"""
Snapshot number.
Returns
-------
nsnap : int
"""
return self._nsnap
@nsnap.setter
def nsnap(self, nsnap):
assert nsnap in [0, 1, 2, 3, 4]
self._nsnap = nsnap
@property
def redshift(self):
"""
Redshift of the snapshot.
Returns
-------
redshift : float
"""
z_dict = {4: 0.0, 3: 0.5, 2: 1.0, 1: 2.0, 0: 3.0}
return z_dict[self.nsnap]
@property
def box(self):
"""
Quijote box object.
Returns
-------
box : instance of :py:class:`csiborgtools.units.BaseBox`
"""
return QuijoteBox(self.nsnap)

View File

@ -24,7 +24,7 @@ class kNNCDFReader:
Parameters Parameters
---------- ----------
paths : py:class`csiborgtools.read.CSiBORGPaths` paths : py:class`csiborgtools.read.Paths`
""" """
_paths = None _paths = None
@ -38,13 +38,12 @@ class kNNCDFReader:
Parameters Parameters
---------- ----------
paths : py:class`csiborgtools.read.CSiBORGPaths` paths : py:class`csiborgtools.read.Paths`
""" """
return self._paths return self._paths
@paths.setter @paths.setter
def paths(self, paths): def paths(self, paths):
# assert isinstance(paths, CSiBORGPaths) # REMOVE
self._paths = paths self._paths = paths
def read(self, run, kind, rmin=None, rmax=None, to_clip=True): def read(self, run, kind, rmin=None, rmax=None, to_clip=True):

View File

@ -36,7 +36,7 @@ class PairOverlap:
Halo catalogue corresponding to the reference simulation. Halo catalogue corresponding to the reference simulation.
catx : :py:class:`csiborgtools.read.HaloCatalogue` catx : :py:class:`csiborgtools.read.HaloCatalogue`
Halo catalogue corresponding to the cross simulation. Halo catalogue corresponding to the cross simulation.
paths : py:class`csiborgtools.read.CSiBORGPaths` paths : py:class`csiborgtools.read.Paths`
CSiBORG paths object. CSiBORG paths object.
""" """
_cat0 = None _cat0 = None
@ -59,7 +59,7 @@ class PairOverlap:
Halo catalogue corresponding to the reference simulation. Halo catalogue corresponding to the reference simulation.
catx : :py:class:`csiborgtools.read.HaloCatalogue` catx : :py:class:`csiborgtools.read.HaloCatalogue`
Halo catalogue corresponding to the cross simulation. Halo catalogue corresponding to the cross simulation.
paths : py:class`csiborgtools.read.CSiBORGPaths` paths : py:class`csiborgtools.read.Paths`
CSiBORG paths object. CSiBORG paths object.
Returns Returns
@ -268,8 +268,8 @@ class PairOverlap:
assert (norm_kind is None assert (norm_kind is None
or norm_kind in ("r200c", "ref_patch", "sum_patch")) or norm_kind in ("r200c", "ref_patch", "sum_patch"))
# Get positions either in the initial or final snapshot # Get positions either in the initial or final snapshot
pos0 = self.cat0().position(in_initial) pos0 = self.cat0().position(in_initial=in_initial)
posx = self.catx().position(in_initial) posx = self.catx().position(in_initial=in_initial)
# Get the normalisation array if applicable # Get the normalisation array if applicable
if norm_kind == "r200c": if norm_kind == "r200c":
@ -474,7 +474,7 @@ class NPairsOverlap:
Single reference simulation halo catalogue. Single reference simulation halo catalogue.
catxs : list of :py:class:`csiborgtools.read.HaloCatalogue` catxs : list of :py:class:`csiborgtools.read.HaloCatalogue`
List of cross simulation halo catalogues. List of cross simulation halo catalogues.
paths : py:class`csiborgtools.read.CSiBORGPaths` paths : py:class`csiborgtools.read.Paths`
CSiBORG paths object. CSiBORG paths object.
verbose : bool, optional verbose : bool, optional
Verbosity flag for loading the overlap objects. Verbosity flag for loading the overlap objects.

View File

@ -21,29 +21,32 @@ from warnings import warn
import numpy import numpy
class CSiBORGPaths: class Paths:
""" """
Paths manager for CSiBORG IC realisations. Paths manager for CSiBORG and Quijote simulations.
Parameters Parameters
---------- ----------
srcdir : str srcdir : str, optional
Path to the folder where the RAMSES outputs are stored. Path to the folder where the RAMSES outputs are stored.
postdir: str postdir: str, optional
Path to the folder where post-processed files are stored. Path to the folder where post-processed files are stored.
quiote_dir : str, optional
Path to the folder where Quijote simulations are stored.
""" """
_srcdir = None _srcdir = None
_postdir = None _postdir = None
_quijote_dir = None
def __init__(self, srcdir=None, postdir=None): def __init__(self, srcdir=None, postdir=None, quijote_dir=None):
self.srcdir = srcdir self.srcdir = srcdir
self.postdir = postdir self.postdir = postdir
self.quijote_dir = quijote_dir
@staticmethod @staticmethod
def _check_directory(path): def _check_directory(path):
if not isdir(path): if not isdir(path):
raise IOError("Invalid directory `{}`!".format(path)) raise IOError(f"Invalid directory `{path}`!")
@property @property
def srcdir(self): def srcdir(self):
@ -65,6 +68,26 @@ class CSiBORGPaths:
self._check_directory(path) self._check_directory(path)
self._srcdir = path self._srcdir = path
@property
def quijote_dir(self):
"""
Path to the folder where Quijote simulations are stored.
Returns
-------
path : str
"""
if self._quijote_dir is None:
raise ValueError("`quijote_dir` is not set!")
return self._quijote_dir
@quijote_dir.setter
def quijote_dir(self, path):
if path is None:
return
self._check_directory(path)
self._quijote_dir = path
@property @property
def postdir(self): def postdir(self):
""" """

View File

@ -22,7 +22,7 @@ import numpy
from scipy.io import FortranFile from scipy.io import FortranFile
from tqdm import tqdm, trange from tqdm import tqdm, trange
from .paths import CSiBORGPaths from .paths import Paths
from .utils import cols_to_structured from .utils import cols_to_structured
############################################################################### ###############################################################################
@ -36,7 +36,7 @@ class ParticleReader:
Parameters Parameters
---------- ----------
paths : py:class`csiborgtools.read.CSiBORGPaths` paths : py:class`csiborgtools.read.Paths`
""" """
_paths = None _paths = None
@ -50,13 +50,13 @@ class ParticleReader:
Parameters Parameters
---------- ----------
paths : py:class`csiborgtools.read.CSiBORGPaths` paths : py:class`csiborgtools.read.Paths`
""" """
return self._paths return self._paths
@paths.setter @paths.setter
def paths(self, paths): def paths(self, paths):
assert isinstance(paths, CSiBORGPaths) assert isinstance(paths, Paths)
self._paths = paths self._paths = paths
def read_info(self, nsnap, nsim): def read_info(self, nsnap, nsim):
@ -396,17 +396,17 @@ class ParticleReader:
class MmainReader: class MmainReader:
""" """
Object to generate the summed substructure catalogue. Object to generate the summed substructure CSiBORG PHEW catalogue.
Parameters Parameters
---------- ----------
paths : :py:class:`csiborgtools.read.CSiBORGPaths` paths : :py:class:`csiborgtools.read.Paths`
Paths objects. Paths objects.
""" """
_paths = None _paths = None
def __init__(self, paths): def __init__(self, paths):
assert isinstance(paths, CSiBORGPaths) assert isinstance(paths, Paths)
self._paths = paths self._paths = paths
@property @property

View File

@ -16,7 +16,7 @@
import joblib import joblib
import numpy import numpy
from .paths import CSiBORGPaths from .paths import Paths
class TPCFReader: class TPCFReader:
@ -25,7 +25,7 @@ class TPCFReader:
Parameters Parameters
---------- ----------
paths : py:class`csiborgtools.read.CSiBORGPaths` paths : py:class`csiborgtools.read.Paths`
""" """
_paths = None _paths = None
@ -39,13 +39,13 @@ class TPCFReader:
Parameters Parameters
---------- ----------
paths : py:class`csiborgtools.read.CSiBORGPaths` paths : py:class`csiborgtools.read.Paths`
""" """
return self._paths return self._paths
@paths.setter @paths.setter
def paths(self, paths): def paths(self, paths):
assert isinstance(paths, CSiBORGPaths) assert isinstance(paths, Paths)
self._paths = paths self._paths = paths
def read(self, run): def read(self, run):

View File

@ -93,7 +93,7 @@ def real2redshift(pos, vel, origin, box, in_box_units, periodic_wrap=True,
Cartesian velocity components. Cartesian velocity components.
origin : 1-dimensional array `(3,)` origin : 1-dimensional array `(3,)`
Origin of the coordinate system in the `pos` reference frame. Origin of the coordinate system in the `pos` reference frame.
box : py:class:`csiborg.read.BoxUnits` box : py:class:`csiborg.read.CSiBORGBox`
Box units. Box units.
in_box_units: bool in_box_units: bool
Whether `pos` and `vel` are in box units. If not, position is assumed Whether `pos` and `vel` are in box units. If not, position is assumed

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -50,7 +50,7 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring)\n", "paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)\n",
"nsims = paths.get_ics(False)" "nsims = paths.get_ics(False)"
] ]
}, },

View File

@ -97,9 +97,9 @@
"source": [ "source": [
"grid = 256\n", "grid = 256\n",
"length = 677.05\n", "length = 677.05\n",
"paths = csiborgtools.read.CSiBORGPaths()\n", "paths = csiborgtools.read.Paths()\n",
"paths.set_info(7444, paths.get_maximum_snapshot(7444))\n", "paths.set_info(7444, paths.get_maximum_snapshot(7444))\n",
"box = csiborgtools.units.BoxUnits(paths)\n", "box = csiborgtools.units.CSiBORGBox(paths)\n",
"MAS = \"CIC\"\n", "MAS = \"CIC\"\n",
"field = csiborgtools.field.DensityField(particles, length, box, MAS)" "field = csiborgtools.field.DensityField(particles, length, box, MAS)"
] ]

View File

@ -52,7 +52,7 @@
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
"paths = csiborgtools.read.CSiBORGPaths()\n", "paths = csiborgtools.read.Paths()\n",
"hw = 0.05\n", "hw = 0.05\n",
"darkskyps = np.genfromtxt(\"../plots/darksky.csv\", delimiter=\", \")\n", "darkskyps = np.genfromtxt(\"../plots/darksky.csv\", delimiter=\", \")\n",
"\n", "\n",
@ -3699,7 +3699,7 @@
}, },
"outputs": [], "outputs": [],
"source": [ "source": [
"paths = csiborgtools.read.CSiBORGPaths()\n", "paths = csiborgtools.read.Paths()\n",
"cat = csiborgtools.read.CombinedCatalogue(paths, min_m500=1e13, max_dist=210)" "cat = csiborgtools.read.CombinedCatalogue(paths, min_m500=1e13, max_dist=210)"
] ]
}, },

View File

@ -55,7 +55,7 @@
"\n", "\n",
"data = data[(data[\"npart\"] > 100) & np.isfinite(data[\"m200\"])]\n", "data = data[(data[\"npart\"] > 100) & np.isfinite(data[\"m200\"])]\n",
"\n", "\n",
"boxunits = csiborgtools.units.BoxUnits(Nsnap, simpath)" "CSiBORGBox = csiborgtools.units.CSiBORGBox(Nsnap, simpath)"
] ]
}, },
{ {
@ -96,7 +96,7 @@
} }
], ],
"source": [ "source": [
"boxunits.box2kpc(0.21) * 1e-3" "CSiBORGBox.box2kpc(0.21) * 1e-3"
] ]
}, },
{ {
@ -1120,7 +1120,7 @@
} }
], ],
"source": [ "source": [
"mass = boxunits.box2solarmass(data[\"m200\"])\n", "mass = CSiBORGBox.box2solarmass(data[\"m200\"])\n",
"\n" "\n"
] ]
}, },
@ -1220,7 +1220,7 @@
"source": [ "source": [
"# n = 584\n", "# n = 584\n",
"# xs = csiborgtools.fits.pick_single_clump(n, parts, part_clumps, clumps)\n", "# xs = csiborgtools.fits.pick_single_clump(n, parts, part_clumps, clumps)\n",
"# halo = csiborgtools.fits.Clump.from_arrays(*xs, rhoc=boxunits.box_rhoc)\n", "# halo = csiborgtools.fits.Clump.from_arrays(*xs, rhoc=CSiBORGBox.box_rhoc)\n",
"# print(halo.Npart)" "# print(halo.Npart)"
] ]
}, },

View File

@ -69,7 +69,7 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring)\n", "paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)\n",
"# cat = csiborgtools.read.ClumpsCatalogue(7444, paths)" "# cat = csiborgtools.read.ClumpsCatalogue(7444, paths)"
] ]
}, },

View File

@ -48,8 +48,8 @@ rank = comm.Get_rank()
nproc = comm.Get_size() nproc = comm.Get_size()
MAS = "CIC" # mass asignment scheme MAS = "CIC" # mass asignment scheme
paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring) paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)
box = csiborgtools.read.BoxUnits(paths) box = csiborgtools.read.CSiBORGBox(paths)
reader = csiborgtools.read.ParticleReader(paths) reader = csiborgtools.read.ParticleReader(paths)
ics = paths.get_ics() ics = paths.get_ics()
nsims = len(ics) nsims = len(ics)

View File

@ -49,7 +49,7 @@ with open("../scripts/knn_auto.yml", "r") as file:
Rmax = 155 / 0.705 # Mpc (h = 0.705) high resolution region radius Rmax = 155 / 0.705 # Mpc (h = 0.705) high resolution region radius
totvol = 4 * numpy.pi * Rmax**3 / 3 totvol = 4 * numpy.pi * Rmax**3 / 3
paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring) paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)
ics = paths.get_ics() ics = paths.get_ics()
knncdf = csiborgtools.clustering.kNN_CDF() knncdf = csiborgtools.clustering.kNN_CDF()

View File

@ -48,7 +48,7 @@ with open("../scripts/knn_cross.yml", "r") as file:
config = yaml.safe_load(file) config = yaml.safe_load(file)
Rmax = 155 / 0.705 # Mpc (h = 0.705) high resolution region radius Rmax = 155 / 0.705 # Mpc (h = 0.705) high resolution region radius
paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring) paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)
ics = paths.get_ics() ics = paths.get_ics()
knncdf = csiborgtools.clustering.kNN_CDF() knncdf = csiborgtools.clustering.kNN_CDF()

View File

@ -47,7 +47,7 @@ with open("../scripts/tpcf_auto.yml", "r") as file:
config = yaml.safe_load(file) config = yaml.safe_load(file)
Rmax = 155 / 0.705 # Mpc (h = 0.705) high resolution region radius Rmax = 155 / 0.705 # Mpc (h = 0.705) high resolution region radius
paths = csiborgtools.read.CSiBORGPaths() paths = csiborgtools.read.Paths()
ics = paths.get_ics() ics = paths.get_ics()
tpcf = csiborgtools.clustering.Mock2PCF() tpcf = csiborgtools.clustering.Mock2PCF()

View File

@ -45,7 +45,7 @@ parser.add_argument("--grid", type=int, help="Grid resolution.")
parser.add_argument("--in_rsp", type=lambda x: bool(strtobool(x)), parser.add_argument("--in_rsp", type=lambda x: bool(strtobool(x)),
help="Calculate from the RSP density field?") help="Calculate from the RSP density field?")
args = parser.parse_args() args = parser.parse_args()
paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring) paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)
if args.ics is None or args.ics[0] == -1: if args.ics is None or args.ics[0] == -1:
ics = paths.get_ics() ics = paths.get_ics()
@ -59,7 +59,7 @@ for i in csiborgtools.fits.split_jobs(len(ics), nproc)[rank]:
print(f"{datetime.now()}: rank {rank} working on simulation {nsim}.", print(f"{datetime.now()}: rank {rank} working on simulation {nsim}.",
flush=True) flush=True)
nsnap = max(paths.get_snapshots(nsim)) nsnap = max(paths.get_snapshots(nsim))
box = csiborgtools.read.BoxUnits(nsnap, nsim, paths) box = csiborgtools.read.CSiBORGBox(nsnap, nsim, paths)
density_gen = csiborgtools.field.DensityField(box, args.MAS) density_gen = csiborgtools.field.DensityField(box, args.MAS)
rho = numpy.load(paths.field_path("density", args.MAS, args.grid, nsim, rho = numpy.load(paths.field_path("density", args.MAS, args.grid, nsim,

View File

@ -46,7 +46,7 @@ parser.add_argument("--grid", type=int, help="Grid resolution.")
parser.add_argument("--in_rsp", type=lambda x: bool(strtobool(x)), parser.add_argument("--in_rsp", type=lambda x: bool(strtobool(x)),
help="Calculate the density field in redshift space?") help="Calculate the density field in redshift space?")
args = parser.parse_args() args = parser.parse_args()
paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring) paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)
mpart = 1.1641532e-10 # Particle mass in CSiBORG simulations. mpart = 1.1641532e-10 # Particle mass in CSiBORG simulations.
if args.ics is None or args.ics[0] == -1: if args.ics is None or args.ics[0] == -1:
@ -61,7 +61,7 @@ for i in csiborgtools.fits.split_jobs(len(ics), nproc)[rank]:
flush=True) flush=True)
nsnap = max(paths.get_snapshots(nsim)) nsnap = max(paths.get_snapshots(nsim))
box = csiborgtools.read.BoxUnits(nsnap, nsim, paths) box = csiborgtools.read.CSiBORGBox(nsnap, nsim, paths)
parts = csiborgtools.read.read_h5(paths.particles_path(nsim))["particles"] parts = csiborgtools.read.read_h5(paths.particles_path(nsim))["particles"]
if args.kind == "density": if args.kind == "density":

View File

@ -42,7 +42,7 @@ parser.add_argument("--kind", type=str, choices=["halos", "clumps"])
parser.add_argument("--ics", type=int, nargs="+", default=None, parser.add_argument("--ics", type=int, nargs="+", default=None,
help="IC realisations. If `-1` processes all simulations.") help="IC realisations. If `-1` processes all simulations.")
args = parser.parse_args() args = parser.parse_args()
paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring) paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)
partreader = csiborgtools.read.ParticleReader(paths) partreader = csiborgtools.read.ParticleReader(paths)
nfwpost = csiborgtools.fits.NFWPosterior() nfwpost = csiborgtools.fits.NFWPosterior()
@ -105,7 +105,7 @@ for nsim in [ics[i] for i in jobs]:
print(f"{datetime.now()}: rank {rank} calculating simulation `{nsim}`.", print(f"{datetime.now()}: rank {rank} calculating simulation `{nsim}`.",
flush=True) flush=True)
nsnap = max(paths.get_snapshots(nsim)) nsnap = max(paths.get_snapshots(nsim))
box = csiborgtools.read.BoxUnits(nsnap, nsim, paths) box = csiborgtools.read.CSiBORGBox(nsnap, nsim, paths)
# Particle archive # Particle archive
f = csiborgtools.read.read_h5(paths.particles_path(nsim)) f = csiborgtools.read.read_h5(paths.particles_path(nsim))

View File

@ -22,7 +22,6 @@ from datetime import datetime
import numpy import numpy
from mpi4py import MPI from mpi4py import MPI
from tqdm import tqdm from tqdm import tqdm
try: try:
@ -45,7 +44,7 @@ parser = ArgumentParser()
parser.add_argument("--ics", type=int, nargs="+", default=None, parser.add_argument("--ics", type=int, nargs="+", default=None,
help="IC realisations. If `-1` processes all simulations.") help="IC realisations. If `-1` processes all simulations.")
args = parser.parse_args() args = parser.parse_args()
paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring) paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)
partreader = csiborgtools.read.ParticleReader(paths) partreader = csiborgtools.read.ParticleReader(paths)
if args.ics is None or args.ics[0] == -1: if args.ics is None or args.ics[0] == -1:

View File

@ -45,7 +45,7 @@ nproc = comm.Get_size()
if nproc > 1: if nproc > 1:
raise NotImplementedError("MPI is not implemented implemented yet.") raise NotImplementedError("MPI is not implemented implemented yet.")
paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring) paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)
cols_collect = [("r", numpy.float32), ("M", numpy.float32)] cols_collect = [("r", numpy.float32), ("M", numpy.float32)]
if args.ics is None or args.ics == -1: if args.ics is None or args.ics == -1:
nsims = paths.get_ics() nsims = paths.get_ics()
@ -59,7 +59,7 @@ for i, nsim in enumerate(nsims):
now = datetime.now() now = datetime.now()
print(f"{now}: calculating {i}th simulation `{nsim}`.", flush=True) print(f"{now}: calculating {i}th simulation `{nsim}`.", flush=True)
nsnap = max(paths.get_snapshots(nsim)) nsnap = max(paths.get_snapshots(nsim))
box = csiborgtools.read.BoxUnits(nsnap, nsim, paths) box = csiborgtools.read.CSiBORGBox(nsnap, nsim, paths)
f = csiborgtools.read.read_h5(paths.particles_path(nsim)) f = csiborgtools.read.read_h5(paths.particles_path(nsim))
particles = f["particles"] particles = f["particles"]

View File

@ -54,7 +54,7 @@ def get_combs():
Get the list of all pairs of simulations, then permute them with a known Get the list of all pairs of simulations, then permute them with a known
seed to minimise loading the same files simultaneously. seed to minimise loading the same files simultaneously.
""" """
paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring) paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)
ics = paths.get_ics() ics = paths.get_ics()
combs = list(combinations(ics, 2)) combs = list(combinations(ics, 2))
Random(42).shuffle(combs) Random(42).shuffle(combs)

View File

@ -32,7 +32,7 @@ except ModuleNotFoundError:
def pair_match(nsim0, nsimx, sigma, smoothen, verbose): def pair_match(nsim0, nsimx, sigma, smoothen, verbose):
from csiborgtools.read import HaloCatalogue, read_h5 from csiborgtools.read import HaloCatalogue, read_h5
paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring) paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)
smooth_kwargs = {"sigma": sigma, "mode": "constant", "cval": 0.0} smooth_kwargs = {"sigma": sigma, "mode": "constant", "cval": 0.0}
overlapper = csiborgtools.match.ParticleOverlap() overlapper = csiborgtools.match.ParticleOverlap()
matcher = csiborgtools.match.RealisationsMatcher() matcher = csiborgtools.match.RealisationsMatcher()

View File

@ -49,7 +49,7 @@ parser.add_argument("--ics", type=int, nargs="+", default=None,
args = parser.parse_args() args = parser.parse_args()
verbose = nproc == 1 verbose = nproc == 1
paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring) paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)
partreader = csiborgtools.read.ParticleReader(paths) partreader = csiborgtools.read.ParticleReader(paths)
# Keep "ID" as the last column! # Keep "ID" as the last column!
pars_extract = ['x', 'y', 'z', 'vx', 'vy', 'vz', 'M', "ID"] pars_extract = ['x', 'y', 'z', 'vx', 'vy', 'vz', 'M', "ID"]

View File

@ -33,7 +33,7 @@ comm = MPI.COMM_WORLD
rank = comm.Get_rank() rank = comm.Get_rank()
nproc = comm.Get_size() nproc = comm.Get_size()
paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring) paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)
mmain_reader = csiborgtools.read.MmainReader(paths) mmain_reader = csiborgtools.read.MmainReader(paths)

View File

@ -18,9 +18,9 @@ snapshot ordering, which is sorted by the clump IDs.
""" """
from argparse import ArgumentParser from argparse import ArgumentParser
from datetime import datetime from datetime import datetime
from gc import collect
import h5py import h5py
from gc import collect
import numpy import numpy
from mpi4py import MPI from mpi4py import MPI
@ -44,7 +44,7 @@ parser = ArgumentParser()
parser.add_argument("--ics", type=int, nargs="+", default=None, parser.add_argument("--ics", type=int, nargs="+", default=None,
help="IC realisations. If `-1` processes all simulations.") help="IC realisations. If `-1` processes all simulations.")
args = parser.parse_args() args = parser.parse_args()
paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring) paths = csiborgtools.read.Paths(**csiborgtools.paths_glamdring)
partreader = csiborgtools.read.ParticleReader(paths) partreader = csiborgtools.read.ParticleReader(paths)
# NOTE: ID has to be the last column. # NOTE: ID has to be the last column.
pars_extract = ["x", "y", "z", "M", "ID"] pars_extract = ["x", "y", "z", "M", "ID"]