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 "globals.typ": *
#import "@preview/physica:0.9.5": *
== Validation <backup_validation> == 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") #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 = Implementation
== Simplified usage == 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 "globals.typ": *
#import "@preview/physica:0.9.5": *
#import "@preview/touying:0.6.1": *
= Simulating the Epoch of Reionization = 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. - Sets the stage for many observables: CMB secondary anisotropies, 21-cm signal, high-z galaxy surveys.
// reformulate // 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 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: 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") #image("assets/cmb_black_body_spectrum.svg", height: 1fr, fit: "contain")
] ]
#pagebreak()
#align(center)[ #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> $ <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 == 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 "globals.typ": *
#import "importer/main.typ": *
#import "@preview/physica:0.9.5": *
// Patch the ETH logo to actually be white:
#let logo = "assets/uzh-logo.svg" #let logo = "assets/uzh-logo.svg"
#let original = read(logo) #let original = read(logo)
#let changed = original.replace( #let changed = original.replace(
@@ -26,122 +24,109 @@
#let title-color = color.blue.darken(50%); #let title-color = color.blue.darken(50%);
#let bg-color = color.white; #let bg-color = color.white;
#let padded_logos = logos.map(logo => box(height: 1.5em, inset: (x:0.3cm), logo))
///// Front page ///// ///// Front page /////
#let notebook = json("../workdir/11_visualization/very_high_res_snapshot.ipynb") #let notebook = json("../workdir/11_visualization/very_high_res_snapshot.ipynb")
#let front_image = image_cell(notebook, cell_id: "very_high_res_slice") #let front_image = image_cell(notebook, cell_id: "very_high_res_slice")
#let (height, space) = layouts.at(layout_size) // #title-slide[
#let width = ratio * height
#set page( // #let space = 2cm
height: height, // #place[
width: width, // #front_image,
footer: none, // ]
header: none, // #place[
margin: 0cm // #box(
) // width: 100%,
// height: 100%,
// fill: color.black.transparentize(65%)
// )
// ]
#let space = 2cm // #block(
#place[ // inset: (x:0.5*space, y:1em),
#set image( // width: 100%,
width: 105%, // height: 60%,
) // align(bottom)[#text(2.0em, weight: "bold", fill: bg-color, title)],
#front_image, // above: 0cm,
] // below: 0cm,
#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,
)
#let padded_logos = logos.map(logo => box(height: 1.5em, inset: (x:0.3cm), logo))
#block( // #block(
height: 40%, // height: 40%,
width: 100%, // width: 100%,
fill: bg-color, // fill: bg-color,
inset: (x:0.5*space,top:1cm, bottom: 1em), // inset: (x:0.5*space,top:1cm, bottom: 1em),
above: 0cm, // above: 0cm,
below: 0cm, // below: 0cm,
if subtitle != none {[ // if subtitle != none {[
#text(1.4em, fill: title-color, weight: "bold", subtitle) // #text(1.4em, fill: title-color, weight: "bold", subtitle)
]} + // ]} +
if subtitle != none and date != none { text(1.4em)[ \ ] } + // if subtitle != none and date != none { text(1.4em)[ \ ] } +
if date != none {text(1.1em, date)} + // if date != none {text(1.1em, date)} +
align( // align(
bottom, // bottom,
stack( // stack(
dir: ltr, // dir: ltr,
authors.join(", ", last: " & "), // authors.join(", ", last: " & "),
h(1fr), // h(1fr),
..padded_logos, // ..padded_logos,
) // )
) // )
) // )
// ]
// #slide[
// // #set page(
// // footer: none,
// // header: none,
// // margin: 0cm
// // )
// ]
///// Main content ///// ///// Main content /////
#show: slides.with(
title: title,
subtitle: subtitle,
date: date,
authors: authors, #show: lineal-theme.with(
toc: false, aspect-ratio: "16-9",
layout: layout_size, // config-common(handout: true),
ratio: ratio, config-info(
title-color: title-color, title: [#title],
bg-color: bg-color, subtitle: [#subtitle],
footer-title: footer-title, author: [Author],
count: "number" date: datetime.today(),
institution: [ETH Zürich, University of Zürich],
// logo: brand.logo,
),
// footer-left: self => [..#padded_logos],
) )
#title-slide()
#show footnote.entry: set text(size: 0.6em)
#set footnote.entry(gap: 3pt)
#set align(horizon)
#set grid(
columns: 2,
gutter: 2em,
)
#include "introduction.typ" #include "introduction.typ"
#include "halo_model.typ"
#include "beorn.typ"
#include "refinements.typ" #include "refinements.typ"
#include "implementation.typ" #include "implementation.typ"
#include "results.typ" #include "results.typ"
#include "conclusion.typ"
= End
#set heading(numbering: none, outlined: false) == Thank you for your attention
= Thank you for your attention
#bibliography("references.bib") #bibliography("references.bib")
#show: appendix
// #context let last_page = counter(page).get()
// #let last_page = counter("page").get()
// #let last_page = 20
// freeze the page counter here
#include("backup.typ") #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 == 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 == Inferring growth from #smallcaps[Thesan] data
#lorem(50) #lorem(50)
@@ -13,3 +39,5 @@
#set image(width: 100%, fit: "contain") #set image(width: 100%, fit: "contain")
#image_cell(notebook, cell_id: "merger_tree_and_fitting") #image_cell(notebook, cell_id: "merger_tree_and_fitting")
] ]

View File

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