mirror of
https://github.com/Findus23/halo_comparison.git
synced 2024-09-19 16:03:50 +02:00
184 lines
5.8 KiB
Python
184 lines
5.8 KiB
Python
from pathlib import Path
|
|
from sys import argv
|
|
|
|
import numpy as np
|
|
import pandas as pd
|
|
from matplotlib import pyplot as plt
|
|
from matplotlib.axes import Axes
|
|
from matplotlib.colors import LogNorm
|
|
from matplotlib.figure import Figure
|
|
|
|
# density like in Vr:
|
|
G = 43.022682 # in Mpc (km/s)^2 / (10^10 Msun)
|
|
|
|
|
|
def concentration(row, halo_type: str):
|
|
r_200crit = row[f'{halo_type}_R_200crit']
|
|
if r_200crit <= 0:
|
|
cnfw = -1
|
|
colour = 'orange'
|
|
return cnfw, colour
|
|
|
|
r_size = row[f'{halo_type}_R_size'] # largest difference from center of mass to any halo particle
|
|
m_200crit = row[f'{halo_type}_Mass_200crit']
|
|
vmax = row[f'{halo_type}_Vmax'] # largest velocity coming from enclosed mass profile calculation
|
|
rmax = row[f'{halo_type}_Rmax']
|
|
npart = row[f'{halo_type}_npart']
|
|
VmaxVvir2 = vmax ** 2 * r_200crit / (G * m_200crit)
|
|
if VmaxVvir2 <= 1.05:
|
|
if m_200crit == 0:
|
|
cnfw = r_size / rmax
|
|
colour = 'white'
|
|
else:
|
|
cnfw = r_200crit / rmax
|
|
colour = 'white'
|
|
else:
|
|
if npart >= 100: # only calculate cnfw for groups with more than 100 particles
|
|
cnfw = row[f'{halo_type}_cNFW']
|
|
colour = 'black'
|
|
else:
|
|
if m_200crit == 0:
|
|
cnfw = r_size / rmax
|
|
colour = 'white'
|
|
else:
|
|
cnfw = r_200crit / rmax
|
|
colour = 'white'
|
|
assert np.isclose(cnfw, row[f'{halo_type}_cNFW'])
|
|
|
|
|
|
return cnfw, colour
|
|
|
|
|
|
def plot_comparison_hist2d(file: Path, property: str, mode: str):
|
|
print("WARNING: Can only plot hist2d of properties with comp_ or ref_ right now!")
|
|
print(f" Selected property: {property}")
|
|
x_col = f"ref_{property}"
|
|
y_col = f"comp_{property}"
|
|
df = pd.read_csv(file)
|
|
if mode == 'concentration_analysis':
|
|
min_x = min([min(df[x_col]), min(df[y_col])])
|
|
max_x = max([max(df[x_col]), max(df[y_col])])
|
|
df = df.loc[2 * df.ref_cNFW < df.comp_cNFW]
|
|
else:
|
|
min_x = min([min(df[x_col]), min(df[y_col])])
|
|
max_x = max([max(df[x_col]), max(df[y_col])])
|
|
fig: Figure = plt.figure()
|
|
ax: Axes = fig.gca()
|
|
bins = np.geomspace(min_x, max_x, 100)
|
|
if mode == "concentration_bla" and property == 'cNFW':
|
|
colors = []
|
|
for i, row in df.iterrows():
|
|
comp_cnfw, comp_colour = concentration(row, halo_type="comp") # ref or comp
|
|
ref_cnfw, ref_colour = concentration(row, halo_type='ref')
|
|
if comp_colour == 'white' or ref_colour == 'white':
|
|
colors.append('white')
|
|
else:
|
|
colors.append('black')
|
|
ax.scatter(df[x_col], df[y_col], c=colors, s=1, alpha=.3)
|
|
else:
|
|
_, _, _, hist = ax.hist2d(df[x_col], df[y_col], bins=(bins, bins), norm=LogNorm())
|
|
fig.colorbar(hist)
|
|
|
|
# ax.set_xscale("log")
|
|
ax.set_xlabel(x_col)
|
|
ax.set_ylabel(y_col)
|
|
# ax.set_yscale("log")
|
|
|
|
ax.loglog([min_x, max_x], [min_x, max_x], linewidth=1, color="C2")
|
|
ax.set_title(file.name)
|
|
# fig.savefig(Path(f"~/tmp/comparison_{file.stem}.pdf").expanduser())
|
|
fig.suptitle
|
|
plt.show()
|
|
|
|
|
|
def plot_comparison_hist(file: Path, property: str, mode: str):
|
|
print("WARNING: Can only plot hist of properties w/o comp_ or ref_ right now!")
|
|
print(f" Selected property: {property}")
|
|
df = pd.read_csv(file)
|
|
if mode == 'concentration_analysis':
|
|
df = df.loc[2 * df.ref_cNFW < df.comp_cNFW]
|
|
fig2: Figure = plt.figure()
|
|
ax2: Axes = fig2.gca()
|
|
|
|
ax2.hist(df[property][df[property] < 50], bins=100)
|
|
ax2.set_xlabel(property)
|
|
ax2.set_title(file.name)
|
|
# fig2.savefig(Path(f"~/tmp/distances_{file.stem}.pdf").expanduser())
|
|
fig2.suptitle
|
|
plt.show()
|
|
|
|
|
|
file = Path(argv[1])
|
|
|
|
# properties = ['group_size', 'Mass_200crit', 'Mass_tot', 'Mvir', 'R_200crit', 'Rvir', 'Vmax', 'cNFW', 'q', 's'] #Mass_FOF and cNFW_200crit don't work, rest looks normal except for cNFW
|
|
properties = ['cNFW']
|
|
# mode = 'concentration_analysis'
|
|
mode = 'concentration_bla'
|
|
|
|
for property in properties:
|
|
plot_comparison_hist2d(file, property, mode)
|
|
|
|
# axis_ratios = ['q', 's'] #they look normal
|
|
|
|
# for property in axis_ratios:
|
|
# plot_comparison_hist2d(file, property, 'no')
|
|
# plot_comparison_hist2d(file, property, mode)
|
|
|
|
# plot_comparison_hist2d(file, 'cNFW_200mean', mode)
|
|
|
|
# ref_property = 'ref_cNFW_200crit'
|
|
# comp_property = 'comp_cNFW_200crit'
|
|
|
|
# df = pd.read_csv(file)
|
|
# all_ref_structure_types: pd.DataFrame = df[ref_property]
|
|
# all_comp_structure_types: pd.DataFrame = df[comp_property]
|
|
|
|
# df_odd: pd.DataFrame = df.loc[2 * df.ref_cNFW < df.comp_cNFW]
|
|
# odd_ref_structure_types: pd.DataFrame = df_odd[ref_property]
|
|
# odd_comp_structure_types: pd.DataFrame = df_odd[comp_property]
|
|
|
|
# print(all_ref_structure_types.mean(), all_comp_structure_types.mean())
|
|
# print(odd_ref_structure_types.mean(), odd_comp_structure_types.mean())
|
|
|
|
|
|
# ref_colour = []
|
|
# comp_colour = []
|
|
# ref_cnfw = []
|
|
# comp_cnfw = []
|
|
# df = pd.read_csv(file)
|
|
#
|
|
# for index, row in df.iterrows():
|
|
# cnfw, colour = concentration(row)
|
|
# ref_cnfw.append(cnfw[0])
|
|
# ref_colour.append(colour[0])
|
|
# comp_cnfw.append(cnfw[1])
|
|
# comp_colour.append(colour[1])
|
|
#
|
|
# fig: Figure = plt.figure()
|
|
# ax: Axes = fig.gca()
|
|
#
|
|
# ax.scatter(ref_cnfw, comp_cnfw, s=1, c=comp_colour, alpha=.3)
|
|
# ax.set_xscale("log")
|
|
# ax.set_yscale("log")
|
|
# plt.show()
|
|
|
|
# #Maybe for later:
|
|
# if __name__ == '__main__':
|
|
# print('Run with sizes.py <Path to file> <property: str> <mode: str>')
|
|
# file = Path(argv[1])
|
|
# property = str(argv[2])
|
|
# mode = str(argv[3])
|
|
|
|
|
|
# #This is to find the median of the quality of our matches
|
|
# matches:pd.DataFrame=df["match"]
|
|
# print(matches)
|
|
# exit()
|
|
# print(matches.median())
|
|
# print(matches.std())
|
|
# exit()
|
|
|
|
# #This is to save weird concentration data to own csv
|
|
# df_odd: pd.DataFrame = df.loc[2 * df.ref_cNFW < df.comp_cNFW]
|
|
# df_odd.to_csv("weird_cnfw.csv")
|
|
# exit()
|