Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gamma ray spectrum from packet dataframe #2601

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
56d8f44
Added decay of abundances with time
Knights-Templars Apr 24, 2024
ddb44a2
Adding dataframe to gammaraypacketsource
Knights-Templars May 3, 2024
28f4554
Added a rejection sampling into decay times
Knights-Templars May 6, 2024
64ab1f0
Changed gamma ray grid
Knights-Templars May 14, 2024
6fb737c
modified the input to gammaraypacketsource
Knights-Templars Jun 12, 2024
cc9fe35
Added dataframe for storing packet info
Knights-Templars Jun 13, 2024
88f7ea4
Merged
Knights-Templars Jun 13, 2024
b523946
Checked with black
Knights-Templars Jun 13, 2024
14ab57e
added tests for total decay energy
Knights-Templars Jun 18, 2024
0a3a178
removing accessing any variables in plasma
Knights-Templars Jun 20, 2024
2089567
done some formatiing and changed what will come out as output
Knights-Templars Jun 24, 2024
4b9dba4
Cleanup
Knights-Templars Jun 24, 2024
c56cddc
Resolved conflicts
Knights-Templars Jun 24, 2024
f24a2c9
Fixed black issues
Knights-Templars Jun 24, 2024
12a72f4
Changed sampling of time to uniform time
Knights-Templars Jun 28, 2024
2215b88
Uniform time sampling between adjacent time steps
Knights-Templars Jul 1, 2024
ef3cd6a
decay times from decaying dataframe
Knights-Templars Jul 2, 2024
4c027f5
corrected the total number of decays
Knights-Templars Jul 16, 2024
960f2b8
Added tests for cumulative decays
Knights-Templars Jul 17, 2024
6161f6a
Added test for time evolution of decays as the composition changes
Knights-Templars Jul 22, 2024
7b123f8
Ran black
Knights-Templars Jul 22, 2024
5fb9903
Merge branch 'tardis-sn:master' into gammaraypacketsourcedata
Knights-Templars Jul 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 20 additions & 53 deletions tardis/energy_input/gamma_packet_loop.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
import logging
import numpy as np
from numba import njit

from tardis.energy_input.gamma_ray_estimators import deposition_estimator_kasen
from tardis.transport.montecarlo import njit_dict_no_parallel
from tardis.opacities.opacities import (
compton_opacity_calculation,
photoabsorption_opacity_calculation,
pair_creation_opacity_calculation,
kappa_calculation,
pair_creation_opacity_artis,
SIGMA_T,
)
from tardis.energy_input.gamma_ray_grid import (
distance_trace,
move_packet,
Expand All @@ -27,7 +36,7 @@
pair_creation_opacity_calculation,
photoabsorption_opacity_calculation,
)
from tardis.transport.montecarlo import njit_dict_no_parallel
from tardis.energy_input.gamma_ray_estimators import deposition_estimator_kasen


@njit(**njit_dict_no_parallel)
Expand All @@ -38,16 +47,13 @@ def gamma_packet_loop(
pair_creation_opacity_type,
electron_number_density_time,
mass_density_time,
inv_volume_time,
iron_group_fraction_per_shell,
inner_velocities,
outer_velocities,
times,
dt_array,
effective_time_array,
energy_bins,
energy_df_rows,
energy_plot_df_rows,
energy_out,
packets_info_array,
):
Expand Down Expand Up @@ -103,22 +109,18 @@ def gamma_packet_loop(
escaped_packets = 0
scattered_packets = 0
packet_count = len(packets)
print("Entering gamma ray loop for " + str(packet_count) + " packets")

deposition_estimator = np.zeros_like(energy_df_rows)
print("Packet count:", packet_count)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this still needed? Could it be a logging command?


for i in range(packet_count):
packet = packets[i]
time_index = get_index(packet.time_current, times)

time_index = get_index(packet.time_current, effective_time_array)
if time_index < 0:
print(packet.time_current, time_index)
raise ValueError("Packet time index less than 0!")

scattered = False

initial_energy = packet.energy_cmf

while packet.status == GXPacketStatus.IN_PROCESS:
# Get delta-time value for this step
dt = dt_array[time_index]
Expand Down Expand Up @@ -203,9 +205,8 @@ def gamma_packet_loop(
outer_velocities,
total_opacity,
effective_time_array[time_index],
times[time_index + 1],
effective_time_array[time_index + 1],
)

distance = min(
distance_interaction, distance_boundary, distance_time
)
Expand All @@ -214,17 +215,6 @@ def gamma_packet_loop(

packet = move_packet(packet, distance)

deposition_estimator[packet.shell, time_index] += (
(initial_energy * 1000)
* distance
* (packet.energy_cmf / initial_energy)
* deposition_estimator_kasen(
comoving_energy,
mass_density_time[packet.shell, time_index],
iron_group_fraction_per_shell[packet.shell],
)
)

if distance == distance_time:
time_index += 1

Expand All @@ -246,27 +236,6 @@ def gamma_packet_loop(

packet, ejecta_energy_gained = process_packet_path(packet)

# Save packets to dataframe rows
# convert KeV to eV / s / cm^3
energy_df_rows[packet.shell, time_index] += (
ejecta_energy_gained * 1000
)

energy_plot_df_rows[i] = np.array(
[
i,
ejecta_energy_gained * 1000
# * inv_volume_time[packet.shell, time_index]
/ dt,
packet.get_location_r(),
packet.time_current,
packet.shell,
compton_opacity,
photoabsorption_opacity,
pair_creation_opacity,
]
)

if packet.status == GXPacketStatus.PHOTOABSORPTION:
# Packet destroyed, go to the next packet
break
Expand All @@ -279,14 +248,16 @@ def gamma_packet_loop(

if packet.shell > len(mass_density_time[:, 0]) - 1:
rest_energy = packet.nu_rf * H_CGS_KEV
lum_rf = (packet.energy_rf * 1.6022e-9) / dt
bin_index = get_index(rest_energy, energy_bins)
bin_width = (
energy_bins[bin_index + 1] - energy_bins[bin_index]
)
energy_out[bin_index, time_index] += rest_energy / (
bin_width * dt
freq_bin_width = bin_width / H_CGS_KEV
energy_out[bin_index, time_index] += (
packet.energy_rf / dt / freq_bin_width
)
luminosity = packet.energy_rf / dt

packet.status = GXPacketStatus.ESCAPED
escaped_packets += 1
if scattered:
Expand All @@ -303,7 +274,7 @@ def gamma_packet_loop(
packet.nu_cmf,
packet.nu_rf,
packet.energy_cmf,
lum_rf,
luminosity,
packet.energy_rf,
packet.shell,
]
Expand All @@ -313,11 +284,7 @@ def gamma_packet_loop(
print("Scattered packets:", scattered_packets)

return (
energy_df_rows,
energy_plot_df_rows,
energy_out,
deposition_estimator,
bin_width,
packets_info_array,
)

Expand Down
98 changes: 94 additions & 4 deletions tardis/energy_input/gamma_ray_channel.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import radioactivedecay as rd

from tardis.energy_input.util import KEV2ERG
from tardis.model.matter.decay import IsotopicMassFraction

logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
Expand Down Expand Up @@ -75,18 +76,18 @@ def calculate_total_decays(inventories, time_delta):
dictionary of inventories for each shell

time_end : float
End time of simulation in days.
End time of simulation step in days.


Returns
-------
cumulative_decay_df : pd.DataFrame
total decays for x g of isotope for time 't'
"""
time_delta = u.Quantity(time_delta, u.s)
time_delta = u.Quantity(time_delta, u.d)
total_decays = {}
for shell, inventory in inventories.items():
total_decays[shell] = inventory.cumulative_decays(time_delta.value)
total_decays[shell] = inventory.cumulative_decays(time_delta.value, "d")

flattened_dict = {}

Expand All @@ -109,7 +110,8 @@ def calculate_total_decays(inventories, time_delta):

def create_isotope_decay_df(cumulative_decay_df, gamma_ray_lines):
"""
Function to create a dataframe of isotopes for each shell with their decay mode, number of decays, radiation type,
Function to create a dataframe of isotopes for each shell with their decay mode,
number of decays, radiation type,
radiation energy and radiation intensity.

Parameters
Expand Down Expand Up @@ -167,3 +169,91 @@ def create_isotope_decay_df(cumulative_decay_df, gamma_ray_lines):
)

return isotope_decay_df


def time_evolve_mass_fraction(raw_isotope_mass_fraction, time_array):
"""
Function to evolve the mass fraction of isotopes with time.

Parameters
----------
raw_isotope_mass_fraction : pd.DataFrame
isotope mass fraction in mass fractions.
time_array : np.array
array of time in days.

Returns
-------
time_evolved_isotope_mass_fraction : pd.DataFrame
time evolved mass fraction of isotopes.
"""

initial_isotope_mass_fraction = raw_isotope_mass_fraction
isotope_mass_fraction_list = []

for time in time_array:

decayed_isotope_mass_fraction = IsotopicMassFraction(
initial_isotope_mass_fraction
).decay(time)
isotope_mass_fraction_list.append(decayed_isotope_mass_fraction)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Appending to arrays is bad for computer memory because you have to reallocate memory to change the size of the array. It's much better to initialize isotope_mass_fraction_list as an empty list with the appropriate size, something line len(time_array)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please address this comment @Knights-Templars

initial_isotope_mass_fraction = decayed_isotope_mass_fraction

time_evolved_isotope_mass_fraction = pd.concat(
isotope_mass_fraction_list, keys=time_array, names=["time"]
)

return time_evolved_isotope_mass_fraction


def time_evolve_cumulative_decay(
raw_isotope_mass_fraction, shell_masses, gamma_ray_lines, time_array
):
"""
Function to calculate the total decays for each isotope for each shell at each time step.

Parameters
----------
raw_isotope_mass_fraction : pd.DataFrame
isotope abundance in mass fractions.
shell_masses : numpy.ndarray
shell masses in units of g
gamma_ray_lines : pd.DataFrame
gamma ray lines from nndc stored as a pandas dataframe.
time_array : numpy.ndarray
array of time steps in days.

Returns
-------
time_evolve_decay_df : pd.DataFrame
dataframe of isotopes for each shell with their decay mode, number of decays, radiation type,
radiation energy and radiation intensity at each time step.

"""

isotope_decay_df_list = []
initial_isotope_mass_fraction = raw_isotope_mass_fraction

dt = np.diff(time_array)

for time in dt:

isotope_dict = create_isotope_dicts(
initial_isotope_mass_fraction, shell_masses
)
inventories = create_inventories_dict(isotope_dict)
total_decays = calculate_total_decays(inventories, time)
isotope_df_time = create_isotope_decay_df(total_decays, gamma_ray_lines)
isotope_decay_df_list.append(isotope_df_time)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See Josh's previous comment on appending


decayed_isotope_mass_fraction = IsotopicMassFraction(
initial_isotope_mass_fraction
).decay(time)

initial_isotope_mass_fraction = decayed_isotope_mass_fraction

time_evolved_decay_df = pd.concat(
isotope_decay_df_list, keys=time_array, names=["time"]
)

return time_evolved_decay_df
2 changes: 0 additions & 2 deletions tardis/energy_input/gamma_ray_grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,6 @@ def calculate_distance_radial(photon, r_inner, r_outer):
outer_2 = -1

distances = np.array([inner_1, inner_2, outer_1, outer_2])

# the correct distance is the shortest positive distance
distance_list = [i for i in distances if i > 0]

if not distance_list:
Expand Down
Loading
Loading