Source code for beorn.structs.lightcone

"""Wrapper class for building lightcones using tools21cm"""
import numpy as np
import tools21cm as t2c
from dataclasses import dataclass
from .parameters import Parameters
from .temporal_cube import TemporalCube

[docs] @dataclass class Lightcone: """Class to handle lightcone data generated from a series of simulation snapshots.""" data: np.ndarray """The lightcone data array containing the desired quantity (e.g., brightness temperature) with spatial and redshift dimensions.""" redshifts: np.ndarray """Array of redshifts corresponding to the slices in the lightcone data.""" parameters: Parameters """The parameters of the simulation.""" quantity: str """The quantity represented in the lightcone (e.g., 'dTb' for brightness temperature).""" @classmethod def build(cls, parameters: Parameters, grid: TemporalCube, quantity='dTb') -> "Lightcone": # prepare the data to a format readable by tools21cm try: grid_data = getattr(grid, quantity) except KeyError: raise ValueError(f"Quantity '{quantity}' not found in grid data.") # data_dict = {grid.z[i]: grid_data[i, ...] for i in range(len(grid.z))} def reading_function(i): gd = grid_data[i, ...] # cleanup nans TODO - remove gd[np.isnan(gd)] = 0.0 return gd scale_factors = 1 / (grid.z[:] + 1) lightcone_data, lightcone_redshifts = t2c.make_lightcone( filenames = range(grid.z.size), # file_redshifts = grid.z[:], file_redshifts = scale_factors, reading_function = reading_function, los_axis = 2, raw_density = False, box_length_mpc = parameters.simulation.Lbox, ) # assert lightcone_redshifts == grid.z, "Redshifts in lightcone do not match grid redshifts." return Lightcone( parameters = parameters, data = lightcone_data, redshifts = lightcone_redshifts, quantity = quantity, )