1
0
Fork 0
mirror of https://github.com/Findus23/rebound-collisions.git synced 2024-09-19 15:53:48 +02:00
rebound-collisions/graph.py

73 lines
2.3 KiB
Python
Raw Permalink Normal View History

2021-02-03 23:07:00 +01:00
from os import environ
2022-01-30 19:51:14 +01:00
import numpy as np
2020-03-31 15:39:59 +02:00
from graphviz import Digraph
2022-01-30 19:51:14 +01:00
from matplotlib.colors import to_hex
2020-03-31 15:39:59 +02:00
2021-01-04 12:25:13 +01:00
from extradata import ExtraData, CollisionMeta
2022-01-30 19:51:14 +01:00
from utils import filename_from_argv, get_water_cmap
2020-03-31 15:39:59 +02:00
2020-12-27 13:40:46 +01:00
fn = filename_from_argv()
2021-02-04 17:29:01 +01:00
ed = ExtraData.load(fn)
2020-03-31 15:39:59 +02:00
dot = Digraph(comment='Collisions')
2021-03-03 15:04:22 +01:00
2022-01-30 19:51:14 +01:00
# dot.engine = "neato"
2021-03-03 15:04:22 +01:00
if dot.engine == "neato":
dot.attr("graph", overlap="false")
2021-01-21 18:50:44 +01:00
interacting_objects = set()
2021-02-03 22:05:59 +01:00
for merged, originals in ed.tree.get_tree().items():
2020-12-27 13:40:46 +01:00
first_parent = True
2020-04-02 12:54:11 +02:00
for parent in originals["parents"]:
2021-01-04 12:25:13 +01:00
meta: CollisionMeta = originals["meta"]
water_ret = meta.water_retention
2021-03-08 18:18:14 +01:00
mantle_ret = meta.mantle_retention
core_ret = meta.core_retention
2020-12-27 13:40:46 +01:00
if first_parent:
2020-03-31 15:39:59 +02:00
2021-03-08 18:18:14 +01:00
label = f"{water_ret:.2f}/{mantle_ret:.2f}/{core_ret:.2f}"
2020-12-27 13:40:46 +01:00
first_parent = False
2022-01-30 19:51:14 +01:00
dot.node(label=label, name=f"{merged}-collision", shape="diamond")
dot.edge(f"{merged}-collision", str(merged))
2020-12-27 13:40:46 +01:00
else:
label = None
2022-01-30 19:51:14 +01:00
dot.edge(str(parent), f"{merged}-collision")
2021-01-21 18:50:44 +01:00
interacting_objects.add(parent)
interacting_objects.add(int(merged))
2022-01-30 19:51:14 +01:00
cmap = get_water_cmap()
2021-02-03 22:05:59 +01:00
for name in ed.pdata.keys():
2021-01-21 18:50:44 +01:00
object = ed.pdata[name]
if object.type == "sun":
2021-03-03 15:04:22 +01:00
displayname = f"{name} (Sun)"
2021-02-03 22:05:59 +01:00
elif object.type == "gas giant":
2021-03-03 15:04:22 +01:00
displayname = f"{name} (gas giant)"
2021-02-03 22:05:59 +01:00
else:
2021-03-03 15:04:22 +01:00
displayname = str(name)
2021-02-03 22:05:59 +01:00
try:
mass = object.total_mass
except KeyError:
mass = 0
2022-01-30 19:51:14 +01:00
with np.errstate(divide='ignore'): # allow 0 water (becomes -inf)
color_val = (np.log10(object.water_mass_fraction) + 5) / 5
color = cmap(color_val)
if color_val > 0.55:
textcolor = "white"
else:
textcolor = "black"
print(to_hex(color), color_val)
dot.node(name=str(name), label=f"m={mass:.1e}\nwmf={object.water_mass_fraction:.1e}",
shape='box' if object.type == "planetesimal" else "ellipse", style="filled", fillcolor=to_hex(color),
fontcolor=textcolor)
# if object.escaped:
# dot.edge(str(name), str("escaped"))
# if object.collided_with_sun:
# dot.edge(str(name), str("collided with sun"))
2020-12-27 13:40:46 +01:00
2021-02-03 23:07:00 +01:00
if environ.get("CI"):
dot.save(fn.with_suffix(".gv"))
else:
2021-03-03 15:04:22 +01:00
dot.render(fn.with_suffix(".gv"), view=True, format="svg")