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

83 lines
2.3 KiB
Python

import sys
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib.axes import Axes
from matplotlib.figure import Figure
from find_center import find_center
from readfiles import ParticlesMeta, read_file, read_halo_file
def V(r):
return 4 / 3 * np.pi * r ** 3
def halo_mass_profile(
particles: pd.DataFrame,
center: np.ndarray,
particles_meta: ParticlesMeta,
vmin: float,
vmax: float,
plot=False,
num_bins=30,
):
center = find_center(particles, center)
positions = particles[["X", "Y", "Z"]].to_numpy()
distances = np.linalg.norm(positions - center, axis=1)
group_radius = distances.max()
log_radial_bins = np.geomspace(vmin, vmax, num_bins)
bin_masses = []
bin_densities = []
for k in range(num_bins - 1):
bin_start = log_radial_bins[k]
bin_end = log_radial_bins[k + 1]
in_bin = np.where((bin_start < distances) & (distances < bin_end))[0]
count = in_bin.shape[0]
mass = count * particles_meta.particle_mass
volume = V(bin_end) - V(bin_start)
bin_masses.append(mass)
density = mass / volume
bin_densities.append(density)
bin_masses = np.array(bin_masses)
bin_densities = np.array(bin_densities)
bin_masses = np.cumsum(bin_masses)
if plot:
fig: Figure = plt.figure()
ax: Axes = fig.gca()
ax2 = ax.twinx()
ax.loglog(log_radial_bins[:-1], bin_masses, label="counts")
ax2.loglog(log_radial_bins[:-1], bin_densities, label="densities", c="C1")
# ax.set_xlabel(r'R / R$_\mathrm{group}$')
ax.set_ylabel(r"M [$10^{10} \mathrm{M}_\odot$]")
ax2.set_ylabel("density [$\\frac{10^{10} \\mathrm{M}_\\odot}{Mpc^3}$]")
plt.legend()
plt.show()
return log_radial_bins, bin_masses, bin_densities, center
if __name__ == "__main__":
input_file = Path(sys.argv[1])
df, particles_meta = read_file(input_file)
df_halos = read_halo_file(input_file.with_name("fof_" + input_file.name))
print(df)
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]
halo_mass_profile(particles_in_halo, halo, particles_meta, plot=True)