mirror of
https://github.com/Richard-Sti/csiborgtools.git
synced 2024-12-22 17:58:01 +00:00
Add support for inverting the reader (#30)
This commit is contained in:
parent
f2cef73977
commit
6e290ccfb4
1 changed files with 80 additions and 2 deletions
|
@ -17,6 +17,7 @@ Tools for summarising various results.
|
||||||
"""
|
"""
|
||||||
import numpy
|
import numpy
|
||||||
import joblib
|
import joblib
|
||||||
|
from os.path import isfile
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
from .make_cat import HaloCatalogue
|
from .make_cat import HaloCatalogue
|
||||||
|
|
||||||
|
@ -187,8 +188,34 @@ class OverlapReader:
|
||||||
if fskel is None:
|
if fskel is None:
|
||||||
fskel = "/mnt/extraspace/rstiskalek/csiborg/overlap/"
|
fskel = "/mnt/extraspace/rstiskalek/csiborg/overlap/"
|
||||||
fskel += "cross_{}_{}.npz"
|
fskel += "cross_{}_{}.npz"
|
||||||
self._data = numpy.load(fskel.format(nsim0, nsimx), allow_pickle=True)
|
|
||||||
|
fpath = fskel.format(nsim0, nsimx)
|
||||||
|
fpath_inv = fskel.format(nsimx, nsim0)
|
||||||
|
is_inverted = False
|
||||||
|
if isfile(fpath):
|
||||||
|
pass
|
||||||
|
elif isfile(fpath_inv):
|
||||||
|
fpath = fpath_inv
|
||||||
|
is_inverted = True
|
||||||
|
nsim0, nsimx = nsimx, nsim0
|
||||||
|
else:
|
||||||
|
raise FileNotFoundError(
|
||||||
|
"No overlap file found for combination `{}` and `{}`."
|
||||||
|
.format(nsim0, nsimx))
|
||||||
|
|
||||||
|
# We can set catalogues already now even if inverted
|
||||||
self._set_cats(nsim0, nsimx)
|
self._set_cats(nsim0, nsimx)
|
||||||
|
print(is_inverted)
|
||||||
|
data = numpy.load(fpath, allow_pickle=True)
|
||||||
|
if is_inverted:
|
||||||
|
inv_match_indxs, inv_overlap = self._invert_match(
|
||||||
|
data["match_indxs"], data["cross"], self.cat0["index"].size,)
|
||||||
|
# Overwrite the original file and store as a dictionary
|
||||||
|
data = {"indxs": self.cat0["index"],
|
||||||
|
"match_indxs": inv_match_indxs,
|
||||||
|
"cross": inv_overlap,
|
||||||
|
}
|
||||||
|
self._data = data
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def nsim0(self):
|
def nsim0(self):
|
||||||
|
@ -252,6 +279,57 @@ class OverlapReader:
|
||||||
self._cat0 = HaloCatalogue(nsim0)
|
self._cat0 = HaloCatalogue(nsim0)
|
||||||
self._catx = HaloCatalogue(nsimx)
|
self._catx = HaloCatalogue(nsimx)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _invert_match(match_indxs, overlap, cross_size):
|
||||||
|
"""
|
||||||
|
Invert reference and cross matching, possible since the overlap
|
||||||
|
definition is symmetric.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
match_indxs : array of 1-dimensional arrays
|
||||||
|
Indices of halos from the original cross catalogue matched to the
|
||||||
|
reference catalogue.
|
||||||
|
overlap : array of 1-dimensional arrays
|
||||||
|
Pair overlap of halos between the originla reference and cross
|
||||||
|
simulations.
|
||||||
|
cross_size : int
|
||||||
|
The size of the cross catalogue.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
inv_match_indxs : array of 1-dimensional arrays
|
||||||
|
The inverted match indices.
|
||||||
|
ind_overlap : array of 1-dimensional arrays
|
||||||
|
The corresponding overlaps to `inv_match_indxs`.
|
||||||
|
"""
|
||||||
|
# 1. Invert the match. Each reference halo has a list of counterparts
|
||||||
|
# so loop over those to each counterpart assign a reference halo.
|
||||||
|
# Add the same time also add the overlaps
|
||||||
|
inv_match_indxs = [[] for __ in range(cross_size)]
|
||||||
|
inv_overlap = [[] for __ in range(cross_size)]
|
||||||
|
for ref_id in range(match_indxs.size):
|
||||||
|
for cross_id, cross in zip(match_indxs[ref_id], overlap[ref_id]):
|
||||||
|
inv_match_indxs[cross_id].append(ref_id)
|
||||||
|
inv_overlap[cross_id].append(cross)
|
||||||
|
|
||||||
|
# 2. Convert the cross matches and overlaps to proper numpy arrays
|
||||||
|
# and ensure that the overlaps are ordered.
|
||||||
|
for n in range(len(inv_match_indxs)):
|
||||||
|
inv_match_indxs[n] = numpy.asanyarray(inv_match_indxs[n],
|
||||||
|
dtype=numpy.int32)
|
||||||
|
inv_overlap[n] = numpy.asanyarray(inv_overlap[n],
|
||||||
|
dtype=numpy.float32)
|
||||||
|
|
||||||
|
ordering = numpy.argsort(inv_overlap[n])[::-1]
|
||||||
|
inv_match_indxs[n] = inv_match_indxs[n][ordering]
|
||||||
|
inv_overlap[n] = inv_overlap[n][ordering]
|
||||||
|
|
||||||
|
inv_match_indxs = numpy.asarray(inv_match_indxs, dtype=object)
|
||||||
|
inv_overlap = numpy.asarray(inv_overlap, dtype=object)
|
||||||
|
|
||||||
|
return inv_match_indxs, inv_overlap
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def indxs(self):
|
def indxs(self):
|
||||||
"""
|
"""
|
||||||
|
@ -281,7 +359,7 @@ class OverlapReader:
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
ovelap : array of 1-dimensional arrays of shape `(nhalos, )`
|
overlap : array of 1-dimensional arrays of shape `(nhalos, )`
|
||||||
"""
|
"""
|
||||||
return self._data["cross"]
|
return self._data["cross"]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue