diff --git a/assets/image.png b/assets/image.png new file mode 100644 index 0000000..6f0e504 Binary files /dev/null and b/assets/image.png differ diff --git a/assets/lightcone.png b/assets/lightcone.png new file mode 100644 index 0000000..5a02e08 Binary files /dev/null and b/assets/lightcone.png differ diff --git a/assets/signals.png b/assets/signals.png new file mode 100644 index 0000000..7d2a5e1 Binary files /dev/null and b/assets/signals.png differ diff --git a/backup.typ b/backup.typ index 210b61f..dd95b62 100644 --- a/backup.typ +++ b/backup.typ @@ -1,6 +1,4 @@ -#import "importer/main.typ": * -#import "@preview/physica:0.9.5": * - +#import "globals.typ": * == Validation diff --git a/beorn.typ b/beorn.typ new file mode 100644 index 0000000..9a3cd92 --- /dev/null +++ b/beorn.typ @@ -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 diff --git a/conclusion.typ b/conclusion.typ new file mode 100644 index 0000000..d0931f0 --- /dev/null +++ b/conclusion.typ @@ -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 + diff --git a/globals.typ b/globals.typ new file mode 100644 index 0000000..e4dba05 --- /dev/null +++ b/globals.typ @@ -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") diff --git a/halo_model.typ b/halo_model.typ new file mode 100644 index 0000000..43d6c04 --- /dev/null +++ b/halo_model.typ @@ -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))) +$ + +#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() diff --git a/implementation.typ b/implementation.typ index 56a0a78..2217a20 100644 --- a/implementation.typ +++ b/implementation.typ @@ -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(, "Validated") diff --git a/introduction.typ b/introduction.typ index 09d42b9..8b6e12d 100644 --- a/introduction.typ +++ b/introduction.typ @@ -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))) $ -(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(, "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 +) diff --git a/main.pdf b/main.pdf index 6b57c07..205a9eb 100644 Binary files a/main.pdf and b/main.pdf differ diff --git a/main.typ b/main.typ index 8db68af..fa15dcf 100644 --- a/main.typ +++ b/main.typ @@ -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) diff --git a/refinements.typ b/refinements.typ index a91bd0f..e8581b8 100644 --- a/refinements.typ +++ b/refinements.typ @@ -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") ] + + diff --git a/results.typ b/results.typ index 6f3610f..4536838 100644 --- a/results.typ +++ b/results.typ @@ -1,6 +1,4 @@ -#import "importer/main.typ": * -#import "@preview/physica:0.9.5": * - +#import "globals.typ": * = Results == Map outputs