1
0
Fork 0
mirror of https://github.com/Findus23/halo_comparison.git synced 2024-09-19 16:03:50 +02:00
halo_comparison/auriga_comparison.py

194 lines
6 KiB
Python
Raw Normal View History

2022-06-14 16:38:50 +02:00
import pickle
2022-06-10 11:04:54 +02:00
from dataclasses import dataclass
2022-06-14 16:38:50 +02:00
from enum import Enum
2022-06-10 11:04:54 +02:00
from pathlib import Path
from typing import List
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.axes import Axes
from matplotlib.colors import LogNorm
from matplotlib.figure import Figure
from cic import cic_from_radius
2022-06-14 16:38:50 +02:00
from halo_mass_profile import halo_mass_profile
from paths import auriga_dir, richings_dir
2022-06-10 11:04:54 +02:00
from readfiles import read_file, read_halo_file
2022-06-14 10:53:19 +02:00
from utils import read_swift_config
2022-06-14 16:38:50 +02:00
class Mode(Enum):
richings = 1
auriga6 = 2
mode = Mode.richings
2022-06-14 10:53:19 +02:00
def dir_name_to_parameter(dir_name: str):
2022-06-14 16:38:50 +02:00
return map(int, dir_name.lstrip("auriga6_halo").lstrip("richings21_").split("_"))
2022-06-14 10:53:19 +02:00
def levelmax_to_softening_length(levelmax: int) -> float:
2022-06-14 16:38:50 +02:00
box_size = 100
return box_size / 30 / 2 ** levelmax
2022-06-10 11:04:54 +02:00
fig1: Figure = plt.figure(figsize=(9, 6))
ax1: Axes = fig1.gca()
fig2: Figure = plt.figure(figsize=(9, 6))
ax2: Axes = fig2.gca()
2022-06-14 10:53:19 +02:00
for ax in [ax1, ax2]:
ax.set_xlabel(r'R [Mpc]$')
2022-06-10 11:04:54 +02:00
ax1.set_ylabel(r'M [$10^{10} \mathrm{M}_\odot$]')
ax2.set_ylabel("density [$\\frac{10^{10} \\mathrm{M}_\\odot}{Mpc^3}$]")
2022-06-14 16:38:50 +02:00
part_numbers = []
reference_file = Path("auriga_reference.pickle")
2022-06-10 11:04:54 +02:00
@dataclass
class Result:
title: str
rho: np.ndarray
2022-06-03 15:20:12 +02:00
2022-06-10 11:04:54 +02:00
images = []
vmin = np.Inf
vmax = -np.Inf
2022-06-14 16:38:50 +02:00
root_dir = auriga_dir if mode == Mode.auriga6 else richings_dir
dirs = [d for d in root_dir.glob("*") if d.is_dir() and "bak" not in d.name]
2022-06-14 10:53:19 +02:00
for i, dir in enumerate(sorted(dirs)):
is_by_adrian = "arj" in dir.name
print(dir.name)
2022-06-10 11:04:54 +02:00
2022-06-14 10:53:19 +02:00
if not is_by_adrian:
levelmin, levelmin_TF, levelmax = dir_name_to_parameter(dir.name)
print(levelmin, levelmin_TF, levelmax)
2022-06-14 16:38:50 +02:00
# if levelmax != 12:
2022-06-14 10:53:19 +02:00
# continue
2022-06-03 15:20:12 +02:00
Xc_adrian = 56.50153741810241
Yc_adrian = 49.40761085700951
Zc_adrian = 49.634393647291695
Xc = 58.25576087992683
Yc = 51.34632916228137
Zc = 51.68749302578122
input_file = dir / "output_0007.hdf5"
2022-06-14 16:38:50 +02:00
if mode == Mode.richings:
input_file = dir / "output_0004.hdf5"
2022-06-03 15:20:12 +02:00
if is_by_adrian:
2022-06-10 11:04:54 +02:00
input_file = dir / "output_0000.hdf5"
2022-06-14 10:53:19 +02:00
softening_length = None
else:
swift_conf = read_swift_config(dir)
softening_length = swift_conf["Gravity"]["comoving_DM_softening"]
assert softening_length == swift_conf["Gravity"]["max_physical_DM_softening"]
2022-06-14 16:38:50 +02:00
ideal_softening_length = levelmax_to_softening_length(levelmax)
# if not np.isclose(softening_length, levelmax_to_softening_length(levelmax)):
# raise ValueError(f"softening length for levelmax {levelmax} should be {ideal_softening_length} "
# f"but is {softening_length}")
2022-06-03 15:20:12 +02:00
print(input_file)
2022-06-10 11:04:54 +02:00
df, particles_meta = read_file(input_file)
df_halos = read_halo_file(input_file.with_name("fof_" + input_file.name))
2022-06-14 10:53:19 +02:00
# halos = read_velo_halos(dir, veloname="velo_out")
2022-06-10 11:04:54 +02:00
# particles_in_halo = df.loc[df["FOFGroupIDs"] == 3]
halo_id = 1
while True:
particles_in_halo = df.loc[df["FOFGroupIDs"] == halo_id]
if len(particles_in_halo) > 1:
break
halo_id += 1
halo = df_halos.loc[halo_id]
2022-06-14 16:38:50 +02:00
part_numbers.append(len(df) * particles_meta.particle_mass)
2022-06-14 10:53:19 +02:00
# halo = halos.loc[1]
2022-06-14 16:38:50 +02:00
log_radial_bins, bin_masses, bin_densities, center = halo_mass_profile(
df, halo, particles_meta, plot=False, num_bins=100,
vmin=0.002, vmax=6.5
2022-06-10 11:04:54 +02:00
)
2022-06-14 16:38:50 +02:00
if is_by_adrian:
with reference_file.open("wb") as f:
pickle.dump([log_radial_bins, bin_masses, bin_densities], f)
2022-06-10 11:04:54 +02:00
ax1.loglog(log_radial_bins[:-1], bin_masses, label=str(dir.name), c=f"C{i}")
ax2.loglog(log_radial_bins[:-1], bin_densities, label=str(dir.name), c=f"C{i}")
2022-06-14 16:38:50 +02:00
if reference_file.exists() and not is_by_adrian and mode == Mode.auriga6:
with reference_file.open("rb") as f:
data: List[np.ndarray] = pickle.load(f)
ref_log_radial_bins, ref_bin_masses, ref_bin_densities = data
mass_deviation: np.ndarray = np.abs(bin_masses - ref_bin_masses)
density_deviation: np.ndarray = np.abs(bin_densities - ref_bin_densities)
ax1.loglog(log_radial_bins[:-1], mass_deviation, c=f"C{i}",
linestyle="dotted")
ax2.loglog(log_radial_bins[:-1], density_deviation, c=f"C{i}",
linestyle="dotted")
accuracy = mass_deviation / ref_bin_masses
print(accuracy)
print("mean accuracy", accuracy.mean())
2022-06-14 10:53:19 +02:00
if softening_length:
for ax in [ax1, ax2]:
ax.axvline(4 * softening_length, color=f"C{i}", linestyle="dotted")
2022-06-10 11:04:54 +02:00
X, Y, Z = df.X.to_numpy(), df.Y.to_numpy(), df.Z.to_numpy()
2022-06-03 15:20:12 +02:00
print()
print(Yc - Yc_adrian)
# shift: (-6, 0, -12)
2022-06-14 16:38:50 +02:00
# if not is_by_adrian:
# xshift = Xc - Xc_adrian
# yshift = Yc - Yc_adrian
# zshift = Zc - Zc_adrian
# print("shift", xshift, yshift, zshift)
2022-06-03 15:20:12 +02:00
2022-06-14 16:38:50 +02:00
X -= center[0]
Y -= center[1]
Z -= center[2]
2022-06-10 11:04:54 +02:00
2022-06-14 16:38:50 +02:00
rho, extent = cic_from_radius(X, Z, 500, 0, 0, 5, periodic=False)
2022-06-03 15:20:12 +02:00
2022-06-10 11:04:54 +02:00
vmin = min(vmin, rho.min())
vmax = max(vmax, rho.max())
images.append(Result(
rho=rho,
2022-06-03 15:20:12 +02:00
title=str(dir.name)
2022-06-10 11:04:54 +02:00
))
# plot_cic(
# rho, extent,
# title=str(dir.name)
# )
ax1.legend()
ax2.legend()
2022-06-14 16:38:50 +02:00
# fig3: Figure = plt.figure(figsize=(9, 9))
# axes: List[Axes] = fig3.subplots(3, 3, sharex=True, sharey=True).flatten()
fig3: Figure = plt.figure(figsize=(6, 3))
axes: List[Axes] = fig3.subplots(1, 2, sharex=True, sharey=True).flatten()
2022-06-10 11:04:54 +02:00
for result, ax in zip(images, axes):
data = 1.1 + result.rho
vmin_scaled = 1.1 + vmin
vmax_scaled = 1.1 + vmax
img = ax.imshow(data.T, norm=LogNorm(vmin=vmin_scaled, vmax=vmax_scaled), extent=extent,
2022-06-14 10:53:19 +02:00
origin="lower")
2022-06-10 11:04:54 +02:00
ax.set_title(result.title)
fig3.tight_layout()
fig3.subplots_adjust(right=0.825)
cbar_ax = fig3.add_axes([0.85, 0.15, 0.05, 0.7])
fig3.colorbar(img, cax=cbar_ax)
2022-06-14 10:53:19 +02:00
fig1.savefig(Path(f"~/tmp/auriga1_{8}.pdf").expanduser())
fig2.savefig(Path(f"~/tmp/auriga2_{8}.pdf").expanduser())
2022-06-10 11:04:54 +02:00
fig3.savefig(Path("~/tmp/auriga3.pdf").expanduser())
plt.show()
2022-06-14 16:38:50 +02:00
print(part_numbers)