From a4a9f70edeec15cec1c25ad97a8d2dbd98bf9b20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=A1=D0=B5?= =?UTF-8?q?=D0=BD=D0=B4=D0=B7=D0=B8=D0=BA=D0=B0=D1=81?= Date: Sat, 20 Sep 2025 22:41:44 +0300 Subject: [PATCH] =?UTF-8?q?CF4=20=D0=92=D1=8B=D1=87=D0=B8=D1=81=D0=BB?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=20=D0=BE=D0=B6=D0=B8=D0=B4=D0=B0=D0=B5=D0=BC?= =?UTF-8?q?=D1=8B=D0=B5=20=D1=80=D0=B0=D1=81=D1=81=D1=82=D0=BE=D1=8F=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B8=D0=BB=D0=B8=20=D1=81=D0=BA=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20=D0=BD=D0=B0=20=D0=BE=D1=81=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=20=D1=81=D0=B3=D0=BB=D0=B0=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D1=81?= =?UTF-8?q?=D0=BA=D0=BE=D1=80=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20=D0=B8=D0=B7?= =?UTF-8?q?=20=D0=BB=D0=B8=D0=BD=D0=B5=D0=B9=D0=BD=D0=BE=D0=B9=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BB=D0=BE=D1=82=D0=BD=D0=BE=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/domain/cf4.py | 126 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 app/domain/cf4.py diff --git a/app/domain/cf4.py b/app/domain/cf4.py new file mode 100644 index 00000000..db9d3ffd --- /dev/null +++ b/app/domain/cf4.py @@ -0,0 +1,126 @@ +import astropy.units as u +from astropy.coordinates import SkyCoord +import numpy as np + +clight = 299792.458 # км/с + + +def to_grid_index(coord, delta=1000 / 128, N=128, L=1000): + """Преобразует координату в индекс сетки""" + coord = (coord + L / 2) + index = np.floor(coord / delta).astype(int) + index = np.clip(index, 0, N - 1) + return index + + +def get_data_from_skycoord_redshift(skycoord, redshift): + """ + Извлекает данные для координат SkyCoord и красного смещения + + Parameters: + ----------- + skycoord : SkyCoord + Объект координат Astropy + redshift : float + Красное смещение + + Returns: + -------- + tuple: (density, density_err, vxyz, vxyz_err, vr, vr_err) + """ + # Преобразуем красное смещение в расстояние (в Мпк) + distance_mpc = (redshift * clight) / 100 # H0 = 100 км/с/Мпк + + # Получаем супергалактические координаты + sgl = skycoord.supergalactic.sgl + sgb = skycoord.supergalactic.sgb + + # Вычисляем картезианские координаты в супергалактической системе + sgc = SkyCoord(sgl=sgl, sgb=sgb, distance=distance_mpc * u.Mpc, + frame='supergalactic') + + sgx = sgc.cartesian.x.value + sgy = sgc.cartesian.y.value + sgz = sgc.cartesian.z.value + + # Находим индексы в сетке + ix = to_grid_index(sgx) + iy = to_grid_index(sgy) + iz = to_grid_index(sgz) + + # Загружаем и возвращаем данные + return _load_grid_data(ix, iy, iz) + + +def get_data_from_skycoord_velocity(skycoord, velocity_km_s): + """ + Извлекает данные для координат SkyCoord и скорости + + Parameters: + ----------- + skycoord : SkyCoord + Объект координат Astropy + velocity_km_s : float + Скорость в км/с + + Returns: + -------- + tuple: (density, density_err, vxyz, vxyz_err, vr, vr_err) + """ + # Преобразуем скорость в расстояние (в Мпк) + distance_mpc = velocity_km_s / 100 # H0 = 100 км/с/Мпк + + # Получаем супергалактические координаты + sgl = skycoord.supergalactic.sgl + sgb = skycoord.supergalactic.sgb + + # Вычисляем картезианские координаты в супергалактической системе + sgc = SkyCoord(sgl=sgl, sgb=sgb, distance=distance_mpc * u.Mpc, + frame='supergalactic') + + sgx = sgc.cartesian.x.value + sgy = sgc.cartesian.y.value + sgz = sgc.cartesian.z.value + + # Находим индексы в сетке + ix = to_grid_index(sgx) + iy = to_grid_index(sgy) + iz = to_grid_index(sgz) + + # Загружаем и возвращаем данные + return _load_grid_data(ix, iy, iz) + + +def _load_grid_data(ix, iy, iz): + """Внутренняя функция для загрузки данных из сетки""" + data = np.load('CF4pp_mean_std_grids.npz') + + d_data = data['d_mean_CF4pp'] + derr_data = data['d_std_CF4pp'] + vxyz_data = data['v_mean_CF4pp'] + vxyz_err_data = data['v_std_CF4pp'] + vr_data = data['vr_mean_CF4pp'] + verr_data = data['vr_std_CF4pp'] + + return (d_data[ix, iy, iz], + derr_data[ix, iy, iz], + vxyz_data[:, ix, iy, iz], + vxyz_err_data[:, ix, iy, iz], + vr_data[ix, iy, iz], + verr_data[ix, iy, iz]) + + +# Примеры использования: +if __name__ == "__main__": + # Пример 1: Галактические координаты + красное смещение + gc = SkyCoord(l=120.5 * u.deg, b=45.2 * u.deg, frame='galactic') + redshift = 0.025 + result1 = get_data_from_skycoord_redshift(gc, redshift) + + # Пример 2: Экваториальные координаты + скорость + eq = SkyCoord(ra=185.3 * u.deg, dec=-12.7 * u.deg, frame='icrs') + velocity = 7500 # км/с + result2 = get_data_from_skycoord_velocity(eq, velocity) + + print("Результат для красного смещения:", result1[:2]) + print("Результат для скорости:", result2[:2]) \ No newline at end of file