starting to take shape

This commit is contained in:
2025-09-17 01:02:10 +02:00
parent 47fff2a7f8
commit 4302cfc914
14 changed files with 462 additions and 153 deletions

BIN
assets/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 755 KiB

BIN
assets/lightcone.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 768 KiB

BIN
assets/signals.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

View File

@@ -1,6 +1,4 @@
#import "importer/main.typ": *
#import "@preview/physica:0.9.5": *
#import "globals.typ": *
== Validation <backup_validation>

116
beorn.typ Normal file
View File

@@ -0,0 +1,116 @@
#import "globals.typ": *
= #beorn
== Procedure
#let notebook = json("../workdir/11_visualization/simplified_visualization_of_procedure.ipynb")
#grid(
columns: (auto, 5em, auto, 5em, auto),
rows: (60%, auto),
align: center,
row-gutter: 2em,
image_cell(notebook, cell_id: "step_profile_1d"),
[#pin(1)$==>$#pin(2)],
image_cell(notebook, cell_id: "step_kernel_3d"),
[#pin(3)$==>$#pin(4)],
image_cell(notebook, cell_id: "step_profile_3d"),
[
1-d profile
],
[],
[
3-d kernel
(localized)
],
[],
[
3-d contribution on a grid
],
)
#pause
#pinit-point-to(
(1, 2),
pin-dx: 20pt,
pin-dy: -20pt,
body-dx: -70pt,
body-dy: -80pt,
offset-dx: 20pt,
offset-dy: 30pt,
)[spherical symmetry]
#pause
#pinit-point-to(
(3, 4),
pin-dx: 20pt,
pin-dy: -20pt,
body-dx: -90pt,
body-dy: -80pt,
offset-dx: 20pt,
offset-dy: 30pt,
)[convolution (fft)]
#pagebreak()
#grid(
columns: (auto, 8em, auto),
rows: (38%, 1em, 38%),
align: center,
column-gutter: 2em,
row-gutter: 0.3em,
image_cell(notebook, cell_id: "step_profile_3d"),
grid.cell(
rowspan: 3,
image_cell(notebook, cell_id: "step_profile_3d_overlap"),
),
[],
// [],
// [],
[#h(3em) Multiple contributions $==>$],
[
$==>$ _Postprocessing_
(overlaps, normalization, ...)
],
// [],
// [],
image_cell(notebook, cell_id: "step_profile_3d_second"),
[],
// [],
// [],
)
#pagebreak()
== Postprocessing
- ionization overlaps
- corrections due to RSD
- computation of derived quantities
- summary statistics
== Maps
Through the redshifting of photons, the brightness temperature across redshift slices will be measured in a frequency band
$=>$ representation as a lightcone
#align(center)[
#image("assets/lightcone.png")
]
from @Schaeffer_2023
== Signal
#align(center)[
#image("assets/signals.png")
]
from @Schaeffer_2023

15
conclusion.typ Normal file
View File

@@ -0,0 +1,15 @@
#import "globals.typ": *
= Conclusion
== Summary
- We presented Beorn, a new code to simulate the 21cm signal from the EoR and Cosmic Dawn.
- Beorn is based on the halo model and uses a novel approach to compute the 21cm signal from 1D profiles around individual sources.
- Beorn is fast, flexible, and easy to use.
- We validated Beorn against numerical simulations and showed that it can reproduce their results with good accuracy.
- Beorn is publicly available and can be used for a variety of applications, including forecasting, parameter estimation, and data analysis.
== Upcoming improvements
- investigation + parameterization of stochasticity
- application to larger volumes
- fully parallel runs

12
globals.typ Normal file
View File

@@ -0,0 +1,12 @@
#import "importer/main.typ": *
#import "@preview/physica:0.9.5": *
#import "@preview/touying:0.6.1": *
#import "@preview/pinit:0.2.2": *
#import "lineal/lib.typ": *
#show math.equation: set align(center)
#show image: set align(center)
#let beorn = raw("BEoRN")

52
halo_model.typ Normal file
View File

@@ -0,0 +1,52 @@
#import "globals.typ": *
== The halo model of reionization
Following @Schneider_2021 @schneider2023cosmologicalforecast21cmpower:
#line(length: 100%, stroke: color.white.transparentize(100%))
#pause
$
rho_alpha (r bar M, z) = (1 + z)^2 / (4 pi r^2) dot sum_(n=2)^(n_m)f_n dot epsilon_alpha (nu prime) dot f_star dot dot(M)(z prime bar M, z)
$
#pause
$
3/2 dot derivative(rho_h (r bar M, z), z) = (3 rho_h (r bar M, z)) / (1 + z) - (rho_"xray" (r bar M, z)) /(k_B (1 + z) H(z))
$
#pause
$
derivative(V_b, t) = dot(N)_"ion"(t) / overline(n)_H^0 - alpha_B dot C / a^3 dot overline(n)_H^0 dot V_b
$
// $
// x_("HII")(r bar M, z) = theta_"H" lr([R_b (M, z) - r], size: #150%)
// $
#pagebreak()
== Revisiting the 21cm signal
$
d T_"b" (bold(x), z) tilde.eq T_0 (z) dot
#pin(1) x_"HI" (bold(x), z) #pin(2) dot
(1 + delta_b (bold(x), z)) dot
(x_alpha (bold(x), z)) / (#pin(3) 1 + x_alpha (bold(x), z) #pin(4) ) dot
((1 - T_"CMB" (z)) / (#pin(5) T_"gas" (bold(x), z) #pin(6)))
$ <eq:dTb>
#pause
// #pinit-highlight(1, 20)
#pinit-point-from((1, 2))[from $x_"HII"$]
#pause
#pinit-point-from((3, 4))[From $rho_alpha$]
#pause
#pinit-point-from((5, 6))[From $rho_"h"$]
#pagebreak()

View File

@@ -1,16 +1,30 @@
#import "importer/main.typ": *
#import "globals.typ": *
#let notebook = json("../workdir/11_visualization/simple_run_example.ipynb")
#show raw: it => {
show regex("pin\d"): it => pin(eval(it.text.slice(3)))
it
}
= Implementation
== Simplified usage
#text(
size: .7em,
)[
#show raw: it => {
show regex("pin\d"): it => pin(eval(it.text.slice(3)))
it
}
#code-block(
filename: "beorn.py",
language: "python",
code_cell(notebook, cell_id: "code_for_run"),
)
// #pinit-point-to(1)[Hello]
// #pinit-point-to(2)[Hello]
// #pinit-point-to(3)[Hello]
// #pinit-point-to(4)[Hello]
// #pinit-point-to(5)[Hello]
]
#code_cell(notebook, cell_id: "code_for_run")
#link(<backup_validation>, "Validated")

View File

@@ -1,6 +1,4 @@
#import "importer/main.typ": *
#import "@preview/physica:0.9.5": *
#import "@preview/touying:0.6.1": *
#import "globals.typ": *
= Simulating the Epoch of Reionization
@@ -14,67 +12,160 @@
- Sets the stage for many observables: CMB secondary anisotropies, 21-cm signal, high-z galaxy surveys.
// reformulate
== The 21cm signal
== The 21-cm signal
The brigthtness temperature describes the difference between the CMB temperature and the spin temperature of neutral hydrogen
#grid[
#image("assets/cmb_black_body_spectrum.svg", height: 1fr, fit: "contain") @cmb_spectrum
#v(1em)
#grid(columns: 2, align: center)[
#image("assets/cmb_black_body_spectrum.svg", height: 1fr, fit: "contain") #text(size: 0.8em)[from @cmb_spectrum]
][
#pause
Removing the contribution from the black body spectrum of the CMB yields the explicit 21-cm signal:
#image("assets/cmb_black_body_spectrum.svg", height: 1fr, fit: "contain")
]
#pagebreak()
#align(center)[
#image("assets/evolution_of_dtb.png", fit: "contain")
#image("assets/evolution_of_dtb.png", height: 85%, fit: "contain")
#text(size: 0.8em)[from @Pritchard2012]
]
@Pritchard2012
#pagebreak()
== Expression the 21-cm signal
Expressing the _differential brightness temperature_ (e.g @Pritchard2012):
$
d T_"b" (bold(x), z) tilde.eq T_0 (z) dot x_"HI" (bold(x), z) dot (1 + delta_b (bold(x), z)) dot (x_alpha (bold(x), z)) / (1 + x_alpha (bold(x), z) ) dot ((1 - T_"CMB" (z)) / (T_"gas" (bold(x), z)))
d T_"b" (bold(x), z) tilde.eq T_0 (z) dot
#pin(1) x_"HI" (bold(x), z) #pin(2) dot
(1 + delta_b (bold(x), z)) dot
(x_alpha (bold(x), z)) / (#pin(3) 1 + x_alpha (bold(x), z) #pin(4) ) dot
((1 - T_"CMB" (z)) / (#pin(5) T_"gas" (bold(x), z) #pin(6)))
$ <eq:dTb>
(e.g @Pritchard2012)
== The halo model of reionization
Following @Schneider_2021 @schneider2023cosmologicalforecast21cmpower:
$
rho_alpha (r bar M, z) = (1 + z)^2 / (4 pi r^2) dot sum_(n=2)^(n_m)f_n dot epsilon_alpha (nu prime) dot f_star dot dot(M)(z prime bar M, z)
$
#line(
length: 100%
)
$
3/2 dot derivative(rho_h (r bar M, z), z) = (3 rho_h (r bar M, z)) / (1 + z) - (rho_"xray" (r bar M, z)) /(k_B (1 + z) H(z))
$
#line(
length: 100%
)
$
x_("HII")(r bar M, z) = theta_"H" lr([R_b (M, z) - r], size: #150%)
$
// Explanation
- further modulation by _RSD_
== The current state of simulations
#lorem(20)
- slow and big
- radiative transfer // what are the downsides
$==>$ semi-numerical approaches such as `BEoRN` @Schaeffer_2023
#layouts.contained(
[
*Traditional approaches*
// keypoints that describe heavy hydro + radiative transfer simulations
- require hydrodynamics
- require radiative transfer
- scale poorly
$=>$ no reproducibility
#pause
],
[
#text(weight: "bold")[semi-numerical approaches]
such as #beorn @Schaeffer_2023, `21cmFAST` [CITATION]
- approximative treatment
- link
- scalable + efficient
$=>$ reproducible and flexible
]
)
#link(<backup_validation>, "validation")
// #layouts.two-boxes(
// [
// #text(weight: "bold")[Traditional approaches]
== `BEoRN`
// // keypoints that describe heavy hydro + radiative transfer simulations
// - require hydrodynamics
// - require radiative transfer
// - scale poorly
// $=>$ no reproducibility
// #pause
// ],
// [
// *semi-numerical approaches*
// such as #beorn @Schaeffer_2023, `21cmFAST` [CITATION]
// - approximative treatment
// - link
// - scalable + efficient
// $=>$ reproducible and flexible
// ]
// )
#pagebreak()
== Matrix
#layouts.matrix((
brand.wordmark,
brand.wordmark,
brand.wordmark,
brand.wordmark,
brand.wordmark,
brand.wordmark
))
== Contained
#layouts.contained(
columns(2, [
- #lorem(10)
- #lorem(15)
- #lorem(25)
]),
brand.wordmark
)
== Four columns
#layouts.four-columns(
[
#text(weight: "bold", brand.wordmark)
#v(1em)
#text(size: 10.5pt)[#lorem(60)]
],
[
#text(weight: "bold", brand.wordmark)
#v(1em)
#text(size: 10.5pt)[#lorem(45)]
],
[
#text(weight: "bold", brand.wordmark)
#v(1em)
#text(size: 10.5pt)[#lorem(75)]
],
[
#text(weight: "bold", brand.wordmark)
#v(1em)
#text(size: 10.5pt)[#lorem(50)]
]
)
== Two columns
#layouts.contained(
columns(2, [
- #lorem(10)
- #lorem(15)
- #lorem(25)
]),
brand.wordmark
)

BIN
main.pdf

Binary file not shown.

171
main.typ
View File

@@ -1,8 +1,6 @@
#import "@preview/diatypst:0.7.0": *
#import "importer/main.typ": *
#import "@preview/physica:0.9.5": *
#import "globals.typ": *
// Patch the ETH logo to actually be white:
#let logo = "assets/uzh-logo.svg"
#let original = read(logo)
#let changed = original.replace(
@@ -26,122 +24,109 @@
#let title-color = color.blue.darken(50%);
#let bg-color = color.white;
#let padded_logos = logos.map(logo => box(height: 1.5em, inset: (x:0.3cm), logo))
///// Front page /////
#let notebook = json("../workdir/11_visualization/very_high_res_snapshot.ipynb")
#let front_image = image_cell(notebook, cell_id: "very_high_res_slice")
#let (height, space) = layouts.at(layout_size)
#let width = ratio * height
// #title-slide[
#set page(
height: height,
width: width,
footer: none,
header: none,
margin: 0cm
)
// #let space = 2cm
// #place[
// #front_image,
// ]
// #place[
// #box(
// width: 100%,
// height: 100%,
// fill: color.black.transparentize(65%)
// )
// ]
#let space = 2cm
#place[
#set image(
width: 105%,
)
#front_image,
]
#place[
#box(
width: 100%,
height: 100%,
fill: color.black.transparentize(65%)
)
]
#block(
inset: (x:0.5*space, y:1em),
width: 100%,
height: 60%,
align(bottom)[#text(2.0em, weight: "bold", fill: bg-color, title)],
above: 0cm,
below: 0cm,
)
// #block(
// inset: (x:0.5*space, y:1em),
// width: 100%,
// height: 60%,
// align(bottom)[#text(2.0em, weight: "bold", fill: bg-color, title)],
// above: 0cm,
// below: 0cm,
// )
#let padded_logos = logos.map(logo => box(height: 1.5em, inset: (x:0.3cm), logo))
#block(
height: 40%,
width: 100%,
fill: bg-color,
inset: (x:0.5*space,top:1cm, bottom: 1em),
above: 0cm,
below: 0cm,
if subtitle != none {[
#text(1.4em, fill: title-color, weight: "bold", subtitle)
]} +
if subtitle != none and date != none { text(1.4em)[ \ ] } +
if date != none {text(1.1em, date)} +
align(
bottom,
stack(
dir: ltr,
authors.join(", ", last: " & "),
h(1fr),
..padded_logos,
)
)
)
// #block(
// height: 40%,
// width: 100%,
// fill: bg-color,
// inset: (x:0.5*space,top:1cm, bottom: 1em),
// above: 0cm,
// below: 0cm,
// if subtitle != none {[
// #text(1.4em, fill: title-color, weight: "bold", subtitle)
// ]} +
// if subtitle != none and date != none { text(1.4em)[ \ ] } +
// if date != none {text(1.1em, date)} +
// align(
// bottom,
// stack(
// dir: ltr,
// authors.join(", ", last: " & "),
// h(1fr),
// ..padded_logos,
// )
// )
// )
// ]
// #slide[
// // #set page(
// // footer: none,
// // header: none,
// // margin: 0cm
// // )
// ]
///// Main content /////
#show: slides.with(
title: title,
subtitle: subtitle,
date: date,
authors: authors,
toc: false,
layout: layout_size,
ratio: ratio,
title-color: title-color,
bg-color: bg-color,
footer-title: footer-title,
count: "number"
#show: lineal-theme.with(
aspect-ratio: "16-9",
// config-common(handout: true),
config-info(
title: [#title],
subtitle: [#subtitle],
author: [Author],
date: datetime.today(),
institution: [ETH Zürich, University of Zürich],
// logo: brand.logo,
),
// footer-left: self => [..#padded_logos],
)
#show footnote.entry: set text(size: 0.6em)
#set footnote.entry(gap: 3pt)
#set align(horizon)
#set grid(
columns: 2,
gutter: 2em,
)
#title-slide()
#include "introduction.typ"
#include "halo_model.typ"
#include "beorn.typ"
#include "refinements.typ"
#include "implementation.typ"
#include "results.typ"
#include "conclusion.typ"
#set heading(numbering: none, outlined: false)
= Thank you for your attention
= End
== Thank you for your attention
#bibliography("references.bib")
// #context let last_page = counter(page).get()
// #let last_page = counter("page").get()
// #let last_page = 20
// freeze the page counter here
#show: appendix
#include("backup.typ")
// #counter(page).update(last_page)

View File

@@ -1,10 +1,36 @@
#import "importer/main.typ": *
#import "globals.typ": *
= Halo mass history
= Halo growth
== Motivation
#layouts.contained(
[
Crucial dependence on the *star formation rate*
- assumed to be directly linked to halo growth rate $dot(M)$:
$
dot(M)_star = f_star (M_"h") dot dot(M_"h")
$
- growth according to the exponential model:
$
M_"h" (z) = M_"h" (z_0) dot exp[-alpha (z - z_0)]
$
with $alpha = dot(M_"h")/M_"h"$ the _specific growth rate_
#pause
],
[
...
]
)
== Effect on the flux profiles
#lorem(50)
#let notebook = json("../workdir/11_visualization/alpha_dependence_of_profiles.ipynb")
#image_cell(notebook, cell_id: "profile_plot_alpha_dependence")
== Inferring growth from #smallcaps[Thesan] data
#lorem(50)
@@ -13,3 +39,5 @@
#set image(width: 100%, fit: "contain")
#image_cell(notebook, cell_id: "merger_tree_and_fitting")
]

View File

@@ -1,6 +1,4 @@
#import "importer/main.typ": *
#import "@preview/physica:0.9.5": *
#import "globals.typ": *
= Results
== Map outputs