diff --git a/src/tutorials/units.jl b/src/tutorials/units.jl index ff0b23c..906cbf0 100644 --- a/src/tutorials/units.jl +++ b/src/tutorials/units.jl @@ -15,121 +15,171 @@ using InteractiveUtils # ╔═╡ fd88a6c1-0abe-4a5a-9414-bb15730c9d18 begin - using DynamicQuantities: @u_str, @us_str, dimension, uconvert, ustrip - using DynamicQuantities.Constants: G, pc, h, k_B, c as c_0 + using Pkg: Pkg + + # TODO: Can remove when https://github.com/MakieOrg/Makie.jl/pull/5623 + # is upstreamed + + # Data viz + Pkg.add([ + Pkg.PackageSpec(; + url = "https://github.com/icweaver/Makie.jl", + subdir = "Makie", + rev = "units-matrix", + ), + Pkg.PackageSpec(; + url = "https://github.com/MakieOrg/Makie.jl", + subdir = "CairoMakie", + rev = "ff/breaking-0.25", + ), + Pkg.PackageSpec(; + url = "https://github.com/MakieOrg/Makie.jl", + subdir = "ComputePipeline", + rev = "ff/breaking-0.25", + ), + ]) + + Pkg.add(["StatsBase", "Distributions", "Random", "DynamicQuantities", "Unitful", "PhysicalConstants", "UnitfulEquivalences", "UnitfulAstro", "DimensionfulAngles", "PlutoUI", "HypertextLiteral"]) + + # Statistical analysis using StatsBase: mean using Distributions: Normal + using Random: Xoshiro + + # Units - DynamicQuantities + using DynamicQuantities: DynamicQuantities as DQ + using DynamicQuantities: SymbolicConstants as C_DQ + + # Units - Unitful + using Unitful: Unitful as U + using PhysicalConstants: CODATA2018 as C_U + using UnitfulEquivalences: UnitfulEquivalences as UE + import UnitfulAstro + import DimensionfulAngles + + # Data Viz using CairoMakie: Colorbar, stephist, heatmap - using Makie: DQConversion - using DimensionalData: DimArray, val, dims + using Makie: Makie as M + + # Notebook setup + using PlutoUI: TableOfContents, details + using HypertextLiteral: @htl end -# ╔═╡ 17c6b7df-a8b3-45d1-9491-526afce11318 -using PlutoUI: TableOfContents, details - # ╔═╡ c6ad0267-65d1-4372-a538-22acd9b5d02b md""" # Using units in astrophysical calculations -This notebook is modified from +This notebook is modified from . + +_Original authors: Ana Bonaca, Erik Tollerud, Jonathan Foster, Lia Corrales, Kris Stern, Stephanie T. Douglas_ !!! tip "Learning Goals" - - Use `Quantity` objects to estimate a hypothetical galaxy's mass - - Take advantage of constants in the DynamicalQuantities.jl package + - Estimate a hypothetical galaxy's mass with units + - Take advantage of constants in the various units packages - Print formatted unit strings - - Plot `Quantity` objects with unit labels, using Makie.jl - - Do math with `Quantity` objects + - Plot objects with unit labels, using Makie.jl + - Do math with units - Convert quantities - Convert between wavelength and energy - - Write functions that take `Quantity` objects instead of plain arrays + - Write functions that take objects with units instead of plain arrays - Make synthetic radio observations - - Use `Quantity` objects such as data cubes to facilitate a full derivation of the total mass of a molecular cloud + - Use objects with units such as data cubes to facilitate a full derivation of the total mass of a molecular cloud !!! note "Keywords" `units` `plots` `radio astronomy` `data cubes` !!! warning "Summary" - In this tutorial we present some examples showing how `Quantity` objects can make astrophysics calculations easier. The examples include calculating the mass of a galaxy from its velocity dispersion and determining masses of molecular clouds from ``\mathrm{CO}`` intensity maps. We end with an example of good practices for using quantities in functions you might distribute to other people. -""" + In this tutorial we present some examples showing how objects with units can make astrophysics calculations easier. The examples include calculating the mass of a galaxy from its velocity dispersion and determining masses of molecular clouds from ``\mathrm{CO}`` intensity maps. We end with an example of good practices for using quantities in functions you might distribute to other people. -# ╔═╡ 05b485e7-115a-4dbb-aa73-0ca6ace2f5c0 -md""" -## Imports + This notebook will cover the main usage for the two most common packages for units in Julia: [DynamicQuantities.jl](https://juliaphysics.github.io/DynamicQuantities.jl/stable/) and [Unitful.jl](https://juliaphysics.github.io/Unitful.jl/stable/). Each package has their own trade-offs, which can be read [about here](https://discourse.julialang.org/t/ann-dynamicquantities-jl-type-stable-physical-quantities/99963). For convenience, the usage for each package will be shown side-by-side in this notebook (if your screen is wide enough), with variables and functions using each appended with `_DQ` and `_U`, respectively. Similarly, functions from each package will be qualified with `DQ` or `U`, respectively. """ -# ╔═╡ 60c89d86-942e-4c97-bd7a-ad2f792b1155 -md""" -## 1. Galaxy mass +# ╔═╡ 1d2293bd-a236-4b41-a9d7-9c27463b5062 +Reff_DQ = 29 * DQ.us"Constants.pc" -In this first example, we will use Quantity objects to estimate a hypothetical galaxy's mass, given its half-light radius and radial velocities of stars in the galaxy. +# ╔═╡ 426c37ea-83dd-4ef4-8a19-f0e16536c034 +Reff_U = 29 * U.u"pc" -Let's assume that we measured the half-light radius of the galaxy to be 29 pc projected on the sky at the distance of the galaxy. This radius is often called the "effective radius", so we'll store it as a `Quantity` object with the name `Reff`. The easiest way to create a `Quantity` object is by multiplying the value with its unit: -""" +# ╔═╡ 1b239188-bba1-44d1-bc9c-10b60f762e0d +DQ.ustrip(DQ.u"Constants.pc", Reff_DQ), DQ.dimension(Reff_DQ) -# ╔═╡ 1d2293bd-a236-4b41-a9d7-9c27463b5062 -Reff = 29 * u"Constants.pc" # Or 29 * pc +# ╔═╡ f2c441b3-374b-439d-ba8c-4b28c0765d45 +U.ustrip(U.u"pc", Reff_U), U.unit(Reff_U) -# ╔═╡ 9b6e871f-0a49-4a24-a9b0-51e3008d6db4 -ustrip(Reff) +# ╔═╡ 7ba07e6b-34e0-4206-9cf7-5006c43635a6 +DQ.uconvert(DQ.us"km", Reff_DQ) -# ╔═╡ 1b239188-bba1-44d1-bc9c-10b60f762e0d -ustrip(pc, Reff) +# ╔═╡ d6e4fd70-8750-457f-a17f-9a044c25c482 +U.uconvert(U.u"m", Reff_U) -# ╔═╡ cecd879b-2d95-4150-8caf-c327165ddec6 -dimension(Reff) +# ╔═╡ 2c7a71f6-e618-40db-80b7-1ad5f09e59d5 +Reff_DQ |> DQ.us"km" -# ╔═╡ cc736aec-c48a-411a-af83-4255309d77e9 +# ╔═╡ 2a11aed4-6516-40dc-94fd-30aa94e76744 +Reff_U |> U.u"km" + +# ╔═╡ 984fcb2e-049b-4b35-a4b6-5c8c686921a3 md""" -Furthermore, we can convert the radius to any other unit of length. Here, we convert it to kilometers: +!!! note "Symbolic units" + Note the use of `us""` for DynamicQuantities.jl, which is required for working with [symbolic units](https://juliaphysics.github.io/DynamicQuantities.jl/stable/symbolic_units/). Will will leverage this later in the notebook to make working with angles more convenient. """ -# ╔═╡ 2c7a71f6-e618-40db-80b7-1ad5f09e59d5 -Reff |> us"km" # Or uconvert(us"km", Reff) - # ╔═╡ c5b4f340-c774-4f09-af4c-f326afce5de3 md""" -Synth. dataset of rad vels +Next, we'll first create a synthetic dataset of radial velocity measurements, assuming a normal distribution with a mean velocity of 206 km/s and a velocity dispersion of 4.3 km/s: """ +# ╔═╡ 2da8169e-a39d-4314-87c0-60b57f80ae96 +v̄, σ_in = 206, 4.3 + # ╔═╡ 892f19a6-af21-4353-9987-9de795ba7ad7 -v = rand(Normal(206, 4.3), 500)u"km/s" +v_DQ = rand(Xoshiro(0), Normal(v̄, σ_in), 500) * DQ.us"km/s" + +# ╔═╡ 64774c2c-0991-48b2-af4a-ced8fedd115b +v_U = rand(Xoshiro(0), Normal(v̄, σ_in), 500) * U.u"km/s" -# ╔═╡ 808f338d-7faa-4d97-ad7b-a7b4066c83f8 -first(v, 10) .|> us"km/s" +# ╔═╡ 9f14f051-d1e9-4638-8008-840a886b50ab +stephist(v_DQ) -# ╔═╡ 59af301c-0713-4c93-a824-7375f8c4f761 -stephist(v |> us"km/s") +# ╔═╡ 0cd8f84d-a6aa-46c7-9e13-535e8e0cea1f +stephist(v_U) # ╔═╡ 2d236d32-faf4-41ef-84de-1d40c02fb238 -sigma = (sqrt ∘ sum)((v .- mean(v)).^2 / length(v)) +σ_DQ = √(sum((v_DQ .- mean(v_DQ)).^2) / length(v_DQ)) -# ╔═╡ 64bfb535-ab84-411c-9a1b-3ed8778e8516 -sigma |> us"km/s" +# ╔═╡ b388f8be-3074-443c-97a9-72eb7098b5e3 +σ_U = √(sum((v_U .- mean(v_U)).^2) / length(v_U)) # ╔═╡ a3baf049-5419-4773-8b7f-0ba07a9f1728 -M = 4 * sigma^2 * Reff / G +M_DQ = 4 * σ_DQ^2 * Reff_DQ / C_DQ.G + +# ╔═╡ efa15492-4811-4896-8947-b90191651952 +M_U = 4 * σ_U^2 * Reff_U / C_U.G # ╔═╡ bb2622f9-98a5-48ca-92cb-bbce84d797f1 -M .|> (us"Constants.M_sun", us"g") +M_DQ .|> (DQ.us"Constants.M_sun", DQ.us"g") + +# ╔═╡ 14909ad6-eb42-48ab-afa7-8b40b700fe3b +M_U .|> (U.u"Msun", U.u"g") # ╔═╡ 9e13bde0-eccf-4d21-b603-fd186e87b7d0 -(log10 ∘ ustrip)(us"Constants.M_sun", M) +(log10 ∘ DQ.ustrip)(DQ.u"Constants.M_sun", M_DQ) -# ╔═╡ 5a9dfdf7-aaf8-421d-a451-6a6a5c35e1cc -md""" -Note that this is different than: -""" +# ╔═╡ 77a81c41-0034-4a18-bb70-d2a1f9379593 +(log10 ∘ U.ustrip)(U.u"Msun", M_U) # ╔═╡ a13de611-145a-40da-9414-8f3f8f85ad98 -(log10 ∘ ustrip)(M) +(log10 ∘ DQ.ustrip)(M_DQ) -# ╔═╡ a3f42e7e-af38-46b0-b1fb-bdbf77312e16 -md""" -emphasizing the importance of being explicit with our units. Similarly, taking the logarithm of something with units is not mathematically well defined, so this will sensibly error as well: -""" +# ╔═╡ 1e24cdfa-f4a9-4f9e-b95d-af83e724cd90 +(log10 ∘ U.ustrip)(M_U) # ╔═╡ 095e7efe-f4c6-4a8a-a029-03ce97cd15bd -log10(M) +log10(M_DQ) + +# ╔═╡ e4a98c65-70de-42fc-b490-f019dd93d3fb +log10(M_U) # ╔═╡ 2648b454-2762-4941-b13c-2303ffcd6521 let @@ -155,14 +205,12 @@ let md""" !!! warn "Exercise" - Use DynamicQuantities.jl and Kepler's law in the form given below to determine the (circular) orbital speed of the Earth around the Sun in km/s: + Use Kepler's law in the form given below to determine the (circular) orbital speed of the Earth around the Sun in km/s: ```math v = \sqrt{\frac{G M_⊙}{r}} ``` - No need to look up constants or conversion factors to do this calculation -- it's all in `DynamicQuantities.Units` and `DynamicQuantities.Constants`. - There's a much easier way to figure out the velocity of the Earth using just two units or quantities. Do that and then compare to the Kepler's law answer (the easiest way is probably to compute the percentage difference, if any). $(sol) @@ -181,62 +229,74 @@ md""" In this second example, we will demonstrate how using units can facilitate a full derivation of the total mass of a molecular cloud using radio observations of isotopes of Carbon Monoxide (CO). """ -# ╔═╡ 78740b86-45e9-45f5-b4c2-be6cb65f1368 -md""" -### Setting up the data cube - -Let's assume that we've mapped the inner part of a molecular cloud in the ``J = 1 - 0`` rotational transition of ``\mathrm{C}^{18}\mathrm{O}`` and are interested in measuring its total mass. The measurement produced a data cube with RA and Dec as spatial coordiates and velocity as the third axis. Each voxel in this data cube represents the brightness temperature of the emission at that position and velocity. Furthermore, we'll assume that we have an independent measurement of distance to the cloud ``d = 250\, \mathrm{pc}`` and that the excitation temperature is known and constant throughout the cloud: ``T_\text{ex} = 25\, \mathrm{K}``: -""" - # ╔═╡ 2c76c406-d15c-4271-baa4-ebebf5299429 -d = 250u"Constants.pc" +d_DQ, T_ex_DQ = 250 * DQ.us"Constants.pc", 25 * DQ.u"K" -# ╔═╡ cb5b1020-b1f8-4ea1-ad03-a91b5c3ab0c2 -T_ex = 25u"K" - -# ╔═╡ b86a31df-9de1-4e27-8ca7-ce7f3d2576fa -md""" -We'll generate a synthetic dataset, assuming the cloud follows a Gaussian distribution in each of RA, Dec, and velocity. We start by creating a 100×100×300 array, such that the first coordinate is right ascension, the second is declination, and the third is velocity. In this data cube, the cloud is positioned at the center, with ``\sigma`` and the center in each dimension shown below. Note in particular that the ``\sigma`` for RA and Dec have different units from the center, but DynamicQuantities.jl automatically does the relevant conversions before computing the exponential. -""" - -# ╔═╡ 9a002059-650b-4dc1-9395-6f266ed35500 -md""" -!!! todo - Explain. What does this part mean? - - > Note in particular that the ``\sigma`` for RA and Dec have different units from the center, but DynamicQuantities.jl automatically does the relevant conversions before computing the exponential. -""" +# ╔═╡ be30f3c4-0c20-4949-bcc8-f3812b39befc +d_U, T_ex_U = 250 * U.u"pc", 25 * U.u"K" # ╔═╡ aab4113d-d7ad-4521-a208-e192ad218cf0 begin # 1D coordinate quantities - ras = range(52, 52.5; length = 100)u"deg" - decs = range(0, 0.5; length = 100)u"deg" - vs = range(0, 30; length = 300)u"km/s" + ras_DQ = range(52, 52.5; length = 100) * DQ.us"deg" + decs_DQ = range(0, 0.5; length = 100) * DQ.us"deg" + vs_DQ = range(0, 30; length = 300) * DQ.us"km/s" +end; + +# ╔═╡ af22e5da-ff9b-4278-95d9-491f84a55add +begin + # 1D coordinate quantities + ras_U = range(52, 52.5; length = 100) * U.u"deg" + decs_U = range(0, 0.5; length = 100) * U.u"deg" + vs_U = range(0, 30; length = 300) * U.u"km/s" end; # ╔═╡ 539290af-787d-4deb-928c-50e4e9f28173 -data = let +data_DQ = let # Cloud's center - cen_ra = 52.25u"deg" - cen_dec = 0.25u"deg" - cen_v = 15u"km/s" + ra_0 = 52.25 * DQ.u"deg" + d_0 = 0.25 * DQ.u"deg" + v_0 = 15 * DQ.u"km/s" # Cloud's size - sig_ra = 3u"arcmin" - sig_dec = 4u"arcmin" - sig_v = 3u"km/s" + ra_σ = 3 * DQ.u"arcmin" + d_σ = 4 * DQ.u"arcmin" + v_σ = 3 * DQ.us"km/s" A = [ exp( - -0.5 * ((ra - cen_ra) / sig_ra)^2 - -0.5 * ((dec - cen_dec) / sig_dec)^2 - -0.5 * ((v - cen_v) / sig_v)^2 + -0.5 * ( + ((ra - ra_0) / ra_σ)^2 + + ((d - d_0) / d_σ)^2 + + ((v - v_0) / v_σ)^2 + ) ) - for ra in ras, dec in decs, v in vs - ] + for ra in ras_DQ, d in decs_DQ, v in vs_DQ + ] * DQ.us"K" +end + +# ╔═╡ 86d608ec-aca2-4738-9c3e-656ccd562da6 +data_U = let + # Cloud's center + ra_0 = 52.25 * U.u"deg" + d_0 = 0.25 * U.u"deg" + v_0 = 15 * U.u"km/s" + + # Cloud's size + ra_σ = 3 * U.u"arcminute" + d_σ = 4 * U.u"arcminute" + v_σ = 3 * U.u"km/s" - DimArray(A * u"K", (RA = ras, Dec = decs, Vel = vs)) + A = [ + exp( + -0.5 * ( + ((ra - ra_0) / ra_σ)^2 + + ((d - d_0) / d_σ)^2 + + ((v - v_0) / v_σ)^2 + ) + ) + for ra in ras_U, d in decs_U, v in vs_U + ] * U.u"K" end # ╔═╡ e86d6cf7-2274-403a-b1db-017973f33fb7 @@ -245,43 +305,53 @@ md""" The units of the exponential are dimensionless, so we multiplied the data cube by ``\mathrm{K}`` to get brightness temperature units. As an aside for experts, we're setting up our artificial cube on the main-beam temperature scale ``\left(T_\text{MB}\right)``, which is the closest we can normally get to the actual brightness temperature of our source. """ -# ╔═╡ 00b9d37f-ce7b-4491-b1df-f0963f2598a8 -md""" -We will also need to know the width of each velocity bin and the size of each pixel, so let's calculate that now: -""" - # ╔═╡ 1f6a0d6c-832b-474d-8fbf-a9de6e821d80 # Average pixel size # This is only right if dec ~ 0, because of the cos(dec) factor. -Δra = (maximum(ras) - minimum(ras)) / length(ras) # Typed |Delta +Δra_DQ, Δdec_DQ = ( + (maximum(ras_DQ) - minimum(ras_DQ)) / length(ras_DQ), # Typed \Delta + (maximum(decs_DQ) - minimum(decs_DQ)) / length(decs_DQ) +) -# ╔═╡ f80f8b06-976f-4b43-8074-8d0bf725ba48 -Δdec = (maximum(decs) - minimum(decs)) / length(decs) +# ╔═╡ efa21003-ee7a-4834-b6f7-7625a7820f70 +# Average pixel size +# This is only right if dec ~ 0, because of the cos(dec) factor. +Δra_U, Δdec_U = ( + (maximum(ras_U) - minimum(ras_U)) / length(ras_U), # Typed \Delta + (maximum(decs_U) - minimum(decs_U)) / length(decs_U) +) # ╔═╡ 6fa07efa-fd25-4bca-bd18-8ba5c557d146 # Average velocity bin width -Δv = (maximum(vs) - minimum(vs)) / length(vs) - -# ╔═╡ 3211ba19-0140-450d-95c6-698a4f0ccbff -md""" -Note that DynamicQuantities.jl uses the unitless radian by default. We can still easily display this in our desired unit system: -""" +Δv_DQ = (maximum(vs_DQ) - minimum(vs_DQ)) / length(vs_DQ) -# ╔═╡ 175854bb-4385-4199-ada9-358def53a822 -(Δra, Δdec) .|> us"arcsec" # Display in arcseconds - -# ╔═╡ 7ab2fe80-812f-4a21-933a-e169a17f6c32 -md""" -We're interested in the integrated intensity over all of the velocity channels, so let's create a 2D quantity array by summing our data cube along the velocity axis (multiplying by the velocity width of a pixel): -""" +# ╔═╡ 95bf572e-23a0-4554-8ee3-b7932721e850 +# Average velocity bin width +Δv_U = (maximum(vs_U) - minimum(vs_U)) / length(vs_U) # ╔═╡ 6ddeb42d-37a5-48a3-ac82-47e4ec2ca541 -intcloud = reduce(+, eachslice(data * Δv; dims = :Vel)) +intcloud_DQ = let + A = data_DQ * Δv_DQ + sum(eachslice(A; dims = 3)) + # sum(A, dims = 3; init = zero(first(A)))[:, :, begin] +end + +# ╔═╡ 9537c91e-03a7-44d7-95ae-e60ea8d5496a +intcloud_U = let + A = data_U * Δv_U + sum(eachslice(A; dims = 3)) +end # ╔═╡ 4d4794fb-804d-4b4a-8c32-a32d88e43e30 md""" !!! todo - Get `Base.sum` support for DQ. Discussion here: + Improve `Base.sum` support for DQ. Discussion here: + + This works too, but is more verbose: + + ```julia + sum(A, dims = 3; init = zero(first(A)))[:, :, begin] + ``` """ # ╔═╡ 1fa8010d-9a5d-4297-9665-9fa8795ef5f7 @@ -290,42 +360,37 @@ md""" Radio astronomers use a rather odd set of units ``[\mathrm{K\, km/s}]`` for integrated intensity (that is, summing all the emission from a line over velocity). """ -# ╔═╡ 4ee79c7c-5c4e-457b-b713-103937e50355 -md""" -We can plot the 2D quantity using Makie's `heatmap` function: -""" - # ╔═╡ f2b222ec-0783-487e-9c52-835976a555b6 let - A = intcloud - x, y = dims(A) - u_A = us"K*km/s" - - fig, ax, p = heatmap( - val(x) .|> us"deg", - val(y) .|> us"rad", - ustrip.(u_A, parent(A)); + fig, ax, p = heatmap(ras_DQ, decs_DQ, intcloud_DQ, + axis = (; + xreversed = true, + xlabel = "RA", + ylabel = "Dec", + ), colormap = :cividis, ) - ax.xreversed = true - ax.xlabel = "RA" - ax.ylabel = "Dec" - - Colorbar(fig[1, 2], p; label = string("Intensity [", dimension(u_A), " ]")) + Colorbar(fig[1, 2], p; label = "Intensity") fig end -# ╔═╡ e4232b15-3369-438e-994b-042aab477a7f -md""" -!!! todo - See if something like this can be upstreamed to DD. Would be nice to be able to just do: +# ╔═╡ f2c3768f-1c81-456d-ba81-6a91fc09e81b +let + fig, ax, p = heatmap(ras_U, decs_U, intcloud_U, + axis = (; + xreversed = true, + xlabel = "RA", + ylabel = "Dec", + ), + colormap = :cividis, + ) - ```julia - heatmap(intcloud) - ``` -""" + Colorbar(fig[1, 2], p; label = "Intensity") + + fig +end # ╔═╡ c749ce2d-17ae-45f4-b721-3f486b1cbc23 md""" @@ -350,160 +415,141 @@ B &= \frac{h\nu}{k_\text{B} T} (Rohlfs & Wilson [Tools for Radio Astronomy](https://www.springer.com/gp/book/9783662053942)). """ -# ╔═╡ 3a3328d5-31de-4deb-bff7-d25c1fcbc4ef -md""" -Here we have given an expression for ``C`` scaled to the values for ``\mathrm{C}^{13}\mathrm{O}`` (``\nu_{13}`` and ``A_{13}``). In order to use this relation for ``\mathrm{C}^{18}\mathrm{O}``, we need to rescale the frequencies ``\nu`` and the Einstein coefficients (``A``). Lastly, ``C`` is in funny mixed units, but that's okay. We'll be able to do our unit handling in the usual way. -""" - -# ╔═╡ fb0f2941-2e56-45db-91fe-e8d6744a00e0 -md""" -First, we look up the wavelength for these emission lines and store them as quantities: -""" - # ╔═╡ bf618161-ef96-4445-8fc8-25dc5f662242 -const λ_13 = 2.60076u"mm" +λ_13_DQ, λ_18_DQ = (2.60076, 2.73079) .* DQ.us"mm" -# ╔═╡ 1a16d2e1-7898-415c-9a98-a1f2f87e08be -const λ_18 = 2.73079u"mm" +# ╔═╡ 182861a3-2902-4e56-8fff-3bfc182268c7 +λ_13_U, λ_18_U = (2.60076, 2.73079) .* U.u"mm" -# ╔═╡ e0a2c745-41cf-4359-bb99-3117fbb507cc -md""" -And compute their corresponding frequencies: -""" +# ╔═╡ 321fa5f5-be6a-4e5f-ba7f-4c117a240253 +λ_13_DQ |> DQ.us"Hz" -# ╔═╡ d45bad3e-4c82-436b-8e64-c61e5cf65c2f -λ_to_ν(λ) = c_0 / λ +# ╔═╡ 2962b22a-5e4a-4dc1-9be6-8e57979ecba5 +λ_13_U |> U.u"Hz" # ╔═╡ ee46b865-dbd4-4939-b241-514941dd138d -const ν_13 = λ_13 |> λ_to_ν +ν_13_DQ, ν_18_DQ = C_DQ.c ./ (λ_13_DQ, λ_18_DQ) .|> DQ.us"Hz" -# ╔═╡ b183c219-a39b-427a-b740-5675fcc175ca -const ν_18 = λ_18 |> λ_to_ν +# ╔═╡ 554321c7-cdcb-415c-8ac2-c63b42b6889a +ν_13_U, ν_18_U = U.uconvert.(U.u"Hz", (λ_13_U, λ_18_U), UE.Spectral()) -# ╔═╡ 323d1169-c59f-456c-9b19-093e26f84214 +# ╔═╡ 0af912a5-18ad-4974-a0b5-c1f66c8fa37a md""" -!!! todo - See how helpful UnitfulEquivalencies.jl-like functionality for DQ would be. -""" - -# ╔═╡ d0215082-52df-4eae-a409-7c3c7cfc69ed -md""" -Next, we look up Einstein coefficients (in units of s⁻¹), and calculate the ratios in constant ``C``. Note how the ratios of frequency and Einstein coefficient units are dimensionless, so the unit of _C_ is unchanged. +!!! note + DynamicQuantities.jl does not have similar unit eqivalence functionality at this time because it is cheap to just roll our own conversions since the physical constants needed are already included in the package. For this reason, we just compute the ``c / λ`` relation directly. """ # ╔═╡ 3a24f4aa-b074-4beb-b77d-6778e2fe580a -const A_13 = 7.4e-8 / u"s" - -# ╔═╡ 1e203abc-4a02-4d01-bf9e-9df636e70ebd -const A_18 = 8.8e-8 / u"s" +CC_DQ = let + A_13, A_18 = (7.4e-8, 8.8e-8) ./ DQ.us"s" + 3e14 * DQ.us"s/(K*cm^2*km)" * (ν_18_DQ/ν_13_DQ)^3 * (A_13/A_18) +end # ╔═╡ 98869c25-2644-47d1-b8cc-05699292f2a8 -C = 3e14u"s/(K*cm^2*km)" * (ν_18/ν_13)^3 * (A_13/A_18) - -# ╔═╡ 18985bb2-6cce-4417-97a2-c2da7b9e0428 -C |> us"s / K / km / cm^2" - -# ╔═╡ d9e2b828-9c32-4638-bfcd-0c16b221aa43 -md""" -Now we move on to calculate the constant ``B``. This is given by the ratio of ``\dfrac{hν}{k_\text{B}T}``, where ``h`` is Planck's constant, ``k_\text{B}`` is the Boltzmann's constant, ``ν`` is the emission frequency, and ``T`` is the excitation temperature. The constants were imported from `DynamicQuantities.Constants`, and the other two values are already calculated, so here we just take the ratio: -""" +CC_U = let + A_13, A_18 = (7.4e-8, 8.8e-8) ./ U.u"s" + 3e14 * U.u"s/(K*cm^2*km)" * (ν_18_U/ν_13_U)^3 * (A_13/A_18) +end # ╔═╡ 4092a893-818e-49f4-93d0-be7bd652dddc -B = h * ν_18 / (k_B * T_ex) +B_DQ = C_DQ.h * ν_18_DQ / (C_DQ.k_B * T_ex_DQ) -# ╔═╡ c5c907d0-a669-43f3-8030-0bd67452f0a1 -k_B - -# ╔═╡ a0b64ba9-cbec-404e-bf39-aee03ae407ae -md""" -Note how DynamicQuantities.jl intelligently cancelled the units for us, while still keeping this as a Quantity object: -""" +# ╔═╡ a0967b01-4eb8-4160-af68-a908734dc25e +B_U = C_U.h * ν_18_U / (C_U.k_B * T_ex_U) # ╔═╡ 82f11626-722b-46fa-9173-8b5d7a80a190 -typeof(B) +B_DQ -# ╔═╡ 6aff587f-be6f-4fd8-96df-9c12f3769f32 -md""" -At this point we have all the ingredients to calculate the number density of ``\mathrm{CO}`` molecules in this cloud. We already integrated (summed) over the velocity channels above to show the integrated intensity map, but we'll do it again here for clarity. This gives us the column density of ``\mathrm{CO}`` for each spatial pixel in our map. We can then print out the peak column column density: -""" +# ╔═╡ 392d3055-2ce0-4db7-8702-f79395f24b3b +B_U |> U.NoUnits # ╔═╡ ef498536-8fb8-46e3-9d8d-f7eb3994a3f5 -NCO = C * reduce(+, eachslice(data * Δv; dims = :Vel)) / (1 - exp(-B)) +NCO_DQ = CC_DQ * intcloud_DQ / (1 - exp(-B_DQ)) + +# ╔═╡ 84f948ad-f903-46a6-a520-2499864f348f +NCO_U = CC_U * intcloud_U / (1 - exp(-B_U)) # ╔═╡ 25598fcd-761d-40b8-95ac-8b68a00026da md""" !!! note "" - **Peak CO Column density:** $(maximum(NCO) |> us"cm^-2") + **Peak CO Column density (DQ):** $(maximum(NCO_DQ)) +""" + +# ╔═╡ 336f8626-7b0c-459d-bedb-281d010fcbd2 +md""" +!!! note "" + **Peak CO Column density (U):** $(maximum(NCO_U)) """ # ╔═╡ eba2f06f-ebe9-492d-81d2-1cc4fccd5b0a md""" ### ``\mathrm{CO}`` to Total Mass -We are using ``\mathrm{CO}`` as a tracer for the much more numerous ``\mathrm{H}_2``, the quantity we are actually trying to infer. Since most of the mass is in ``\mathrm{H}_2``, we calculate its column density by multiplying the ``\mathrm{CO}`` column density with the (known/assumed) ``\mathrm{H}_2 / \mathrm{CO}`` ratio: +We are using ``\mathrm{CO}`` as a tracer for the much more numerous ``\mathrm{H}_2``, the quantity we are actually trying to infer. Using the (known/assumed) ``\mathrm{H}_2 / \mathrm{CO}`` ratio: """ # ╔═╡ de22c778-1529-4177-85e6-a0178f437a8c H₂_CO_ratio = 5.9e6 # ╔═╡ c262aa56-b9b6-4da4-8810-d6120f0724c6 -NH₂ = NCO * H₂_CO_ratio +NH₂_DQ = NCO_DQ * H₂_CO_ratio + +# ╔═╡ 9a98c6bb-d0d5-426e-9137-9fc94fc944be +NH₂_U = NCO_U * H₂_CO_ratio # ╔═╡ 1e8ec5c5-3d41-44a7-8dfa-81d981750d9e md""" !!! note "" - **Peak ``\mathrm{H}_2`` column density:** $(maximum(NH₂) |> us"cm^-2") + **Peak ``\mathrm{H}_2`` column density (DQ):** $(maximum(NH₂_DQ)) """ -# ╔═╡ c6b35992-973b-49d4-bfa7-855e8fe10924 +# ╔═╡ dd22bc93-28bf-412e-a52b-d4332475daa2 md""" -That's a peak column density of roughly 50 magnitudes of visual extinction (assuming the conversion between ``N_{\mathrm{H}_2}`` and ``A_V`` from Bohlin et al. 1978), which seems reasonable for a molecular cloud. - -We obtain the mass column density by multiplying the number column density by the mass of an individual ``\mathrm{H_2}`` molecule: +!!! note "" + **Peak ``\mathrm{H}_2`` column density (U):** $(maximum(NH₂_U)) """ -# ╔═╡ 85f84c90-46e6-4d3f-bba2-6fc190a05533 -mH₂ = 2*1.008u"Constants.u" - -# ╔═╡ 16cdd7e8-0ec2-4953-ad8b-f53669d05eda -mH₂ |> us"Constants.u" - # ╔═╡ 522d88d6-5f60-401b-8786-0236c0859eda -ρ = NH₂ * mH₂ +ρ_DQ = let + mH₂ = 2*1.008 * C_DQ.u + NH₂_DQ * mH₂ +end -# ╔═╡ fbd0d75b-b3af-4eb5-a249-423317d656e5 -md""" -A final step in going from the column density to mass is summing up over the area. If we do this in the straightforward way of length × width of a pixel, this area is then in units of deg²: -""" +# ╔═╡ 014b94b3-a6fa-4627-a24d-fe8c5e275582 +ρ_U = let + mH₂ = 2*1.008 * U.u"u" + NH₂_U * mH₂ +end # ╔═╡ 0eefe540-1669-4510-bef7-8fb7f8be68f1 -Δap = Δra * Δdec +Δap_DQ = Δra_DQ * Δdec_DQ -# ╔═╡ 4f59f4e6-c735-4a40-b171-744b17eb37fd -Δap |> us"deg^2" +# ╔═╡ 085c04f2-0762-4213-b874-14f3ce1f0b49 +Δap_U = Δra_U * Δdec_U # ╔═╡ b057812d-1a8e-479c-8192-1c1acdb97d23 -Δa = Δap * d^2 +Δa_DQ = Δap_DQ * d_DQ^2 -# ╔═╡ 586b1993-be11-4437-9d3b-789511ea26bf -Δa |> us"cm^2" +# ╔═╡ 98f0753f-635e-46e3-8045-ff40ca2e827b +Δa_U = Δap_U * d_U^2 -# ╔═╡ e81f3b44-bc04-4768-81c2-c2733958f5a9 +# ╔═╡ 479b900b-b1bf-4d89-a53e-b1b20da7f5ad +Δa_DQ |> C_DQ.pc^2 + +# ╔═╡ 28237d12-6065-4fa3-bd40-6397dae7ecb6 +Δa_U |> U.u"pc^2" + +# ╔═╡ 9c0862d0-8028-4ef4-a867-18c7932dad91 md""" -Finally, multiplying the column density with the pixel area and summing over all the pixels gives us the cloud mass: +!!! tip + To treat angles as physical units instead of as dimensionless, see [this relevant section](https://juliaphysics.github.io/DynamicQuantities.jl/stable/examples/#3.-Using-dimensional-angles) in the DynamicQuantities.jl documentation, and this extension package for Unitful.jl: [DimensionfulAngles.jl](https://github.com/cmichelenstrofer/DimensionfulAngles.jl). """ # ╔═╡ 88966b7e-b261-45a6-9f12-6b74f24c03e4 -M_cloud = sum(ρ * Δa) +M_cloud_DQ = sum(ρ_DQ * Δa_DQ) |> C_DQ.M_sun -# ╔═╡ ff7def67-eb96-45b3-959a-2b01c7804e07 -M_cloud |> us"Constants.M_sun" - -# ╔═╡ 965a8e44-e96e-434e-8454-cced531ae9d2 -md""" -!!! note "" - **Total cloud mass:** $(M_cloud |> us"Constants.M_sun") -""" +# ╔═╡ 1aaaebb6-839a-4598-82b9-dc17efdf7623 +M_cloud_U = sum(ρ_U * Δa_U) |> U.u"Msun" # ╔═╡ 802f5cad-a0c0-4426-94f2-426f89dea7e1 md""" @@ -515,9 +561,9 @@ md""" # ╔═╡ 2eed0bc8-2306-42bb-9803-33ae131021e6 md""" -## 3. Using `Quantities` with functions +## 3. Using units with functions -`Quantity` is also a useful tool if you plan to share some of your code, either with collaborators or the wider community. By writing functions that take `Quantity` objects instead of raw numbers or arrays, you can write code that is agnostic to the input unit. In this way, you may even be able to prevent [the destruction of Mars orbiters](http://en.wikipedia.org/wiki/Mars_Climate_Orbiter#Cause_of_failure). Below, we provide a simple example. +Units are also a useful tool if you plan to share some of your code, either with collaborators or the wider community. By writing functions that take numbers with units objects instead of raw numbers or arrays, you can write code that is agnostic to the input unit. In this way, you may even be able to prevent [the destruction of Mars orbiters](http://en.wikipedia.org/wiki/Mars_Climate_Orbiter#Cause_of_failure). Below, we provide a simple example. Suppose you are working on an instrument, and the person funding it asks for a function to give an analytic estimate of the response function. You determine from some tests it's basically a Lorentzian, but with a different scale along the two axes. Your first thought might be to do this: """ @@ -540,48 +586,57 @@ You meant the inputs to be in arcsec, but alas, you send that to your collaborat # ╔═╡ ffc4bdc3-16e3-4b3e-b448-cfdc16428378 response_func_bad(1.0, 1.2) -# ╔═╡ 71cca345-cffc-4aee-a671-08901a92babe -md""" -And now they tell all their friends how terrible the instrument is, because it's supposed to have arcsecond resolution, but your function clearly shows it can only resolve an arcmin at best. But you can solve this by requiring they pass in Quantity objects. The new function could simply be: -""" - # ╔═╡ 1c3faf9f-adcf-4232-acf4-655d828623e3 -function response_func_good(x, y) - xscale = 0.9us"arcsec" # We use symbolic dimensions here - yscale = 0.85us"arcsec" # to treat radians as unitful quantities +function response_func_good_DQ(x, y) + xscale = 0.9 * DQ.us"arcsec" # We use symbolic dimensions here + yscale = 0.85 * DQ.us"arcsec" # to treat radians as unitful quantities xfactor = 1 / (1 + x / xscale) yfactor = 1 / (1 + y / yscale) return xfactor * yfactor end -# ╔═╡ 7cfb17fc-81a4-4522-a88b-2fd10001baaa -md""" -And your collaborator now has to pay attention. If they just blindly put in a number, they get an error: -""" +# ╔═╡ 6708c2f5-a291-486e-8e66-93acfcedbcb7 +function response_func_good_U(x, y) + xscale = 0.9 * U.u"arcsecondᵃ" # We use dimensionful angles here + yscale = 0.85 * U.u"arcsecondᵃ" # to treat radians as unitful quantities + xfactor = 1 / (1 + x / xscale) + yfactor = 1 / (1 + y / yscale) + + return xfactor * yfactor +end # ╔═╡ ce1804da-df61-4e4c-aa3b-d950e83b7c13 -response_func_good(1.0, 1.2) +response_func_good_DQ(1.0, 1.2) -# ╔═╡ 5590c909-6103-4427-b1a2-4cf35265dc07 -md""" -Which is their cue to provide the units explicitly: -""" +# ╔═╡ 910920d2-085a-498f-8458-e6e96903ab92 +response_func_good_U(1.0, 1.2) # ╔═╡ f7486c08-b74b-471f-bbc2-690439a487f8 -response_func_good(1.0u"arcmin", 1.2u"arcmin") +response_func_good_DQ(1.0 * DQ.u"arcmin", 1.2 * DQ.u"arcmin") + +# ╔═╡ 08c5e6fc-d8b5-4311-8f35-449a830daeec +response_func_good_U(1.0 * U.u"arcminuteᵃ", 1.2 * U.u"arcminuteᵃ") # ╔═╡ c143ab62-b3f0-4b6a-83aa-76e5dc3548ac md""" The funding agency is impressed at the resolution you achieved, and your instrument is saved! You now go on to win the Nobel Prize due to discoveries the instrument makes. And it was all because you used `Quantity` as the input of code you shared. """ +# ╔═╡ 0c05c385-67bd-4078-8fe2-34a37a13b312 +md""" +!!! note + **DynamicQuantities.jl:** Note the use of `us""` instead of `u""`, both supplied by DynamicQuantities.jl, to achieve this behavior. + + **Unitful.jl:** Note the use of `ᵃ` supplied by DimensionfulAngles.jl instead of the base angle units provided by Unitful.jl to achieve this behavior. +""" + # ╔═╡ 7d4f9a02-81a7-4bdc-a22d-3435192f9f15 let sol = details("Example solution", md""" ```julia - v_orb(M, r) = sqrt(u"Constants.G" * M / r) + v_orb(M, r) = sqrt(C_DQ.G * M / r) ``` """) @@ -601,1828 +656,370 @@ end # ╔═╡ bedc8ccd-e6f6-4dd1-a0b6-1889f4b5b658 TableOfContents(; title = "On this page", depth = 4) -# ╔═╡ 00000000-0000-0000-0000-000000000001 -PLUTO_PROJECT_TOML_CONTENTS = """ -[deps] -CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" -DimensionalData = "0703355e-b756-11e9-17c0-8b28908087d0" -Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" -DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821" -Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" -StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" - -[sources] -CairoMakie = {rev = "ff/dim-converts", subdir = "CairoMakie", url = "https://github.com/MakieOrg/Makie.jl"} -Makie = {rev = "ff/dim-converts", subdir = "Makie", url = "https://github.com/MakieOrg/Makie.jl"} - -[compat] -DimensionalData = "~0.29.25" -Distributions = "~0.25.122" -DynamicQuantities = "~1.10.0" -PlutoUI = "~0.7.75" -StatsBase = "~0.34.9" +# ╔═╡ 05b485e7-115a-4dbb-aa73-0ca6ace2f5c0 +md""" +## Packages """ -# ╔═╡ 00000000-0000-0000-0000-000000000002 -PLUTO_MANIFEST_TOML_CONTENTS = """ -# This file is machine-generated - editing it directly is not advised - -julia_version = "1.12.3" -manifest_format = "2.0" -project_hash = "ebdc1f917a9ec2d2643cd2904a11a6cde0e0260a" - -[[deps.AbstractFFTs]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" -uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" -version = "1.5.0" -weakdeps = ["ChainRulesCore", "Test"] - - [deps.AbstractFFTs.extensions] - AbstractFFTsChainRulesCoreExt = "ChainRulesCore" - AbstractFFTsTestExt = "Test" - -[[deps.AbstractPlutoDingetjes]] -deps = ["Pkg"] -git-tree-sha1 = "6e1d2a35f2f90a4bc7c2ed98079b2ba09c35b83a" -uuid = "6e696c72-6542-2067-7265-42206c756150" -version = "1.3.2" - -[[deps.AbstractTrees]] -git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" -uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" -version = "0.4.5" - -[[deps.Adapt]] -deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "7e35fca2bdfba44d797c53dfe63a51fabf39bfc0" -uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.4.0" -weakdeps = ["SparseArrays", "StaticArrays"] - - [deps.Adapt.extensions] - AdaptSparseArraysExt = "SparseArrays" - AdaptStaticArraysExt = "StaticArrays" - -[[deps.AdaptivePredicates]] -git-tree-sha1 = "7e651ea8d262d2d74ce75fdf47c4d63c07dba7a6" -uuid = "35492f91-a3bd-45ad-95db-fcad7dcfedb7" -version = "1.2.0" - -[[deps.AliasTables]] -deps = ["PtrArrays", "Random"] -git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" -uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" -version = "1.1.3" - -[[deps.Animations]] -deps = ["Colors"] -git-tree-sha1 = "e092fa223bf66a3c41f9c022bd074d916dc303e7" -uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" -version = "0.4.2" - -[[deps.ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.2" - -[[deps.ArrayInterface]] -deps = ["Adapt", "LinearAlgebra"] -git-tree-sha1 = "d81ae5489e13bc03567d4fbbb06c546a5e53c857" -uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.22.0" - - [deps.ArrayInterface.extensions] - ArrayInterfaceBandedMatricesExt = "BandedMatrices" - ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" - ArrayInterfaceCUDAExt = "CUDA" - ArrayInterfaceCUDSSExt = ["CUDSS", "CUDA"] - ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" - ArrayInterfaceChainRulesExt = "ChainRules" - ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" - ArrayInterfaceMetalExt = "Metal" - ArrayInterfaceReverseDiffExt = "ReverseDiff" - ArrayInterfaceSparseArraysExt = "SparseArrays" - ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" - ArrayInterfaceTrackerExt = "Tracker" - - [deps.ArrayInterface.weakdeps] - BandedMatrices = "aae01518-5342-5314-be14-df237901396f" - BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" - ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" - Metal = "dde4c033-4e86-420c-a63e-0dd931031962" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" - Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" - -[[deps.Artifacts]] -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" -version = "1.11.0" - -[[deps.Automa]] -deps = ["PrecompileTools", "SIMD", "TranscodingStreams"] -git-tree-sha1 = "a8f503e8e1a5f583fbef15a8440c8c7e32185df2" -uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" -version = "1.1.0" - -[[deps.AxisAlgorithms]] -deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] -git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" -uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" -version = "1.1.0" - -[[deps.AxisArrays]] -deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] -git-tree-sha1 = "4126b08903b777c88edf1754288144a0492c05ad" -uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" -version = "0.4.8" - -[[deps.Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" -version = "1.11.0" - -[[deps.BaseDirs]] -git-tree-sha1 = "bca794632b8a9bbe159d56bf9e31c422671b35e0" -uuid = "18cc8868-cbac-4acf-b575-c8ff214dc66f" -version = "1.3.2" - -[[deps.Bzip2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" -uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" -version = "1.0.9+0" - -[[deps.CEnum]] -git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" -uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" -version = "0.5.0" - -[[deps.CRC32c]] -uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" -version = "1.11.0" - -[[deps.CRlibm]] -deps = ["CRlibm_jll"] -git-tree-sha1 = "66188d9d103b92b6cd705214242e27f5737a1e5e" -uuid = "96374032-68de-5a5b-8d9e-752f78720389" -version = "1.0.2" - -[[deps.CRlibm_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" -uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" -version = "1.0.1+0" - -[[deps.Cairo]] -deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] -git-tree-sha1 = "71aa551c5c33f1a4415867fe06b7844faadb0ae9" -uuid = "159f3aea-2a34-519c-b102-8c37f9878175" -version = "1.1.1" - -[[deps.CairoMakie]] -deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] -git-tree-sha1 = "5017d6849aff775febd36049f7d926a5fb6677ec" -repo-rev = "ff/dim-converts" -repo-subdir = "CairoMakie" -repo-url = "https://github.com/MakieOrg/Makie.jl" -uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" -version = "0.15.8" - -[[deps.Cairo_jll]] -deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "fde3bf89aead2e723284a8ff9cdf5b551ed700e8" -uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.18.5+0" - -[[deps.ChainRulesCore]] -deps = ["Compat", "LinearAlgebra"] -git-tree-sha1 = "e4c6a16e77171a5f5e25e9646617ab1c276c5607" -uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.26.0" -weakdeps = ["SparseArrays"] - - [deps.ChainRulesCore.extensions] - ChainRulesCoreSparseArraysExt = "SparseArrays" - -[[deps.ColorBrewer]] -deps = ["Colors", "JSON"] -git-tree-sha1 = "07da79661b919001e6863b81fc572497daa58349" -uuid = "a2cac450-b92f-5266-8821-25eda20663c8" -version = "0.4.2" - -[[deps.ColorSchemes]] -deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] -git-tree-sha1 = "b0fd3f56fa442f81e0a47815c92245acfaaa4e34" -uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.31.0" - -[[deps.ColorTypes]] -deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" -uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.12.1" -weakdeps = ["StyledStrings"] - - [deps.ColorTypes.extensions] - StyledStringsExt = "StyledStrings" - -[[deps.ColorVectorSpace]] -deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] -git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" -uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.11.0" -weakdeps = ["SpecialFunctions"] - - [deps.ColorVectorSpace.extensions] - SpecialFunctionsExt = "SpecialFunctions" - -[[deps.Colors]] -deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] -git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" -uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.13.1" - -[[deps.Compat]] -deps = ["TOML", "UUIDs"] -git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.18.1" -weakdeps = ["Dates", "LinearAlgebra"] - - [deps.Compat.extensions] - CompatLinearAlgebraExt = "LinearAlgebra" - -[[deps.CompilerSupportLibraries_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.3.0+1" - -[[deps.ComputePipeline]] -deps = ["Observables", "Preferences"] -git-tree-sha1 = "76dab592fa553e378f9dd8adea16fe2591aa3daa" -uuid = "95dc2771-c249-4cd0-9c9f-1f3b4330693c" -version = "0.1.6" - -[[deps.ConstructionBase]] -git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" -uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" -version = "1.6.0" -weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] - - [deps.ConstructionBase.extensions] - ConstructionBaseIntervalSetsExt = "IntervalSets" - ConstructionBaseLinearAlgebraExt = "LinearAlgebra" - ConstructionBaseStaticArraysExt = "StaticArrays" - -[[deps.Contour]] -git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" -uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" -version = "0.6.3" - -[[deps.DataAPI]] -git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" -uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.16.0" - -[[deps.DataStructures]] -deps = ["OrderedCollections"] -git-tree-sha1 = "e357641bb3e0638d353c4b29ea0e40ea644066a6" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.19.3" - -[[deps.DataValueInterfaces]] -git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" -uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" -version = "1.0.0" - -[[deps.Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" -version = "1.11.0" - -[[deps.DelaunayTriangulation]] -deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"] -git-tree-sha1 = "c55f5a9fd67bdbc8e089b5a3111fe4292986a8e8" -uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" -version = "1.6.6" - -[[deps.DimensionalData]] -deps = ["Adapt", "ArrayInterface", "ConstructionBase", "DataAPI", "Dates", "Extents", "Interfaces", "IntervalSets", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "PrecompileTools", "Random", "RecipesBase", "Statistics", "TableTraits", "Tables"] -git-tree-sha1 = "147961441e5cb35da0af404aa4684d2e74ec68eb" -uuid = "0703355e-b756-11e9-17c0-8b28908087d0" -version = "0.29.25" - - [deps.DimensionalData.extensions] - DimensionalDataAbstractFFTsExt = "AbstractFFTs" - DimensionalDataAlgebraOfGraphicsExt = "AlgebraOfGraphics" - DimensionalDataCategoricalArraysExt = "CategoricalArrays" - DimensionalDataChainRulesCoreExt = "ChainRulesCore" - DimensionalDataDiskArraysExt = "DiskArrays" - DimensionalDataMakieExt = "Makie" - DimensionalDataNearestNeighborsExt = "NearestNeighbors" - DimensionalDataPythonCallExt = "PythonCall" - DimensionalDataSparseArraysExt = "SparseArrays" - DimensionalDataStatsBaseExt = "StatsBase" - - [deps.DimensionalData.weakdeps] - AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c" - AlgebraOfGraphics = "cbdf2221-f076-402e-a563-3d30da359d67" - CategoricalArrays = "324d7699-5711-5eae-9e2f-1d82baa6b597" - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - DiskArrays = "3c3547ce-8d99-4f5e-a174-61eb10b00ae3" - Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" - NearestNeighbors = "b8a86587-4115-5ab1-83bc-aa920d37bbce" - PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" - -[[deps.DispatchDoctor]] -deps = ["MacroTools", "Preferences"] -git-tree-sha1 = "fc34127e78323c49984e1a146d577d0f890dd2b4" -uuid = "8d63f2c5-f18a-4cf2-ba9d-b3f60fc568c8" -version = "0.4.26" - - [deps.DispatchDoctor.extensions] - DispatchDoctorChainRulesCoreExt = "ChainRulesCore" - DispatchDoctorEnzymeCoreExt = "EnzymeCore" - - [deps.DispatchDoctor.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" - -[[deps.Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" -version = "1.11.0" - -[[deps.Distributions]] -deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "3bc002af51045ca3b47d2e1787d6ce02e68b943a" -uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.122" - - [deps.Distributions.extensions] - DistributionsChainRulesCoreExt = "ChainRulesCore" - DistributionsDensityInterfaceExt = "DensityInterface" - DistributionsTestExt = "Test" - - [deps.Distributions.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" - Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[deps.DocStringExtensions]] -git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.9.5" - -[[deps.Downloads]] -deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.7.0" - -[[deps.DynamicQuantities]] -deps = ["DispatchDoctor", "PrecompileTools", "TestItems", "Tricks"] -git-tree-sha1 = "57c48a46e27d67208ad51c564b078a90bbd0dc2c" -uuid = "06fc5a27-2a28-4c7c-a15d-362465fb6821" -version = "1.10.0" - - [deps.DynamicQuantities.extensions] - DynamicQuantitiesLinearAlgebraExt = "LinearAlgebra" - DynamicQuantitiesMeasurementsExt = "Measurements" - DynamicQuantitiesScientificTypesExt = "ScientificTypes" - DynamicQuantitiesUnitfulExt = "Unitful" - - [deps.DynamicQuantities.weakdeps] - LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" - ScientificTypes = "321657f4-b219-11e9-178b-2701a2544e81" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.EarCut_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" -uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" -version = "2.2.4+0" - -[[deps.EnumX]] -git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" -uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" -version = "1.0.5" - -[[deps.ExactPredicates]] -deps = ["IntervalArithmetic", "Random", "StaticArrays"] -git-tree-sha1 = "83231673ea4d3d6008ac74dc5079e77ab2209d8f" -uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" -version = "2.2.9" - -[[deps.Expat_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "27af30de8b5445644e8ffe3bcb0d72049c089cf1" -uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.7.3+0" - -[[deps.Extents]] -git-tree-sha1 = "b309b36a9e02fe7be71270dd8c0fd873625332b4" -uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" -version = "0.1.6" - -[[deps.FFMPEG_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "01ba9d15e9eae375dc1eb9589df76b3572acd3f2" -uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "8.0.1+0" - -[[deps.FFTW]] -deps = ["AbstractFFTs", "FFTW_jll", "Libdl", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] -git-tree-sha1 = "97f08406df914023af55ade2f843c39e99c5d969" -uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" -version = "1.10.0" - -[[deps.FFTW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6d6219a004b8cf1e0b4dbe27a2860b8e04eba0be" -uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" -version = "3.3.11+0" - -[[deps.FileIO]] -deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "d60eb76f37d7e5a40cc2e7c36974d864b82dc802" -uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.17.1" - - [deps.FileIO.extensions] - HTTPExt = "HTTP" - - [deps.FileIO.weakdeps] - HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" - -[[deps.FilePaths]] -deps = ["FilePathsBase", "MacroTools", "Reexport"] -git-tree-sha1 = "a1b2fbfe98503f15b665ed45b3d149e5d8895e4c" -uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" -version = "0.9.0" - - [deps.FilePaths.extensions] - FilePathsGlobExt = "Glob" - FilePathsURIParserExt = "URIParser" - FilePathsURIsExt = "URIs" - - [deps.FilePaths.weakdeps] - Glob = "c27321d9-0574-5035-807b-f59d2c89b15c" - URIParser = "30578b45-9adc-5946-b283-645ec420af67" - URIs = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" - -[[deps.FilePathsBase]] -deps = ["Compat", "Dates"] -git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2" -uuid = "48062228-2e41-5def-b9a4-89aafe57970f" -version = "0.9.24" -weakdeps = ["Mmap", "Test"] - - [deps.FilePathsBase.extensions] - FilePathsBaseMmapExt = "Mmap" - FilePathsBaseTestExt = "Test" - -[[deps.FileWatching]] -uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" -version = "1.11.0" - -[[deps.FillArrays]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "5bfcd42851cf2f1b303f51525a54dc5e98d408a3" -uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.15.0" -weakdeps = ["PDMats", "SparseArrays", "Statistics"] - - [deps.FillArrays.extensions] - FillArraysPDMatsExt = "PDMats" - FillArraysSparseArraysExt = "SparseArrays" - FillArraysStatisticsExt = "Statistics" - -[[deps.FixedPointNumbers]] -deps = ["Statistics"] -git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" -uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.5" - -[[deps.Fontconfig_jll]] -deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] -git-tree-sha1 = "f85dac9a96a01087df6e3a749840015a0ca3817d" -uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" -version = "2.17.1+0" - -[[deps.Format]] -git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" -uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" -version = "1.3.7" - -[[deps.FreeType]] -deps = ["CEnum", "FreeType2_jll"] -git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" -uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" -version = "4.1.1" - -[[deps.FreeType2_jll]] -deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" -uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.13.4+0" - -[[deps.FreeTypeAbstraction]] -deps = ["BaseDirs", "ColorVectorSpace", "Colors", "FreeType", "GeometryBasics", "Mmap"] -git-tree-sha1 = "4ebb930ef4a43817991ba35db6317a05e59abd11" -uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" -version = "0.10.8" - -[[deps.FriBidi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" -uuid = "559328eb-81f9-559d-9380-de523a88c83c" -version = "1.0.17+0" - -[[deps.GeometryBasics]] -deps = ["EarCut_jll", "Extents", "IterTools", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"] -git-tree-sha1 = "1f5a80f4ed9f5a4aada88fc2db456e637676414b" -uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" -version = "0.5.10" - - [deps.GeometryBasics.extensions] - GeometryBasicsGeoInterfaceExt = "GeoInterface" - - [deps.GeometryBasics.weakdeps] - GeoInterface = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" - -[[deps.GettextRuntime_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"] -git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340" -uuid = "b0724c58-0f36-5564-988d-3bb0596ebc4a" -version = "0.22.4+0" - -[[deps.Giflib_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6570366d757b50fabae9f4315ad74d2e40c0560a" -uuid = "59f7168a-df46-5410-90c8-f2779963d0ec" -version = "5.2.3+0" - -[[deps.Glib_jll]] -deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "6b4d2dc81736fe3980ff0e8879a9fc7c33c44ddf" -uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.86.2+0" - -[[deps.Graphics]] -deps = ["Colors", "LinearAlgebra", "NaNMath"] -git-tree-sha1 = "a641238db938fff9b2f60d08ed9030387daf428c" -uuid = "a2bd30eb-e257-5431-a919-1863eab51364" -version = "1.1.3" - -[[deps.Graphite2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8a6dbda1fd736d60cc477d99f2e7a042acfa46e8" -uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" -version = "1.3.15+0" - -[[deps.GridLayoutBase]] -deps = ["GeometryBasics", "InteractiveUtils", "Observables"] -git-tree-sha1 = "93d5c27c8de51687a2c70ec0716e6e76f298416f" -uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" -version = "0.11.2" - -[[deps.Grisu]] -git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" -uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" -version = "1.0.2" - -[[deps.HarfBuzz_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] -git-tree-sha1 = "f923f9a774fcf3f5cb761bfa43aeadd689714813" -uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" -version = "8.5.1+0" - -[[deps.HypergeometricFunctions]] -deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] -git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" -uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" -version = "0.3.28" - -[[deps.Hyperscript]] -deps = ["Test"] -git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" -uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" -version = "0.0.5" - -[[deps.HypertextLiteral]] -deps = ["Tricks"] -git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" -uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" -version = "0.9.5" - -[[deps.IOCapture]] -deps = ["Logging", "Random"] -git-tree-sha1 = "0ee181ec08df7d7c911901ea38baf16f755114dc" -uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" -version = "1.0.0" - -[[deps.ImageAxes]] -deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] -git-tree-sha1 = "e12629406c6c4442539436581041d372d69c55ba" -uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" -version = "0.6.12" - -[[deps.ImageBase]] -deps = ["ImageCore", "Reexport"] -git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" -uuid = "c817782e-172a-44cc-b673-b171935fbb9e" -version = "0.1.7" - -[[deps.ImageCore]] -deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] -git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3" -uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" -version = "0.10.5" - -[[deps.ImageIO]] -deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs", "WebP"] -git-tree-sha1 = "696144904b76e1ca433b886b4e7edd067d76cbf7" -uuid = "82e4d734-157c-48bb-816b-45c225c6df19" -version = "0.6.9" - -[[deps.ImageMetadata]] -deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] -git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec" -uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" -version = "0.9.10" - -[[deps.Imath_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "dcc8d0cd653e55213df9b75ebc6fe4a8d3254c65" -uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" -version = "3.2.2+0" - -[[deps.IndirectArrays]] -git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" -uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" -version = "1.0.0" - -[[deps.Inflate]] -git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" -uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.5" - -[[deps.IntelOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303" -uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2025.2.0+0" - -[[deps.InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" -version = "1.11.0" - -[[deps.Interfaces]] -git-tree-sha1 = "331ff37738aea1a3cf841ddf085442f31b84324f" -uuid = "85a1e053-f937-4924-92a5-1367d23b7b87" -version = "0.3.2" - -[[deps.Interpolations]] -deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] -git-tree-sha1 = "65d505fa4c0d7072990d659ef3fc086eb6da8208" -uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" -version = "0.16.2" - - [deps.Interpolations.extensions] - InterpolationsForwardDiffExt = "ForwardDiff" - InterpolationsUnitfulExt = "Unitful" - - [deps.Interpolations.weakdeps] - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.IntervalArithmetic]] -deps = ["CRlibm", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Printf", "Random", "RoundingEmulator"] -git-tree-sha1 = "02b61501dbe6da3b927cc25dacd7ce32390ee970" -uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" -version = "1.0.2" - - [deps.IntervalArithmetic.extensions] - IntervalArithmeticArblibExt = "Arblib" - IntervalArithmeticDiffRulesExt = "DiffRules" - IntervalArithmeticForwardDiffExt = "ForwardDiff" - IntervalArithmeticIntervalSetsExt = "IntervalSets" - IntervalArithmeticLinearAlgebraExt = "LinearAlgebra" - IntervalArithmeticRecipesBaseExt = "RecipesBase" - IntervalArithmeticSparseArraysExt = "SparseArrays" - - [deps.IntervalArithmetic.weakdeps] - Arblib = "fb37089c-8514-4489-9461-98f9c8763369" - DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" - LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - -[[deps.IntervalSets]] -git-tree-sha1 = "d966f85b3b7a8e49d034d27a189e9a4874b4391a" -uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.7.13" -weakdeps = ["Random", "RecipesBase", "Statistics"] - - [deps.IntervalSets.extensions] - IntervalSetsRandomExt = "Random" - IntervalSetsRecipesBaseExt = "RecipesBase" - IntervalSetsStatisticsExt = "Statistics" - -[[deps.InverseFunctions]] -git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" -uuid = "3587e190-3f89-42d0-90ee-14403ec27112" -version = "0.1.17" -weakdeps = ["Dates", "Test"] - - [deps.InverseFunctions.extensions] - InverseFunctionsDatesExt = "Dates" - InverseFunctionsTestExt = "Test" - -[[deps.InvertedIndices]] -git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe" -uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" -version = "1.3.1" - -[[deps.IrrationalConstants]] -git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758" -uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.2.6" - -[[deps.Isoband]] -deps = ["isoband_jll"] -git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" -uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" -version = "0.1.1" - -[[deps.IterTools]] -git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" -uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" -version = "1.10.0" - -[[deps.IteratorInterfaceExtensions]] -git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" -uuid = "82899510-4779-5014-852e-03e436cf321d" -version = "1.0.0" - -[[deps.JLLWrappers]] -deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "0533e564aae234aff59ab625543145446d8b6ec2" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.7.1" - -[[deps.JSON]] -deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"] -git-tree-sha1 = "5b6bb73f555bc753a6153deec3717b8904f5551c" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "1.3.0" - - [deps.JSON.extensions] - JSONArrowExt = ["ArrowTypes"] - - [deps.JSON.weakdeps] - ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" - -[[deps.JpegTurbo]] -deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] -git-tree-sha1 = "9496de8fb52c224a2e3f9ff403947674517317d9" -uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" -version = "0.1.6" - -[[deps.JpegTurbo_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "b6893345fd6658c8e475d40155789f4860ac3b21" -uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "3.1.4+0" - -[[deps.JuliaSyntaxHighlighting]] -deps = ["StyledStrings"] -uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011" -version = "1.12.0" - -[[deps.KernelDensity]] -deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] -git-tree-sha1 = "ba51324b894edaf1df3ab16e2cc6bc3280a2f1a7" -uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" -version = "0.6.10" - -[[deps.LAME_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "059aabebaa7c82ccb853dd4a0ee9d17796f7e1bc" -uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.3+0" - -[[deps.LERC_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" -uuid = "88015f11-f218-50d7-93a8-a6af411a945d" -version = "4.0.1+0" - -[[deps.LLVMOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "eb62a3deb62fc6d8822c0c4bef73e4412419c5d8" -uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" -version = "18.1.8+0" - -[[deps.LZO_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" -uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" -version = "2.10.3+0" - -[[deps.LaTeXStrings]] -git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" -uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.4.0" - -[[deps.LazyArtifacts]] -deps = ["Artifacts", "Pkg"] -uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" -version = "1.11.0" - -[[deps.LazyModules]] -git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" -uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" -version = "0.3.1" - -[[deps.LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" -version = "0.6.4" - -[[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"] -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.15.0+0" - -[[deps.LibGit2]] -deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" -version = "1.11.0" - -[[deps.LibGit2_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"] -uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.9.0+0" - -[[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "OpenSSL_jll"] -uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.11.3+1" - -[[deps.Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" -version = "1.11.0" - -[[deps.Libffi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a" -uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" -version = "3.4.7+0" - -[[deps.Libglvnd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] -git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0" -uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" -version = "1.7.1+1" - -[[deps.Libiconv_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" -uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" -version = "1.18.0+0" - -[[deps.Libmount_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "3acf07f130a76f87c041cfb2ff7d7284ca67b072" -uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.41.2+0" - -[[deps.Libtiff_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "f04133fe05eff1667d2054c53d59f9122383fe05" -uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.7.2+0" - -[[deps.Libuuid_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "2a7a12fc0a4e7fb773450d17975322aa77142106" -uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.41.2+0" - -[[deps.LinearAlgebra]] -deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -version = "1.12.0" - -[[deps.LogExpFunctions]] -deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.29" - - [deps.LogExpFunctions.extensions] - LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" - LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" - LogExpFunctionsInverseFunctionsExt = "InverseFunctions" - - [deps.LogExpFunctions.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - -[[deps.Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" -version = "1.11.0" - -[[deps.MIMEs]] -git-tree-sha1 = "c64d943587f7187e751162b3b84445bbbd79f691" -uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" -version = "1.1.0" - -[[deps.MKL_jll]] -deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] -git-tree-sha1 = "282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa" -uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -version = "2025.2.0+0" - -[[deps.MacroTools]] -git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" -uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.16" - -[[deps.Makie]] -deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "ComputePipeline", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "Pkg", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] -git-tree-sha1 = "b41bbd001365f32f09b31a186c1fe6cdd88ff556" -repo-rev = "ff/dim-converts" -repo-subdir = "Makie" -repo-url = "https://github.com/MakieOrg/Makie.jl" -uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -version = "0.24.8" -weakdeps = ["DynamicQuantities"] - - [deps.Makie.extensions] - MakieDynamicQuantitiesExt = "DynamicQuantities" - -[[deps.MappedArrays]] -git-tree-sha1 = "0ee4497a4e80dbd29c058fcee6493f5219556f40" -uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" -version = "0.4.3" - -[[deps.Markdown]] -deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" -version = "1.11.0" - -[[deps.MathTeXEngine]] -deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] -git-tree-sha1 = "7eb8cdaa6f0e8081616367c10b31b9d9b34bb02a" -uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" -version = "0.6.7" - -[[deps.Missings]] -deps = ["DataAPI"] -git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" -uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.2.0" - -[[deps.Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" -version = "1.11.0" - -[[deps.MosaicViews]] -deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] -git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" -uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" -version = "0.3.4" - -[[deps.MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2025.5.20" - -[[deps.NaNMath]] -deps = ["OpenLibm_jll"] -git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" -uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "1.1.3" - -[[deps.Netpbm]] -deps = ["FileIO", "ImageCore", "ImageMetadata"] -git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" -uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" -version = "1.1.1" - -[[deps.NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.3.0" - -[[deps.Observables]] -git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" -uuid = "510215fc-4207-5dde-b226-833fc4488ee2" -version = "0.5.5" - -[[deps.OffsetArrays]] -git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151" -uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.17.0" -weakdeps = ["Adapt"] - - [deps.OffsetArrays.extensions] - OffsetArraysAdaptExt = "Adapt" - -[[deps.Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "b6aa4566bb7ae78498a5e68943863fa8b5231b59" -uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.6+0" - -[[deps.OpenBLASConsistentFPCSR_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "567515ca155d0020a45b05175449b499c63e7015" -uuid = "6cdc7f73-28fd-5e50-80fb-958a8875b1af" -version = "0.3.29+0" - -[[deps.OpenBLAS_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] -uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.29+0" - -[[deps.OpenEXR]] -deps = ["Colors", "FileIO", "OpenEXR_jll"] -git-tree-sha1 = "97db9e07fe2091882c765380ef58ec553074e9c7" -uuid = "52e1d378-f018-4a11-a4be-720524705ac7" -version = "0.3.3" - -[[deps.OpenEXR_jll]] -deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "df9b7c88c2e7a2e77146223c526bf9e236d5f450" -uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" -version = "3.4.4+0" - -[[deps.OpenLibm_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.7+0" - -[[deps.OpenSSL_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.5.4+0" - -[[deps.OpenSpecFun_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" -uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" -version = "0.5.6+0" - -[[deps.Opus_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c392fc5dd032381919e3b22dd32d6443760ce7ea" -uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.5.2+0" - -[[deps.OrderedCollections]] -git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.8.1" - -[[deps.PCRE2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.44.0+1" - -[[deps.PDMats]] -deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "e4cff168707d441cd6bf3ff7e4832bdf34278e4a" -uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.37" -weakdeps = ["StatsBase"] - - [deps.PDMats.extensions] - StatsBaseExt = "StatsBase" - -[[deps.PNGFiles]] -deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] -git-tree-sha1 = "cf181f0b1e6a18dfeb0ee8acc4a9d1672499626c" -uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" -version = "0.4.4" - -[[deps.Packing]] -deps = ["GeometryBasics"] -git-tree-sha1 = "bc5bf2ea3d5351edf285a06b0016788a121ce92c" -uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" -version = "0.5.1" - -[[deps.PaddedViews]] -deps = ["OffsetArrays"] -git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" -uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" -version = "0.5.12" - -[[deps.Pango_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "0662b083e11420952f2e62e17eddae7fc07d5997" -uuid = "36c8627f-9965-5494-a995-c6b170f724f3" -version = "1.57.0+0" - -[[deps.Parsers]] -deps = ["Dates", "PrecompileTools", "UUIDs"] -git-tree-sha1 = "7d2f8f21da5db6a806faf7b9b292296da42b2810" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.8.3" - -[[deps.Pixman_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] -git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53" -uuid = "30392449-352a-5448-841d-b1acce4e97dc" -version = "0.44.2+0" - -[[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.12.1" -weakdeps = ["REPL"] - - [deps.Pkg.extensions] - REPLExt = "REPL" - -[[deps.PkgVersion]] -deps = ["Pkg"] -git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" -uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" -version = "0.3.3" - -[[deps.PlotUtils]] -deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] -git-tree-sha1 = "26ca162858917496748aad52bb5d3be4d26a228a" -uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.4.4" - -[[deps.PlutoUI]] -deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Downloads", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] -git-tree-sha1 = "6ed167db158c7c1031abf3bd67f8e689c8bdf2b7" -uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" -version = "0.7.77" - -[[deps.PolygonOps]] -git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" -uuid = "647866c9-e3ac-4575-94e7-e3d426903924" -version = "0.1.2" - -[[deps.PrecompileTools]] -deps = ["Preferences"] -git-tree-sha1 = "07a921781cab75691315adc645096ed5e370cb77" -uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.3.3" - -[[deps.Preferences]] -deps = ["TOML"] -git-tree-sha1 = "522f093a29b31a93e34eaea17ba055d850edea28" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.5.1" - -[[deps.Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" -version = "1.11.0" - -[[deps.ProgressMeter]] -deps = ["Distributed", "Printf"] -git-tree-sha1 = "fbb92c6c56b34e1a2c4c36058f68f332bec840e7" -uuid = "92933f4c-e287-5a05-a399-4b506db050ca" -version = "1.11.0" - -[[deps.PtrArrays]] -git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" -uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" -version = "1.3.0" - -[[deps.QOI]] -deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] -git-tree-sha1 = "472daaa816895cb7aee81658d4e7aec901fa1106" -uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" -version = "1.0.2" - -[[deps.QuadGK]] -deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" -uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.11.2" - - [deps.QuadGK.extensions] - QuadGKEnzymeExt = "Enzyme" - - [deps.QuadGK.weakdeps] - Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" - -[[deps.REPL]] -deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" -version = "1.11.0" - -[[deps.Random]] -deps = ["SHA"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" -version = "1.11.0" - -[[deps.RangeArrays]] -git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" -uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" -version = "0.3.2" - -[[deps.Ratios]] -deps = ["Requires"] -git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" -uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" -version = "0.4.5" -weakdeps = ["FixedPointNumbers"] - - [deps.Ratios.extensions] - RatiosFixedPointNumbersExt = "FixedPointNumbers" - -[[deps.RecipesBase]] -deps = ["PrecompileTools"] -git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" -uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" -version = "1.3.4" - -[[deps.Reexport]] -git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" -uuid = "189a3867-3050-52da-a836-e630ba90ab69" -version = "1.2.2" - -[[deps.RelocatableFolders]] -deps = ["SHA", "Scratch"] -git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" -uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" -version = "1.0.1" - -[[deps.Requires]] -deps = ["UUIDs"] -git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" -uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.3.1" - -[[deps.Rmath]] -deps = ["Random", "Rmath_jll"] -git-tree-sha1 = "5b3d50eb374cea306873b371d3f8d3915a018f0b" -uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" -version = "0.9.0" - -[[deps.Rmath_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" -uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" -version = "0.5.1+0" - -[[deps.RoundingEmulator]] -git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" -uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" -version = "0.2.1" - -[[deps.SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" -version = "0.7.0" - -[[deps.SIMD]] -deps = ["PrecompileTools"] -git-tree-sha1 = "e24dc23107d426a096d3eae6c165b921e74c18e4" -uuid = "fdea26ae-647d-5447-a871-4b548cad5224" -version = "3.7.2" - -[[deps.Scratch]] -deps = ["Dates"] -git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" -uuid = "6c6a2e73-6563-6170-7368-637461726353" -version = "1.3.0" - -[[deps.Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" -version = "1.11.0" - -[[deps.ShaderAbstractions]] -deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"] -git-tree-sha1 = "818554664a2e01fc3784becb2eb3a82326a604b6" -uuid = "65257c39-d410-5151-9873-9b3e5be5013e" -version = "0.5.0" - -[[deps.SharedArrays]] -deps = ["Distributed", "Mmap", "Random", "Serialization"] -uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" -version = "1.11.0" - -[[deps.Showoff]] -deps = ["Dates", "Grisu"] -git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" -uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" -version = "1.0.3" - -[[deps.SignedDistanceFields]] -deps = ["Statistics"] -git-tree-sha1 = "3949ad92e1c9d2ff0cd4a1317d5ecbba682f4b92" -uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" -version = "0.4.1" - -[[deps.SimpleTraits]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "be8eeac05ec97d379347584fa9fe2f5f76795bcb" -uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.5" - -[[deps.Sixel]] -deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] -git-tree-sha1 = "0494aed9501e7fb65daba895fb7fd57cc38bc743" -uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" -version = "0.1.5" - -[[deps.Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" -version = "1.11.0" - -[[deps.SortingAlgorithms]] -deps = ["DataStructures"] -git-tree-sha1 = "64d974c2e6fdf07f8155b5b2ca2ffa9069b608d9" -uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.2.2" - -[[deps.SparseArrays]] -deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.12.0" - -[[deps.SpecialFunctions]] -deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "f2685b435df2613e25fc10ad8c26dddb8640f547" -uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.6.1" -weakdeps = ["ChainRulesCore"] - - [deps.SpecialFunctions.extensions] - SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" - -[[deps.StableRNGs]] -deps = ["Random"] -git-tree-sha1 = "4f96c596b8c8258cc7d3b19797854d368f243ddc" -uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" -version = "1.0.4" - -[[deps.StackViews]] -deps = ["OffsetArrays"] -git-tree-sha1 = "be1cf4eb0ac528d96f5115b4ed80c26a8d8ae621" -uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" -version = "0.1.2" - -[[deps.StaticArrays]] -deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "eee1b9ad8b29ef0d936e3ec9838c7ec089620308" -uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.16" -weakdeps = ["ChainRulesCore", "Statistics"] - - [deps.StaticArrays.extensions] - StaticArraysChainRulesCoreExt = "ChainRulesCore" - StaticArraysStatisticsExt = "Statistics" - -[[deps.StaticArraysCore]] -git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a" -uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.4" - -[[deps.Statistics]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.11.1" -weakdeps = ["SparseArrays"] - - [deps.Statistics.extensions] - SparseArraysExt = ["SparseArrays"] - -[[deps.StatsAPI]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "178ed29fd5b2a2cfc3bd31c13375ae925623ff36" -uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.8.0" - -[[deps.StatsBase]] -deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "be5733d4a2b03341bdcab91cea6caa7e31ced14b" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.9" - -[[deps.StatsFuns]] -deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "91f091a8716a6bb38417a6e6f274602a19aaa685" -uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "1.5.2" -weakdeps = ["ChainRulesCore", "InverseFunctions"] - - [deps.StatsFuns.extensions] - StatsFunsChainRulesCoreExt = "ChainRulesCore" - StatsFunsInverseFunctionsExt = "InverseFunctions" - -[[deps.StructArrays]] -deps = ["ConstructionBase", "DataAPI", "Tables"] -git-tree-sha1 = "a2c37d815bf00575332b7bd0389f771cb7987214" -uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" -version = "0.7.2" - - [deps.StructArrays.extensions] - StructArraysAdaptExt = "Adapt" - StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"] - StructArraysLinearAlgebraExt = "LinearAlgebra" - StructArraysSparseArraysExt = "SparseArrays" - StructArraysStaticArraysExt = "StaticArrays" - - [deps.StructArrays.weakdeps] - Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" - GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" - KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" - LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - -[[deps.StructUtils]] -deps = ["Dates", "UUIDs"] -git-tree-sha1 = "79529b493a44927dd5b13dde1c7ce957c2d049e4" -uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42" -version = "2.6.0" - - [deps.StructUtils.extensions] - StructUtilsMeasurementsExt = ["Measurements"] - StructUtilsTablesExt = ["Tables"] - - [deps.StructUtils.weakdeps] - Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" - Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" - -[[deps.StyledStrings]] -uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" -version = "1.11.0" - -[[deps.SuiteSparse]] -deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] -uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" - -[[deps.SuiteSparse_jll]] -deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] -uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.8.3+2" - -[[deps.TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" -version = "1.0.3" - -[[deps.TableTraits]] -deps = ["IteratorInterfaceExtensions"] -git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" -uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" -version = "1.0.1" - -[[deps.Tables]] -deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] -git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" -uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.12.1" - -[[deps.Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" -version = "1.10.0" - -[[deps.TensorCore]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" -uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" -version = "0.1.1" - -[[deps.Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -version = "1.11.0" - -[[deps.TestItems]] -git-tree-sha1 = "42fd9023fef18b9b78c8343a4e2f3813ffbcefcb" -uuid = "1c621080-faea-4a02-84b6-bbd5e436b8fe" -version = "1.0.0" - -[[deps.TiffImages]] -deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "PrecompileTools", "ProgressMeter", "SIMD", "UUIDs"] -git-tree-sha1 = "98b9352a24cb6a2066f9ababcc6802de9aed8ad8" -uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" -version = "0.11.6" - -[[deps.TranscodingStreams]] -git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" -uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.11.3" - -[[deps.Tricks]] -git-tree-sha1 = "311349fd1c93a31f783f977a71e8b062a57d4101" -uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" -version = "0.1.13" - -[[deps.TriplotBase]] -git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" -uuid = "981d1d27-644d-49a2-9326-4793e63143c3" -version = "0.1.0" - -[[deps.URIs]] -git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a" -uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.6.1" - -[[deps.UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" -version = "1.11.0" - -[[deps.Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" -version = "1.11.0" - -[[deps.UnicodeFun]] -deps = ["REPL"] -git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" -uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" -version = "0.4.1" - -[[deps.Unitful]] -deps = ["Dates", "LinearAlgebra", "Random"] -git-tree-sha1 = "c25751629f5baaa27fef307f96536db62e1d754e" -uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" -version = "1.27.0" - - [deps.Unitful.extensions] - ConstructionBaseUnitfulExt = "ConstructionBase" - ForwardDiffExt = "ForwardDiff" - InverseFunctionsUnitfulExt = "InverseFunctions" - LatexifyExt = ["Latexify", "LaTeXStrings"] - NaNMathExt = "NaNMath" - PrintfExt = "Printf" - - [deps.Unitful.weakdeps] - ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" - Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" - NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" - Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[deps.WebP]] -deps = ["CEnum", "ColorTypes", "FileIO", "FixedPointNumbers", "ImageCore", "libwebp_jll"] -git-tree-sha1 = "aa1ca3c47f119fbdae8770c29820e5e6119b83f2" -uuid = "e3aaa7dc-3e4b-44e0-be63-ffb868ccd7c1" -version = "0.1.3" - -[[deps.WoodburyMatrices]] -deps = ["LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" -uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" -version = "1.0.0" - -[[deps.XZ_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "9cce64c0fdd1960b597ba7ecda2950b5ed957438" -uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" -version = "5.8.2+0" - -[[deps.Xorg_libX11_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "b5899b25d17bf1889d25906fb9deed5da0c15b3b" -uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.8.12+0" - -[[deps.Xorg_libXau_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" -uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" -version = "1.0.13+0" - -[[deps.Xorg_libXdmcp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" -uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" -version = "1.1.6+0" - -[[deps.Xorg_libXext_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "a4c0ee07ad36bf8bbce1c3bb52d21fb1e0b987fb" -uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.7+0" - -[[deps.Xorg_libXrender_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" -uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" -version = "0.9.12+0" - -[[deps.Xorg_libxcb_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] -git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" -uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" -version = "1.17.1+0" - -[[deps.Xorg_xtrans_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" -uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" -version = "1.6.0+0" - -[[deps.Zlib_jll]] -deps = ["Libdl"] -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.3.1+2" - -[[deps.Zstd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" -uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.5.7+1" - -[[deps.isoband_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" -uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" -version = "0.2.3+0" - -[[deps.libaom_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "371cc681c00a3ccc3fbc5c0fb91f58ba9bec1ecf" -uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" -version = "3.13.1+0" - -[[deps.libass_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "125eedcb0a4a0bba65b657251ce1d27c8714e9d6" -uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.17.4+0" - -[[deps.libblastrampoline_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.15.0+0" - -[[deps.libfdk_aac_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "646634dd19587a56ee2f1199563ec056c5f228df" -uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.4+0" - -[[deps.libpng_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "de8ab4f01cb2d8b41702bab9eaad9e8b7d352f73" -uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.53+0" - -[[deps.libsixel_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"] -git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a" -uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" -version = "1.10.5+0" - -[[deps.libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll"] -git-tree-sha1 = "11e1772e7f3cc987e9d3de991dd4f6b2602663a5" -uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.8+0" - -[[deps.libwebp_jll]] -deps = ["Artifacts", "Giflib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Libtiff_jll", "libpng_jll"] -git-tree-sha1 = "4e4282c4d846e11dce56d74fa8040130b7a95cb3" -uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2" -version = "1.6.0+0" - -[[deps.nghttp2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.64.0+1" - -[[deps.oneTBB_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "1350188a69a6e46f799d3945beef36435ed7262f" -uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" -version = "2022.0.0+1" - -[[deps.p7zip_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] -uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.7.0+0" - -[[deps.x264_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7" -uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" -version = "10164.0.1+0" - -[[deps.x265_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "e7b67590c14d487e734dcb925924c5dc43ec85f3" -uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "4.1.0+0" +# ╔═╡ d21ab65d-5ea0-4eca-8d1b-09fc83daf3b0 +md""" +## Utility functions """ +# ╔═╡ e0d2d6c4-d363-4bb2-9d12-42c4a52aba3b +function side_by_side(content=nothing) + @htl(""" + + + $(content) + """) +end + +# ╔═╡ 60c89d86-942e-4c97-bd7a-ad2f792b1155 +md""" +## 1. Galaxy mass + +In this first example, we will use objects with units to estimate a hypothetical galaxy's mass, given its half-light radius and radial velocities of stars in the galaxy. + +Let's assume that we measured the half-light radius of the galaxy to be 29 pc projected on the sky at the distance of the galaxy. This radius is often called the "effective radius", so we'll store it with the name `Reff`. The easiest way to create an object with units is by multiplying the value with its unit: +""" |> side_by_side + +# ╔═╡ a9d14d8e-aefa-48d9-a3b3-ca13e284ab08 +md""" +We can access the value and unit of quantities using the `ustrip()` and `dimension()`/`unit()` functions: +""" |> side_by_side + +# ╔═╡ cc736aec-c48a-411a-af83-4255309d77e9 +md""" +Furthermore, we can convert the radius to any other unit of length using the `uconvert()` function. Here, we convert it to kilometers: +""" |> side_by_side + +# ╔═╡ b7f7e8e2-7f26-4d27-8dc5-8204761a9965 +md""" +Units are also "callable," meaning we can treat them like functions. Even though the first example with calling a unit is a bit awkward, the `|>` syntax makes it much more natural: +""" |> side_by_side + +# ╔═╡ eb31da4c-7011-49ec-a9ac-194eaee10c7a +md"""using the `Normal` distribution from the Distributions.jl package: +""" |> side_by_side + +# ╔═╡ f7ceb7c4-6488-43eb-b211-9f7087762a56 +md""" +which we can then visualize with Makie.jl using its automatic unit support: +""" |> side_by_side + +# ╔═╡ ce5aea87-2614-4e72-8e88-25a8c590b89f +md""" +Now we can calculate the velocity dispersion of the galaxy. This demonstrates how you can perform basic operations like subtraction and division with objects with units, and also use them in standard Julia functions such as `mean()` and `size()`. They retain their units through these operations just as you would expect them to: +""" |> side_by_side + +# ╔═╡ bb9d675b-00ce-4d20-b78b-a08835b47137 +md""" +Now for the actual mass calculation. If a galaxy is pressure-supported (for example, an elliptical or dwarf spheroidal galaxy), its mass within the stellar extent can be estimated using a straightforward formula: ``M_{1/2} = 4σ^2 R_\text{eff}/G``. There are caveats to the use of this formula for science -- see [Wolf et al. 2010](http://ui.adsabs.harvard.edu/abs/2010MNRAS.406.1220W/abstract) for details. + +!!! note + Constants [are included in DQ](https://juliaphysics.github.io/DynamicQuantities.jl/stable/constants/): + + ```julia + using DynamicQuantities: Constants as C_DQ + ``` + + For demonstration purposes, we will actually be importing from `SymbolicConstants` instead. In practice, it is much more performant to work in the base SI system provided by `Constants`, and just convert to whatever units are desired in the end. + + For Unitful.jl, a separate package like [PhysicalConstants.jl for Unitful.jl](https://juliaphysics.github.io/PhysicalConstants.jl/stable/) is required: + + ```julia + using PhysicalConstants: CODATA2018 as C_U + ``` +""" |> side_by_side + +# ╔═╡ 0ab125c6-568b-414c-acaa-abcfebb559e2 +md""" +We can also easily express the mass in whatever form we like -- solar masses are common in astronomy, or maybe you want the default SI and CGS units: +""" |> side_by_side + +# ╔═╡ 5f438b76-7fc7-49ed-8a0a-7f2d5a760414 +md""" +Or, if you want the log of the mass, you can just use the builtin `log10` as long as the logarithm's argument is dimensionless. +""" |> side_by_side + +# ╔═╡ 5a9dfdf7-aaf8-421d-a451-6a6a5c35e1cc +md""" +Note that this is different than: +""" |> side_by_side + +# ╔═╡ a3f42e7e-af38-46b0-b1fb-bdbf77312e16 +md""" +emphasizing the importance of being explicit with our units. Similarly, taking the logarithm of something with units is not mathematically well defined, so this will sensibly error as well: +""" |> side_by_side + +# ╔═╡ 78740b86-45e9-45f5-b4c2-be6cb65f1368 +md""" +### Setting up the data cube + +Let's assume that we've mapped the inner part of a molecular cloud in the ``J = 1 - 0`` rotational transition of ``\mathrm{C}^{18}\mathrm{O}`` and are interested in measuring its total mass. The measurement produced a data cube with RA and Dec as spatial coordiates and velocity as the third axis. Each voxel in this data cube represents the brightness temperature of the emission at that position and velocity. Furthermore, we'll assume that we have an independent measurement of distance to the cloud ``d = 250\, \mathrm{pc}`` and that the excitation temperature is known and constant throughout the cloud: ``T_\text{ex} = 25\, \mathrm{K}``: +""" |> side_by_side + +# ╔═╡ b86a31df-9de1-4e27-8ca7-ce7f3d2576fa +md""" +We'll generate a synthetic dataset, assuming the cloud follows a Gaussian distribution in each of RA, Dec, and velocity. We start by creating a 100×100×300 array, such that the first coordinate is right ascension, the second is declination, and the third is velocity. In this data cube, the cloud is positioned at the center, with ``\sigma`` and the center in each dimension shown below: +""" |> side_by_side + +# ╔═╡ e13cbda5-ddd4-491e-bf2a-d6ed24d2bdbd +md""" +Note in particular that the ``\sigma`` for RA and Dec have different units from the center, but we are able to automatically handle the relevant conversions before computing the exponential: +""" |> side_by_side + +# ╔═╡ 00b9d37f-ce7b-4491-b1df-f0963f2598a8 +md""" +We will also need to know the size of each pixel: +""" |> side_by_side + +# ╔═╡ ccb58b55-b9c8-4229-aff8-92541af123ec +md""" +and the width of each velocity bin: +""" |> side_by_side + +# ╔═╡ 7ab2fe80-812f-4a21-933a-e169a17f6c32 +md""" +We're interested in the integrated intensity over all of the velocity channels, so let's create a 2D quantity array by summing our data cube along the velocity axis (multiplying by the velocity width of a pixel): +""" |> side_by_side + +# ╔═╡ 4ee79c7c-5c4e-457b-b713-103937e50355 +md""" +We can plot the 2D quantity using Makie's `heatmap` function: +""" |> side_by_side + +# ╔═╡ 3a3328d5-31de-4deb-bff7-d25c1fcbc4ef +md""" +Here we have given an expression for ``C`` scaled to the values for ``\mathrm{C}^{13}\mathrm{O}`` (``\nu_{13}`` and ``A_{13}``). In order to use this relation for ``\mathrm{C}^{18}\mathrm{O}``, we need to rescale the frequencies ``\nu`` and the Einstein coefficients (``A``). Lastly, ``C`` is in funny mixed units, but that's okay. We'll be able to do our unit handling in the usual way. + +First, we look up the wavelength for these emission lines and store them as quantities: +""" |> side_by_side + +# ╔═╡ e0a2c745-41cf-4359-bb99-3117fbb507cc +md""" +Since the wavelength and frequency of light are related using the speed of light, we can convert between them. However, doing so just using the `uconvert()` function or its equivalent `|>` fails, as units of length and frequency are not directly convertible: +""" |> side_by_side + +# ╔═╡ 7fa76f60-c623-4b25-b185-0cd5e805ef71 +md""" +Fortunately, the Unitful.jl ecosystem comes to the rescue by providing a feature called "unit equivalences." Equivalences provide a way to convert between two physically different units that are not normally equivalent, but in a certain context have a one-to-one mapping. For more on equivalencies, see [the documentation for UnitfulEquivalences.jl](https://sostock.github.io/UnitfulEquivalences.jl) (UE). + +In this case, passing the `Spectral()` argument to `uconvert()` provides the equivalences necessary to handle conversions between wavelength and frequency: +""" |> side_by_side + +# ╔═╡ d0215082-52df-4eae-a409-7c3c7cfc69ed +md""" +Next, we look up Einstein coefficients (in units of s⁻¹), and calculate the ratios in constant ``CC``. Note how the ratios of frequency and Einstein coefficient units are dimensionless, so the unit of ``CC`` is unchanged: +""" |> side_by_side + +# ╔═╡ d9e2b828-9c32-4638-bfcd-0c16b221aa43 +md""" +Now we move on to calculate the constant ``B``. This is given by the ratio of ``\dfrac{hν}{k_\text{B}T}``, where ``h`` is Planck's constant, ``k_\text{B}`` is the Boltzmann's constant, ``ν`` is the emission frequency, and ``T`` is the excitation temperature. The constants were imported from `DynamicQuantities.Constants`, and the other two values are already calculated, so here we just take the ratio: +""" |> side_by_side + +# ╔═╡ a0b64ba9-cbec-404e-bf39-aee03ae407ae +md""" +!!! note + Note how DynamicQuantities.jl intelligently cancelled the units for us, while still keeping this as a `Quantity` object. For Unitful.jl, a conversion to `NoUnits` is needed. In practice, it is generaly prefable to not worry about these intermediate units and just convert eveything at the end. +""" |> side_by_side + +# ╔═╡ 6aff587f-be6f-4fd8-96df-9c12f3769f32 +md""" +At this point we have all the ingredients to calculate the number density of ``\mathrm{CO}`` molecules in this cloud. We already integrated (summed) over the velocity channels above to show the integrated intensity map, but we'll do it again here for clarity. This gives us the column density of ``\mathrm{CO}`` for each spatial pixel in our map: +""" |> side_by_side + +# ╔═╡ 63d629a1-379f-44bd-a02d-d252d0594357 +md""" +We can then print out the peak column column density: +""" |> side_by_side + +# ╔═╡ 072535ef-9a0d-4c1e-aea7-6486d329f66f +md""" +we can calculate the ``\text{H}_2`` column density by multiplying the ``\mathrm{CO}`` column density found previously with this ratio: +""" |> side_by_side + +# ╔═╡ 00f69c40-f31c-49e6-a1cc-d84a4cb2b43d +md""" +The peak column column density is then: +""" |> side_by_side + +# ╔═╡ c6b35992-973b-49d4-bfa7-855e8fe10924 +md""" +That's a peak column density of roughly 50 magnitudes of visual extinction (assuming the conversion between ``N_{\mathrm{H}_2}`` and ``A_V`` from [Bohlin et al. 1978](http://ui.adsabs.harvard.edu/abs/1978ApJ...224..132B/abstract)), which seems reasonable for a molecular cloud. + +We obtain the mass column density by multiplying the number column density by the mass of an individual ``\mathrm{H_2}`` molecule: +""" |> side_by_side + +# ╔═╡ fbd0d75b-b3af-4eb5-a249-423317d656e5 +md""" +A final step in going from the column density to mass is summing up over the area. If we do this in the straightforward way of length × width of a pixel, this area is then in units of deg²: +""" |> side_by_side + +# ╔═╡ a427567e-b6dd-44a9-a61f-a725960cc459 +md""" +In the small angle approximation, multiplying the pixel area with the square of distance yields the cross-sectional area of the cloud that the pixel covers, in physical units: +""" |> side_by_side + +# ╔═╡ cefdeee7-6a4b-4c60-a14c-c1edac53be98 +md""" +Angles in both packages are dimensionless by default, so the above quantities can be freely converted to other compatible dimensions: +""" |> side_by_side + +# ╔═╡ e81f3b44-bc04-4768-81c2-c2733958f5a9 +md""" +Finally, multiplying the column density with the pixel area and summing over all the pixels gives us the cloud mass: +""" |> side_by_side + +# ╔═╡ 71cca345-cffc-4aee-a671-08901a92babe +md""" +And now they tell all their friends how terrible the instrument is, because it's supposed to have arcsecond resolution, but your function clearly shows it can only resolve an arcmin at best. But you can solve this by requiring they pass in Quantity objects. The new function could simply be: +""" |> side_by_side + +# ╔═╡ 7cfb17fc-81a4-4522-a88b-2fd10001baaa +md""" +And your collaborator now has to pay attention. If they just blindly put in a number, they get an error: +""" |> side_by_side + +# ╔═╡ 5590c909-6103-4427-b1a2-4cf35265dc07 +md""" +which is their cue to provide the units explicitly: +""" |> side_by_side + # ╔═╡ Cell order: # ╟─c6ad0267-65d1-4372-a538-22acd9b5d02b # ╟─05b485e7-115a-4dbb-aa73-0ca6ace2f5c0 # ╠═fd88a6c1-0abe-4a5a-9414-bb15730c9d18 # ╟─60c89d86-942e-4c97-bd7a-ad2f792b1155 # ╠═1d2293bd-a236-4b41-a9d7-9c27463b5062 -# ╠═9b6e871f-0a49-4a24-a9b0-51e3008d6db4 +# ╠═426c37ea-83dd-4ef4-8a19-f0e16536c034 +# ╟─a9d14d8e-aefa-48d9-a3b3-ca13e284ab08 # ╠═1b239188-bba1-44d1-bc9c-10b60f762e0d -# ╠═cecd879b-2d95-4150-8caf-c327165ddec6 +# ╠═f2c441b3-374b-439d-ba8c-4b28c0765d45 # ╟─cc736aec-c48a-411a-af83-4255309d77e9 +# ╠═7ba07e6b-34e0-4206-9cf7-5006c43635a6 +# ╠═d6e4fd70-8750-457f-a17f-9a044c25c482 +# ╟─b7f7e8e2-7f26-4d27-8dc5-8204761a9965 # ╠═2c7a71f6-e618-40db-80b7-1ad5f09e59d5 +# ╠═2a11aed4-6516-40dc-94fd-30aa94e76744 +# ╟─984fcb2e-049b-4b35-a4b6-5c8c686921a3 # ╟─c5b4f340-c774-4f09-af4c-f326afce5de3 +# ╠═2da8169e-a39d-4314-87c0-60b57f80ae96 +# ╟─eb31da4c-7011-49ec-a9ac-194eaee10c7a # ╠═892f19a6-af21-4353-9987-9de795ba7ad7 -# ╠═808f338d-7faa-4d97-ad7b-a7b4066c83f8 -# ╠═59af301c-0713-4c93-a824-7375f8c4f761 +# ╠═64774c2c-0991-48b2-af4a-ced8fedd115b +# ╟─f7ceb7c4-6488-43eb-b211-9f7087762a56 +# ╠═9f14f051-d1e9-4638-8008-840a886b50ab +# ╠═0cd8f84d-a6aa-46c7-9e13-535e8e0cea1f +# ╟─ce5aea87-2614-4e72-8e88-25a8c590b89f # ╠═2d236d32-faf4-41ef-84de-1d40c02fb238 -# ╠═64bfb535-ab84-411c-9a1b-3ed8778e8516 +# ╠═b388f8be-3074-443c-97a9-72eb7098b5e3 +# ╟─bb9d675b-00ce-4d20-b78b-a08835b47137 # ╠═a3baf049-5419-4773-8b7f-0ba07a9f1728 +# ╠═efa15492-4811-4896-8947-b90191651952 +# ╟─0ab125c6-568b-414c-acaa-abcfebb559e2 # ╠═bb2622f9-98a5-48ca-92cb-bbce84d797f1 +# ╠═14909ad6-eb42-48ab-afa7-8b40b700fe3b +# ╟─5f438b76-7fc7-49ed-8a0a-7f2d5a760414 # ╠═9e13bde0-eccf-4d21-b603-fd186e87b7d0 +# ╠═77a81c41-0034-4a18-bb70-d2a1f9379593 # ╟─5a9dfdf7-aaf8-421d-a451-6a6a5c35e1cc # ╠═a13de611-145a-40da-9414-8f3f8f85ad98 +# ╠═1e24cdfa-f4a9-4f9e-b95d-af83e724cd90 # ╟─a3f42e7e-af38-46b0-b1fb-bdbf77312e16 # ╠═095e7efe-f4c6-4a8a-a029-03ce97cd15bd +# ╠═e4a98c65-70de-42fc-b490-f019dd93d3fb # ╟─2648b454-2762-4941-b13c-2303ffcd6521 # ╠═48fac714-ab96-4475-ad0b-0c61432bf849 # ╟─9e8eabc7-f1ce-4dbb-bfd5-e6d28793f9d6 # ╟─78740b86-45e9-45f5-b4c2-be6cb65f1368 # ╠═2c76c406-d15c-4271-baa4-ebebf5299429 -# ╠═cb5b1020-b1f8-4ea1-ad03-a91b5c3ab0c2 +# ╠═be30f3c4-0c20-4949-bcc8-f3812b39befc # ╟─b86a31df-9de1-4e27-8ca7-ce7f3d2576fa -# ╟─9a002059-650b-4dc1-9395-6f266ed35500 # ╠═aab4113d-d7ad-4521-a208-e192ad218cf0 +# ╠═af22e5da-ff9b-4278-95d9-491f84a55add +# ╟─e13cbda5-ddd4-491e-bf2a-d6ed24d2bdbd # ╠═539290af-787d-4deb-928c-50e4e9f28173 +# ╠═86d608ec-aca2-4738-9c3e-656ccd562da6 # ╟─e86d6cf7-2274-403a-b1db-017973f33fb7 # ╟─00b9d37f-ce7b-4491-b1df-f0963f2598a8 # ╠═1f6a0d6c-832b-474d-8fbf-a9de6e821d80 -# ╠═f80f8b06-976f-4b43-8074-8d0bf725ba48 +# ╠═efa21003-ee7a-4834-b6f7-7625a7820f70 +# ╟─ccb58b55-b9c8-4229-aff8-92541af123ec # ╠═6fa07efa-fd25-4bca-bd18-8ba5c557d146 -# ╟─3211ba19-0140-450d-95c6-698a4f0ccbff -# ╠═175854bb-4385-4199-ada9-358def53a822 +# ╠═95bf572e-23a0-4554-8ee3-b7932721e850 # ╟─7ab2fe80-812f-4a21-933a-e169a17f6c32 # ╠═6ddeb42d-37a5-48a3-ac82-47e4ec2ca541 +# ╠═9537c91e-03a7-44d7-95ae-e60ea8d5496a # ╟─4d4794fb-804d-4b4a-8c32-a32d88e43e30 # ╟─1fa8010d-9a5d-4297-9665-9fa8795ef5f7 # ╟─4ee79c7c-5c4e-457b-b713-103937e50355 # ╠═f2b222ec-0783-487e-9c52-835976a555b6 -# ╟─e4232b15-3369-438e-994b-042aab477a7f +# ╠═f2c3768f-1c81-456d-ba81-6a91fc09e81b # ╟─c749ce2d-17ae-45f4-b721-3f486b1cbc23 # ╟─3a3328d5-31de-4deb-bff7-d25c1fcbc4ef -# ╟─fb0f2941-2e56-45db-91fe-e8d6744a00e0 # ╠═bf618161-ef96-4445-8fc8-25dc5f662242 -# ╠═1a16d2e1-7898-415c-9a98-a1f2f87e08be +# ╠═182861a3-2902-4e56-8fff-3bfc182268c7 # ╟─e0a2c745-41cf-4359-bb99-3117fbb507cc -# ╠═d45bad3e-4c82-436b-8e64-c61e5cf65c2f +# ╠═321fa5f5-be6a-4e5f-ba7f-4c117a240253 +# ╠═2962b22a-5e4a-4dc1-9be6-8e57979ecba5 +# ╟─7fa76f60-c623-4b25-b185-0cd5e805ef71 # ╠═ee46b865-dbd4-4939-b241-514941dd138d -# ╠═b183c219-a39b-427a-b740-5675fcc175ca -# ╟─323d1169-c59f-456c-9b19-093e26f84214 +# ╠═554321c7-cdcb-415c-8ac2-c63b42b6889a +# ╟─0af912a5-18ad-4974-a0b5-c1f66c8fa37a # ╟─d0215082-52df-4eae-a409-7c3c7cfc69ed # ╠═3a24f4aa-b074-4beb-b77d-6778e2fe580a -# ╠═1e203abc-4a02-4d01-bf9e-9df636e70ebd # ╠═98869c25-2644-47d1-b8cc-05699292f2a8 -# ╠═18985bb2-6cce-4417-97a2-c2da7b9e0428 # ╟─d9e2b828-9c32-4638-bfcd-0c16b221aa43 # ╠═4092a893-818e-49f4-93d0-be7bd652dddc -# ╠═c5c907d0-a669-43f3-8030-0bd67452f0a1 +# ╠═a0967b01-4eb8-4160-af68-a908734dc25e # ╟─a0b64ba9-cbec-404e-bf39-aee03ae407ae # ╠═82f11626-722b-46fa-9173-8b5d7a80a190 +# ╠═392d3055-2ce0-4db7-8702-f79395f24b3b # ╟─6aff587f-be6f-4fd8-96df-9c12f3769f32 # ╠═ef498536-8fb8-46e3-9d8d-f7eb3994a3f5 +# ╠═84f948ad-f903-46a6-a520-2499864f348f +# ╟─63d629a1-379f-44bd-a02d-d252d0594357 # ╟─25598fcd-761d-40b8-95ac-8b68a00026da +# ╟─336f8626-7b0c-459d-bedb-281d010fcbd2 # ╟─eba2f06f-ebe9-492d-81d2-1cc4fccd5b0a # ╠═de22c778-1529-4177-85e6-a0178f437a8c +# ╟─072535ef-9a0d-4c1e-aea7-6486d329f66f # ╠═c262aa56-b9b6-4da4-8810-d6120f0724c6 +# ╠═9a98c6bb-d0d5-426e-9137-9fc94fc944be +# ╟─00f69c40-f31c-49e6-a1cc-d84a4cb2b43d # ╟─1e8ec5c5-3d41-44a7-8dfa-81d981750d9e +# ╟─dd22bc93-28bf-412e-a52b-d4332475daa2 # ╟─c6b35992-973b-49d4-bfa7-855e8fe10924 -# ╠═85f84c90-46e6-4d3f-bba2-6fc190a05533 -# ╠═16cdd7e8-0ec2-4953-ad8b-f53669d05eda # ╠═522d88d6-5f60-401b-8786-0236c0859eda +# ╠═014b94b3-a6fa-4627-a24d-fe8c5e275582 # ╟─fbd0d75b-b3af-4eb5-a249-423317d656e5 # ╠═0eefe540-1669-4510-bef7-8fb7f8be68f1 -# ╠═4f59f4e6-c735-4a40-b171-744b17eb37fd +# ╠═085c04f2-0762-4213-b874-14f3ce1f0b49 +# ╟─a427567e-b6dd-44a9-a61f-a725960cc459 # ╠═b057812d-1a8e-479c-8192-1c1acdb97d23 -# ╠═586b1993-be11-4437-9d3b-789511ea26bf +# ╠═98f0753f-635e-46e3-8045-ff40ca2e827b +# ╟─cefdeee7-6a4b-4c60-a14c-c1edac53be98 +# ╠═479b900b-b1bf-4d89-a53e-b1b20da7f5ad +# ╠═28237d12-6065-4fa3-bd40-6397dae7ecb6 +# ╟─9c0862d0-8028-4ef4-a867-18c7932dad91 # ╟─e81f3b44-bc04-4768-81c2-c2733958f5a9 # ╠═88966b7e-b261-45a6-9f12-6b74f24c03e4 -# ╠═ff7def67-eb96-45b3-959a-2b01c7804e07 -# ╟─965a8e44-e96e-434e-8454-cced531ae9d2 +# ╠═1aaaebb6-839a-4598-82b9-dc17efdf7623 # ╟─802f5cad-a0c0-4426-94f2-426f89dea7e1 # ╟─2eed0bc8-2306-42bb-9803-33ae131021e6 # ╠═9922bdbe-cf9e-486a-8e8a-28a7ded12d04 @@ -2430,14 +1027,17 @@ version = "4.1.0+0" # ╠═ffc4bdc3-16e3-4b3e-b448-cfdc16428378 # ╟─71cca345-cffc-4aee-a671-08901a92babe # ╠═1c3faf9f-adcf-4232-acf4-655d828623e3 +# ╠═6708c2f5-a291-486e-8e66-93acfcedbcb7 # ╟─7cfb17fc-81a4-4522-a88b-2fd10001baaa # ╠═ce1804da-df61-4e4c-aa3b-d950e83b7c13 +# ╠═910920d2-085a-498f-8458-e6e96903ab92 # ╟─5590c909-6103-4427-b1a2-4cf35265dc07 # ╠═f7486c08-b74b-471f-bbc2-690439a487f8 +# ╠═08c5e6fc-d8b5-4311-8f35-449a830daeec # ╟─c143ab62-b3f0-4b6a-83aa-76e5dc3548ac +# ╟─0c05c385-67bd-4078-8fe2-34a37a13b312 # ╟─7d4f9a02-81a7-4bdc-a22d-3435192f9f15 # ╟─59b4d441-9a74-468f-ad8c-882516a09049 -# ╠═17c6b7df-a8b3-45d1-9491-526afce11318 # ╠═bedc8ccd-e6f6-4dd1-a0b6-1889f4b5b658 -# ╟─00000000-0000-0000-0000-000000000001 -# ╟─00000000-0000-0000-0000-000000000002 +# ╟─d21ab65d-5ea0-4eca-8d1b-09fc83daf3b0 +# ╟─e0d2d6c4-d363-4bb2-9d12-42c4a52aba3b