{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "5a38ed25", "metadata": { "ExecuteTime": { "end_time": "2023-04-12T14:25:46.519408Z", "start_time": "2023-04-12T14:25:03.003304Z" }, "scrolled": true }, "outputs": [], "source": [ "import sys\n", "import numpy as np\n", "import h5py\n", "import matplotlib.pyplot as plt\n", "from numba import jit\n", "import numpy\n", "\n", "sys.path.append(\"../\")\n", "import csiborgtools\n", "\n", "%matplotlib widget\n", "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "code", "execution_count": 2, "id": "312c96c9", "metadata": {}, "outputs": [], "source": [ "paths = csiborgtools.read.CSiBORGPaths(**csiborgtools.paths_glamdring)\n", "nsim0 = 7468\n", "nsimx = 7588 \n", "nsnap0 = max(paths.get_snapshots(nsim0))\n", "nsnapx = max(paths.get_snapshots(nsimx))\n", "overlapper = csiborgtools.match.ParticleOverlap()\n", "partreader = csiborgtools.read.ParticleReader(paths)" ] }, { "cell_type": "code", "execution_count": 3, "id": "174206f5", "metadata": {}, "outputs": [], "source": [ "clumpmap0 = csiborgtools.read.read_h5(paths.particles_path(nsim0))[\"clumpmap\"]\n", "parts0 = csiborgtools.read.read_h5(paths.initmatch_path(nsim0, \"particles\"))[\"particles\"]\n", "clid2map0 = {clid: i for i, clid in enumerate(clumpmap0[:, 0])}\n", "\n", "# clumpmapx = csiborgtools.read.read_h5(paths.particles_path(nsimx))[\"clumpmap\"]\n", "# partsx = csiborgtools.read.read_h5(paths.initmatch_path(nsimx, \"particles\"))[\"particles\"]\n", "# clid2mapx = {clid: i for i, clid in enumerate(clumpmapx[:, 0])}\n", "\n", "cat0 = csiborgtools.read.HaloCatalogue(nsim0, paths, load_initial=True, minmass=None, with_lagpatch=True)\n", "catx = csiborgtools.read.HaloCatalogue(nsimx, paths, load_initial=True, minmass=None, with_lagpatch=True)" ] }, { "cell_type": "code", "execution_count": 4, "id": "de571afb", "metadata": {}, "outputs": [], "source": [ "parts = csiborgtools.read.read_h5(paths.particles_path(nsim0))[\"particles\"]" ] }, { "cell_type": "code", "execution_count": 39, "id": "a1128e15", "metadata": {}, "outputs": [], "source": [ "X = parts[:100000, :]\n", "pos = X[:, :3]\n", "vel = X[:, 3:6]\n", "origin = [0.5, 0.5, 0.5]\n", "box = csiborgtools.read.BoxUnits(nsnap0, nsim0, paths)" ] }, { "cell_type": "code", "execution_count": 42, "id": "1b64c2b7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.04632865, 0.00390616, 0.07068912],\n", " [0.678856 , 0.5636776 , 0.39254144],\n", " [0.67959476, 0.5646367 , 0.39651725],\n", " ...,\n", " [0.6699929 , 0.5782057 , 0.39238685],\n", " [0.64754474, 0.58878136, 0.38821003],\n", " [0.6480443 , 0.5889117 , 0.38808307]], dtype=float32)" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "csiborgtools.read.real2redshift(pos, vel, origin, box)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 25, "id": "b79fddeb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0018435717" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.abs(x - 1).max()" ] }, { "cell_type": "code", "execution_count": null, "id": "fb4398be", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 94, "id": "81ce3e39", "metadata": {}, "outputs": [], "source": [ "k0 = clumpmap0[clid2map0[0], 2] + 1\n", "# parts.shape[0]" ] }, { "cell_type": "code", "execution_count": 96, "id": "5384bc24", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "182510395" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "parts.shape[0] - k0" ] }, { "cell_type": "code", "execution_count": 44, "id": "32f9ca63", "metadata": {}, "outputs": [], "source": [ "clumps_cat = csiborgtools.read.ClumpsCatalogue(nsim0, paths, load_fitted=True, minmass=None, maxdist=155 / 0.705)" ] }, { "cell_type": "code", "execution_count": 119, "id": "6a1bf230", "metadata": {}, "outputs": [], "source": [ "cat = csiborgtools.read.HaloCatalogue(nsim0, paths, minmass=None)" ] }, { "cell_type": "code", "execution_count": 124, "id": "85eb7844", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1, 3, 5, ..., 21809643, 21810694, 21818034],\n", " dtype=int32)" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cat['ID']" ] }, { "cell_type": "code", "execution_count": 114, "id": "b3fea4ab", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "153575" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(cat)" ] }, { "cell_type": "code", "execution_count": 118, "id": "146b4c6e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1355" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numpy.isnan(cat[\"lagpatch\"]).sum()" ] }, { "cell_type": "code", "execution_count": null, "id": "08e2b141", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 88, "id": "b8c91301", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-42.401093 , -32.8627 , -45.08371 , ..., 9.587616 ,\n", " 5.0563965, 12.45813 ], dtype=float32)" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cat['x0']" ] }, { "cell_type": "code", "execution_count": null, "id": "9cf882e0", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 46, "id": "49a14648", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "265246" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(clumps_cat)" ] }, { "cell_type": "code", "execution_count": 50, "id": "ba45cf01", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0119bb1def8d463ba494175ee5416a8c", "version_major": 2, "version_minor": 0 }, "image/png": "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ktPpNOIDdi7TejatX8m8nk3rVzKvZ9P6lczr+Ur9mjrzV8vY28BER0crJSVFBQUF9rKamhoVFBTI4/GEcGQAAACNy9gZQEmaNWuWJk6cqNtvv1133nmnXnnlFZ08eVK//OUvQz00AACARmN0APz7v/97HTlyRPPmzZPP59OAAQO0du3aCy4MqQuHw6Fnn332gkPEzZlpPZvWr2Rez6b1K5nXs2n9Sub1bFq/V8vo+wACAACYyNhzAAEAAExFAAQAADAMARAAAMAwBEAAAADDEACvwQMPPKBu3bqpTZs2io+P1/jx43Xw4MHLbnPvvfcqKioq6DF16tQmGvG1uZp+T58+rczMTHXq1EkdOnTQmDFjLrj5drjat2+fJk2apKSkJLVt21Y9e/bUs88+q6qqqstuF6n7+Gr7jeR9LEn/8i//orvuukvt2rWzb+x+JY8++ugF+3j48OGNO9AGcjX9WpalefPmKT4+Xm3btlVaWpq++eabxh1oAzp27JjGjRsnp9OpmJgYTZo0SSdOnLjsNpH0OX7jjTfUo0cPtWnTRqmpqdq6detl61esWKE+ffqoTZs26tevn/74xz820UgbTn16zs3NvWBftmnTpglHG54IgNdgyJAhWr58uUpLS/Vf//Vf2rNnjx566KErbjd58mQdOnTIfixcuLAJRnvtrqbfmTNn6pNPPtGKFSu0YcMGHTx4UA8++GATjfja7Nq1SzU1NXr77bdVUlKil19+WYsXL9avf/3rK24bifv4avuN5H0sSVVVVfr5z3+uadOm1Wu74cOHB+3j999/v5FG2LCupt+FCxfq1Vdf1eLFi7Vlyxa1b99e6enpOn36dCOOtOGMGzdOJSUlys/P1+rVq7Vx40ZNmTLlittFwuf4ww8/1KxZs/Tss8/qL3/5i2699Valp6fr8OHDF63ftGmTHn74YU2aNEnbtm3T6NGjNXr0aO3cubOJR3716tuz9MNfBTl3X3777bdNOOIwZaHBfPzxx1ZUVJRVVVV1yZof//jH1j/90z813aAa0ZX6raiosFq3bm2tWLHCXvb1119bkiyv19tUw2xQCxcutJKSki5b05z28ZX6bU77eMmSJZbL5apT7cSJE61Ro0Y16ngaW137rampsdxut/Xiiy/ayyoqKiyHw2G9//77jTjChvHVV19ZkqwvvvjCXrZmzRorKirK+u677y65XaR8ju+8804rMzPTfl5dXW0lJCRYOTk5F63/u7/7OysjIyNoWWpqqvUP//APjTrOhlTfnuvz2TYJM4AN5NixY1q6dKnuuusutW7d+rK1S5cuVefOnXXLLbcoOztb33//fRONsuHUpd+ioiKdOXNGaWlp9rI+ffqoW7du8nq9TTXUBuX3+9WxY8cr1jWHfSxdud/muI/rqrCwULGxserdu7emTZumo0ePhnpIjWLv3r3y+XxB+9jlcik1NTUi9rHX61VMTIxuv/12e1laWppatGihLVu2XHbbcP8cV1VVqaioKGjftGjRQmlpaZfcN16vN6hektLT0yNiX0pX17MknThxQt27d1diYqJGjRqlkpKSphhuWDP6L4E0hKysLL3++uv6/vvvNWjQIK1evfqy9Y888oi6d++uhIQEbd++XVlZWSotLdXKlSubaMTXpj79+nw+RUdHX3CeUVxcnHw+XyOPtOHt3r1br732ml566aXL1kX6Pq5Vl36b2z6uq+HDh+vBBx9UUlKS9uzZo1//+tcaMWKEvF6vWrZsGerhNaja/Xj+X0iKlH3s8/kUGxsbtKxVq1bq2LHjZccfCZ/jv/71r6qurr7ovtm1a9dFt/H5fBG7L6Wr67l379767W9/q/79+8vv9+ull17SXXfdpZKSEnXt2rUphh2WmAE8z5w5cy44WfT8x7m/ZLNnz9a2bdv06aefqmXLlpowYYKsy/xxlSlTpig9PV39+vXTuHHj9Lvf/U6rVq3Snj17mqK9CzR2v+Govj1L0nfffafhw4fr5z//uSZPnnzZ14/0fSzVr99wdDU918fYsWP1wAMPqF+/fho9erRWr16tL774QoWFhQ3XRD00dr/hqLF7DrfPMa6ex+PRhAkTNGDAAP34xz/WypUr1aVLF7399tuhHlpIMQN4nieffFKPPvroZWtuuOEG++fOnTurc+fOuummm9S3b18lJiZq8+bN8ng8dXq/1NRUST/MtvTs2fOqx321GrNft9utqqoqVVRUBM0QlZeXy+12N1QL9Vbfng8ePKghQ4borrvu0jvvvFPv94u0fVyffpvLPr5WN9xwgzp37qzdu3dr6NChDfa6ddWY/dbux/LycsXHx9vLy8vLNWDAgKt6zYZQ157dbvcFFwecPXtWx44dq9fvaKg/xxfTuXNntWzZ8oKr7i/3+XO73fWqDzdX0/P5WrdurYEDB2r37t2NMcSIQQA8T5cuXdSlS5er2rampkaSVFlZWedtiouLJSnof6xNqTH7TUlJUevWrVVQUKAxY8ZIkkpLS1VWVlbngNwY6tPzd999pyFDhiglJUVLlixRixb1nzSPpH1c336bwz5uCAcOHNDRo0cjYh/XV1JSktxutwoKCuzAFwgEtGXLlnpfOd2Q6tqzx+NRRUWFioqKlJKSIklav369ampq7FBXF6H+HF9MdHS0UlJSVFBQoNGjR0v64f/LBQUFmj59+kW38Xg8Kigo0IwZM+xl+fn5If281sfV9Hy+6upq7dixQyNHjmzEkUaAUF+FEqk2b95svfbaa9a2bdusffv2WQUFBdZdd91l9ezZ0zp9+rRlWZZ14MABq3fv3taWLVssy7Ks3bt3W88//7z15ZdfWnv37rU+/vhj64YbbrAGDx4cylbq5Gr6tSzLmjp1qtWtWzdr/fr11pdffml5PB7L4/GEqo16OXDggNWrVy9r6NCh1oEDB6xDhw7Zj3Nrmss+vpp+LSuy97FlWda3335rbdu2zZo/f77VoUMHa9u2bda2bdus48eP2zW9e/e2Vq5caVmWZR0/ftx66qmnLK/Xa+3du9f67LPPrNtuu8268cYb7c9COKtvv5ZlWQsWLLBiYmKsjz/+2Nq+fbs1atQoKykpyTp16lQoWqi34cOHWwMHDrS2bNli/fnPf7ZuvPFG6+GHH7bXR/Ln+IMPPrAcDoeVm5trffXVV9aUKVOsmJgYy+fzWZZlWePHj7fmzJlj13/++edWq1atrJdeesn6+uuvrWeffdZq3bq1tWPHjlC1UG/17Xn+/PnWunXrrD179lhFRUXW2LFjrTZt2lglJSWhaiEsEACv0vbt260hQ4ZYHTt2tBwOh9WjRw9r6tSp1oEDB+yavXv3WpKsP/3pT5ZlWVZZWZk1ePBge5tevXpZs2fPtvx+f4i6qLur6deyLOvUqVPWr371K+v666+32rVrZ/3sZz8LChThbMmSJZakiz5qNad9fDX9WlZk72PL+uGWLhfr+dweJVlLliyxLMuyvv/+e2vYsGFWly5drNatW1vdu3e3Jk+ebH/5hLv69mtZP9wK5plnnrHi4uIsh8NhDR061CotLW36wV+lo0ePWg8//LDVoUMHy+l0Wr/85S+DAm+kf45fe+01q1u3blZ0dLR15513Wps3b7bX/fjHP7YmTpwYVL98+XLrpptusqKjo62bb77ZysvLa+IRX7v69Dxjxgy7Ni4uzho5cqT1l7/8JQSjDi9RlhVhZ/ADAADgmnAVMAAAgGEIgAAAAIYhAAIAABiGAAgAAGAYAiAAAIBhCIAAAACGIQACAAAYhgAIAABgGAIgAACAYQiAAAAAhiEAAgAAGIYACAAAYBgCIAAAgGEIgAAAAIYhAAIAABiGAAgAAGAYAiAAAIBhCIAAAACGIQACAAAYhgAIAABgGAIgAACAYQiAAAAAhiEAAgAAGIYACAAAYBgCIAAAgGEIgAAAAIYhAAIAABiGAAgAAGAYAiAAAIBhCIAAAACGIQACAAAY5v8Dao5lL+mCel4AAAAASUVORK5CYII=", "text/html": [ "\n", "