diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index d616f7c..5c6eb6d 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -18,8 +18,10 @@ jobs: fail-fast: false matrix: version: - - '1.0' - - '1.9' + - '1' + - '1.10' + - '1.11' + - '1.12' - 'nightly' os: - ubuntu-latest diff --git a/Project.toml b/Project.toml index db41448..dbf11ae 100644 --- a/Project.toml +++ b/Project.toml @@ -1,12 +1,11 @@ name = "ShroffCelegansModels" uuid = "28a312d2-d9d3-46a7-98c1-9c09f12e8c99" -authors = ["Mark Kittisopikul and contributors"] version = "1.0.0-DEV" +authors = ["Mark Kittisopikul and contributors"] [deps] BSplineKit = "093aae92-e908-43d7-9660-e50ee39d5a0a" CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" -CircStats = "2f6764a1-d620-4564-9394-76eb7c776766" ColorSchemes = "35d6a980-a343-548e-a6ea-1d62b119f2f4" Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" CoordinateTransformations = "150eb455-5306-5404-9cee-2592286d6298" @@ -14,21 +13,15 @@ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" FixedPointNumbers = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" -ImageContrastAdjustment = "f332f351-ec65-5f6a-b3d1-319c6670881a" -ImageCore = "a09fc81d-aa75-5fe9-8630-4744c3626534" -ImageFiltering = "6a3955dd-da59-5b1f-98d4-e7296123deb5" -IndirectArrays = "9b13fd28-a010-5f03-acff-a1bbcff69959" InteractiveUtils = "b77e0a4c-d291-57a0-90e8-8db25a27a240" Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" LRUCache = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -MakieCore = "20f20a25-4f0e-4fdf-b5d1-57303727442b" Missings = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" Observables = "510215fc-4207-5dde-b226-833fc4488ee2" Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" @@ -36,19 +29,18 @@ PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" ProgressMeter = "92933f4c-e287-5a05-a399-4b506db050ca" QuadGK = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -Rotations = "6038ab10-8711-5258-84ad-4b1120ba62dc" +Sockets = "6462fe0b-24de-5631-8697-dd941f90decc" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" ThinPlateSplines = "1d861738-f48e-4029-b1d3-81ce6bc7f5ab" TiffImages = "731e570b-9d59-4bfa-96dc-6df516fadf69" -UnicodePlots = "b8865327-cd53-5732-bb35-84acbb429228" [sources] ThinPlateSplines = {url = "https://github.com/mkitti/ThinPlateSplines.jl"} [compat] -BSplineKit = "0.17, 0.18, 0.19" +BSplineKit = "0.18, 0.19" CSV = "0.10" CircStats = "1" ColorSchemes = "3" @@ -60,8 +52,8 @@ FFTW = "1" FileIO = "1" FixedPointNumbers = "0.8" FiniteDifferences = "0.12" -GeometryBasics = "0.4, 0.5" -HDF5 = "0.17" +GeometryBasics = "0.4.11, 0.5" +HDF5 = "0.17.2, 0.18" ImageContrastAdjustment = "0.3" ImageCore = "0.10" ImageFiltering = "0.7" @@ -70,7 +62,7 @@ IndirectArrays = "1" Interpolations = "0.15, 0.16" JSON3 = "1" LRUCache = "1" -Makie = "0.20, 0.21" +Makie = "0.24.6" MakieCore = "0.7, 0.8, 0.9" Missings = "1" Observables = "0.5" @@ -81,7 +73,8 @@ Rotations = "1" StaticArrays = "1" Statistics = "1" StatsBase = "0.34" -ThinPlateSplines = "0.1, 0.2" +Sockets = "1" +ThinPlateSplines = "0.1, 0.2.0" TiffImages = "0.10, 0.11" UnicodePlots = "3" julia = "1" @@ -91,3 +84,6 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] test = ["Test"] + +[workspace] +projects = ["glmakie", "web", "ShroffCelegansModelsCore"] diff --git a/config/CHANGES.md b/config/CHANGES.md new file mode 100644 index 0000000..8ec178f --- /dev/null +++ b/config/CHANGES.md @@ -0,0 +1,43 @@ +# Config Change Summary + +## 2024-09-05 v1 → 2026-03-19 v2 + +Settings (folderpaths, voxel scale, outlier removal, interpolation, warping, smoothing, mipav_output) are unchanged. + +### Removed paths (5) + +**JCC596_NU** — 3 old paths replaced by re-processed `Untwisting_Redo` equivalents: +- `JCC596_NU/Untwisting/082619_JCC596_NU/JCC596_NU/Pos3/SPIMB_result/Reg_Sample/Decon_registered` +- `JCC596_NU/Untwisting/091119_JCC596_NU/JCC596_NU/JCC596_NU/JCC596_NU/Pos2/SPIMB_result/Reg_Sample/Decon_registered` +- `JCC596_NU/Untwisting/091119_JCC596_NU/JCC596_NU/JCC596_NU/JCC596_NU/Pos3/SPIMB_result/Reg_Sample/Decon_registered` + +**DCR4221** — UTP 1 dataset dropped; strain now has 4 datasets (UTP 2–5): +- `Non-model C elegans folders/Untwisting_Paper/DCR4221/063014_lattices_Javier - UTP 1/Decon_reg` + +**RW10752_NU Pos2** — old path replaced: +- `RW10752_NU/Untwisting/031219_RW10752_NU/RW10752_NU/RW10752_NU/Pos2/Old/Decon_registered` + +### Added paths (13) + +**JCC596_NU** — 3 replacement paths under `Untwisting_Redo`: +- `JCC596_NU/Untwisting_Redo/082619_Pos3` +- `JCC596_NU/Untwisting_Redo/091119_Pos2` +- `JCC596_NU/Untwisting_Redo/091119_Pos3` + +**RW10752_NU Pos2** — replacement path: +- `RW10752_NU/Untwisting/031219_RW10752_NU/RW10752_NU/RW10752_NU/Pos2/SPIMB/For_Tracking/For_Tracking` + +**RW10131_retracked** — new strain, 3 positions (2024 SLS268 imaging): +- `RW10131/Data/2024_SLS268/20240401/RW10131_SLS6_New/Pos4/SPIMB/Reg_Sample/For_Tracking` +- `RW10131/Data/2024_SLS268/20240429/SLS268_RW10131_SLS6/Pos1/SPIMB/Reg_Sample/For_Tracking` +- `RW10131/Data/2024_SLS268/20240507/Pos1/SPIMA/Reg_Sample/For_Tracking` + +**RW10598_retracked** — new strain, 3 positions (2023 re-tracking): +- `RW10598/2023_Data/Tracking/20230718/RW10598_NU/Pos1/SPIMB/Reg_Sample/For_Tracking` +- `RW10598/2023_Data/Tracking/20230718/RW10598_NU/Pos2/SPIMB/Reg_Sample/For_Tracking` +- `RW10598/2023_Data/Tracking/20230719/RW10598_NU/Pos4/SPIMB/Reg_Sample/For_Tracking` + +**RW10896_retracked** — new strain, 3 positions (2023 imaging): +- `RW10896/Postwitching/2023_imaging/20231129/RW10896_NU/Pos1/SPIMB/Registered_Volumes/For_Tracking` +- `RW10896/Postwitching/2023_imaging/20231129/RW10896_NU/Pos2/SPIMB/Registered_Volumes/For_Tracking` +- `RW10896/Postwitching/2023_imaging/20231129/RW10896_NU/Pos3/SPIMB/Registered_Volumes/For_Tracking` diff --git a/config/convert_windows_paths.jl b/config/convert_windows_paths.jl new file mode 100644 index 0000000..1fa5b94 --- /dev/null +++ b/config/convert_windows_paths.jl @@ -0,0 +1,60 @@ +#!/usr/bin/env julia +# Converts Windows-style paths in a config JSON to Unix-style paths. +# Usage: julia convert_windows_paths.jl [input.json [output.json]] +# +# Default input: config/windows/config_2026_03_19_v2.json +# Default output: config/linux/config_2026_03_19_v2.json +# +# Path mapping applied: +# X:\shrofflab\ → /nearline/shroff/shrofflab/ +# remaining backslashes → forward slashes + +using JSON3 + +const WINDOWS_PREFIX = Regex("^[A-Za-z]:\\\\shrofflab\\\\", "i") +const UNIX_PREFIX = "/nearline/shroff/shrofflab/" + +function convert_path(s::AbstractString) + s = replace(s, WINDOWS_PREFIX => UNIX_PREFIX) + replace(s, '\\' => '/') +end + +function convert_value(v) + if v isa AbstractString + return convert_path(v) + elseif v isa AbstractDict + return Dict(k => convert_value(val) for (k, val) in v) + elseif v isa AbstractArray + return [convert_value(el) for el in v] + else + return v + end +end + +function main() + script_dir = dirname(abspath(@__FILE__)) + + input_path = length(ARGS) >= 1 ? ARGS[1] : + joinpath(script_dir, "windows", "config_2026_03_19_v2.json") + + default_output_dir = joinpath(script_dir, "linux") + output_path = length(ARGS) >= 2 ? ARGS[2] : + joinpath(default_output_dir, basename(input_path)) + + isfile(input_path) || error("Input file not found: $input_path") + + config = open(input_path) do io + JSON3.read(io, Dict{String,Any}) + end + converted = convert_value(config) + + mkpath(dirname(output_path)) + open(output_path, "w") do io + JSON3.write(io, converted) + println(io) # trailing newline + end + + println("Wrote converted config to: $output_path") +end + +main() diff --git a/config/linux/config_2026_03_19_v2.json b/config/linux/config_2026_03_19_v2.json new file mode 100644 index 0000000..d5ec18e --- /dev/null +++ b/config/linux/config_2026_03_19_v2.json @@ -0,0 +1 @@ +{"settings":{"mipav_output":{"cell_info":"cell_info.json","labels_on":false},"outlier_removal":{"remove_outliers":true,"n_stdev":2,"early_window_size":10,"window_size":10},"interpolation":{"min_timepoints_required":2,"method":"linear","seam_cells_on":{"V5L":0,"V1L":0,"V2L":0,"QR":0.667,"V2R":0,"H2L":0,"V4L":0,"V3R":0,"QL":0.667,"V1R":0,"H1R":0,"V5R":0,"V6L":0,"TR":0,"H1L":0,"H2R":0,"V3L":0,"TL":0,"V6R":0,"H0R":0,"V4R":0,"H0L":0},"total_min":420},"voxel_to_micron_scale":[0.1625,0.1625,0.1625],"smoothing":{"method":"sgolay","window_size":90},"folderpaths":{"twisted_annotations":"integrated_annotation/annotations.csv","twisted_lattice":"lattice_final/lattice.csv","straightened_lattice":"straightened_lattice/straightened_lattice.csv","side":"RegB","straightened_annotations":"straightened_annotations/straightened_annotations.csv","data_folderpath":"Decon_reg_#/Decon_reg_#_results","straightened_seam_cells":"straightened_seamcells/straightened_seamcells.csv","twisted_seam_cells":"seam_cell_final/seam_cells.csv"},"warping":{"seam_cells":["H0L","H0R","H1L","H1R","H2L","H2R","V1R","V1L","V2R","V2L","V3R","V3L","V4L","V4R","V5L","V5R","V6L","V6R","TL","TR"],"radial_correction":1,"z_padding":100}},"data":{"strains":[{"name":"OD1599_NU","folderpaths":["/nearline/shroff/shrofflab/OD1599_NU/120619_Pos2/Decon_reg","/nearline/shroff/shrofflab/OD1599_NU/112719_Pos3/Decon_Reg","/nearline/shroff/shrofflab/OD1599_NU/112619_Pos0/Decon_reg"],"include":true},{"name":"DCR6485_RPM1_NU","folderpaths":["/nearline/shroff/shrofflab/DCR6485_RPM1_NU/011419_RC/DCR6485_NU/DCR6485_NU/DCR6485_NU/Pos0/SPIMB/Decon","/nearline/shroff/shrofflab/DCR6485_RPM1_NU/011419_RC/DCR6485_NU/DCR6485_NU/DCR6485_NU/Pos4/SPIMB/Decon_Reg","/nearline/shroff/shrofflab/DCR6485_RPM1_NU/021020_RC/DCR6485_NU_1/DCR6485_NU_1/Pos2/SPIMB/Decon"],"include":true},{"name":"JCC596_NU","folderpaths":["/nearline/shroff/shrofflab/JCC596_NU/Untwisting_Redo/091119_Pos3","/nearline/shroff/shrofflab/JCC596_NU/Untwisting_Redo/091119_Pos2","/nearline/shroff/shrofflab/JCC596_NU/Untwisting_Redo/082619_Pos3"],"include":true},{"name":"KP9305_NU","folderpaths":["/nearline/shroff/shrofflab/Non-model C elegans folders/KP9305_Activity_Full/073019_KP9305_NU/Pos0","/nearline/shroff/shrofflab/Non-model C elegans folders/KP9305_Activity_Full/073019_KP9305_NU/Pos4","/nearline/shroff/shrofflab/Non-model C elegans folders/KP9305_Activity_Full/073019_KP9305_NU/Pos2"],"include":true},{"name":"RW10131","folderpaths":["/nearline/shroff/shrofflab/RW10131/Data/052918_Pos0/Decon_registered","/nearline/shroff/shrofflab/RW10131/Data/052918_Pos1/Decon_registered"],"include":true},{"name":"RW10896","folderpaths":["/nearline/shroff/shrofflab/RW10896/Postwitching/Pos1/Decon_registered","/nearline/shroff/shrofflab/RW10896/Postwitching/Pos4/Decon_registered","/nearline/shroff/shrofflab/RW10896/Postwitching/Pos6/Decon_registered"],"include":true},{"name":"RW10752_NU","folderpaths":["/nearline/shroff/shrofflab/RW10752_NU/Untwisting/031219_RW10752_NU/RW10752_NU/RW10752_NU/Pos2/SPIMB/For_Tracking/For_Tracking","/nearline/shroff/shrofflab/RW10752_NU/Untwisting/031219_RW10752_NU/RW10752_NU/RW10752_NU/Pos1/Decon_registered","/nearline/shroff/shrofflab/RW10752_NU/Untwisting/022519_RW10752_NU/RW10752_NU/RW10752_NU/Pos0/Decon_registered"],"include":true},{"name":"RW10584","folderpaths":["/nearline/shroff/shrofflab/RW10584/051817/Decon_reg","/nearline/shroff/shrofflab/RW10584/052517/Decon_reg","/nearline/shroff/shrofflab/RW10584/101017/Decon_reg"],"include":true},{"name":"RW10598","folderpaths":["/nearline/shroff/shrofflab/RW10598/Data/Pos4-bgsub_95_iteration_5/Decon_registered","/nearline/shroff/shrofflab/RW10598/Data/598_Slitscan_6um_5min_Pos1/Decon_registered","/nearline/shroff/shrofflab/RW10598/Data/Pos0/Decon_registered"],"include":true},{"name":"DCR4221","folderpaths":["/nearline/shroff/shrofflab/Non-model C elegans folders/Untwisting_Paper/DCR4221/040215/LE311 Data/LE311_US_5min_2 - UTP 3/Decon_reg","/nearline/shroff/shrofflab/Non-model C elegans folders/Untwisting_Paper/DCR4221/040215/LE311 Data/LE311-US_5min_3 - UTP 2/Decon_reg","/nearline/shroff/shrofflab/Non-model C elegans folders/Untwisting_Paper/DCR4221/040215/LE311 Data/LE311_US_5min_4 - UTP 4/Decon_reg","/nearline/shroff/shrofflab/Non-model C elegans folders/Untwisting_Paper/DCR4221/040215/LE311 Data/LE311_US_5min_1 - UTP 5/Decon_reg"],"include":true},{"name":"RW10375","folderpaths":["/nearline/shroff/shrofflab/RW10375/Pos0/SPIMB/Reg_Sample/ForTracking","/nearline/shroff/shrofflab/RW10375/Pos1/SPIMB/Reg_Sample/ForTracking","/nearline/shroff/shrofflab/RW10375/Pos2/SPIMB/Reg_Sample/ForTracking"],"include":true},{"name":"RW10557","folderpaths":["/nearline/shroff/shrofflab/RW10557/031021/Pos0/segmentation","/nearline/shroff/shrofflab/RW10557/031021/Pos1/Segmentation","/nearline/shroff/shrofflab/RW10557/031021/Pos2/segmentation"],"include":true},{"name":"RW10753","folderpaths":["/nearline/shroff/shrofflab/RW10753/Tracking/Pos6","/nearline/shroff/shrofflab/RW10753/Tracking/Pos2","/nearline/shroff/shrofflab/RW10753/Tracking/Pos1"],"include":true},{"name":"RW10742","folderpaths":["/nearline/shroff/shrofflab/RW10742/Tracking/Pos1/Segmentation","/nearline/shroff/shrofflab/RW10742/Tracking/Pos4/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/RW10742/Tracking/Pos5/For_Tracking"],"include":true},{"name":"RW10711","folderpaths":["/nearline/shroff/shrofflab/RW10711/Tracking/Pos0/For_Tracking","/nearline/shroff/shrofflab/RW10711/Tracking/Pos1/For_Tracking","/nearline/shroff/shrofflab/RW10711/Tracking/Pos3"],"include":true},{"name":"Vab-1","folderpaths":["/nearline/shroff/shrofflab/Vab-1/Tracking/Pos0/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/Vab-1/Tracking/Pos2/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/Vab-1/Tracking/Pos3/SPIMB/Reg_Sample/For_Tracking"],"include":true},{"name":"efn-1","folderpaths":["/nearline/shroff/shrofflab/efn-1/Tracking/Pos0/For_Tracking","/nearline/shroff/shrofflab/efn-1/Tracking/Pos3/For_Tracking","/nearline/shroff/shrofflab/efn-1/Tracking/Pos4/For_Tracking"],"include":true},{"name":"efn-2","folderpaths":["/nearline/shroff/shrofflab/efn-2/120222_efn-2/Pos1/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/efn-2/120222_efn-2/Pos2/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/efn-2/120222_efn-2/Pos6/SPIMB/Reg_Sample/For_Tracking"],"include":true},{"name":"lin-26","folderpaths":["/nearline/shroff/shrofflab/lin-26_mSC/Tracking/0208/SLS148_Untwisting/Pos4/SPIMA/Reg_Sample/Flipped_FT","/nearline/shroff/shrofflab/lin-26_mSC/Tracking/021323/SLS148_SLS6/Pos3/SPIMB/Reg_Sample/Flipped_FT","/nearline/shroff/shrofflab/lin-26_mSC/Tracking/031523/Pos4/SPIMA/Reg_Sample/Flipped_FT"],"include":true},{"name":"CND-1","folderpaths":["/nearline/shroff/shrofflab/CND-1_RedUntwisting_A/Tracking/033023/RedUT_A_cnd-1/Pos3/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/CND-1_RedUntwisting_A/Tracking/033023/RedUT_A_cnd-1/Pos2/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/CND-1_RedUntwisting_A/Tracking/032423/CND-1_RedUT/Pos2/SPIMA/Reg_Sample/For_Tracking"],"include":true},{"name":"Efn-4","folderpaths":["/nearline/shroff/shrofflab/Efn-4_RedUntwisting/Tracking/031723/EFN-4_RedUT_A/Pos4/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/Efn-4_RedUntwisting/Tracking/031723/EFN-4_RedUT_A/Pos1/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/Efn-4_RedUntwisting/Tracking/031723/EFN-4_RedUT_A/Pos3/SPIMB/Reg_Sample/For_Tracking"],"include":true},{"name":"RW10896_retracked","folderpaths":["/nearline/shroff/shrofflab/RW10896/Postwitching/2023_imaging/20231129/RW10896_NU/Pos1/SPIMB/Registered_Volumes/For_Tracking","/nearline/shroff/shrofflab/RW10896/Postwitching/2023_imaging/20231129/RW10896_NU/Pos2/SPIMB/Registered_Volumes/For_Tracking","/nearline/shroff/shrofflab/RW10896/Postwitching/2023_imaging/20231129/RW10896_NU/Pos3/SPIMB/Registered_Volumes/For_Tracking"],"include":true},{"name":"RW10131_retracked","folderpaths":["/nearline/shroff/shrofflab/RW10131/Data/2024_SLS268/20240401/RW10131_SLS6_New/Pos4/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/RW10131/Data/2024_SLS268/20240429/SLS268_RW10131_SLS6/Pos1/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/RW10131/Data/2024_SLS268/20240507/Pos1/SPIMA/Reg_Sample/For_Tracking"],"include":true},{"name":"RW10598_retracked","folderpaths":["/nearline/shroff/shrofflab/RW10598/2023_Data/Tracking/20230718/RW10598_NU/Pos1/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/RW10598/2023_Data/Tracking/20230718/RW10598_NU/Pos2/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/RW10598/2023_Data/Tracking/20230719/RW10598_NU/Pos4/SPIMB/Reg_Sample/For_Tracking"],"include":true}],"seam_cells":["/nearline/shroff/shrofflab/OD1599_NU/120619_Pos2/Decon_reg","/nearline/shroff/shrofflab/OD1599_NU/112719_Pos3/Decon_Reg","/nearline/shroff/shrofflab/OD1599_NU/112619_Pos0/Decon_reg","/nearline/shroff/shrofflab/DCR6485_RPM1_NU/011419_RC/DCR6485_NU/DCR6485_NU/DCR6485_NU/Pos0/SPIMB/Decon","/nearline/shroff/shrofflab/DCR6485_RPM1_NU/011419_RC/DCR6485_NU/DCR6485_NU/DCR6485_NU/Pos4/SPIMB/Decon_Reg","/nearline/shroff/shrofflab/DCR6485_RPM1_NU/021020_RC/DCR6485_NU_1/DCR6485_NU_1/Pos2/SPIMB/Decon","/nearline/shroff/shrofflab/JCC596_NU/Untwisting_Redo/091119_Pos3","/nearline/shroff/shrofflab/JCC596_NU/Untwisting_Redo/091119_Pos2","/nearline/shroff/shrofflab/JCC596_NU/Untwisting_Redo/082619_Pos3","/nearline/shroff/shrofflab/Non-model C elegans folders/KP9305_Activity_Full/073019_KP9305_NU/Pos0","/nearline/shroff/shrofflab/Non-model C elegans folders/KP9305_Activity_Full/073019_KP9305_NU/Pos4","/nearline/shroff/shrofflab/Non-model C elegans folders/KP9305_Activity_Full/073019_KP9305_NU/Pos2","/nearline/shroff/shrofflab/RW10131/Data/052918_Pos0/Decon_registered","/nearline/shroff/shrofflab/RW10131/Data/052918_Pos1/Decon_registered","/nearline/shroff/shrofflab/RW10896/Postwitching/Pos1/Decon_registered","/nearline/shroff/shrofflab/RW10896/Postwitching/Pos4/Decon_registered","/nearline/shroff/shrofflab/RW10896/Postwitching/Pos6/Decon_registered","/nearline/shroff/shrofflab/RW10752_NU/Untwisting/031219_RW10752_NU/RW10752_NU/RW10752_NU/Pos2/SPIMB/For_Tracking/For_Tracking","/nearline/shroff/shrofflab/RW10752_NU/Untwisting/031219_RW10752_NU/RW10752_NU/RW10752_NU/Pos1/Decon_registered","/nearline/shroff/shrofflab/RW10752_NU/Untwisting/022519_RW10752_NU/RW10752_NU/RW10752_NU/Pos0/Decon_registered","/nearline/shroff/shrofflab/RW10584/051817/Decon_reg","/nearline/shroff/shrofflab/RW10584/052517/Decon_reg","/nearline/shroff/shrofflab/RW10584/101017/Decon_reg","/nearline/shroff/shrofflab/RW10598/Data/Pos4-bgsub_95_iteration_5/Decon_registered","/nearline/shroff/shrofflab/RW10598/Data/598_Slitscan_6um_5min_Pos1/Decon_registered","/nearline/shroff/shrofflab/RW10598/Data/Pos0/Decon_registered","/nearline/shroff/shrofflab/Non-model C elegans folders/Untwisting_Paper/DCR4221/040215/LE311 Data/LE311_US_5min_2 - UTP 3/Decon_reg","/nearline/shroff/shrofflab/Non-model C elegans folders/Untwisting_Paper/DCR4221/040215/LE311 Data/LE311-US_5min_3 - UTP 2/Decon_reg","/nearline/shroff/shrofflab/Non-model C elegans folders/Untwisting_Paper/DCR4221/040215/LE311 Data/LE311_US_5min_4 - UTP 4/Decon_reg","/nearline/shroff/shrofflab/Non-model C elegans folders/Untwisting_Paper/DCR4221/040215/LE311 Data/LE311_US_5min_1 - UTP 5/Decon_reg","/nearline/shroff/shrofflab/RW10375/Pos0/SPIMB/Reg_Sample/ForTracking","/nearline/shroff/shrofflab/RW10375/Pos1/SPIMB/Reg_Sample/ForTracking","/nearline/shroff/shrofflab/RW10375/Pos2/SPIMB/Reg_Sample/ForTracking","/nearline/shroff/shrofflab/RW10557/031021/Pos0/segmentation","/nearline/shroff/shrofflab/RW10557/031021/Pos1/Segmentation","/nearline/shroff/shrofflab/RW10557/031021/Pos2/segmentation","/nearline/shroff/shrofflab/RW10753/Tracking/Pos6","/nearline/shroff/shrofflab/RW10753/Tracking/Pos2","/nearline/shroff/shrofflab/RW10753/Tracking/Pos1","/nearline/shroff/shrofflab/RW10742/Tracking/Pos1/Segmentation","/nearline/shroff/shrofflab/RW10742/Tracking/Pos4/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/RW10742/Tracking/Pos5/For_Tracking","/nearline/shroff/shrofflab/RW10711/Tracking/Pos0/For_Tracking","/nearline/shroff/shrofflab/RW10711/Tracking/Pos1/For_Tracking","/nearline/shroff/shrofflab/RW10711/Tracking/Pos3","/nearline/shroff/shrofflab/Vab-1/Tracking/Pos0/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/Vab-1/Tracking/Pos2/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/Vab-1/Tracking/Pos3/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/efn-1/Tracking/Pos0/For_Tracking","/nearline/shroff/shrofflab/efn-1/Tracking/Pos3/For_Tracking","/nearline/shroff/shrofflab/efn-1/Tracking/Pos4/For_Tracking","/nearline/shroff/shrofflab/efn-2/120222_efn-2/Pos1/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/efn-2/120222_efn-2/Pos2/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/efn-2/120222_efn-2/Pos6/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/lin-26_mSC/Tracking/0208/SLS148_Untwisting/Pos4/SPIMA/Reg_Sample/Flipped_FT","/nearline/shroff/shrofflab/lin-26_mSC/Tracking/021323/SLS148_SLS6/Pos3/SPIMB/Reg_Sample/Flipped_FT","/nearline/shroff/shrofflab/lin-26_mSC/Tracking/031523/Pos4/SPIMA/Reg_Sample/Flipped_FT","/nearline/shroff/shrofflab/CND-1_RedUntwisting_A/Tracking/033023/RedUT_A_cnd-1/Pos3/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/CND-1_RedUntwisting_A/Tracking/033023/RedUT_A_cnd-1/Pos2/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/CND-1_RedUntwisting_A/Tracking/032423/CND-1_RedUT/Pos2/SPIMA/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/Efn-4_RedUntwisting/Tracking/031723/EFN-4_RedUT_A/Pos4/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/Efn-4_RedUntwisting/Tracking/031723/EFN-4_RedUT_A/Pos1/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/Efn-4_RedUntwisting/Tracking/031723/EFN-4_RedUT_A/Pos3/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/RW10896/Postwitching/2023_imaging/20231129/RW10896_NU/Pos1/SPIMB/Registered_Volumes/For_Tracking","/nearline/shroff/shrofflab/RW10896/Postwitching/2023_imaging/20231129/RW10896_NU/Pos2/SPIMB/Registered_Volumes/For_Tracking","/nearline/shroff/shrofflab/RW10896/Postwitching/2023_imaging/20231129/RW10896_NU/Pos3/SPIMB/Registered_Volumes/For_Tracking","/nearline/shroff/shrofflab/RW10131/Data/2024_SLS268/20240401/RW10131_SLS6_New/Pos4/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/RW10131/Data/2024_SLS268/20240429/SLS268_RW10131_SLS6/Pos1/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/RW10131/Data/2024_SLS268/20240507/Pos1/SPIMA/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/RW10598/2023_Data/Tracking/20230718/RW10598_NU/Pos1/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/RW10598/2023_Data/Tracking/20230718/RW10598_NU/Pos2/SPIMB/Reg_Sample/For_Tracking","/nearline/shroff/shrofflab/RW10598/2023_Data/Tracking/20230719/RW10598_NU/Pos4/SPIMB/Reg_Sample/For_Tracking"]}} diff --git a/config/windows/config_2026_03_19_v2.json b/config/windows/config_2026_03_19_v2.json new file mode 100644 index 0000000..36a53e5 --- /dev/null +++ b/config/windows/config_2026_03_19_v2.json @@ -0,0 +1,362 @@ +{ + "settings": { + "folderpaths": { + "side": "RegB", + "data_folderpath": "Decon_reg_#\\Decon_reg_#_results", + "straightened_seam_cells": "straightened_seamcells\\straightened_seamcells.csv", + "straightened_annotations": "straightened_annotations\\straightened_annotations.csv", + "straightened_lattice": "straightened_lattice\\straightened_lattice.csv", + "twisted_seam_cells": "seam_cell_final\\seam_cells.csv", + "twisted_annotations": "integrated_annotation\\annotations.csv", + "twisted_lattice": "lattice_final\\lattice.csv" + }, + "voxel_to_micron_scale": [ + 0.1625, + 0.1625, + 0.1625 + ], + "outlier_removal": { + "remove_outliers": true, + "n_stdev": 2, + "window_size": 10, + "early_window_size": 10 + }, + "interpolation": { + "total_min": 420, + "min_timepoints_required": 2, + "method": "linear", + "seam_cells_on": { + "H0L": 0, + "H0R": 0, + "H1L": 0, + "H1R": 0, + "H2L": 0, + "H2R": 0, + "V1R": 0, + "V1L": 0, + "V2R": 0, + "V2L": 0, + "V3R": 0, + "V3L": 0, + "V4L": 0, + "V4R": 0, + "QL": 0.667, + "QR": 0.667, + "V5L": 0, + "V5R": 0, + "V6L": 0, + "V6R": 0, + "TL": 0, + "TR": 0 + } + }, + "warping": { + "z_padding": 100, + "radial_correction": 1, + "seam_cells": [ + "H0L", + "H0R", + "H1L", + "H1R", + "H2L", + "H2R", + "V1R", + "V1L", + "V2R", + "V2L", + "V3R", + "V3L", + "V4L", + "V4R", + "V5L", + "V5R", + "V6L", + "V6R", + "TL", + "TR" + ] + }, + "smoothing": { + "method": "sgolay", + "window_size": 90 + }, + "mipav_output": { + "labels_on": false, + "cell_info": "cell_info.json" + } + }, + "data": { + "seam_cells": [ + "X:\\shrofflab\\OD1599_NU\\120619_Pos2\\Decon_reg", + "X:\\shrofflab\\OD1599_NU\\112719_Pos3\\Decon_Reg", + "X:\\shrofflab\\OD1599_NU\\112619_Pos0\\Decon_reg", + "X:\\shrofflab\\DCR6485_RPM1_NU\\011419_RC\\DCR6485_NU\\DCR6485_NU\\DCR6485_NU\\Pos0\\SPIMB\\Decon", + "X:\\shrofflab\\DCR6485_RPM1_NU\\011419_RC\\DCR6485_NU\\DCR6485_NU\\DCR6485_NU\\Pos4\\SPIMB\\Decon_Reg", + "X:\\shrofflab\\DCR6485_RPM1_NU\\021020_RC\\DCR6485_NU_1\\DCR6485_NU_1\\Pos2\\SPIMB\\Decon", + "X:\\shrofflab\\JCC596_NU\\Untwisting_Redo\\082619_Pos3", + "X:\\shrofflab\\JCC596_NU\\Untwisting_Redo\\091119_Pos2", + "X:\\shrofflab\\JCC596_NU\\Untwisting_Redo\\091119_Pos3", + "X:\\shrofflab\\RW10131\\Data\\052918_Pos0\\Decon_registered", + "X:\\shrofflab\\RW10131\\Data\\052918_Pos1\\Decon_registered", + "X:\\shrofflab\\RW10896\\Postwitching\\Pos1\\Decon_registered", + "X:\\shrofflab\\RW10896\\Postwitching\\Pos4\\Decon_registered", + "X:\\shrofflab\\RW10896\\Postwitching\\Pos6\\Decon_registered", + "X:\\shrofflab\\RW10752_NU\\Untwisting\\031219_RW10752_NU\\RW10752_NU\\RW10752_NU\\Pos1\\Decon_registered", + "X:\\shrofflab\\RW10752_NU\\Untwisting\\022519_RW10752_NU\\RW10752_NU\\RW10752_NU\\Pos0\\Decon_registered", + "X:\\shrofflab\\RW10584\\051817\\Decon_reg", + "X:\\shrofflab\\RW10584\\052517\\Decon_reg", + "X:\\shrofflab\\RW10584\\101017\\Decon_reg", + "X:\\shrofflab\\RW10598\\Data\\Pos4-bgsub_95_iteration_5\\Decon_registered", + "X:\\shrofflab\\RW10598\\Data\\598_Slitscan_6um_5min_Pos1\\Decon_registered", + "X:\\shrofflab\\RW10598\\Data\\Pos0\\Decon_registered", + "X:\\shrofflab\\RW10375\\Pos0\\SPIMB\\Reg_Sample\\ForTracking", + "X:\\shrofflab\\RW10375\\Pos1\\SPIMB\\Reg_Sample\\ForTracking", + "X:\\shrofflab\\RW10375\\Pos2\\SPIMB\\Reg_Sample\\ForTracking", + "X:\\shrofflab\\RW10557\\031021\\Pos0\\segmentation", + "X:\\shrofflab\\RW10557\\031021\\Pos1\\Segmentation", + "X:\\shrofflab\\RW10557\\031021\\Pos2\\segmentation", + "X:\\shrofflab\\RW10753\\Tracking\\Pos6", + "X:\\shrofflab\\RW10753\\Tracking\\Pos2", + "X:\\shrofflab\\RW10753\\Tracking\\Pos1", + "X:\\shrofflab\\RW10742\\Tracking\\Pos1\\Segmentation", + "X:\\shrofflab\\RW10742\\Tracking\\Pos4\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\RW10742\\Tracking\\Pos5\\For_Tracking", + "X:\\shrofflab\\RW10711\\Tracking\\Pos0\\For_Tracking", + "X:\\shrofflab\\RW10711\\Tracking\\Pos1\\For_Tracking", + "X:\\shrofflab\\RW10711\\Tracking\\Pos3", + "X:\\shrofflab\\Vab-1\\Tracking\\Pos0\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\Vab-1\\Tracking\\Pos2\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\Vab-1\\Tracking\\Pos3\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\efn-1\\Tracking\\Pos0\\For_Tracking", + "X:\\shrofflab\\efn-1\\Tracking\\Pos3\\For_Tracking", + "X:\\shrofflab\\efn-1\\Tracking\\Pos4\\For_Tracking", + "X:\\shrofflab\\efn-2\\120222_efn-2\\Pos1\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\efn-2\\120222_efn-2\\Pos2\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\efn-2\\120222_efn-2\\Pos6\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\Non-model C elegans folders\\Untwisting_Paper\\DCR4221\\063014_lattices_Javier - UTP 1\\Decon_reg", + "X:\\shrofflab\\Non-model C elegans folders\\Untwisting_Paper\\DCR4221\\040215\\LE311 Data\\LE311-US_5min_3 - UTP 2\\Decon_reg", + "X:\\shrofflab\\Non-model C elegans folders\\Untwisting_Paper\\DCR4221\\040215\\LE311 Data\\LE311_US_5min_2 - UTP 3\\Decon_reg", + "X:\\shrofflab\\Non-model C elegans folders\\Untwisting_Paper\\DCR4221\\040215\\LE311 Data\\LE311_US_5min_4 - UTP 4\\Decon_reg", + "X:\\shrofflab\\Non-model C elegans folders\\Untwisting_Paper\\DCR4221\\040215\\LE311 Data\\LE311_US_5min_1 - UTP 5\\Decon_reg", + "X:\\shrofflab\\RW10752_NU\\Untwisting\\031219_RW10752_NU\\RW10752_NU\\RW10752_NU\\Pos2\\SPIMB\\For_Tracking\\For_Tracking" + ], + "strains": [ + { + "name": "OD1599_NU", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\OD1599_NU\\120619_Pos2\\Decon_reg", + "X:\\shrofflab\\OD1599_NU\\112719_Pos3\\Decon_Reg", + "X:\\shrofflab\\OD1599_NU\\112619_Pos0\\Decon_reg" + ] + }, + { + "name": "DCR6485_RPM1_NU", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\DCR6485_RPM1_NU\\011419_RC\\DCR6485_NU\\DCR6485_NU\\DCR6485_NU\\Pos0\\SPIMB\\Decon", + "X:\\shrofflab\\DCR6485_RPM1_NU\\011419_RC\\DCR6485_NU\\DCR6485_NU\\DCR6485_NU\\Pos4\\SPIMB\\Decon_Reg", + "X:\\shrofflab\\DCR6485_RPM1_NU\\021020_RC\\DCR6485_NU_1\\DCR6485_NU_1\\Pos2\\SPIMB\\Decon" + ] + }, + { + "name": "JCC596_NU", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\JCC596_NU\\Untwisting_Redo\\091119_Pos3", + "X:\\shrofflab\\JCC596_NU\\Untwisting_Redo\\091119_Pos2", + "X:\\shrofflab\\JCC596_NU\\Untwisting_Redo\\082619_Pos3" + ] + }, + { + "name": "KP9305_NU", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\Non-model C elegans folders\\KP9305_Activity_Full\\073019_KP9305_NU\\Pos0", + "X:\\shrofflab\\Non-model C elegans folders\\KP9305_Activity_Full\\073019_KP9305_NU\\Pos4", + "X:\\shrofflab\\Non-model C elegans folders\\KP9305_Activity_Full\\073019_KP9305_NU\\Pos2" + ] + }, + { + "name": "RW10131", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\RW10131\\Data\\052918_Pos0\\Decon_registered", + "X:\\shrofflab\\RW10131\\Data\\052918_Pos1\\Decon_registered" + ] + }, + { + "name": "RW10896", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\RW10896\\Postwitching\\Pos1\\Decon_registered", + "X:\\shrofflab\\RW10896\\Postwitching\\Pos4\\Decon_registered", + "X:\\shrofflab\\RW10896\\Postwitching\\Pos6\\Decon_registered" + ] + }, + { + "name": "RW10752_NU", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\RW10752_NU\\Untwisting\\031219_RW10752_NU\\RW10752_NU\\RW10752_NU\\Pos2\\SPIMB\\For_Tracking\\For_Tracking", + "X:\\shrofflab\\RW10752_NU\\Untwisting\\031219_RW10752_NU\\RW10752_NU\\RW10752_NU\\Pos1\\Decon_registered", + "X:\\shrofflab\\RW10752_NU\\Untwisting\\022519_RW10752_NU\\RW10752_NU\\RW10752_NU\\Pos0\\Decon_registered" + ] + }, + { + "name": "RW10584", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\RW10584\\051817\\Decon_reg", + "X:\\shrofflab\\RW10584\\052517\\Decon_reg", + "X:\\shrofflab\\RW10584\\101017\\Decon_reg" + ] + }, + { + "name": "RW10598", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\RW10598\\Data\\Pos4-bgsub_95_iteration_5\\Decon_registered", + "X:\\shrofflab\\RW10598\\Data\\598_Slitscan_6um_5min_Pos1\\Decon_registered", + "X:\\shrofflab\\RW10598\\Data\\Pos0\\Decon_registered" + ] + }, + { + "name": "DCR4221", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\Non-model C elegans folders\\Untwisting_Paper\\DCR4221\\040215\\LE311 Data\\LE311_US_5min_2 - UTP 3\\Decon_reg", + "X:\\shrofflab\\Non-model C elegans folders\\Untwisting_Paper\\DCR4221\\040215\\LE311 Data\\LE311-US_5min_3 - UTP 2\\Decon_reg", + "X:\\shrofflab\\Non-model C elegans folders\\Untwisting_Paper\\DCR4221\\040215\\LE311 Data\\LE311_US_5min_4 - UTP 4\\Decon_reg", + "X:\\shrofflab\\Non-model C elegans folders\\Untwisting_Paper\\DCR4221\\040215\\LE311 Data\\LE311_US_5min_1 - UTP 5\\Decon_reg" + ] + }, + { + "name": "RW10375", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\RW10375\\Pos0\\SPIMB\\Reg_Sample\\ForTracking", + "X:\\shrofflab\\RW10375\\Pos1\\SPIMB\\Reg_Sample\\ForTracking", + "X:\\shrofflab\\RW10375\\Pos2\\SPIMB\\Reg_Sample\\ForTracking" + ] + }, + { + "name": "RW10557", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\RW10557\\031021\\Pos0\\segmentation", + "X:\\shrofflab\\RW10557\\031021\\Pos1\\Segmentation", + "X:\\shrofflab\\RW10557\\031021\\Pos2\\segmentation" + ] + }, + { + "name": "RW10753", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\RW10753\\Tracking\\Pos6", + "X:\\shrofflab\\RW10753\\Tracking\\Pos2", + "X:\\shrofflab\\RW10753\\Tracking\\Pos1" + ] + }, + { + "name": "RW10742", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\RW10742\\Tracking\\Pos1\\Segmentation", + "X:\\shrofflab\\RW10742\\Tracking\\Pos4\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\RW10742\\Tracking\\Pos5\\For_Tracking" + ] + }, + { + "name": "RW10711", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\RW10711\\Tracking\\Pos0\\For_Tracking", + "X:\\shrofflab\\RW10711\\Tracking\\Pos1\\For_Tracking", + "X:\\shrofflab\\RW10711\\Tracking\\Pos3" + ] + }, + { + "name": "Vab-1", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\Vab-1\\Tracking\\Pos0\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\Vab-1\\Tracking\\Pos2\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\Vab-1\\Tracking\\Pos3\\SPIMB\\Reg_Sample\\For_Tracking" + ] + }, + { + "name": "efn-1", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\efn-1\\Tracking\\Pos0\\For_Tracking", + "X:\\shrofflab\\efn-1\\Tracking\\Pos3\\For_Tracking", + "X:\\shrofflab\\efn-1\\Tracking\\Pos4\\For_Tracking" + ] + }, + { + "name": "efn-2", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\efn-2\\120222_efn-2\\Pos1\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\efn-2\\120222_efn-2\\Pos2\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\efn-2\\120222_efn-2\\Pos6\\SPIMB\\Reg_Sample\\For_Tracking" + ] + }, + { + "name": "lin-26", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\lin-26_mSC\\Tracking\\0208\\SLS148_Untwisting\\Pos4\\SPIMA\\Reg_Sample\\Flipped_FT", + "X:\\shrofflab\\lin-26_mSC\\Tracking\\021323\\SLS148_SLS6\\Pos3\\SPIMB\\Reg_Sample\\Flipped_FT", + "X:\\shrofflab\\lin-26_mSC\\Tracking\\031523\\Pos4\\SPIMA\\Reg_Sample\\Flipped_FT" + ] + }, + { + "name": "CND-1", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\CND-1_RedUntwisting_A\\Tracking\\033023\\RedUT_A_cnd-1\\Pos3\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\CND-1_RedUntwisting_A\\Tracking\\033023\\RedUT_A_cnd-1\\Pos2\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\CND-1_RedUntwisting_A\\Tracking\\032423\\CND-1_RedUT\\Pos2\\SPIMA\\Reg_Sample\\For_Tracking" + ] + }, + { + "name": "Efn-4", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\Efn-4_RedUntwisting\\Tracking\\031723\\EFN-4_RedUT_A\\Pos4\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\Efn-4_RedUntwisting\\Tracking\\031723\\EFN-4_RedUT_A\\Pos1\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\Efn-4_RedUntwisting\\Tracking\\031723\\EFN-4_RedUT_A\\Pos3\\SPIMB\\Reg_Sample\\For_Tracking" + ] + }, + { + "name": "RW10896_retracked", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\RW10896\\Postwitching\\2023_imaging\\20231129\\RW10896_NU\\Pos1\\SPIMB\\Registered_Volumes\\For_Tracking", + "X:\\shrofflab\\RW10896\\Postwitching\\2023_imaging\\20231129\\RW10896_NU\\Pos2\\SPIMB\\Registered_Volumes\\For_Tracking", + "X:\\shrofflab\\RW10896\\Postwitching\\2023_imaging\\20231129\\RW10896_NU\\Pos3\\SPIMB\\Registered_Volumes\\For_Tracking" + ] + }, + { + "name": "RW10131_retracked", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\RW10131\\Data\\2024_SLS268\\20240401\\RW10131_SLS6_New\\Pos4\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\RW10131\\Data\\2024_SLS268\\20240429\\SLS268_RW10131_SLS6\\Pos1\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\RW10131\\Data\\2024_SLS268\\20240507\\Pos1\\SPIMA\\Reg_Sample\\For_Tracking" + ] + }, + { + "name": "RW10598_retracked", + "include": true, + "folderpaths": [ + "X:\\shrofflab\\RW10598\\2023_Data\\Tracking\\20230718\\RW10598_NU\\Pos1\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\RW10598\\2023_Data\\Tracking\\20230718\\RW10598_NU\\Pos2\\SPIMB\\Reg_Sample\\For_Tracking", + "X:\\shrofflab\\RW10598\\2023_Data\\Tracking\\20230719\\RW10598_NU\\Pos4\\SPIMB\\Reg_Sample\\For_Tracking" + ] + } + ] + } +} \ No newline at end of file diff --git a/deployment/.gitattributes b/deployment/.gitattributes new file mode 100644 index 0000000..997504b --- /dev/null +++ b/deployment/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting & preventing 3-way merges +pixi.lock merge=binary linguist-language=YAML linguist-generated=true -diff diff --git a/deployment/.gitignore b/deployment/.gitignore new file mode 100644 index 0000000..ae849e6 --- /dev/null +++ b/deployment/.gitignore @@ -0,0 +1,3 @@ +# pixi environments +.pixi/* +!.pixi/config.toml diff --git a/deployment/Dockerfile b/deployment/Dockerfile new file mode 100644 index 0000000..da2afa7 --- /dev/null +++ b/deployment/Dockerfile @@ -0,0 +1,11 @@ +# Base image is overridden by each namespace's BuildConfig (dockerStrategy.from) +FROM scratch + +COPY . /app/ShroffCelegansModels.jl + +# Re-precompile only the local package and anything that depends on it. +# External deps are already precompiled in the base image. +RUN julia --threads=auto --project=/app/ShroffCelegansModels.jl/web \ + -e 'using Pkg; Pkg.precompile()' + +CMD ["julia", "--version"] diff --git a/deployment/Dockerfile.base b/deployment/Dockerfile.base new file mode 100644 index 0000000..598f7d9 --- /dev/null +++ b/deployment/Dockerfile.base @@ -0,0 +1,21 @@ +FROM julia:1.12 + +RUN apt-get update && apt-get install -y --no-install-recommends \ + libhdf5-dev \ + libgl1 \ + libglib2.0-0 \ + && rm -rf /var/lib/apt/lists/* + +# Copy only dependency manifests — this layer is cached until deps change +COPY Manifest.toml /app/ShroffCelegansModels.jl/ +COPY Project.toml /app/ShroffCelegansModels.jl/ +COPY web/Project.toml /app/ShroffCelegansModels.jl/web/ +COPY glmakie/Project.toml /app/ShroffCelegansModels.jl/glmakie/ + +# Stub the local package so external deps can be precompiled without full source +RUN mkdir -p /app/ShroffCelegansModels.jl/src && \ + printf 'module ShroffCelegansModels\nend\n' \ + > /app/ShroffCelegansModels.jl/src/ShroffCelegansModels.jl + +RUN julia --threads=auto --project=/app/ShroffCelegansModels.jl/web \ + -e 'using Pkg; Pkg.instantiate(); Pkg.precompile()' diff --git a/deployment/README.md b/deployment/README.md new file mode 100644 index 0000000..189780d --- /dev/null +++ b/deployment/README.md @@ -0,0 +1,230 @@ +# shroff-data — Container Build & Deployment Package + +This directory contains everything needed to rebuild the shroff-data container image +and deploy it on OpenShift. The source is the `ShroffCelegansModels.jl` repo itself — +all patches previously applied in the separate build package have been merged back in. + +## Directory contents + +``` +ShroffCelegansModels.jl/ # Repo root — also the Docker build context +├── .dockerignore # Excludes deployment/, backup_*/, cache_*/, services/ +├── deployment/ +│ ├── README.md # This file +│ ├── Dockerfile # App image — builds FROM the base image (~2 min) +│ ├── Dockerfile.base # Base image — installs deps & precompiles external packages (~7 min) +│ ├── shroff-data/ # K8s manifests — production namespace (shroff-data.int.janelia.org) +│ │ ├── 00-namespace.yaml +│ │ ├── 01-configmap.yaml +│ │ ├── 02-pvc.yaml +│ │ ├── 03-deployment.yaml +│ │ ├── 04-route.yaml +│ │ ├── 05-buildconfig.yaml +│ │ └── 06-scc.yaml +│ └── shroff-data-test/ # K8s manifests — test namespace (shroff-data-test.int.janelia.org) +│ ├── 00-namespace.yaml +│ ├── 01-configmap.yaml +│ ├── 02-pvc.yaml +│ ├── 03-deployment.yaml +│ ├── 04-route.yaml +│ ├── 05-buildconfig.yaml +│ ├── 05b-buildconfig-base.yaml +│ └── 06-scc.yaml +``` + +All `oc` commands below must be run from the **repo root** (`ShroffCelegansModels.jl/`), +which is the Docker build context. + +## Prerequisites: `oc` via pixi + +The OpenShift CLI is provided by [pixi](https://pixi.sh/) — see `deployment/pixi.toml` +(`openshift-cli` from conda-forge). The system `PATH` does not include `oc`; invoke it +through pixi instead. + +Pick one of the following: + +```bash +# Option A — prefix every command (works from repo root) +pixi run --manifest-path deployment/pixi.toml oc whoami + +# Option B — drop into a shell with oc on PATH +cd deployment && pixi shell # then `oc ...` works; `cd ..` back to repo root for builds + +# Option C — alias in your own shell +alias oc='pixi run --manifest-path '"$PWD"'/deployment/pixi.toml oc' +``` + +The `oc` invocations in the rest of this README assume one of the above is in effect. +Log in with `oc login ...` against the cluster before continuing. + +## Two-stage build + +The build is split into two images to keep routine deploys fast: + +| Image | Dockerfile | Build time | Rebuild when | +|-------|-----------|------------|--------------| +| `shroff-data-test-base` | `Dockerfile.base` | ~7 min | `Project.toml` or `Manifest.toml` changes | +| `shroff-data-test` | `Dockerfile` | ~2 min | Any code change | + +`Dockerfile.base` installs system packages and precompiles all external Julia packages +using a stub for the local `ShroffCelegansModels` package. `Dockerfile` builds `FROM` +that base, copies the real source, and re-precompiles only the local package. + +## Deploying from scratch + +### Test namespace (`shroff-data-test`) + +```bash +oc apply -f deployment/shroff-data-test/00-namespace.yaml +oc apply -f deployment/shroff-data-test/06-scc.yaml + +# Build the base image first (~7 min) +oc apply -f deployment/shroff-data-test/05b-buildconfig-base.yaml +oc start-build shroff-data-test-base --from-dir=. -n shroff-data-test --follow + +# Then build the app image (~2 min) +oc apply -f deployment/shroff-data-test/05-buildconfig.yaml +oc start-build shroff-data-test --from-dir=. -n shroff-data-test --follow + +oc apply -f deployment/shroff-data-test/01-configmap.yaml +oc apply -f deployment/shroff-data-test/02-pvc.yaml +oc apply -f deployment/shroff-data-test/03-deployment.yaml +oc apply -f deployment/shroff-data-test/04-route.yaml +``` + +### Production namespace (`shroff-data`) + +> **Note:** The production namespace does not yet have a base image BuildConfig. +> Use the single-stage build until it is set up (see test namespace as a reference). + +```bash +oc apply -f deployment/shroff-data/00-namespace.yaml +oc apply -f deployment/shroff-data/06-scc.yaml +oc apply -f deployment/shroff-data/05-buildconfig.yaml +oc start-build shroff-data --from-dir=. -n shroff-data --follow +oc apply -f deployment/shroff-data/01-configmap.yaml +oc apply -f deployment/shroff-data/02-pvc.yaml +oc apply -f deployment/shroff-data/03-deployment.yaml +oc apply -f deployment/shroff-data/04-route.yaml +``` + +## Rebuilding after a code update (~2 min) + +For routine code changes, only the app image needs to be rebuilt: + +```bash +# Test +oc start-build shroff-data-test --from-dir=. -n shroff-data-test --follow + +# Production +oc start-build shroff-data --from-dir=. -n shroff-data --follow +``` + +## Rebuilding after a dependency update (~7 + 2 min) + +When `Project.toml` or `Manifest.toml` changes, rebuild the base first, then the app: + +```bash +# Test +oc start-build shroff-data-test-base --from-dir=. -n shroff-data-test --follow +oc start-build shroff-data-test --from-dir=. -n shroff-data-test --follow +``` + +## URLs + +| Environment | URL | +|-------------|-----| +| Production | https://shroff-data.int.janelia.org | +| Test | https://shroff-data-test.int.janelia.org | + +--- + +## Patches merged into the repo + +These four changes were previously applied to a separate build copy and have since been +merged back into the repo. They are noted here for reference. + +### 1. `src/demo_averaging/loading.jl` — config_path fallback + +Added an `else` branch so the config path resolves correctly in containers (which have +random pod names, not the expected hostnames): + +```julia +else + const config_path = joinpath(@__DIR__, "..", "..", "config", "linux", "config_2026_03_19_v2.json") +end +``` + +### 2. `scripts/launch_show_average_annotations.jl` — NFS alias fallback + +Added an `else` branch so `alias_cache_unix("/nearline/shroff")` always runs in containers: + +```julia +else + alias_cache_unix("/nearline/shroff") +end +``` + +### 3. `web/scripts/*.jl` — bind address + +Changed HTTP server bind address from `Sockets.getaddrinfo("shroff-data.int.janelia.org")` +to `"0.0.0.0"` so it binds to a local interface inside the container. + +### 4. `web/scripts/*.jl` — WebSocket proxy URL + +Changed Bonito's `proxy_url` from a hardcoded hostname to read from an environment variable, +allowing the same image to serve both production and test: + +```julia +proxy_url="https://$(get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"))/show_average_annotations/" +``` + +`SHROFF_HOST` is set automatically by the deployment manifest. + +--- + +## Accessing HDF5 data files on the server + +The HDF5 data files are stored on a persistent volume mounted at `/var/www/shroff/data` +inside the nginx container. + +### Get a shell to browse or edit files + +```bash +# Production +oc exec -it -n shroff-data deployment/shroff-data -c nginx -- sh + +# Test +oc exec -it -n shroff-data-test deployment/shroff-data-test -c nginx -- sh + +# Files are at: +ls /var/www/shroff/data/ +``` + +### Copy a file from your machine to the server + +```bash +# Get the pod name first +oc get pods -n shroff-data + +oc cp /local/path/to/file.h5 shroff-data/:/var/www/shroff/data/file.h5 -c nginx +``` + +### Copy a file from the server to your machine + +```bash +oc cp shroff-data/:/var/www/shroff/data/file.h5 /local/path/to/file.h5 -c nginx +``` + +### Delete or rename files + +```bash +oc exec -n shroff-data deployment/shroff-data -c nginx -- rm /var/www/shroff/data/old.h5 +oc exec -n shroff-data deployment/shroff-data -c nginx -- mv /var/www/shroff/data/old.h5 /var/www/shroff/data/new.h5 +``` + +### Notes + +- Changes to the PVC are **persistent** — they survive pod restarts and redeployments +- The volume is shared between the nginx container (serves the files) and nothing else — Julia apps use `/nearline/shroff` for microscopy data, not this PVC +- `oc` CLI must be installed and you must be logged in to the OpenShift cluster diff --git a/deployment/download_annotation_changes.jl b/deployment/download_annotation_changes.jl new file mode 100644 index 0000000..1d76f19 --- /dev/null +++ b/deployment/download_annotation_changes.jl @@ -0,0 +1,13 @@ +using Dates + +function (@main)(args) + date = Dates.format(Dates.today(), "yyyy_mm_dd") + + pod = strip(read(`oc get pod -n shroff-data -l app=shroff-data -o $("jsonpath={.items[0].metadata.name}")`, String)) + + dest = "../annotation_changes_$(date).h5" + + run(`oc cp -n shroff-data -c fix-ap-axis $(pod):/data/annotations/annotation_changes.h5 $(dest)`) + + println("Downloaded to $dest") +end diff --git a/deployment/pixi.lock b/deployment/pixi.lock new file mode 100644 index 0000000..0083f85 --- /dev/null +++ b/deployment/pixi.lock @@ -0,0 +1,27 @@ +version: 6 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + options: + pypi-prerelease-mode: if-necessary-or-explicit + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/openshift-cli-4.20.2-hfc2019e_0.conda + win-64: + - conda: https://conda.anaconda.org/conda-forge/win-64/openshift-cli-4.20.2-h11686cb_0.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/openshift-cli-4.20.2-hfc2019e_0.conda + sha256: 8ba453cb89a23fc27d8b712c406e7ad06ad9e65b2a9b6a11b6a5b91527a648fc + md5: cc15eeccba5b733052870c0f226dca18 + license: Apache-2.0 + license_family: APACHE + size: 107321457 + timestamp: 1762191858837 +- conda: https://conda.anaconda.org/conda-forge/win-64/openshift-cli-4.20.2-h11686cb_0.conda + sha256: 9899cbfdb711ffca706fc526d907f2d9999512b64eb30c41bd5c2ed1c80b742d + md5: 960710ad8ca42e8c1b3fd6df1010a7bd + license: Apache-2.0 + license_family: APACHE + size: 106178707 + timestamp: 1762191879702 diff --git a/deployment/pixi.toml b/deployment/pixi.toml new file mode 100644 index 0000000..cfdaae6 --- /dev/null +++ b/deployment/pixi.toml @@ -0,0 +1,12 @@ +[workspace] +authors = ["Mark Kittisopikul "] +channels = ["conda-forge"] +name = "deployment" +platforms = ["linux-64", "win-64"] +version = "0.1.0" + +[tasks] +download-annotation-changes = { cmd = "julia download_annotation_changes.jl" } + +[dependencies] +openshift-cli = ">=4.20.2,<5" diff --git a/deployment/shroff-data-test/00-namespace.yaml b/deployment/shroff-data-test/00-namespace.yaml new file mode 100644 index 0000000..4744c22 --- /dev/null +++ b/deployment/shroff-data-test/00-namespace.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: shroff-data-test + labels: + name: shroff-data-test diff --git a/deployment/shroff-data-test/01-configmap.yaml b/deployment/shroff-data-test/01-configmap.yaml new file mode 100644 index 0000000..d3c0242 --- /dev/null +++ b/deployment/shroff-data-test/01-configmap.yaml @@ -0,0 +1,120 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: nginx-config + namespace: shroff-data-test +data: + default.conf: | + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + server { + listen 8080; + server_name shroff-data-test.int.janelia.org; + + # Static files baked into the Julia image (shared via emptyDir or same image) + # HDF5 data files served from CephFS PVC at /var/www/shroff/data/ + root /app/ShroffCelegansModels.jl/web/static; + index index.html; + + location / { + } + + location /data/ { + alias /var/www/shroff/data/; + autoindex on; + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always; + add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always; + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Type' 'text/plain; charset=utf-8'; + add_header 'Content-Length' 0; + return 204; + } + } + + location /show_average_annotations/ { + proxy_pass http://localhost:8180/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /meshscatter_average_edited/ { + proxy_pass http://localhost:8580/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /meshscatter_average_edited_2024_10_24/ { + proxy_pass http://localhost:8590/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /debug_annotation_ap_axis/ { + proxy_pass http://localhost:9180/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /debug_annotation_ap_axis_live/ { + proxy_pass http://localhost:9181/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /debug_annotation_ap_axis_retrack_live/ { + proxy_pass http://localhost:9281/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /zscore_analysis/ { + proxy_pass http://localhost:9300/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /fix_annotation_ap_axis/ { + proxy_pass http://localhost:9381/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /modified_times/ { + proxy_pass http://localhost:9400/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + } diff --git a/deployment/shroff-data-test/02-pvc.yaml b/deployment/shroff-data-test/02-pvc.yaml new file mode 100644 index 0000000..2a888ba --- /dev/null +++ b/deployment/shroff-data-test/02-pvc.yaml @@ -0,0 +1,60 @@ +# CephFS PVC for /var/www/shroff/data/ (185MB HDF5 files migrated from VM). +# Static web files (index.html etc.) are baked into the image — not stored here. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: shroff-data-test-www + namespace: shroff-data-test +spec: + accessModes: + - ReadWriteMany + storageClassName: ocs-storagecluster-cephfs + resources: + requests: + storage: 10Gi +--- +# NFS PV/PVC for /nearline/shroff (Shroff Lab microscopy data — read by Julia apps) +apiVersion: v1 +kind: PersistentVolume +metadata: + name: shroff-data-test-nearline +spec: + capacity: + storage: 1Ti + accessModes: + - ReadOnlyMany + persistentVolumeReclaimPolicy: Retain + storageClassName: "" + nfs: + server: nearline.hhmi.org + path: /nearline3/shroff + readOnly: true +--- +--- +# CephFS PVC for annotation_changes.h5 (user edits that must survive pod restarts). +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: shroff-data-test-annotations + namespace: shroff-data-test +spec: + accessModes: + - ReadWriteMany + storageClassName: ocs-storagecluster-cephfs + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: shroff-data-test-nearline + namespace: shroff-data-test +spec: + accessModes: + - ReadOnlyMany + storageClassName: "" + volumeName: shroff-data-test-nearline + resources: + requests: + storage: 1Ti diff --git a/deployment/shroff-data-test/03-deployment.yaml b/deployment/shroff-data-test/03-deployment.yaml new file mode 100644 index 0000000..04c5dce --- /dev/null +++ b/deployment/shroff-data-test/03-deployment.yaml @@ -0,0 +1,389 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: shroff-data-test + namespace: shroff-data-test + labels: + app: shroff-data-test +spec: + replicas: 1 + selector: + matchLabels: + app: shroff-data-test + template: + metadata: + labels: + app: shroff-data-test + spec: + initContainers: + # Copy static web files from the Julia image into a shared emptyDir so nginx + # (nginx:alpine, no Julia) can serve them without needing the full Julia image. + - name: copy-static + image: image-registry.openshift-image-registry.svc:5000/shroff-data-test/shroff-data-test:latest + command: ["cp", "-r", "/app/ShroffCelegansModels.jl/web/static/.", "/static/"] + volumeMounts: + - name: static-files + mountPath: /static + containers: + - name: nginx + image: nginx:alpine + ports: + - containerPort: 8080 + name: http + volumeMounts: + - name: www-data + mountPath: /var/www/shroff/data + - name: static-files + mountPath: /app/ShroffCelegansModels.jl/web/static + readOnly: true + - name: nginx-config + mountPath: /etc/nginx/conf.d + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 256Mi + readinessProbe: + httpGet: + path: / + port: 8080 + initialDelaySeconds: 5 + periodSeconds: 10 + + # Julia web apps — code and precompiled packages baked into the image. + # Only /nearline/shroff NFS mount needed for microscopy data. + # startupProbe allows up to 20 min (safety net; should start fast with precompiled image). + + - name: show-average-annotations + image: image-registry.openshift-image-registry.svc:5000/shroff-data-test/shroff-data-test:latest + command: + - julia + - --threads=auto + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_show_average_annotations.jl + ports: + - containerPort: 8180 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data-test.int.janelia.org" + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + resources: + requests: + memory: 4Gi + cpu: 250m + limits: + memory: 4Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 8180 + failureThreshold: 10 + periodSeconds: 30 + + - name: meshscatter-average-edited + image: image-registry.openshift-image-registry.svc:5000/shroff-data-test/shroff-data-test:latest + command: + - julia + - --threads=auto + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_meshscatter_average_edited.jl + ports: + - containerPort: 8580 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data-test.int.janelia.org" + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 8580 + failureThreshold: 10 + periodSeconds: 30 + + - name: meshscatter-2024-10-24 + image: image-registry.openshift-image-registry.svc:5000/shroff-data-test/shroff-data-test:latest + command: + - julia + - --threads=auto + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_meshscatter_average_edited_2024_10_24.jl + ports: + - containerPort: 8590 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data-test.int.janelia.org" + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 8590 + failureThreshold: 10 + periodSeconds: 30 + + - name: debug-ap-axis + image: image-registry.openshift-image-registry.svc:5000/shroff-data-test/shroff-data-test:latest + command: + - julia + - --threads=auto + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_debug_annotation_ap_axis.jl + ports: + - containerPort: 9180 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data-test.int.janelia.org" + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 9180 + failureThreshold: 10 + periodSeconds: 30 + + - name: debug-ap-axis-live + image: image-registry.openshift-image-registry.svc:5000/shroff-data-test/shroff-data-test:latest + command: + - julia + - --threads=auto + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_debug_annotation_ap_axis_live.jl + ports: + - containerPort: 9181 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data-test.int.janelia.org" + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 9181 + failureThreshold: 10 + periodSeconds: 30 + + - name: debug-ap-axis-retrack-live + image: image-registry.openshift-image-registry.svc:5000/shroff-data-test/shroff-data-test:latest + command: + - julia + - --threads=auto + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_debug_annotation_ap_axis_retrack_live.jl + ports: + - containerPort: 9281 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data-test.int.janelia.org" + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 9281 + failureThreshold: 10 + periodSeconds: 30 + + - name: debug-zscore + image: image-registry.openshift-image-registry.svc:5000/shroff-data-test/shroff-data-test:latest + command: ["sleep", "infinity"] + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data-test.int.janelia.org" + - name: ANNOTATION_CHANGES_PATH + value: /data/annotations/annotation_changes.h5 + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + - name: annotations + mountPath: /data/annotations + resources: + requests: + memory: 4Gi + cpu: 250m + limits: + memory: 8Gi + cpu: "2" + + - name: zscore-analysis + image: image-registry.openshift-image-registry.svc:5000/shroff-data-test/shroff-data-test:latest + command: + - julia + - --threads=auto + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_zscore_analysis.jl + ports: + - containerPort: 9300 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data-test.int.janelia.org" + - name: ANNOTATION_CHANGES_PATH + value: /data/annotations/annotation_changes.h5 + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + - name: annotations + mountPath: /data/annotations + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 9300 + failureThreshold: 10 + periodSeconds: 30 + + - name: modified-times + image: image-registry.openshift-image-registry.svc:5000/shroff-data-test/shroff-data-test:latest + command: + - julia + - --threads=auto + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_modified_times.jl + ports: + - containerPort: 9400 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data-test.int.janelia.org" + - name: MODIFIED_TIMES_DIR + value: /data/annotations/modified_times + volumeMounts: + - name: annotations + mountPath: /data/annotations + readOnly: true + resources: + requests: + memory: 512Mi + cpu: 100m + limits: + memory: 1Gi + cpu: "1" + startupProbe: + tcpSocket: + port: 9400 + failureThreshold: 10 + periodSeconds: 30 + + - name: fix-ap-axis + image: image-registry.openshift-image-registry.svc:5000/shroff-data-test/shroff-data-test:latest + command: + - julia + - --threads=auto + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_fix_annotation_ap_axis.jl + ports: + - containerPort: 9381 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data-test.int.janelia.org" + - name: ANNOTATION_CHANGES_PATH + value: /data/annotations/annotation_changes.h5 + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + - name: annotations + mountPath: /data/annotations + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 9381 + failureThreshold: 10 + periodSeconds: 30 + + volumes: + - name: static-files + emptyDir: {} + - name: www-data + persistentVolumeClaim: + claimName: shroff-data-test-www + - name: nearline + persistentVolumeClaim: + claimName: shroff-data-test-nearline + - name: annotations + persistentVolumeClaim: + claimName: shroff-data-test-annotations + - name: nginx-config + configMap: + name: nginx-config +--- +apiVersion: v1 +kind: Service +metadata: + name: shroff-data-test + namespace: shroff-data-test +spec: + selector: + app: shroff-data-test + ports: + - port: 8080 + targetPort: 8080 + name: http diff --git a/deployment/shroff-data-test/04-route.yaml b/deployment/shroff-data-test/04-route.yaml new file mode 100644 index 0000000..3e2f49e --- /dev/null +++ b/deployment/shroff-data-test/04-route.yaml @@ -0,0 +1,21 @@ +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + name: shroff-data-test + namespace: shroff-data-test + labels: + app: shroff-data-test + annotations: + haproxy.router.openshift.io/timeout: 600s +spec: + host: shroff-data-test.int.janelia.org + to: + kind: Service + name: shroff-data-test + weight: 100 + port: + targetPort: http + tls: + termination: edge + insecureEdgeTerminationPolicy: Redirect + wildcardPolicy: None diff --git a/deployment/shroff-data-test/05-buildconfig.yaml b/deployment/shroff-data-test/05-buildconfig.yaml new file mode 100644 index 0000000..6e2fb0a --- /dev/null +++ b/deployment/shroff-data-test/05-buildconfig.yaml @@ -0,0 +1,28 @@ +apiVersion: build.openshift.io/v1 +kind: BuildConfig +metadata: + name: shroff-data-test + namespace: shroff-data-test +spec: + source: + type: Binary + binary: {} + strategy: + type: Docker + dockerStrategy: + dockerfilePath: deployment/Dockerfile + from: + kind: ImageStreamTag + name: shroff-data-test-base:latest + namespace: shroff-data-test + output: + to: + kind: ImageStreamTag + name: shroff-data-test:latest + triggers: [] +--- +apiVersion: image.openshift.io/v1 +kind: ImageStream +metadata: + name: shroff-data-test + namespace: shroff-data-test diff --git a/deployment/shroff-data-test/05b-buildconfig-base.yaml b/deployment/shroff-data-test/05b-buildconfig-base.yaml new file mode 100644 index 0000000..37b92e4 --- /dev/null +++ b/deployment/shroff-data-test/05b-buildconfig-base.yaml @@ -0,0 +1,24 @@ +apiVersion: build.openshift.io/v1 +kind: BuildConfig +metadata: + name: shroff-data-test-base + namespace: shroff-data-test +spec: + source: + type: Binary + binary: {} + strategy: + type: Docker + dockerStrategy: + dockerfilePath: deployment/Dockerfile.base + output: + to: + kind: ImageStreamTag + name: shroff-data-test-base:latest + triggers: [] +--- +apiVersion: image.openshift.io/v1 +kind: ImageStream +metadata: + name: shroff-data-test-base + namespace: shroff-data-test diff --git a/deployment/shroff-data-test/06-scc.yaml b/deployment/shroff-data-test/06-scc.yaml new file mode 100644 index 0000000..54215cc --- /dev/null +++ b/deployment/shroff-data-test/06-scc.yaml @@ -0,0 +1,13 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: shroff-data-test-anyuid + namespace: shroff-data-test +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:openshift:scc:anyuid +subjects: + - kind: ServiceAccount + name: default + namespace: shroff-data-test diff --git a/deployment/shroff-data-test/07-cronjob-modified-times.yaml b/deployment/shroff-data-test/07-cronjob-modified-times.yaml new file mode 100644 index 0000000..e1641d0 --- /dev/null +++ b/deployment/shroff-data-test/07-cronjob-modified-times.yaml @@ -0,0 +1,62 @@ +# Daily snapshot of integrated_annotation CSV mtimes across all datasets. +# Writes /data/annotations/modified_times/modified_times_YYYY_mm_dd_HHMMSS.h5 +# plus /data/annotations/modified_times/modified_times.h5 (latest) to the +# shroff-data-test-annotations PVC. +apiVersion: batch/v1 +kind: CronJob +metadata: + name: save-modified-times + namespace: shroff-data-test + labels: + app: shroff-data-test + component: save-modified-times +spec: + schedule: "0 2 * * *" + timeZone: "America/New_York" + concurrencyPolicy: Forbid + successfulJobsHistoryLimit: 3 + failedJobsHistoryLimit: 3 + startingDeadlineSeconds: 3600 + jobTemplate: + spec: + backoffLimit: 1 + activeDeadlineSeconds: 7200 + template: + metadata: + labels: + app: shroff-data-test + component: save-modified-times + spec: + restartPolicy: Never + containers: + - name: save-modified-times + image: image-registry.openshift-image-registry.svc:5000/shroff-data-test/shroff-data-test:latest + command: + - julia + - --threads=auto + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/save_modified_times.jl + workingDir: /app/ShroffCelegansModels.jl + env: + - name: MODIFIED_TIMES_DIR + value: /data/annotations/modified_times + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + - name: annotations + mountPath: /data/annotations + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 4Gi + cpu: "2" + volumes: + - name: nearline + persistentVolumeClaim: + claimName: shroff-data-test-nearline + - name: annotations + persistentVolumeClaim: + claimName: shroff-data-test-annotations diff --git a/deployment/shroff-data/00-namespace.yaml b/deployment/shroff-data/00-namespace.yaml new file mode 100644 index 0000000..5bc4e91 --- /dev/null +++ b/deployment/shroff-data/00-namespace.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: shroff-data + labels: + name: shroff-data diff --git a/deployment/shroff-data/01-configmap.yaml b/deployment/shroff-data/01-configmap.yaml new file mode 100644 index 0000000..aef6e12 --- /dev/null +++ b/deployment/shroff-data/01-configmap.yaml @@ -0,0 +1,120 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: nginx-config + namespace: shroff-data +data: + default.conf: | + map $http_upgrade $connection_upgrade { + default upgrade; + '' close; + } + + server { + listen 8080; + server_name shroff-data.int.janelia.org; + + # Static files baked into the Julia image (shared via emptyDir or same image) + # HDF5 data files served from CephFS PVC at /var/www/shroff/data/ + root /app/ShroffCelegansModels.jl/web/static; + index index.html; + + location / { + } + + location /data/ { + alias /var/www/shroff/data/; + autoindex on; + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always; + add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always; + if ($request_method = 'OPTIONS') { + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Type' 'text/plain; charset=utf-8'; + add_header 'Content-Length' 0; + return 204; + } + } + + location /show_average_annotations/ { + proxy_pass http://localhost:8180/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /meshscatter_average_edited/ { + proxy_pass http://localhost:8580/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /meshscatter_average_edited_2024_10_24/ { + proxy_pass http://localhost:8590/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /debug_annotation_ap_axis/ { + proxy_pass http://localhost:9180/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /debug_annotation_ap_axis_live/ { + proxy_pass http://localhost:9181/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /debug_annotation_ap_axis_retrack_live/ { + proxy_pass http://localhost:9281/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /zscore_analysis/ { + proxy_pass http://localhost:9300/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /fix_annotation_ap_axis/ { + proxy_pass http://localhost:9381/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + + location /modified_times/ { + proxy_pass http://localhost:9400/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header Host $host; + proxy_read_timeout 600s; + } + } diff --git a/deployment/shroff-data/02-pvc.yaml b/deployment/shroff-data/02-pvc.yaml new file mode 100644 index 0000000..9871a9a --- /dev/null +++ b/deployment/shroff-data/02-pvc.yaml @@ -0,0 +1,60 @@ +# CephFS PVC for /var/www/shroff/data/ (185MB HDF5 files migrated from VM). +# Static web files (index.html etc.) are baked into the image — not stored here. +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: shroff-data-www + namespace: shroff-data +spec: + accessModes: + - ReadWriteMany + storageClassName: ocs-storagecluster-cephfs + resources: + requests: + storage: 10Gi +--- +# NFS PV/PVC for /nearline/shroff (Shroff Lab microscopy data — read by Julia apps) +apiVersion: v1 +kind: PersistentVolume +metadata: + name: shroff-data-nearline +spec: + capacity: + storage: 1Ti + accessModes: + - ReadOnlyMany + persistentVolumeReclaimPolicy: Retain + storageClassName: "" + nfs: + server: nearline.hhmi.org + path: /nearline3/shroff + readOnly: true +--- +--- +# CephFS PVC for annotation_changes.h5 (user edits that must survive pod restarts). +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: shroff-data-annotations + namespace: shroff-data +spec: + accessModes: + - ReadWriteMany + storageClassName: ocs-storagecluster-cephfs + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: shroff-data-nearline + namespace: shroff-data +spec: + accessModes: + - ReadOnlyMany + storageClassName: "" + volumeName: shroff-data-nearline + resources: + requests: + storage: 1Ti diff --git a/deployment/shroff-data/03-deployment.yaml b/deployment/shroff-data/03-deployment.yaml new file mode 100644 index 0000000..7bb73e7 --- /dev/null +++ b/deployment/shroff-data/03-deployment.yaml @@ -0,0 +1,357 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: shroff-data + namespace: shroff-data + labels: + app: shroff-data +spec: + replicas: 1 + selector: + matchLabels: + app: shroff-data + template: + metadata: + labels: + app: shroff-data + spec: + initContainers: + # Copy static web files from the Julia image into a shared emptyDir so nginx + # (nginx:alpine, no Julia) can serve them without needing the full Julia image. + - name: copy-static + image: image-registry.openshift-image-registry.svc:5000/shroff-data/shroff-data:latest + command: ["cp", "-r", "/app/ShroffCelegansModels.jl/web/static/.", "/static/"] + volumeMounts: + - name: static-files + mountPath: /static + containers: + - name: nginx + image: nginx:alpine + ports: + - containerPort: 8080 + name: http + volumeMounts: + - name: www-data + mountPath: /var/www/shroff/data + - name: static-files + mountPath: /app/ShroffCelegansModels.jl/web/static + readOnly: true + - name: nginx-config + mountPath: /etc/nginx/conf.d + resources: + requests: + cpu: 100m + memory: 128Mi + limits: + cpu: 500m + memory: 256Mi + readinessProbe: + httpGet: + path: / + port: 8080 + initialDelaySeconds: 5 + periodSeconds: 10 + + # Julia web apps — code and precompiled packages baked into the image. + # Only /nearline/shroff NFS mount needed for microscopy data. + # startupProbe allows up to 20 min (safety net; should start fast with precompiled image). + + - name: show-average-annotations + image: image-registry.openshift-image-registry.svc:5000/shroff-data/shroff-data:latest + command: + - julia + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_show_average_annotations.jl + ports: + - containerPort: 8180 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data.int.janelia.org" + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + resources: + requests: + memory: 4Gi + cpu: 250m + limits: + memory: 4Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 8180 + failureThreshold: 10 + periodSeconds: 30 + + - name: meshscatter-average-edited + image: image-registry.openshift-image-registry.svc:5000/shroff-data/shroff-data:latest + command: + - julia + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_meshscatter_average_edited.jl + ports: + - containerPort: 8580 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data.int.janelia.org" + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 8580 + failureThreshold: 10 + periodSeconds: 30 + + - name: meshscatter-2024-10-24 + image: image-registry.openshift-image-registry.svc:5000/shroff-data/shroff-data:latest + command: + - julia + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_meshscatter_average_edited_2024_10_24.jl + ports: + - containerPort: 8590 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data.int.janelia.org" + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 8590 + failureThreshold: 10 + periodSeconds: 30 + + - name: debug-ap-axis + image: image-registry.openshift-image-registry.svc:5000/shroff-data/shroff-data:latest + command: + - julia + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_debug_annotation_ap_axis.jl + ports: + - containerPort: 9180 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data.int.janelia.org" + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 9180 + failureThreshold: 10 + periodSeconds: 30 + + - name: debug-ap-axis-live + image: image-registry.openshift-image-registry.svc:5000/shroff-data/shroff-data:latest + command: + - julia + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_debug_annotation_ap_axis_live.jl + ports: + - containerPort: 9181 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data.int.janelia.org" + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 9181 + failureThreshold: 10 + periodSeconds: 30 + + - name: debug-ap-axis-retrack-live + image: image-registry.openshift-image-registry.svc:5000/shroff-data/shroff-data:latest + command: + - julia + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_debug_annotation_ap_axis_retrack_live.jl + ports: + - containerPort: 9281 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data.int.janelia.org" + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 9281 + failureThreshold: 10 + periodSeconds: 30 + + - name: zscore-analysis + image: image-registry.openshift-image-registry.svc:5000/shroff-data/shroff-data:latest + command: + - julia + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_zscore_analysis.jl + ports: + - containerPort: 9300 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data.int.janelia.org" + - name: ANNOTATION_CHANGES_PATH + value: /data/annotations/annotation_changes.h5 + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + - name: annotations + mountPath: /data/annotations + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 9300 + failureThreshold: 10 + periodSeconds: 30 + + - name: modified-times + image: image-registry.openshift-image-registry.svc:5000/shroff-data/shroff-data:latest + command: + - julia + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_modified_times.jl + ports: + - containerPort: 9400 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data.int.janelia.org" + - name: MODIFIED_TIMES_DIR + value: /data/annotations/modified_times + volumeMounts: + - name: annotations + mountPath: /data/annotations + readOnly: true + resources: + requests: + memory: 512Mi + cpu: 100m + limits: + memory: 1Gi + cpu: "1" + startupProbe: + tcpSocket: + port: 9400 + failureThreshold: 10 + periodSeconds: 30 + + - name: fix-ap-axis + image: image-registry.openshift-image-registry.svc:5000/shroff-data/shroff-data:latest + command: + - julia + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/web_fix_annotation_ap_axis.jl + ports: + - containerPort: 9381 + workingDir: /app/ShroffCelegansModels.jl + env: + - name: SHROFF_HOST + value: "shroff-data.int.janelia.org" + - name: ANNOTATION_CHANGES_PATH + value: /data/annotations/annotation_changes.h5 + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + - name: annotations + mountPath: /data/annotations + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 3Gi + cpu: "2" + startupProbe: + tcpSocket: + port: 9381 + failureThreshold: 10 + periodSeconds: 30 + + volumes: + - name: static-files + emptyDir: {} + - name: www-data + persistentVolumeClaim: + claimName: shroff-data-www + - name: nearline + persistentVolumeClaim: + claimName: shroff-data-nearline + - name: annotations + persistentVolumeClaim: + claimName: shroff-data-annotations + - name: nginx-config + configMap: + name: nginx-config +--- +apiVersion: v1 +kind: Service +metadata: + name: shroff-data + namespace: shroff-data +spec: + selector: + app: shroff-data + ports: + - port: 8080 + targetPort: 8080 + name: http diff --git a/deployment/shroff-data/04-route.yaml b/deployment/shroff-data/04-route.yaml new file mode 100644 index 0000000..fae3131 --- /dev/null +++ b/deployment/shroff-data/04-route.yaml @@ -0,0 +1,22 @@ +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + name: shroff-data + namespace: shroff-data + labels: + app: shroff-data + annotations: + haproxy.router.openshift.io/timeout: 600s +spec: + host: shroff-data.int.janelia.org + to: + kind: Service + name: shroff-data + weight: 100 + port: + targetPort: http + tls: + termination: edge + insecureEdgeTerminationPolicy: Redirect + wildcardPolicy: None + diff --git a/deployment/shroff-data/05-buildconfig.yaml b/deployment/shroff-data/05-buildconfig.yaml new file mode 100644 index 0000000..a80084b --- /dev/null +++ b/deployment/shroff-data/05-buildconfig.yaml @@ -0,0 +1,28 @@ +apiVersion: build.openshift.io/v1 +kind: BuildConfig +metadata: + name: shroff-data + namespace: shroff-data +spec: + source: + type: Binary + binary: {} + strategy: + type: Docker + dockerStrategy: + dockerfilePath: deployment/Dockerfile + from: + kind: ImageStreamTag + name: shroff-data-base:latest + namespace: shroff-data + output: + to: + kind: ImageStreamTag + name: shroff-data:latest + triggers: [] +--- +apiVersion: image.openshift.io/v1 +kind: ImageStream +metadata: + name: shroff-data + namespace: shroff-data diff --git a/deployment/shroff-data/05b-buildconfig-base.yaml b/deployment/shroff-data/05b-buildconfig-base.yaml new file mode 100644 index 0000000..d6ac7d6 --- /dev/null +++ b/deployment/shroff-data/05b-buildconfig-base.yaml @@ -0,0 +1,24 @@ +apiVersion: build.openshift.io/v1 +kind: BuildConfig +metadata: + name: shroff-data-base + namespace: shroff-data +spec: + source: + type: Binary + binary: {} + strategy: + type: Docker + dockerStrategy: + dockerfilePath: deployment/Dockerfile.base + output: + to: + kind: ImageStreamTag + name: shroff-data-base:latest + triggers: [] +--- +apiVersion: image.openshift.io/v1 +kind: ImageStream +metadata: + name: shroff-data-base + namespace: shroff-data diff --git a/deployment/shroff-data/06-scc.yaml b/deployment/shroff-data/06-scc.yaml new file mode 100644 index 0000000..e9f1a4a --- /dev/null +++ b/deployment/shroff-data/06-scc.yaml @@ -0,0 +1,13 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: shroff-data-anyuid + namespace: shroff-data +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:openshift:scc:anyuid +subjects: + - kind: ServiceAccount + name: default + namespace: shroff-data diff --git a/deployment/shroff-data/07-cronjob-modified-times.yaml b/deployment/shroff-data/07-cronjob-modified-times.yaml new file mode 100644 index 0000000..a91b8cf --- /dev/null +++ b/deployment/shroff-data/07-cronjob-modified-times.yaml @@ -0,0 +1,61 @@ +# Daily snapshot of integrated_annotation CSV mtimes across all datasets. +# Writes /data/annotations/modified_times/modified_times_YYYY_mm_dd_HHMMSS.h5 +# plus /data/annotations/modified_times/modified_times.h5 (latest) to the +# shroff-data-annotations PVC. +apiVersion: batch/v1 +kind: CronJob +metadata: + name: save-modified-times + namespace: shroff-data + labels: + app: shroff-data + component: save-modified-times +spec: + schedule: "0 2 * * *" + timeZone: "America/New_York" + concurrencyPolicy: Forbid + successfulJobsHistoryLimit: 3 + failedJobsHistoryLimit: 3 + startingDeadlineSeconds: 3600 + jobTemplate: + spec: + backoffLimit: 1 + activeDeadlineSeconds: 7200 + template: + metadata: + labels: + app: shroff-data + component: save-modified-times + spec: + restartPolicy: Never + containers: + - name: save-modified-times + image: image-registry.openshift-image-registry.svc:5000/shroff-data/shroff-data:latest + command: + - julia + - --project=/app/ShroffCelegansModels.jl/web + - /app/ShroffCelegansModels.jl/web/scripts/save_modified_times.jl + workingDir: /app/ShroffCelegansModels.jl + env: + - name: MODIFIED_TIMES_DIR + value: /data/annotations/modified_times + volumeMounts: + - name: nearline + mountPath: /nearline/shroff + readOnly: true + - name: annotations + mountPath: /data/annotations + resources: + requests: + memory: 2Gi + cpu: 250m + limits: + memory: 4Gi + cpu: "2" + volumes: + - name: nearline + persistentVolumeClaim: + claimName: shroff-data-nearline + - name: annotations + persistentVolumeClaim: + claimName: shroff-data-annotations diff --git a/glmakie/Manifest.toml b/glmakie/Manifest.toml index 9c7e437..cae6e8b 100644 --- a/glmakie/Manifest.toml +++ b/glmakie/Manifest.toml @@ -1,8 +1,8 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.11.4" +julia_version = "1.12.3" manifest_format = "2.0" -project_hash = "5eb09591a8bf80d7978729c550d312413a27b20d" +project_hash = "f1036b997b79e9fa711a14480e97e80cc5339b95" [[deps.AbstractFFTs]] deps = ["LinearAlgebra"] @@ -20,35 +20,11 @@ git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" version = "0.4.5" -[[deps.Accessors]] -deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] -git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" -uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" -version = "0.1.42" - - [deps.Accessors.extensions] - AxisKeysExt = "AxisKeys" - IntervalSetsExt = "IntervalSets" - LinearAlgebraExt = "LinearAlgebra" - StaticArraysExt = "StaticArrays" - StructArraysExt = "StructArrays" - TestExt = "Test" - UnitfulExt = "Unitful" - - [deps.Accessors.weakdeps] - AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" - IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" - LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" - Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - [[deps.Adapt]] deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" +git-tree-sha1 = "0761717147821d696c9470a7a86364b2fbd22fd8" uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.3.0" +version = "4.5.2" weakdeps = ["SparseArrays", "StaticArrays"] [deps.Adapt.extensions] @@ -76,43 +52,11 @@ version = "0.4.2" uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" version = "1.1.2" -[[deps.ArrayInterface]] -deps = ["Adapt", "LinearAlgebra"] -git-tree-sha1 = "9606d7832795cbef89e06a550475be300364a8aa" -uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.19.0" - - [deps.ArrayInterface.extensions] - ArrayInterfaceBandedMatricesExt = "BandedMatrices" - ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" - ArrayInterfaceCUDAExt = "CUDA" - ArrayInterfaceCUDSSExt = "CUDSS" - ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" - ArrayInterfaceChainRulesExt = "ChainRules" - ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" - 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" - 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.ArrayLayouts]] -deps = ["FillArrays", "LinearAlgebra"] -git-tree-sha1 = "4e25216b8fea1908a0ce0f5d87368587899f75be" +deps = ["FillArrays", "LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "e0b47732a192dd59b9d079a06d04235e2f833963" uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" -version = "1.11.1" +version = "1.12.2" weakdeps = ["SparseArrays"] [deps.ArrayLayouts.extensions] @@ -136,21 +80,21 @@ version = "1.1.0" [[deps.AxisArrays]] deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] -git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" +git-tree-sha1 = "4126b08903b777c88edf1754288144a0492c05ad" uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" -version = "0.4.7" +version = "0.4.8" [[deps.BSplineKit]] deps = ["ArrayLayouts", "BandedMatrices", "FastGaussQuadrature", "ForwardDiff", "LinearAlgebra", "PrecompileTools", "Random", "Reexport", "SparseArrays", "Static", "StaticArrays", "StaticArraysCore", "StatsAPI"] -git-tree-sha1 = "8950181792e94c20b204b4d25cba7f2399c5b386" +git-tree-sha1 = "02d491054afeb89b7f34331701e4474eb0b904f7" uuid = "093aae92-e908-43d7-9660-e50ee39d5a0a" -version = "0.19.0" +version = "0.19.2" [[deps.BandedMatrices]] deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "PrecompileTools"] -git-tree-sha1 = "e35c672b239c5105f597963c33e740eeb46cf0ab" +git-tree-sha1 = "02fa77c70ba84361b9bc9ff28523bd9d78519265" uuid = "aae01518-5342-5314-be14-df237901396f" -version = "1.9.4" +version = "1.11.0" [deps.BandedMatrices.extensions] BandedMatricesSparseArraysExt = "SparseArrays" @@ -165,9 +109,9 @@ uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" version = "1.11.0" [[deps.BaseDirs]] -git-tree-sha1 = "03fea4a4efe25d2069c2d5685155005fc251c0a1" +git-tree-sha1 = "bca794632b8a9bbe159d56bf9e31c422671b35e0" uuid = "18cc8868-cbac-4acf-b575-c8ff214dc66f" -version = "1.3.0" +version = "1.3.2" [[deps.Bzip2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -198,67 +142,65 @@ version = "1.0.1+0" [[deps.CSV]] deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] -git-tree-sha1 = "deddd8725e5e1cc49ee205a1964256043720a6c3" +git-tree-sha1 = "8d8e0b0f350b8e1c91420b5e64e5de774c2f0f4d" uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" -version = "0.10.15" +version = "0.10.16" [[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" +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "d0efe2c6fdcdaa1c161d206aa8b933788397ec71" uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.18.5+0" - -[[deps.CatIndices]] -deps = ["CustomUnitRanges", "OffsetArrays"] -git-tree-sha1 = "a0f80a09780eed9b1d106a1bf62041c2efc995bc" -uuid = "aafaddc9-749c-510e-ac4f-586e18779b91" -version = "0.2.2" +version = "1.18.6+0" [[deps.ChainRulesCore]] deps = ["Compat", "LinearAlgebra"] -git-tree-sha1 = "1713c74e00545bfe14605d2a2be1712de8fbcb58" +git-tree-sha1 = "12177ad6b3cad7fd50c8b3825ce24a99ad61c18f" uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.25.1" +version = "1.26.1" weakdeps = ["SparseArrays"] [deps.ChainRulesCore.extensions] ChainRulesCoreSparseArraysExt = "SparseArrays" -[[deps.CircStats]] -deps = ["Distributions", "HypothesisTests", "LinearAlgebra", "SpecialFunctions", "Statistics"] -git-tree-sha1 = "ecfe2e9a260c4723026b4a71460cf0420def9e40" -uuid = "2f6764a1-d620-4564-9394-76eb7c776766" -version = "1.0.4" - [[deps.CodecZlib]] deps = ["TranscodingStreams", "Zlib_jll"] git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" uuid = "944b1d66-785c-5afd-91f1-9de20f533193" version = "0.7.8" +[[deps.CodecZstd]] +deps = ["TranscodingStreams", "Zstd_jll"] +git-tree-sha1 = "da54a6cd93c54950c15adf1d336cfd7d71f51a56" +uuid = "6b39b394-51ab-5f42-8807-6242bab2b4c2" +version = "0.8.7" + [[deps.ColorBrewer]] deps = ["Colors", "JSON"] -git-tree-sha1 = "e771a63cc8b539eca78c85b0cabd9233d6c8f06f" +git-tree-sha1 = "07da79661b919001e6863b81fc572497daa58349" uuid = "a2cac450-b92f-5266-8821-25eda20663c8" -version = "0.4.1" +version = "0.4.2" [[deps.ColorSchemes]] deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] -git-tree-sha1 = "403f2d8e209681fcbd9468a8514efff3ea08452e" +git-tree-sha1 = "b0fd3f56fa442f81e0a47815c92245acfaaa4e34" uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.29.0" +version = "3.31.0" [[deps.ColorTypes]] deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.5" +version = "0.12.1" +weakdeps = ["StyledStrings"] + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" [[deps.ColorVectorSpace]] deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] -git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.10.0" +version = "0.11.0" weakdeps = ["SpecialFunctions"] [deps.ColorVectorSpace.extensions] @@ -270,16 +212,6 @@ git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" version = "0.13.1" -[[deps.Combinatorics]] -git-tree-sha1 = "8010b6bb3388abe68d95743dcbea77650bb2eddf" -uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" -version = "1.0.3" - -[[deps.CommonSolve]] -git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" -uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" -version = "0.2.4" - [[deps.CommonSubexpressions]] deps = ["MacroTools"] git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" @@ -293,9 +225,9 @@ version = "1.0.0" [[deps.Compat]] deps = ["TOML", "UUIDs"] -git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.16.0" +version = "4.18.1" weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] @@ -304,26 +236,18 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.1.1+0" +version = "1.3.0+1" -[[deps.CompositionsBase]] -git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" -uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" -version = "0.1.2" -weakdeps = ["InverseFunctions"] - - [deps.CompositionsBase.extensions] - CompositionsBaseInverseFunctionsExt = "InverseFunctions" - -[[deps.ComputationalResources]] -git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" -uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" -version = "0.3.2" +[[deps.ComputePipeline]] +deps = ["Observables", "Preferences"] +git-tree-sha1 = "3b4be73db165146d8a88e47924f464e55ab053cd" +uuid = "95dc2771-c249-4cd0-9c9f-1f3b4330693c" +version = "0.1.7" [[deps.ConstructionBase]] -git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157" +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" -version = "1.5.8" +version = "1.6.0" weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] [deps.ConstructionBase.extensions] @@ -342,16 +266,23 @@ git-tree-sha1 = "a692f5e257d332de1e554e4566a4e5a8a72de2b2" uuid = "150eb455-5306-5404-9cee-2592286d6298" version = "0.6.4" +[[deps.CoreMath]] +deps = ["CoreMath_jll"] +git-tree-sha1 = "8c0480f92b1b1796239156a1b9b1bfb1b39499b4" +uuid = "b7a15901-be09-4a0e-87d2-2e66b0e09b5a" +version = "0.1.0" + +[[deps.CoreMath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a692a4c1dc59a4b8bc0b6403876eb3250fde2bc3" +uuid = "a38c48d9-6df1-5ac9-9223-b6ada3b5572b" +version = "0.1.0+0" + [[deps.Crayons]] git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" version = "4.1.1" -[[deps.CustomUnitRanges]] -git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a" -uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" -version = "1.0.2" - [[deps.DataAPI]] git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" @@ -359,15 +290,15 @@ version = "1.16.0" [[deps.DataFrames]] deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] -git-tree-sha1 = "fb61b4812c49343d7ef0b533ba982c46021938a6" +git-tree-sha1 = "5fab31e2e01e70ad66e3e24c968c264d1cf166d6" uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" -version = "1.7.0" +version = "1.8.2" [[deps.DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" +deps = ["OrderedCollections"] +git-tree-sha1 = "e86f4a2805f7f19bec5129bc9150c38208e5dc23" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.22" +version = "0.19.4" [[deps.DataValueInterfaces]] git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" @@ -387,9 +318,9 @@ version = "1.16.2+0" [[deps.DelaunayTriangulation]] deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"] -git-tree-sha1 = "5620ff4ee0084a6ab7097a27ba0c19290200b037" +git-tree-sha1 = "c55f5a9fd67bdbc8e089b5a3111fe4292986a8e8" uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" -version = "1.6.4" +version = "1.6.6" [[deps.DiffResults]] deps = ["StaticArraysCore"] @@ -410,9 +341,9 @@ version = "1.11.0" [[deps.Distributions]] deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "3e6d038b77f22791b8e3472b7c633acea1ecac06" +git-tree-sha1 = "12184a8cf11c7cbd90a4db8b2cb2f7b6f057cc46" uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.120" +version = "0.25.124" [deps.Distributions.extensions] DistributionsChainRulesCoreExt = "ChainRulesCore" @@ -425,14 +356,14 @@ version = "0.25.120" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [[deps.DocStringExtensions]] -git-tree-sha1 = "e7b7e6f178525d17c720ab9c081e4ef04429f860" +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.9.4" +version = "0.9.5" [[deps.Downloads]] deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.6.0" +version = "1.7.0" [[deps.EarCut_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -441,9 +372,9 @@ uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" version = "2.2.4+0" [[deps.EnumX]] -git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" +git-tree-sha1 = "c49898e8438c828577f04b92fc9368c388ac783c" uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" -version = "1.0.5" +version = "1.0.7" [[deps.EpollShim_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -453,38 +384,44 @@ version = "0.0.20230411+1" [[deps.ExactPredicates]] deps = ["IntervalArithmetic", "Random", "StaticArrays"] -git-tree-sha1 = "b3f2ff58735b5f024c392fde763f29b057e4b025" +git-tree-sha1 = "83231673ea4d3d6008ac74dc5079e77ab2209d8f" uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" -version = "2.2.8" +version = "2.2.9" [[deps.Expat_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "d55dffd9ae73ff72f1c0482454dcf2ec6c6c4a63" +git-tree-sha1 = "27af30de8b5445644e8ffe3bcb0d72049c089cf1" uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.6.5+0" +version = "2.7.3+0" [[deps.Extents]] git-tree-sha1 = "b309b36a9e02fe7be71270dd8c0fd873625332b4" uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" version = "0.1.6" +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "95ecf07c2eea562b5adbd0696af6db62c0f52560" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.5" + [[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 = "8cc47f299902e13f90405ddb5bf87e5d474c0d38" +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", "libva_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "66381d7059b5f3f6162f28831854008040a4e905" uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "6.1.2+0" +version = "8.0.1+1" -[[deps.FFTViews]] -deps = ["CustomUnitRanges", "FFTW"] -git-tree-sha1 = "cbdf14d1e8c7c8aacbe8b19862e0179fd08321c2" -uuid = "4f61f5a4-77b1-5117-aa51-3ab5ef4ef0cd" -version = "0.3.2" +[[deps.FFTA]] +deps = ["AbstractFFTs", "DocStringExtensions", "LinearAlgebra", "MuladdMacro", "Primes", "Random", "Reexport"] +git-tree-sha1 = "65e55303b72f4a567a51b174dd2c47496efeb95a" +uuid = "b86e33f2-c0db-4aa1-a6e0-ab43e668529e" +version = "0.3.1" [[deps.FFTW]] -deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] -git-tree-sha1 = "7de7c78d681078f027389e067864a8d53bd7c3c9" +deps = ["AbstractFFTs", "FFTW_jll", "Libdl", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "97f08406df914023af55ade2f843c39e99c5d969" uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" -version = "1.8.1" +version = "1.10.0" [[deps.FFTW_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -494,15 +431,15 @@ version = "3.3.11+0" [[deps.FastGaussQuadrature]] deps = ["LinearAlgebra", "SpecialFunctions", "StaticArrays"] -git-tree-sha1 = "fd923962364b645f3719855c88f7074413a6ad92" +git-tree-sha1 = "0044e9f5e49a57e88205e8f30ab73928b05fe5b6" uuid = "442a2c76-b920-505d-bb47-c5924d526838" -version = "1.0.2" +version = "1.1.0" [[deps.FileIO]] deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "b66970a70db13f45b7e57fbda1736e1cf72174ea" +git-tree-sha1 = "6522cfb3b8fe97bec632252263057996cbd3de20" uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.17.0" +version = "1.18.0" [deps.FileIO.extensions] HTTPExt = "HTTP" @@ -511,10 +448,20 @@ version = "1.17.0" HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" [[deps.FilePaths]] -deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"] -git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629" +deps = ["FilePathsBase", "MacroTools", "Reexport"] +git-tree-sha1 = "a1b2fbfe98503f15b665ed45b3d149e5d8895e4c" uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" -version = "0.8.3" +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"] @@ -533,22 +480,17 @@ version = "1.11.0" [[deps.FillArrays]] deps = ["LinearAlgebra"] -git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +git-tree-sha1 = "2f979084d1e13948a3352cf64a25df6bd3b4dca3" uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.13.0" -weakdeps = ["PDMats", "SparseArrays", "Statistics"] +version = "1.16.0" +weakdeps = ["PDMats", "SparseArrays", "StaticArrays", "Statistics"] [deps.FillArrays.extensions] FillArraysPDMatsExt = "PDMats" FillArraysSparseArraysExt = "SparseArrays" + FillArraysStaticArraysExt = "StaticArrays" FillArraysStatisticsExt = "Statistics" -[[deps.FiniteDifferences]] -deps = ["ChainRulesCore", "LinearAlgebra", "Printf", "Random", "Richardson", "SparseArrays", "StaticArrays"] -git-tree-sha1 = "06d76c780d657729cf20821fb5832c6cc4dfd0b5" -uuid = "26cc04aa-876d-5657-8c51-4c34ba976000" -version = "0.12.32" - [[deps.FixedPointNumbers]] deps = ["Statistics"] git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" @@ -557,9 +499,9 @@ version = "0.8.5" [[deps.Fontconfig_jll]] deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] -git-tree-sha1 = "301b5d5d731a0654825f1f2e906990f7141a106b" +git-tree-sha1 = "f85dac9a96a01087df6e3a749840015a0ca3817d" uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" -version = "2.16.0+0" +version = "2.17.1+0" [[deps.Format]] git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" @@ -568,9 +510,9 @@ version = "1.3.7" [[deps.ForwardDiff]] deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] -git-tree-sha1 = "910febccb28d493032495b7009dce7d7f7aee554" +git-tree-sha1 = "cddeab6487248a39dae1a960fff0ac17b2a28888" uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "1.0.1" +version = "1.3.3" weakdeps = ["StaticArrays"] [deps.ForwardDiff.extensions] @@ -584,15 +526,15 @@ version = "4.1.1" [[deps.FreeType2_jll]] deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" +git-tree-sha1 = "70329abc09b886fd2c5d94ad2d9527639c421e3e" uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.13.4+0" +version = "2.14.3+1" [[deps.FreeTypeAbstraction]] deps = ["BaseDirs", "ColorVectorSpace", "Colors", "FreeType", "GeometryBasics", "Mmap"] -git-tree-sha1 = "eaca92bac73aa42f68c57d1b8df1b746eeb2bdaa" +git-tree-sha1 = "4ebb930ef4a43817991ba35db6317a05e59abd11" uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" -version = "0.10.7" +version = "0.10.8" [[deps.FriBidi_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -607,44 +549,39 @@ version = "1.11.0" [[deps.GLFW]] deps = ["GLFW_jll"] -git-tree-sha1 = "13c52cdd876a31240da16dfb51363aed42740325" +git-tree-sha1 = "af06f66cca2b698ab9c482de55977ff8178d025e" uuid = "f7f18e0c-5ee9-5ccd-a5bf-e8befd85ed98" -version = "3.4.4" +version = "3.4.6" [[deps.GLFW_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] -git-tree-sha1 = "fcb0584ff34e25155876418979d4c8971243bb89" +git-tree-sha1 = "9e0fb9e54594c47f278d75063980e43066e26e20" uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" -version = "3.4.0+2" +version = "3.4.1+1" [[deps.GLMakie]] deps = ["ColorTypes", "Colors", "FileIO", "FixedPointNumbers", "FreeTypeAbstraction", "GLFW", "GeometryBasics", "LinearAlgebra", "Makie", "Markdown", "MeshIO", "ModernGL", "Observables", "PrecompileTools", "Printf", "ShaderAbstractions", "StaticArrays"] -git-tree-sha1 = "8753fba3356131357b5cd02500fe80c3668535d0" +git-tree-sha1 = "1e0d427d2c73eb5a7564394df2c9fec8b85e7805" uuid = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" -version = "0.10.18" - -[[deps.GeoFormatTypes]] -git-tree-sha1 = "8e233d5167e63d708d41f87597433f59a0f213fe" -uuid = "68eda718-8dee-11e9-39e7-89f7f65f511f" -version = "0.4.4" - -[[deps.GeoInterface]] -deps = ["DataAPI", "Extents", "GeoFormatTypes"] -git-tree-sha1 = "294e99f19869d0b0cb71aef92f19d03649d028d5" -uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" -version = "1.4.1" +version = "0.13.9" [[deps.GeometryBasics]] -deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] -git-tree-sha1 = "b62f2b2d76cee0d61a2ef2b3118cd2a3215d3134" +deps = ["EarCut_jll", "Extents", "IterTools", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"] +git-tree-sha1 = "1f5a80f4ed9f5a4aada88fc2db456e637676414b" uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" -version = "0.4.11" +version = "0.5.10" -[[deps.Gettext_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" -uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" -version = "0.21.0+0" + [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"] @@ -653,10 +590,15 @@ uuid = "59f7168a-df46-5410-90c8-f2779963d0ec" version = "5.2.3+0" [[deps.Glib_jll]] -deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "fee60557e4f19d0fe5cd169211fdda80e494f4e8" +deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "24f6def62397474a297bfcec22384101609142ed" uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.84.0+0" +version = "2.86.3+0" + +[[deps.Glob]] +git-tree-sha1 = "83cb0092e2792b9e3a865b6655e88f5b862607e2" +uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" +version = "1.4.0" [[deps.Graphite2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -666,9 +608,9 @@ version = "1.3.15+0" [[deps.GridLayoutBase]] deps = ["GeometryBasics", "InteractiveUtils", "Observables"] -git-tree-sha1 = "dc6bed05c15523624909b3953686c5f5ffa10adc" +git-tree-sha1 = "93d5c27c8de51687a2c70ec0716e6e76f298416f" uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" -version = "0.11.1" +version = "0.11.2" [[deps.Grisu]] git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" @@ -676,24 +618,38 @@ uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" version = "1.0.2" [[deps.HDF5]] -deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"] -path = "../../HDF5" +deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "UUIDs"] +git-tree-sha1 = "b21f87845e859579fb0a036aeac9667c71d274a3" +repo-rev = "master" +repo-url = "https://github.com/JuliaIO/HDF5.jl.git" uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" -version = "0.17.1" +version = "0.18.0" [deps.HDF5.extensions] - InlineStringsExt = "InlineStrings" + BloscExt = "Blosc" + CodecBzip2Ext = "CodecBzip2" + CodecLz4Ext = "CodecLz4" + CodecZstdExt = "CodecZstd" + FileIOExt = "FileIO" MPIExt = "MPI" + OrderedCollectionsFileIOExt = ["FileIO", "OrderedCollections"] + bitshuffle_jll_ext = "bitshuffle_jll" [deps.HDF5.weakdeps] - InlineStrings = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" + Blosc = "a74b3585-a348-5f62-a45c-50e91977d574" + CodecBzip2 = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd" + CodecLz4 = "5ba52731-8f18-5e0d-9241-30f10d1ec561" + CodecZstd = "6b39b394-51ab-5f42-8807-6242bab2b4c2" + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" + bitshuffle_jll = "228fe19c-1b83-5282-a626-13744502a320" [[deps.HDF5_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] -git-tree-sha1 = "e94f84da9af7ce9c6be049e9067e511e17ff89ec" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "MPIABI_jll", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "aws_c_s3_jll", "dlfcn_win32_jll", "libaec_jll", "mpif_jll"] +git-tree-sha1 = "45337643a2d97262d5fe72ce1f13e8a662d13d62" uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" -version = "1.14.6+0" +version = "2.1.2+0" [[deps.HarfBuzz_jll]] deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] @@ -702,10 +658,10 @@ uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" version = "8.5.1+0" [[deps.Hwloc_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "92f65c4d78ce8cdbb6b68daf88889950b0a99d11" +deps = ["Artifacts", "JLLWrappers", "Libdl", "XML2_jll", "Xorg_libpciaccess_jll"] +git-tree-sha1 = "baaaebd42ed9ee1bd9173cfd56910e55a8622ee1" uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" -version = "2.12.1+0" +version = "2.13.0+1" [[deps.HypergeometricFunctions]] deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] @@ -713,12 +669,6 @@ git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" version = "0.3.28" -[[deps.HypothesisTests]] -deps = ["Combinatorics", "Distributions", "LinearAlgebra", "Printf", "Random", "Roots", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "15319d5a767eb386bc4b702d5e025a0be62be293" -uuid = "09f84164-cd44-5f33-b23f-e6b0d136a0d5" -version = "0.11.5" - [[deps.IfElse]] git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" @@ -736,24 +686,12 @@ git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" uuid = "c817782e-172a-44cc-b673-b171935fbb9e" version = "0.1.7" -[[deps.ImageContrastAdjustment]] -deps = ["ImageBase", "ImageCore", "ImageTransformations", "Parameters"] -git-tree-sha1 = "eb3d4365a10e3f3ecb3b115e9d12db131d28a386" -uuid = "f332f351-ec65-5f6a-b3d1-319c6670881a" -version = "0.3.12" - [[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.ImageFiltering]] -deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "PrecompileTools", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"] -git-tree-sha1 = "eea3a5095c0c5f143e62773164ab11f67e43c4bb" -uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" -version = "0.7.10" - [[deps.ImageIO]] deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs", "WebP"] git-tree-sha1 = "696144904b76e1ca433b886b4e7edd067d76cbf7" @@ -766,17 +704,11 @@ git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec" uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" version = "0.9.10" -[[deps.ImageTransformations]] -deps = ["AxisAlgorithms", "CoordinateTransformations", "ImageBase", "ImageCore", "Interpolations", "OffsetArrays", "Rotations", "StaticArrays"] -git-tree-sha1 = "dfde81fafbe5d6516fb864dc79362c5c6b973c82" -uuid = "02fcd773-0e25-5acc-982a-7f6622650795" -version = "0.10.2" - [[deps.Imath_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "0936ba688c6d201805a83da835b55c61a180db52" +git-tree-sha1 = "dcc8d0cd653e55213df9b75ebc6fe4a8d3254c65" uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" -version = "3.1.11+0" +version = "3.2.2+0" [[deps.IndirectArrays]] git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" @@ -789,9 +721,9 @@ uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" version = "0.1.5" [[deps.InlineStrings]] -git-tree-sha1 = "6a9fde685a7ac1eb3495f8e812c5a7c3711c2d5e" +git-tree-sha1 = "8f3d257792a522b4601c24a577954b0a8cd7334d" uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" -version = "1.4.3" +version = "1.4.5" [deps.InlineStrings.extensions] ArrowTypesExt = "ArrowTypes" @@ -801,11 +733,16 @@ version = "1.4.3" ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +[[deps.IntegerMathUtils]] +git-tree-sha1 = "4c1acff2dc6b6967e7e750633c50bc3b8d83e617" +uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" +version = "0.1.3" + [[deps.IntelOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "0f14a5456bdc6b9731a5682f439a672750a09e48" +git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303" uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2025.0.4+0" +version = "2025.2.0+0" [[deps.InteractiveUtils]] deps = ["Markdown"] @@ -813,41 +750,46 @@ uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" version = "1.11.0" [[deps.Interpolations]] -deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] -git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "65d505fa4c0d7072990d659ef3fc086eb6da8208" uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" -version = "0.15.1" -weakdeps = ["Unitful"] +version = "0.16.2" +weakdeps = ["ForwardDiff", "Unitful"] [deps.Interpolations.extensions] + InterpolationsForwardDiffExt = "ForwardDiff" InterpolationsUnitfulExt = "Unitful" [[deps.IntervalArithmetic]] -deps = ["CRlibm", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Random", "RoundingEmulator"] -git-tree-sha1 = "694c52705f8b23dc5b39eeac629dc3059a168a40" +deps = ["CRlibm", "CoreMath", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Printf", "Random", "RoundingEmulator"] +git-tree-sha1 = "f1c42fcaca2d8034fe392f3e86c2e0809f75b2a1" uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" -version = "0.22.35" +version = "1.0.6" [deps.IntervalArithmetic.extensions] + IntervalArithmeticArblibExt = "Arblib" IntervalArithmeticDiffRulesExt = "DiffRules" IntervalArithmeticForwardDiffExt = "ForwardDiff" IntervalArithmeticIntervalSetsExt = "IntervalSets" + IntervalArithmeticIrrationalConstantsExt = "IrrationalConstants" 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" + IrrationalConstants = "92d709cd-6900-40b7-9082-c6be49f344b6" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [[deps.IntervalSets]] -git-tree-sha1 = "5fbb102dcb8b1a858111ae81d56682376130517d" +git-tree-sha1 = "79d6bd28c8d9bccc2229784f1bd637689b256377" uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.7.11" +version = "0.7.14" [deps.IntervalSets.extensions] IntervalSetsRandomExt = "Random" @@ -875,9 +817,9 @@ uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" version = "1.3.1" [[deps.IrrationalConstants]] -git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" +git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758" uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.2.4" +version = "0.2.6" [[deps.Isoband]] deps = ["isoband_jll"] @@ -897,15 +839,21 @@ version = "1.0.0" [[deps.JLLWrappers]] deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +git-tree-sha1 = "0533e564aae234aff59ab625543145446d8b6ec2" uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.7.0" +version = "1.7.1" [[deps.JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"] +git-tree-sha1 = "67c6f1f085cb2671c93fe34244c9cccde30f7a26" uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.4" +version = "1.5.0" + + [deps.JSON.extensions] + JSONArrowExt = ["ArrowTypes"] + + [deps.JSON.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" [[deps.JSON3]] deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] @@ -927,27 +875,32 @@ version = "0.1.6" [[deps.JpegTurbo_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1" +git-tree-sha1 = "c0c9b76f3520863909825cbecdef58cd63de705a" uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "3.1.1+0" +version = "3.1.5+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 = "7d703202e65efa1369de1279c162b915e245eed1" +deps = ["Distributions", "DocStringExtensions", "FFTA", "Interpolations", "StatsBase"] +git-tree-sha1 = "4260cfc991b8885bf747801fb60dd4503250e478" uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" -version = "0.6.9" +version = "0.6.11" [[deps.LAME_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +git-tree-sha1 = "059aabebaa7c82ccb853dd4a0ee9d17796f7e1bc" uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.2+0" +version = "3.100.3+0" [[deps.LERC_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" +git-tree-sha1 = "17b94ecafcfa45e8360a4fc9ca6b583b049e4e37" uuid = "88015f11-f218-50d7-93a8-a6af411a945d" -version = "4.0.1+0" +version = "4.1.0+0" [[deps.LLVMOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -964,12 +917,6 @@ weakdeps = ["Serialization"] [deps.LRUCache.extensions] SerializationExt = ["Serialization"] -[[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" @@ -991,24 +938,24 @@ uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" version = "0.6.4" [[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.6.0+0" +version = "8.15.0+0" [[deps.LibGit2]] -deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"] uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" version = "1.11.0" [[deps.LibGit2_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"] uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.7.2+0" +version = "1.9.0+0" [[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +deps = ["Artifacts", "Libdl", "OpenSSL_jll"] uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.11.0+1" +version = "1.11.3+1" [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" @@ -1034,26 +981,26 @@ version = "1.18.0+0" [[deps.Libmount_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "a31572773ac1b745e0343fe5e2c8ddda7a37e997" +git-tree-sha1 = "cc3ad4faf30015a3e8094c9b5b7f19e85bdf2386" uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.41.0+0" +version = "2.42.0+0" [[deps.Libtiff_jll]] deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "4ab7581296671007fc33f07a721631b8855f4b1d" +git-tree-sha1 = "f04133fe05eff1667d2054c53d59f9122383fe05" uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.7.1+0" +version = "4.7.2+0" [[deps.Libuuid_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "321ccef73a96ba828cd51f2ab5b9f917fa73945a" +git-tree-sha1 = "d620582b1f0cbe2c72dd1d5bd195a9ce73370ab1" uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.41.0+0" +version = "2.42.0+0" [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -version = "1.11.0" +version = "1.12.0" [[deps.LogExpFunctions]] deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] @@ -1077,27 +1024,33 @@ version = "1.11.0" [[deps.MKL_jll]] deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] -git-tree-sha1 = "5de60bc6cb3899cd318d80d627560fae2e2d99ae" +git-tree-sha1 = "282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa" uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -version = "2025.0.1+1" +version = "2025.2.0+0" + +[[deps.MPIABI_jll]] +deps = ["Artifacts", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "8d684b5918769c4f9423e0ee3bbdefdab82709e8" +uuid = "b5ada748-db0f-5fc0-8972-9331c762740c" +version = "0.1.4+0" [[deps.MPICH_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "3aa3210044138a1749dbd350a9ba8680869eb503" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "07dbec8aab01696edc0151a401a6cdfe95b9b885" uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" -version = "4.3.0+1" +version = "5.0.1+0" [[deps.MPIPreferences]] deps = ["Libdl", "Preferences"] -git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07" +git-tree-sha1 = "8e98d5d80b87403c311fd51e8455d4546ba7a5f8" uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" -version = "0.1.11" +version = "0.1.12" [[deps.MPItrampoline_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "ff91ca13c7c472cef700f301c8d752bc2aaff1a8" +git-tree-sha1 = "675df097f8eeb28998b2cfe3b25655af73d5f7df" uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" -version = "5.5.3+0" +version = "5.5.6+0" [[deps.MacroTools]] git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" @@ -1105,49 +1058,38 @@ uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" version = "0.5.16" [[deps.Makie]] -deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "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", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] -git-tree-sha1 = "be3051d08b78206fb5e688e8d70c9e84d0264117" +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 = "68af66ec16af8b152309310251ecb4fbfe39869f" uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -version = "0.21.18" +version = "0.24.9" -[[deps.MakieCore]] -deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"] -git-tree-sha1 = "9019b391d7d086e841cbeadc13511224bd029ab3" -uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" -version = "0.8.12" + [deps.Makie.extensions] + MakieDynamicQuantitiesExt = "DynamicQuantities" + + [deps.Makie.weakdeps] + DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821" [[deps.MappedArrays]] -git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +git-tree-sha1 = "0ee4497a4e80dbd29c058fcee6493f5219556f40" uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" -version = "0.4.2" - -[[deps.MarchingCubes]] -deps = ["PrecompileTools", "StaticArrays"] -git-tree-sha1 = "0e893025924b6becbae4109f8020ac0e12674b01" -uuid = "299715c1-40a9-479a-aaf9-4a633d36f717" -version = "0.1.11" +version = "0.4.3" [[deps.Markdown]] -deps = ["Base64"] +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 = "31a99cb7537f812e1d6be893a71804c35979f1be" +git-tree-sha1 = "7eb8cdaa6f0e8081616367c10b31b9d9b34bb02a" uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" -version = "0.6.4" - -[[deps.MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.6+0" +version = "0.6.7" [[deps.MeshIO]] deps = ["ColorTypes", "FileIO", "GeometryBasics", "Printf"] -git-tree-sha1 = "14a12d9153b1a1a22d669eede58b2ea2164ff138" +git-tree-sha1 = "c009236e222df68e554c7ce5c720e4a33cc0c23f" uuid = "7269a6da-0436-5bbc-96c2-40638cbb6118" -version = "0.4.13" +version = "0.5.3" [[deps.MicrosoftMPI_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -1179,7 +1121,12 @@ version = "0.3.4" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2023.12.12" +version = "2025.5.20" + +[[deps.MuladdMacro]] +git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.4" [[deps.NaNMath]] deps = ["OpenLibm_jll"] @@ -1195,7 +1142,7 @@ version = "1.1.1" [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.2.0" +version = "1.3.0" [[deps.Observables]] git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" @@ -1212,21 +1159,21 @@ weakdeps = ["Adapt"] OffsetArraysAdaptExt = "Adapt" [[deps.Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b6aa4566bb7ae78498a5e68943863fa8b5231b59" uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.5+1" +version = "1.3.6+0" [[deps.OpenBLASConsistentFPCSR_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "567515ca155d0020a45b05175449b499c63e7015" +git-tree-sha1 = "f2b3b9e52a5eb6a3434c8cca67ad2dde011194f4" uuid = "6cdc7f73-28fd-5e50-80fb-958a8875b1af" -version = "0.3.29+0" +version = "0.3.30+0" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.27+1" +version = "0.3.29+0" [[deps.OpenEXR]] deps = ["Colors", "FileIO", "OpenEXR_jll"] @@ -1236,26 +1183,25 @@ version = "0.3.3" [[deps.OpenEXR_jll]] deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "8292dd5c8a38257111ada2174000a33745b06d4e" +git-tree-sha1 = "9ac7c730c53b3b5d9a73fb900ac4b4fc263774db" uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" -version = "3.2.4+0" +version = "3.4.9+0" [[deps.OpenLibm_jll]] deps = ["Artifacts", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.1+4" +version = "0.8.7+0" [[deps.OpenMPI_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"] -git-tree-sha1 = "047b66eb62f3cae59ed260ebb9075a32a04350f1" +git-tree-sha1 = "6d6c0ca4824268c1a7dca1f4721c535ac63d9074" uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" -version = "5.0.7+2" +version = "5.0.11+0" [[deps.OpenSSL_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "9216a80ff3682833ac4b733caa8c00390620ba5d" +deps = ["Artifacts", "Libdl"] uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.5.0+0" +version = "3.5.4+0" [[deps.OpenSpecFun_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] @@ -1265,9 +1211,9 @@ version = "0.5.6+0" [[deps.Opus_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +git-tree-sha1 = "e2bb57a313a74b8104064b7efd01406c0a50d2ff" uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.3.3+0" +version = "1.6.1+0" [[deps.OrderedCollections]] git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" @@ -1277,13 +1223,17 @@ version = "1.8.1" [[deps.PCRE2_jll]] deps = ["Artifacts", "Libdl"] uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.42.0+1" +version = "10.44.0+1" [[deps.PDMats]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "f07c06228a1c670ae4c87d1276b92c7c597fdda0" +git-tree-sha1 = "e4cff168707d441cd6bf3ff7e4832bdf34278e4a" uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.35" +version = "0.11.37" +weakdeps = ["StatsBase"] + + [deps.PDMats.extensions] + StatsBaseExt = "StatsBase" [[deps.PNGFiles]] deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] @@ -1305,15 +1255,9 @@ 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 = "275a9a6d85dc86c24d03d1837a0010226a96f540" +git-tree-sha1 = "58e5ed5e386e156bd93e86b305ebd21ac63d2d04" uuid = "36c8627f-9965-5494-a995-c6b170f724f3" -version = "1.56.3+0" - -[[deps.Parameters]] -deps = ["OrderedCollections", "UnPack"] -git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" -uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" -version = "0.12.3" +version = "1.57.1+0" [[deps.Parsers]] deps = ["Dates", "PrecompileTools", "UUIDs"] @@ -1330,7 +1274,7 @@ 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.11.0" +version = "1.12.1" weakdeps = ["REPL"] [deps.Pkg.extensions] @@ -1344,9 +1288,9 @@ version = "0.3.3" [[deps.PlotUtils]] deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] -git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" +git-tree-sha1 = "26ca162858917496748aad52bb5d3be4d26a228a" uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.4.3" +version = "1.4.4" [[deps.PolygonOps]] git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" @@ -1361,21 +1305,33 @@ version = "1.4.3" [[deps.PrecompileTools]] deps = ["Preferences"] -git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +git-tree-sha1 = "07a921781cab75691315adc645096ed5e370cb77" uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.2.1" +version = "1.3.3" [[deps.Preferences]] deps = ["TOML"] -git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +git-tree-sha1 = "8b770b60760d4451834fe79dd483e318eee709c4" uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.4.3" +version = "1.5.2" [[deps.PrettyTables]] -deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] -git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "REPL", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "624de6279ab7d94fc9f672f0068107eb6619732c" uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" -version = "2.4.0" +version = "3.3.2" + + [deps.PrettyTables.extensions] + PrettyTablesTypstryExt = "Typstry" + + [deps.PrettyTables.weakdeps] + Typstry = "f0ed7684-a786-439e-b1e3-3b82803b501e" + +[[deps.Primes]] +deps = ["IntegerMathUtils"] +git-tree-sha1 = "25cdd1d20cd005b52fc12cb6be3f75faaf59bb9b" +uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae" +version = "0.5.7" [[deps.Printf]] deps = ["Unicode"] @@ -1384,26 +1340,26 @@ version = "1.11.0" [[deps.ProgressMeter]] deps = ["Distributed", "Printf"] -git-tree-sha1 = "13c5103482a8ed1536a54c08d0e742ae3dca2d42" +git-tree-sha1 = "fbb92c6c56b34e1a2c4c36058f68f332bec840e7" uuid = "92933f4c-e287-5a05-a399-4b506db050ca" -version = "1.10.4" +version = "1.11.0" [[deps.PtrArrays]] -git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +git-tree-sha1 = "4fbbafbc6251b883f4d2705356f3641f3652a7fe" uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" -version = "1.3.0" +version = "1.4.0" [[deps.QOI]] deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] -git-tree-sha1 = "8b3fc30bc0390abdce15f8822c889f669baed73d" +git-tree-sha1 = "472daaa816895cb7aee81658d4e7aec901fa1106" uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" -version = "1.0.1" +version = "1.0.2" [[deps.QuadGK]] deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" +git-tree-sha1 = "5e8e8b0ab68215d7a2b14b9921a946fee794749e" uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.11.2" +version = "2.11.3" [deps.QuadGK.extensions] QuadGKEnzymeExt = "Enzyme" @@ -1411,14 +1367,8 @@ version = "2.11.2" [deps.QuadGK.weakdeps] Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" -[[deps.Quaternions]] -deps = ["LinearAlgebra", "Random", "RealDot"] -git-tree-sha1 = "994cc27cdacca10e68feb291673ec3a76aa2fae9" -uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" -version = "0.7.6" - [[deps.REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] +deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" version = "1.11.0" @@ -1442,12 +1392,6 @@ weakdeps = ["FixedPointNumbers"] [deps.Ratios.extensions] RatiosFixedPointNumbersExt = "FixedPointNumbers" -[[deps.RealDot]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" -uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" -version = "0.1.0" - [[deps.Reexport]] git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" uuid = "189a3867-3050-52da-a836-e630ba90ab69" @@ -1465,17 +1409,11 @@ git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" uuid = "ae029012-a4dd-5104-9daa-d747884805df" version = "1.3.1" -[[deps.Richardson]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "48f038bfd83344065434089c2a79417f38715c41" -uuid = "708f8203-808e-40c0-ba2d-98a6953ed40d" -version = "1.4.2" - [[deps.Rmath]] deps = ["Random", "Rmath_jll"] -git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" +git-tree-sha1 = "5b3d50eb374cea306873b371d3f8d3915a018f0b" uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" -version = "0.8.0" +version = "0.9.0" [[deps.Rmath_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -1483,38 +1421,6 @@ git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" version = "0.5.1+0" -[[deps.Roots]] -deps = ["Accessors", "CommonSolve", "Printf"] -git-tree-sha1 = "3ac13765751ffc81e3531223782d9512f6023f71" -uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" -version = "2.2.7" - - [deps.Roots.extensions] - RootsChainRulesCoreExt = "ChainRulesCore" - RootsForwardDiffExt = "ForwardDiff" - RootsIntervalRootFindingExt = "IntervalRootFinding" - RootsSymPyExt = "SymPy" - RootsSymPyPythonCallExt = "SymPyPythonCall" - - [deps.Roots.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807" - SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" - SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c" - -[[deps.Rotations]] -deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"] -git-tree-sha1 = "5680a9276685d392c87407df00d57c9924d9f11e" -uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" -version = "1.7.1" - - [deps.Rotations.extensions] - RotationsRecipesBaseExt = "RecipesBase" - - [deps.Rotations.weakdeps] - RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" - [[deps.RoundingEmulator]] git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" @@ -1526,31 +1432,36 @@ version = "0.7.0" [[deps.SIMD]] deps = ["PrecompileTools"] -git-tree-sha1 = "fea870727142270bdf7624ad675901a1ee3b4c87" +git-tree-sha1 = "e24dc23107d426a096d3eae6c165b921e74c18e4" uuid = "fdea26ae-647d-5447-a871-4b548cad5224" -version = "3.7.1" +version = "3.7.2" + +[[deps.SciMLPublic]] +git-tree-sha1 = "0ba076dbdce87ba230fff48ca9bca62e1f345c9b" +uuid = "431bcebd-1456-4ced-9d72-93c2757fff0b" +version = "1.0.1" [[deps.Scratch]] deps = ["Dates"] -git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" uuid = "6c6a2e73-6563-6170-7368-637461726353" -version = "1.2.1" +version = "1.3.0" [[deps.SentinelArrays]] deps = ["Dates", "Random"] -git-tree-sha1 = "712fb0231ee6f9120e005ccd56297abbc053e7e0" +git-tree-sha1 = "ebe7e59b37c400f694f52b58c93d26201387da70" uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" -version = "1.4.8" +version = "1.4.9" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" version = "1.11.0" [[deps.ShaderAbstractions]] -deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays", "StructArrays", "Tables"] -git-tree-sha1 = "79123bc60c5507f035e6d1d9e563bb2971954ec8" +deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"] +git-tree-sha1 = "818554664a2e01fc3784becb2eb3a82326a604b6" uuid = "65257c39-d410-5151-9873-9b3e5be5013e" -version = "0.4.1" +version = "0.5.0" [[deps.SharedArrays]] deps = ["Distributed", "Mmap", "Random", "Serialization"] @@ -1564,28 +1475,28 @@ uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" version = "1.0.3" [[deps.ShroffCelegansModels]] -deps = ["BSplineKit", "CSV", "CircStats", "ColorSchemes", "Colors", "CoordinateTransformations", "DataFrames", "Dates", "FFTW", "FileIO", "FiniteDifferences", "FixedPointNumbers", "GeometryBasics", "HDF5", "ImageContrastAdjustment", "ImageCore", "ImageFiltering", "IndirectArrays", "InteractiveUtils", "Interpolations", "JSON3", "LRUCache", "LinearAlgebra", "Makie", "MakieCore", "Missings", "Observables", "Pkg", "PrecompileTools", "Printf", "ProgressMeter", "QuadGK", "Rotations", "StaticArrays", "Statistics", "StatsBase", "ThinPlateSplines", "TiffImages", "UnicodePlots"] +deps = ["BSplineKit", "CSV", "ColorSchemes", "Colors", "CoordinateTransformations", "DataFrames", "Dates", "FFTW", "FileIO", "FixedPointNumbers", "GeometryBasics", "HDF5", "InteractiveUtils", "Interpolations", "JSON3", "LRUCache", "LinearAlgebra", "Makie", "Missings", "Observables", "Pkg", "PrecompileTools", "Printf", "ProgressMeter", "QuadGK", "Sockets", "StaticArrays", "Statistics", "StatsBase", "ThinPlateSplines", "TiffImages"] path = ".." uuid = "28a312d2-d9d3-46a7-98c1-9c09f12e8c99" version = "1.0.0-DEV" [[deps.SignedDistanceFields]] -deps = ["Random", "Statistics", "Test"] -git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" +deps = ["Statistics"] +git-tree-sha1 = "3949ad92e1c9d2ff0cd4a1317d5ecbba682f4b92" uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" -version = "0.4.0" +version = "0.4.1" [[deps.SimpleTraits]] deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +git-tree-sha1 = "be8eeac05ec97d379347584fa9fe2f5f76795bcb" uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.4" +version = "0.9.5" [[deps.Sixel]] deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] -git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" +git-tree-sha1 = "0494aed9501e7fb65daba895fb7fd57cc38bc743" uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" -version = "0.1.3" +version = "0.1.5" [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" @@ -1593,20 +1504,20 @@ version = "1.11.0" [[deps.SortingAlgorithms]] deps = ["DataStructures"] -git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +git-tree-sha1 = "64d974c2e6fdf07f8155b5b2ca2ffa9069b608d9" uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.2.1" +version = "1.2.2" [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.11.0" +version = "1.12.0" [[deps.SpecialFunctions]] deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "41852b8679f78c8d8961eeadc8f62cef861a52e3" +git-tree-sha1 = "2700b235561b0335d5bef7097a111dc513b8655e" uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.5.1" +version = "2.7.2" weakdeps = ["ChainRulesCore"] [deps.SpecialFunctions.extensions] @@ -1614,9 +1525,9 @@ weakdeps = ["ChainRulesCore"] [[deps.StableRNGs]] deps = ["Random"] -git-tree-sha1 = "95af145932c2ed859b63329952ce8d633719f091" +git-tree-sha1 = "4f96c596b8c8258cc7d3b19797854d368f243ddc" uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" -version = "1.0.3" +version = "1.0.4" [[deps.StackViews]] deps = ["OffsetArrays"] @@ -1625,27 +1536,16 @@ uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" version = "0.1.2" [[deps.Static]] -deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] -git-tree-sha1 = "f737d444cb0ad07e61b3c1bef8eb91203c321eff" +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools", "SciMLPublic"] +git-tree-sha1 = "49440414711eddc7227724ae6e570c7d5559a086" uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" -version = "1.2.0" - -[[deps.StaticArrayInterface]] -deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] -git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" -uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" -version = "1.8.0" -weakdeps = ["OffsetArrays", "StaticArrays"] - - [deps.StaticArrayInterface.extensions] - StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" - StaticArrayInterfaceStaticArraysExt = "StaticArrays" +version = "1.3.1" [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" +git-tree-sha1 = "246a8bb2e6667f832eea063c3a56aef96429a3db" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.13" +version = "1.9.18" weakdeps = ["ChainRulesCore", "Statistics"] [deps.StaticArrays.extensions] @@ -1653,9 +1553,9 @@ weakdeps = ["ChainRulesCore", "Statistics"] StaticArraysStatisticsExt = "Statistics" [[deps.StaticArraysCore]] -git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a" uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.3" +version = "1.4.4" [[deps.Statistics]] deps = ["LinearAlgebra"] @@ -1669,21 +1569,21 @@ weakdeps = ["SparseArrays"] [[deps.StatsAPI]] deps = ["LinearAlgebra"] -git-tree-sha1 = "9d72a13a3f4dd3795a195ac5a44d7d6ff5f552ff" +git-tree-sha1 = "178ed29fd5b2a2cfc3bd31c13375ae925623ff36" uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.7.1" +version = "1.8.0" [[deps.StatsBase]] -deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "b81c5035922cc89c2d9523afc6c54be512411466" +deps = ["AliasTables", "DataAPI", "DataStructures", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "aceda6f4e598d331548e04cc6b2124a6148138e3" uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.5" +version = "0.34.10" [[deps.StatsFuns]] deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "8e45cecc66f3b42633b8ce14d431e8e57a3e242e" +git-tree-sha1 = "91f091a8716a6bb38417a6e6f274602a19aaa685" uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "1.5.0" +version = "1.5.2" weakdeps = ["ChainRulesCore", "InverseFunctions"] [deps.StatsFuns.extensions] @@ -1692,15 +1592,15 @@ weakdeps = ["ChainRulesCore", "InverseFunctions"] [[deps.StringManipulation]] deps = ["PrecompileTools"] -git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" +git-tree-sha1 = "d05693d339e37d6ab134c5ab53c29fce5ee5d7d5" uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" -version = "0.4.1" +version = "0.4.4" [[deps.StructArrays]] deps = ["ConstructionBase", "DataAPI", "Tables"] -git-tree-sha1 = "9537ef82c42cdd8c5d443cbc359110cbb36bae10" +git-tree-sha1 = "ad8002667372439f2e3611cfd14097e03fa4bccd" uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" -version = "0.6.21" +version = "0.7.3" [deps.StructArrays.extensions] StructArraysAdaptExt = "Adapt" @@ -1723,6 +1623,22 @@ git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8" uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" version = "1.11.0" +[[deps.StructUtils]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "aab80fbf866600f3299dd7f6656d80e7be177cfe" +uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42" +version = "2.7.2" + + [deps.StructUtils.extensions] + StructUtilsMeasurementsExt = ["Measurements"] + StructUtilsStaticArraysCoreExt = ["StaticArraysCore"] + StructUtilsTablesExt = ["Tables"] + + [deps.StructUtils.weakdeps] + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + [[deps.StyledStrings]] uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" version = "1.11.0" @@ -1734,7 +1650,7 @@ uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" [[deps.SuiteSparse_jll]] deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.7.0+0" +version = "7.8.3+2" [[deps.TOML]] deps = ["Dates"] @@ -1749,9 +1665,9 @@ version = "1.0.1" [[deps.Tables]] deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] -git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297" +git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.12.0" +version = "1.12.1" [[deps.Tar]] deps = ["ArgTools", "SHA"] @@ -1773,23 +1689,17 @@ version = "1.11.0" deps = ["LinearAlgebra", "Test", "Tullio"] path = "../../ThinPlateSplines" uuid = "1d861738-f48e-4029-b1d3-81ce6bc7f5ab" -version = "0.2.0" +version = "0.2.1" weakdeps = ["GeometryBasics"] [deps.ThinPlateSplines.extensions] ThinPlateSplinesGeometryBasicsExt = "GeometryBasics" [[deps.TiffImages]] -deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"] -git-tree-sha1 = "f21231b166166bebc73b99cea236071eb047525b" +deps = ["CodecZstd", "ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "PrecompileTools", "ProgressMeter", "SIMD", "UUIDs"] +git-tree-sha1 = "9ca5f1f2d42f80df4b8c9f6ab5a64f438bbd9976" uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" -version = "0.11.3" - -[[deps.TiledIteration]] -deps = ["OffsetArrays", "StaticArrayInterface"] -git-tree-sha1 = "1176cc31e867217b06928e2f140c90bd1bc88283" -uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" -version = "0.5.0" +version = "0.11.9" [[deps.TranscodingStreams]] git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" @@ -1803,9 +1713,9 @@ version = "0.1.0" [[deps.Tullio]] deps = ["DiffRules", "LinearAlgebra", "Requires"] -git-tree-sha1 = "972698b132b9df8791ae74aa547268e977b55f68" +git-tree-sha1 = "de0febfe1243e89f352abd4ca0e9de6c8e6190c5" uuid = "bc48ee85-29a4-5162-ae0b-a64e1601d4bc" -version = "0.3.8" +version = "0.3.9" [deps.Tullio.extensions] TullioCUDAExt = "CUDA" @@ -1824,11 +1734,6 @@ deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" version = "1.11.0" -[[deps.UnPack]] -git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" -uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" -version = "1.0.2" - [[deps.Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" version = "1.11.0" @@ -1839,49 +1744,40 @@ git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" version = "0.4.1" -[[deps.UnicodePlots]] -deps = ["ColorSchemes", "ColorTypes", "Contour", "Crayons", "Dates", "LinearAlgebra", "MarchingCubes", "NaNMath", "PrecompileTools", "Printf", "SparseArrays", "StaticArrays", "StatsBase"] -git-tree-sha1 = "24c0e2df19eb3f894d28a64e7486926f38de8a49" -uuid = "b8865327-cd53-5732-bb35-84acbb429228" -version = "3.7.2" - - [deps.UnicodePlots.extensions] - FreeTypeExt = ["FileIO", "FreeType"] - ImageInTerminalExt = "ImageInTerminal" - IntervalSetsExt = "IntervalSets" - TermExt = "Term" - UnitfulExt = "Unitful" - - [deps.UnicodePlots.weakdeps] - FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" - FreeType = "b38be410-82b0-50bf-ab77-7b57e271db43" - ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" - IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" - Term = "22787eb5-b846-44ae-b979-8e399b8463ab" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - [[deps.Unitful]] deps = ["Dates", "LinearAlgebra", "Random"] -git-tree-sha1 = "d62610ec45e4efeabf7032d67de2ffdea8344bed" +git-tree-sha1 = "57e1b2c9de4bd6f40ecb9de4ac1797b81970d008" uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" -version = "1.22.1" -weakdeps = ["ConstructionBase", "InverseFunctions"] +version = "1.28.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.VideoIO]] +deps = ["ColorTypes", "Dates", "Downloads", "FFMPEG", "FFMPEG_jll", "FileIO", "Glob", "ImageCore", "PrecompileTools", "Scratch"] +git-tree-sha1 = "875ead370b78ae92b8aeee906109d8010afa6909" +uuid = "d6d074c3-1acf-5d4c-9a43-ef38773959a2" +version = "1.6.1" [[deps.Wayland_jll]] -deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "XML2_jll"] -git-tree-sha1 = "49be0be57db8f863a902d59c0083d73281ecae8e" +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "96478df35bbc2f3e1e791bc7a3d0eeee559e60e9" uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" -version = "1.23.1+0" - -[[deps.Wayland_protocols_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "5db3e9d307d32baba7067b13fc7b5aa6edd4a19a" -uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" -version = "1.36.0+0" +version = "1.24.0+0" [[deps.WeakRefStrings]] deps = ["DataAPI", "InlineStrings", "Parsers"] @@ -1897,9 +1793,9 @@ version = "0.1.3" [[deps.WoodburyMatrices]] deps = ["LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" +git-tree-sha1 = "248a7031b3da79a127f14e5dc5f417e26f9f6db7" uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" -version = "1.0.0" +version = "1.1.0" [[deps.WorkerUtilities]] git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" @@ -1908,21 +1804,21 @@ version = "1.6.1" [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "b8b243e47228b4a3877f1dd6aee0c5d56db7fcf4" +git-tree-sha1 = "80d3930c6347cfce7ccf96bd3bafdf079d9c0390" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.13.6+1" +version = "2.13.9+0" [[deps.XZ_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "fee71455b0aaa3440dfdd54a9a36ccef829be7d4" +git-tree-sha1 = "b29c22e245d092b8b4e8d3c09ad7baa586d9f573" uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" -version = "5.8.1+0" +version = "5.8.3+0" [[deps.Xorg_libX11_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "b5899b25d17bf1889d25906fb9deed5da0c15b3b" +git-tree-sha1 = "808090ede1d41644447dd5cbafced4731c56bd2f" uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.8.12+0" +version = "1.8.13+0" [[deps.Xorg_libXau_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -1944,15 +1840,15 @@ version = "1.1.6+0" [[deps.Xorg_libXext_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "a4c0ee07ad36bf8bbce1c3bb52d21fb1e0b987fb" +git-tree-sha1 = "1a4a26870bf1e5d26cd585e38038d399d7e65706" uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.7+0" +version = "1.3.8+0" [[deps.Xorg_libXfixes_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "9caba99d38404b285db8801d5c45ef4f4f425a6d" +git-tree-sha1 = "75e00946e43621e09d431d9b95818ee751e6b2ef" uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" -version = "6.0.1+0" +version = "6.0.2+0" [[deps.Xorg_libXi_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] @@ -1962,15 +1858,15 @@ version = "1.8.3+0" [[deps.Xorg_libXinerama_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"] -git-tree-sha1 = "a5bc75478d323358a90dc36766f3c99ba7feb024" +git-tree-sha1 = "0ba01bc7396896a4ace8aab67db31403c71628f4" uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" -version = "1.1.6+0" +version = "1.1.7+0" [[deps.Xorg_libXrandr_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "aff463c82a773cb86061bce8d53a0d976854923e" +git-tree-sha1 = "6c174ef70c96c76f4c3f4d3cfbe09d018bcd1b53" uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" -version = "1.5.5+0" +version = "1.5.6+0" [[deps.Xorg_libXrender_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] @@ -1978,6 +1874,12 @@ git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" version = "0.9.12+0" +[[deps.Xorg_libpciaccess_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "4909eb8f1cbf6bd4b1c30dd18b2ead9019ef2fad" +uuid = "a65dc6b1-eb27-53a1-bb3e-dea574b5389e" +version = "0.18.1+0" + [[deps.Xorg_libxcb_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" @@ -1986,9 +1888,9 @@ version = "1.17.1+0" [[deps.Xorg_libxkbfile_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "e3150c7400c41e207012b41659591f083f3ef795" +git-tree-sha1 = "ed756a03e95fff88d8f738ebc2849431bdd4fd1a" uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" -version = "1.1.3+0" +version = "1.2.0+0" [[deps.Xorg_xkbcomp_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] @@ -2011,7 +1913,7 @@ version = "1.6.0+0" [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.2.13+1" +version = "1.3.1+2" [[deps.Zstd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -2019,6 +1921,66 @@ git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" version = "1.5.7+1" +[[deps.aws_c_auth_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_cal_jll", "aws_c_http_jll", "aws_c_sdkutils_jll"] +git-tree-sha1 = "8cab83c96af80a1be968251ce1a0548a7545484d" +uuid = "2b3700d1-4306-52e2-a478-c162f0c514be" +version = "0.9.6+0" + +[[deps.aws_c_cal_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"] +git-tree-sha1 = "22c0f42f4a1f0dc5dcfa8fd267c4ac407c455e7a" +uuid = "70f11efc-bab2-57f1-b0f3-22aad4e67c4b" +version = "0.9.13+0" + +[[deps.aws_c_common_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a759cb9bf456ad792cc7898a81ae333cce9ef02a" +uuid = "73048d1d-b8c4-5092-a58d-866c5e8d1e50" +version = "0.12.6+0" + +[[deps.aws_c_compression_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"] +git-tree-sha1 = "7910c72f45f44afd297c39fe43b99c56d5ed22ec" +uuid = "73a04cd5-f3d7-5bac-9290-e8adb709f224" +version = "0.3.2+0" + +[[deps.aws_c_http_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_compression_jll", "aws_c_io_jll"] +git-tree-sha1 = "e358d5a001ef7afbd4f8c5225322512819cda2f2" +uuid = "3254fc65-9028-534d-aa9d-d76d128babc6" +version = "0.10.13+0" + +[[deps.aws_c_io_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_cal_jll", "aws_c_common_jll", "s2n_tls_jll"] +git-tree-sha1 = "7e481d474b2087ee8bbf55b81bf9119f21e396d9" +uuid = "13c41daa-f319-5298-b5eb-5754e0170d52" +version = "0.26.3+0" + +[[deps.aws_c_s3_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_auth_jll", "aws_c_common_jll", "aws_c_http_jll", "aws_checksums_jll", "s2n_tls_jll"] +git-tree-sha1 = "3e9917ab25114feba657e71be41cad068b9f6595" +uuid = "bd1f34fb-993f-5903-a121-aaf302eed6d4" +version = "0.11.5+0" + +[[deps.aws_c_sdkutils_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"] +git-tree-sha1 = "c43dfba2c1ab9ea9f02f2c80e86fa16f6460244e" +uuid = "1282aa60-004d-510b-9f52-12498d409daa" +version = "0.2.4+1" + +[[deps.aws_checksums_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"] +git-tree-sha1 = "2570c8e23f4771a087b12a47edcaaa670ac05a01" +uuid = "b2a88e68-78e7-5e94-8c20-c02986ec140e" +version = "0.2.10+0" + +[[deps.dlfcn_win32_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e141d67ffe550eadfb5af1bdbdaf138031e4805f" +uuid = "c4b69c83-5512-53e3-94e6-de98773c479f" +version = "1.4.2+0" + [[deps.isoband_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" @@ -2027,26 +1989,26 @@ version = "0.2.3+0" [[deps.libaec_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "f5733a5a9047722470b95a81e1b172383971105c" +git-tree-sha1 = "1411bc34c180946d3cef591de1384012afa6edee" uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0" -version = "1.1.3+0" +version = "1.1.6+0" [[deps.libaom_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "522c1df09d05a71785765d19c9524661234738e9" +git-tree-sha1 = "850b06095ee71f0135d644ffd8a52850699581ed" uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" -version = "3.11.0+0" +version = "3.13.3+0" [[deps.libass_jll]] deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +git-tree-sha1 = "125eedcb0a4a0bba65b657251ce1d27c8714e9d6" uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.15.2+0" +version = "0.17.4+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.11.0+0" +version = "5.15.0+0" [[deps.libdecor_jll]] deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] @@ -2054,17 +2016,23 @@ git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" version = "0.2.2+0" +[[deps.libdrm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libpciaccess_jll"] +git-tree-sha1 = "63aac0bcb0b582e11bad965cef4a689905456c03" +uuid = "8e53e030-5e6c-5a89-a30b-be5b7263a166" +version = "2.4.125+1" + [[deps.libfdk_aac_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +git-tree-sha1 = "646634dd19587a56ee2f1199563ec056c5f228df" uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.3+0" +version = "2.0.4+0" [[deps.libpng_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "002748401f7b520273e2b506f61cab95d4701ccf" +git-tree-sha1 = "e51150d5ab85cee6fc36726850f0e627ad2e4aba" uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.48+0" +version = "1.6.58+0" [[deps.libsixel_jll]] deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"] @@ -2072,33 +2040,51 @@ git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a" uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" version = "1.10.5+0" +[[deps.libva_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll", "Xorg_libXfixes_jll", "libdrm_jll"] +git-tree-sha1 = "7dbf96baae3310fe2fa0df0ccbb3c6288d5816c9" +uuid = "9a156e7d-b971-5f62-b2c9-67348b8fb97c" +version = "2.23.0+0" + [[deps.libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] -git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll"] +git-tree-sha1 = "11e1772e7f3cc987e9d3de991dd4f6b2602663a5" uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.7+2" +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 = "d2408cac540942921e7bd77272c32e58c33d8a77" +git-tree-sha1 = "4e4282c4d846e11dce56d74fa8040130b7a95cb3" uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2" -version = "1.5.0+0" +version = "1.6.0+0" + +[[deps.mpif_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIABI_jll", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "TOML"] +git-tree-sha1 = "c5ce26ac1d6d17f35e965d82a4d13566330e368c" +uuid = "9aeb927a-4695-514f-a259-621a69f20ec0" +version = "0.1.6+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.59.0+0" +version = "1.64.0+1" [[deps.oneTBB_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "d5a767a3bb77135a99e433afe0eb14cd7f6914c3" +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "1350188a69a6e46f799d3945beef36435ed7262f" uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" -version = "2022.0.0+0" +version = "2022.0.0+1" [[deps.p7zip_jll]] -deps = ["Artifacts", "Libdl"] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.4.0+2" +version = "17.7.0+0" + +[[deps.s2n_tls_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6b99e06a3863de281da6ff0e193a5b3706349054" +uuid = "cddc5d3d-934d-5d3a-9747-62fc12ea3f48" +version = "1.7.2+0" [[deps.x264_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -2108,12 +2094,12 @@ version = "10164.0.1+0" [[deps.x265_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "dcc541bb19ed5b0ede95581fb2e41ecf179527d2" +git-tree-sha1 = "e7b67590c14d487e734dcb925924c5dc43ec85f3" uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "3.6.0+0" +version = "4.1.0+0" [[deps.xkbcommon_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] -git-tree-sha1 = "c950ae0a3577aec97bfccf3381f66666bc416729" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "a1fc6507a40bf504527d0d4067d718f8e179b2b8" uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" -version = "1.8.1+0" +version = "1.13.0+0" diff --git a/glmakie/Project.toml b/glmakie/Project.toml index 5aac7d1..4fcb863 100644 --- a/glmakie/Project.toml +++ b/glmakie/Project.toml @@ -1,4 +1,7 @@ [deps] +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" ColorTypes = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" ShroffCelegansModels = "28a312d2-d9d3-46a7-98c1-9c09f12e8c99" +VideoIO = "d6d074c3-1acf-5d4c-9a43-ef38773959a2" diff --git a/scripts/build_fig.jl b/scripts/build_fig.jl new file mode 100644 index 0000000..f30f869 --- /dev/null +++ b/scripts/build_fig.jl @@ -0,0 +1,169 @@ +#julia> fig = with_theme(theme_black()) do +using Colors +using TiffImages +using FixedPointNumbers +function build_figure(model=models[49], vol = nothing, redch = nothing) + r = LinRange(0,1,length(model)) + verts = map(model.transverse_splines[[1,9,17,25]]) do s + s.(r) + end |> stack + central_pts = model.central_spline.(r); + function square(n) + pts = [ + verts[n, 1] + verts[n, 2], + verts[n, 3] + verts[n, 2], + verts[n, 3] + verts[n, 4], + verts[n, 1] + verts[n, 4] + ] .- central_pts[n] + # println(pts) + GeometryBasics.Mesh(pts, [1, 2, 3, 3, 4, 1]) + end + smodel = ShroffCelegansModels.Types.StraightenedCelegansModel(model) + _square_obs = Observable(square(1)) + _contour_obs = Observable(ShroffCelegansModels.get_model_contour_mesh(model)) + + + green_colormap = to_colormap(:greens) + green_colormap[1] = RGBA(0,0,0,0) + red_colormap = to_colormap(:reds) + red_colormap[1] = RGBA(0,0,0,0) + blue_colormap = to_colormap(:blues) + blue_colormap[1] = RGBA(0,0,0,0) + + sections = ShroffCelegansModels.get_sections(model) + straight_sections = ShroffCelegansModels.get_sections(smodel) + + _straight_contour_obs = Observable( + ShroffCelegansModels.get_model_contour_mesh( + straight_sections, + transform_points = swapyz_scale, + ) + ) + + #vol = TiffImages.load(raw"X:\shrofflab\RW10598\Data\598_Slitscan_6um_5min_Pos1\Decon_registered\RegB\Decon_reg_67.tif"); + if isnothing(vol) + vol = TiffImages.load(raw"X:\shrofflab\OD1599_NU\112719_Pos3\Decon_Reg\RegB\Decon_reg_60.tif") + redch = TiffImages.load(raw"X:\shrofflab\OD1599_NU\112719_Pos3\Decon_Reg\RegA\Decon_reg_60.tif") + end + raw_vol = reinterpret(N0f32, vol) + + fig = Figure() + ax = LScene(fig[1:2, 1]; show_axis=true) + t = 1:length(model) + ax_straight = LScene(fig[3,1]; show_axis=true) + sliders = SliderGrid(fig[4, 1], + (label="Spline Parameter", range=t), + ) + r = LinRange(0,1,length(model)) + low_raw_vol = similar(raw_vol) + low_raw_vol .= 0 + mask = raw_vol .< 0.01 + low_raw_vol[mask] .= raw_vol[mask] + #v = volume!(ax, permutedims(vol, (2, 1, 3)); colormap=green_colormap, colorrange=(0.00, 0.5)) + #v2 = volume!(ax, permutedims(reinterpret(N0f16, redch), (2, 1, 3)); colormap=red_colormap, colorrange=(0.00, 0.03)) + v = volume!(ax, permutedims(raw_vol, (2,1,3)); colormap=green_colormap, colorrange=extrema(raw_vol)) + #v2 = volume!(ax, permutedims(redch, (2,1,3)); colormap=red_colormap, colorrange=extrema(redch)) + #v_surface = volume!(ax, permutedims(low_raw_vol, (2,1,3)); colormap=blue_colormap, colorrange=(0.00, 0.01), alpha = 0.5) + mesh!(ax, _contour_obs, alpha=0.5, transparency=true; color = :grey) + #_square_obs = Observable(square(1)) + mesh!(ax, _square_obs, color=:red) + right_spline = Observable(ShroffCelegansModels.Types.transverse_spline(model, 1).(r)) + left_spline = Observable(ShroffCelegansModels.Types.transverse_spline(model, 17).(r)) + central_spline = Observable(ShroffCelegansModels.Types.central_spline(model).(r)) + lines!(ax, left_spline, color=:red) + lines!(ax, right_spline, color=:green) + lines!(ax, central_spline, color=:magenta) + pts = seam_cell_pts(model, 0) + scatter!(ax, pts, color=:red) + + mesh!(ax_straight, _straight_contour_obs, alpha = 0.5, transparency=true; color = :grey) + + + #scatter!(ax, pts, color=:red) + cc = Camera3D(ax.scene) + + zoom!(ax.scene, cc, 0.5) + + cc_straight = Camera3D(ax_straight.scene; + projectiontype = Makie.Orthographic, + lookat = Vec3d(0, 90, 0), + eyeposition = Vec3d(30, 90, 0) + ) + + zoom!(ax_straight.scene, cc_straight, 0.5) + update_cam!(ax_straight.scene, cc_straight) + + on(sliders.sliders[1].value) do i + r = LinRange(0,1,length(model))[1:i] + _square_obs[] = square(i) + _contour_obs[] = ShroffCelegansModels.get_model_contour_mesh( + sections[1:i]; ellipse_points=32) + right_spline[] = ShroffCelegansModels.Types.transverse_spline(model, 1).(r) + left_spline[] = ShroffCelegansModels.Types.transverse_spline(model, 17).(r) + central_spline[] = ShroffCelegansModels.Types.central_spline(model).(r) + + _straight_contour_obs[] = ShroffCelegansModels.get_model_contour_mesh( + straight_sections[1:i]; + ellipse_points=32, + transform_points=swapyz_scale + ) + end + + (; + fig, + ax, + ax_straight, + cc, + cc_straight + ) + + Foo(fig) do fig + display(fig, update=false) + zoom!(ax.scene, cameracontrols(ax), 0.5) + zoom!(ax_straight.scene, cameracontrols(ax_straight), 0.2) + end +end + +#= +julia> record(fig, "2024_10_24_sweep_v1.mp4", 1:length(models[60]); visible=true) do i + _square_obs[] = square(i) + _contour_obs[] = ShroffCelegansModels.get_model_contour_mesh(sections[1:i]; ellipse_points=32) + sleep(0.01) + end +=# + +function square_samples(n, radius=nothing) + if isnothing(radius) + pts = [ + verts[n, 1] + verts[n, 2], + verts[n, 3] + verts[n, 2], + verts[n, 3] + verts[n, 4], + verts[n, 1] + verts[n, 4] + ] .- central_pts[n] + else + up_vec = normalize(verts[n, 2] .- central_pts[n]) + right_vec = normalize(verts[n, 1] .- central_pts[n]) + pts = [ + up_vec + right_vec, + up_vec - right_vec, + -up_vec - right_vec, + -up_vec + right_vec + ] + # pts = normalize.(pts) + pts .*= radius + pts .+= (central_pts[n],) + end + w = floor(Int, norm(pts[1] - pts[4])) + h = floor(Int, norm(pts[2] - pts[1])) + # @info w h norm(up_vec) norm(right_vec) norm(pts[1] - pts[4]) norm(pts[2] - pts[1]) radius + left = LinRange(pts[4], pts[3], h) + top = LinRange(Point3f(0), pts[1] - pts[4], w) + # voxels = Matrix{Point3f}(undef, h, w) + voxels = Point3f[] + for start in left + for pt in (start,) .+ top + push!(voxels, pt) + end + end + return reshape(voxels, (w, h)) +end \ No newline at end of file diff --git a/scripts/launch_show_average_annotations.jl b/scripts/launch_show_average_annotations.jl index 58cfbd9..11ee371 100644 --- a/scripts/launch_show_average_annotations.jl +++ b/scripts/launch_show_average_annotations.jl @@ -1,12 +1,12 @@ using Pkg #using Revise cd(dirname(@__DIR__)) -Pkg.activate(dirname(@__DIR__)) -using JSON3 +#Pkg.activate(dirname(@__DIR__)) using ShroffCelegansModels -using Printf -using HDF5 -using ThinPlateSplines # tps_solve +using ShroffCelegansModels.JSON3 +using ShroffCelegansModels.Printf +using ShroffCelegansModels.HDF5 +using ShroffCelegansModels.ThinPlateSplines # tps_solve using InteractiveUtils @info "Loading demo_averaging.jl..." @@ -88,9 +88,8 @@ end if gethostname() == "KITTISOPIKULM-2" alias_cache("X") -elseif gethostname() == "vm7249" - # shroff-data.int.janelia.org - alias_cache_unix("/nearline/shroff") +else + alias_cache_unix("/nearline/shroff/") end function main() diff --git a/scripts/meshscatter_average.jl b/scripts/meshscatter_average.jl index 5e34ad4..0ffe8f5 100644 --- a/scripts/meshscatter_average.jl +++ b/scripts/meshscatter_average.jl @@ -16,7 +16,7 @@ function meshscatter_average(average_annotations_dict; nerve_ring = false, model colors_dict = load_colors_dict() function get_color(annotation) annotation = lowercase(annotation) - annotation = replace(annotation, "/" => "_") + #annotation = replace(annotation, "/" => "_") get(colors_dict, annotation, RGBf(1,1,1)) end diff --git a/scripts/meshscatter_average_dev.jl b/scripts/meshscatter_average_dev.jl index b89c352..84b81b9 100644 --- a/scripts/meshscatter_average_dev.jl +++ b/scripts/meshscatter_average_dev.jl @@ -20,8 +20,8 @@ function meshscatter_average(average_annotations_dict; nerve_ring = false, model colors_dict = load_colors_dict() function get_color(annotation) annotation = lowercase(annotation) - annotation = replace(annotation, "/" => "_") - get(colors_dict, annotation, RGBAf(0,0,0,0)) + #annotation = replace(annotation, "/" => "_") + get(colors_dict, annotation, RGBAf(1,1,1,1)) end # Font size @@ -29,7 +29,7 @@ function meshscatter_average(average_annotations_dict; nerve_ring = false, model # HPF Label label_offset = 8 - time_text = Observable("hpf = 14:00") + time_text = Observable("hpf = 12:31") text!(-label_offset, 0, label_offset; text = time_text, fontsize=_fontsize) # Scalebar @@ -198,8 +198,8 @@ function meshscatter_average(average_annotations_dict; nerve_ring = false, model zoom!(ax.scene, 4) on(throttle(0.1, time_slider.value)) do t - total_minutes = (t-1)/200*420 - hours = 7 + round(Int, total_minutes/60, RoundDown) + total_minutes = (t-1+11)/200*370 + hours = 6 + round(Int, total_minutes/60, RoundDown) minutes = round(Int, mod(total_minutes, 60), RoundDown) time_text[] = "hpf = $hours:$(@sprintf("%02d", minutes))" if xy_bounding_radius > 0 @@ -240,7 +240,7 @@ function meshscatter_average(average_annotations_dict; nerve_ring = false, model update_cam!(ax.scene, cc, 0, 0) scalebar[] = Point3f[[label_offset+1, scalebar_y_offset, -label_offset-1], [label_offset+1, scalebar_y_offset + scalebar_size_um, -label_offset-1]] end - vid = Observable(DOM.div("Press record..."; id="video_recording", style="color: white; display: none;")) + #vid = Observable(DOM.div("Press record..."; id="video_recording", style="color: white; display: none;")) on(record_button.clicks) do _ # record(fig, "/var/www/shroff/test.mp4", time_slider.range[]; update=false) do t # VideoStream @@ -251,7 +251,7 @@ function meshscatter_average(average_annotations_dict; nerve_ring = false, model vid[] = DOM.div(crop_video(vs); id = "video_recording") controls_visible[] = true if !isnothing(session) - evaljs(session, js"""document.getElementById("video_recording").scrollIntoView(true)""") + #evaljs(session, js"""document.getElementById("video_recording").scrollIntoView(true)""") end end on(record_button2.clicks) do _ @@ -270,7 +270,7 @@ function meshscatter_average(average_annotations_dict; nerve_ring = false, model vid[] = DOM.div(crop_video(vs); id = "video_recording") controls_visible[] = true if !isnothing(session) - evaljs(session, js"""document.getElementById("video_recording").scrollIntoView(true)""") + #evaljs(session, js"""document.getElementById("video_recording").scrollIntoView(true)""") end end @@ -298,7 +298,8 @@ function meshscatter_average(average_annotations_dict; nerve_ring = false, model =# #DOM.body(fig, style=Styles(CSS("background-color" => "black"))) DataInspector(fig; backgroundcolor = :black) - DOM.div(fig, vid) + #DOM.div(fig, vid) + fig end #with_theme(meshscatter_all, theme_black()) #set_theme!(theme_black()) diff --git a/scripts/meshscatter_single.jl b/scripts/meshscatter_single.jl new file mode 100644 index 0000000..95bfb63 --- /dev/null +++ b/scripts/meshscatter_single.jl @@ -0,0 +1,90 @@ +using Makie +using Makie: throttle, Button +using Printf +using GeometryBasics + +function meshscatter_single(cache; nerve_ring = false) + fig = Figure(size = (1920, 1080)) + ax = LScene(fig[1,1:3]; show_axis = false) + coordinates = values(cache) + #T = MeshScatter{Tuple{Vector{Point{3, Float64}}}} + T = Observable{Vector{Point{3, Float64}}} + s = Vector{T}(undef, length(coordinates)) + _markersize = Observable(0.5) + _keys = collect(keys(cache)) + if nerve_ring + for (i, v) in enumerate(coordinates) + s[i] = Observable(v[end]) + if contains(_keys[i], "DCR6485_RPM1_NU") + meshscatter!(s[i], markersize=_markersize, color = :blue) + else + meshscatter!(s[i], markersize=_markersize, color = :grey, alpha = 0.1) + end + end + else + for (i, v) in enumerate(coordinates) + s[i] = Observable(v[end]) + meshscatter!(s[i], markersize=_markersize) + end + end + time_text = Observable("hpf = 14:00") + text!(-20, 0, 20; text = time_text) + text!( 20, 190, -20; text = "10 μm") + scalebar = Observable(Point3f[[21, 190, -21], [21, 200, -21]]) + lines!(scalebar, color = :white, linewidth = 5) + cc = Camera3D(ax.scene; + projectiontype = Makie.Orthographic, + lookat = Vec3d(0, 90, 0), + eyeposition = Vec3d(60, 90, 0) + ) + + time_points = axes(first(coordinates), 1) + time_slider = Makie.Slider(fig[2,1:3], range = time_points, startvalue = 201) + #grid = GridLayout(tellwidth = false, tellheight = false, height = Fixed(5)) + xy_button = Button(fig; label = "XY", buttoncolor = RGBf(0.5, 0.5, 0.5), tellwidth = false) + xz_button = Button(fig; label = "XZ", buttoncolor = RGBf(0.5, 0.5, 0.5), tellwidth = false) + yz_button = Button(fig; label = "YZ", buttoncolor = RGBf(0.5, 0.5, 0.5), tellwidth = false) + #grid[1,1] = button + fig[3,1] = xy_button + fig[3,2] = xz_button + fig[3,3] = yz_button + zoom!(ax.scene, 2) + on(throttle(0.1, time_slider.value)) do t + total_minutes = (t-1)/200*420 + hours = 7 + round(Int, total_minutes/60, RoundDown) + minutes = round(Int, mod(total_minutes, 60), RoundDown) + time_text[] = "hpf = $hours:$(@sprintf("%02d", minutes))" + for (i, v) in enumerate(coordinates) + s[i][] = v[t] + end + end + on(xy_button.clicks) do _ + update_cam!(ax.scene, cc, π/2, 0) + scalebar[] = Point3f[[21, 190, -21], [11, 190, -21]] + end + on(xz_button.clicks) do _ + update_cam!(ax.scene, cc, 0, π/2) + scalebar[] = Point3f[[21, 190, -21], [21, 200, -21]] + end + on(yz_button.clicks) do _ + update_cam!(ax.scene, cc, 0, 0) + scalebar[] = Point3f[[21, 190, -21], [21, 200, -21]] + end + #= + println("Press any key to continue:") + readline() + for i in 1:10 + _markersize[] = 0.1*i + for t in time_points + for (i, v) in enumerate(coordinates) + s[i][] = v[t] + end + sleep(0.05) + end + end + =# + # DOM.body(fig, style=Styles(CSS("background-color" => "black"))) + fig +end +#with_theme(meshscatter_all, theme_black()) +#set_theme!(theme_black()) diff --git a/src/MIPAVIO.jl b/src/MIPAVIO.jl index dbe4d91..56e24e5 100644 --- a/src/MIPAVIO.jl +++ b/src/MIPAVIO.jl @@ -8,16 +8,22 @@ MIPAV is a Java program from the National Institutes of Health """ module MIPAVIO using DataFrames: DataFrame - using GeometryBasics: Point3, Point3f + using GeometryBasics: Point3, Point3f, Point3d using CSV: CSV using ShroffCelegansModels: Datasets using Statistics: mean + using Dates: DateTime, unix2datetime, TimeType + using HDF5: h5open, create_group, attrs export mipav_df_to_points, mipav_df_to_point_dict - function mipav_df_to_points(df::DataFrame) - map(df.x_voxels, df.y_voxels, df.z_voxels) do x,y,z - Point3(x,y,z) + function mipav_df_to_points(df::DataFrame)::Vector{Point3d} + map( + df.x_voxels::Vector{Float64}, + df.y_voxels::Vector{Float64}, + df.z_voxels::Vector{Float64} + ) do x,y,z + Point3d(x,y,z) end end @@ -58,7 +64,7 @@ module MIPAVIO return missing else filepath = joinpath(ds.path, "Decon_reg_$(timepoint)", "Decon_reg_$(timepoint)_results", data_path) - @info "Filepath" filepath + @debug "Filepath" filepath if isfile(filepath) return filepath else @@ -113,4 +119,83 @@ module MIPAVIO end return annotations end + + function get_modified_times_unix(dataset::Datasets.NormalizedDataset)::Vector{Float64} + map(1:length(range(dataset.cell_key))) do i + try + path = get_integrated_annotations_path(dataset, i) + ismissing(path) && return NaN + path_stat = stat(path) + path_stat.mtime + catch + NaN + end + end + end + + function get_modified_times_unix( + datasets::Dict{String, Vector{Datasets.NormalizedDataset}} + )::Dict{String,Vector{Vector{Float64}}} + Dict(k => get_modified_times_unix.(v) for (k,v) in datasets) + end + + function save_modified_times_unix( + datasets::Dict{String, Vector{Datasets.NormalizedDataset}}, + modified_times::Dict{String,Vector{Vector{Float64}}} = get_modified_times_unix(datasets); + filepath::String + ) + h5open(filepath, "w") do h5f + for group in keys(datasets) + h5g = create_group(h5f, group) + for (k,v) in pairs(modified_times[group]) + h5g[string(k)] = v + A = attrs(h5f[group][string(k)]) + dataset = datasets[group][k] + A["path"] = dataset.path + A["cell_key.name"] = dataset.cell_key.name + A["cell_key.start"] = dataset.cell_key.start + A["cell_key.end"] = dataset.cell_key.stop + A["cell_key.outliers"] = dataset.cell_key.outliers + end + end + end + end + + function get_modified_times(dataset::Datasets.NormalizedDataset)::Vector{Union{Missing,DateTime}} + map(1:length(range(dataset.cell_key))) do i + path = get_integrated_annotations_path(dataset, i) + ismissing(path) && return missing + path_stat = stat(path) + unix2datetime(path_stat.mtime) + end + end + + function get_last_modified_time(dataset::Datasets.NormalizedDataset) + mtimes = get_modified_times(dataset) + if all(ismissing, mtimes) + return missing + else + return maximum(skipmissing(mtimes)) + end + end + + function print_integrated_annotations_modified_since( + datasets::Dict{String, Vector{Datasets.NormalizedDataset}}, + since::TimeType; + modified_times = get_modified_times_unix(datasets) + ) + for group in keys(modified_times) + for idx in keys(modified_times[group]) + for tp in keys(modified_times[group][idx]) + ds = datasets[group][idx] + u = modified_times[group][idx][tp] + if !isnan(u) && unix2datetime(u) > since + path = get_integrated_annotations_path(ds, idx) + println(group, ", ", idx, ", ", tp, ", ", unix2datetime(u)) + # println(path) + end + end + end + end + end end \ No newline at end of file diff --git a/src/ShroffCelegansModels.jl b/src/ShroffCelegansModels.jl index 0becc40..14f654c 100644 --- a/src/ShroffCelegansModels.jl +++ b/src/ShroffCelegansModels.jl @@ -1,47 +1,80 @@ module ShroffCelegansModels - using CSV - #using Makie - using Makie - using DataFrames - using GeometryBasics - #using ColorSchemes - using LinearAlgebra - using BSplineKit - using QuadGK - using LRUCache - using FFTW - using Dates - using PrecompileTools: @setup_workload, @compile_workload + using BSplineKit + using CSV + using ColorSchemes: ColorSchemes + using Colors: Colors + using CoordinateTransformations: CoordinateTransformations + using DataFrames + using Dates + using FFTW + using FileIO: FileIO + using FixedPointNumbers: FixedPointNumbers + using GeometryBasics + using HDF5: HDF5 + using Interpolations: Interpolations + using JSON3: JSON3 + using LRUCache + using LinearAlgebra + using Makie + using Missings: Missings + using Observables: Observables + using Pkg: Pkg + using PrecompileTools: @setup_workload, @compile_workload + using ProgressMeter: ProgressMeter + using QuadGK + using Sockets: Sockets + using StaticArrays: StaticArrays + using Statistics: Statistics + using StatsBase: StatsBase + using ThinPlateSplines: ThinPlateSplines + using TiffImages: TiffImages + if gethostname() == "KITTISOPIKULM-2" + const config_path = raw"D:\shroff\python_model_building\C-Elegans-Model-Generation\config_2026_03_19_v2.json" + else + const config_path = joinpath(@__DIR__, "..", "config", "linux", "config_2026_03_19_v2.json") + end + const voxel_size = 0.1625 # um - include("datasets.jl") - include("MIPAVIO.jl") + include("datasets.jl") + include("MIPAVIO.jl") - include("util.jl") - include("ParametricSplines.jl") - include("types.jl") + include("util.jl") + include("ParametricSplines.jl") + include("types.jl") - using .ParametricSplines - using .Types + using .ParametricSplines + using .Types - include("build_model.jl") - include("mesh.jl") - include("straighten.jl") + include("build_model.jl") + include("mesh.jl") + include("straighten.jl") - include("average.jl") + include("average.jl") - using .Datasets + using .Datasets - include("show.jl") - include("points.jl") + include("show.jl") + include("points.jl") - using .Points + using .Points - include("model_time_series.jl") - include("area.jl") + include("model_time_series.jl") + include("area.jl") - include("annotation_untwist.jl") - include("parse_worm_dataset_path.jl") + include("annotation_untwist.jl") + include("parse_worm_dataset_path.jl") - include("precompile.jl") + include("demo_averaging/read_config_json.jl") + # save_celegans_avg_models loads modelio + include("save_celegans_avg_models.jl") + include("demo_averaging/seam_cell_pts.jl") + include("demo_averaging/fix_annotation_ap_axis.jl") + include("demo_averaging/get_avg_models.jl") + include("demo_averaging/transform_annotations.jl") + include("demo_averaging/get_group_annotation_positions_over_time.jl") + include("demo_averaging/average_annotations.jl") + include("makie.jl") + + include("precompile.jl") end diff --git a/src/animate_untwist.jl b/src/animate_untwist.jl index 11e4cca..f1a4e5d 100644 --- a/src/animate_untwist.jl +++ b/src/animate_untwist.jl @@ -147,7 +147,7 @@ function animate_untwist(smodel; fig = nothing) sleep(1) for rep in 1:3 - mesh!(ax, M; shading = MakieCore.automatic, color = [i for c in 1:length(model) for i in 1:3], colormap = :buda) + mesh!(ax, M; shading = Makie.automatic, color = [i for c in 1:length(model) for i in 1:3], colormap = :buda) sleep(1) for i in 0:10:100 @@ -257,7 +257,7 @@ function controllable_untwist(smodel; fig = nothing) # for rep in 1:3 time = Observable(0) - mesh!(ax, M; shading = MakieCore.automatic, color = [i for c in 1:length(model) for i in 1:3], colormap = :buda) + mesh!(ax, M; shading = Makie.automatic, color = [i for c in 1:length(model) for i in 1:3], colormap = :buda) # sleep(1) on(time) do t @@ -356,4 +356,4 @@ function record_untwist(smodel) record(untwist_fig, "untwist.mp4", 0:600) do t untwist_time[] = t end -end \ No newline at end of file +end diff --git a/src/annotation_untwist.jl b/src/annotation_untwist.jl index 6fff3d6..ffc65d8 100644 --- a/src/annotation_untwist.jl +++ b/src/annotation_untwist.jl @@ -159,7 +159,7 @@ function untwist_annotations( model::AbstractCelegansModel, pts::AbstractVector{<: Point}, central_spline_voxel_distances::Union{AbstractVector{<: Real},Nothing} = nothing -) +)::Vector{Point3d} thresholds = [1.0, 1.05, 1.10, 1.15, 1.20, 1.25, 1.30, 1.35, 1.40, 1.45, 1.5, 2.0, 2.5] # For each point, find the nearest point along the central spline @@ -211,8 +211,8 @@ function untwist_annotations( # The returned untwisted annotation points are computed using the angle and distance # between the central spline and the annotation point # The z-coordinate is the same as that of the nearest central point on the straightened model - return map(zip(angles,pts_norm,z)) do (angle, dist,z) - Point3(cos(angle)*dist, sin(angle)*dist, z) + return map(zip(angles,pts_norm,z)) do (angle, dist, z) + Point3d(cos(angle)*dist, sin(angle)*dist, z) end end @@ -250,12 +250,12 @@ dataset = ShroffCelegansModels.NormalizedDataset("X:/shrofflab/OD1599_NU/120619_ c3_pt = ShroffCelegansModels.untwist_annotations(dataset, 71)["C3"] ``` """ -function untwist_annotations(dataset::NormalizedDataset, timepoint::Int=1) +function untwist_annotations(dataset::NormalizedDataset, timepoint::Int=1)::Union{Missing, Dict{String, Point3d}} mts = ModelTimeSeries(dataset) try df = MIPAVIO.get_integrated_annotations(dataset, timepoint) - pts = MIPAVIO.mipav_df_to_points(df) - return Dict(df.name .=> untwist_annotations(mts(timepoint), pts)) + pts = MIPAVIO.mipav_df_to_points(df)::Vector{Point3d} + return Dict{String,Point3d}(Vector{String}(df.name)::Vector{String} .=> untwist_annotations(mts(timepoint), pts)) catch err return missing end diff --git a/src/demo_averaging.jl b/src/demo_averaging.jl index f5760a9..75a6f8f 100644 --- a/src/demo_averaging.jl +++ b/src/demo_averaging.jl @@ -4,7 +4,7 @@ using ShroffCelegansModels.Types: AbstractCelegansModel using JSON3 using Missings using StatsBase -includet("makie.jl") +include("makie.jl") using Makie using CSV using DataFrames diff --git a/src/demo_averaging/average_annotations.jl b/src/demo_averaging/average_annotations.jl index 9dacddf..97c5e05 100644 --- a/src/demo_averaging/average_annotations.jl +++ b/src/demo_averaging/average_annotations.jl @@ -3,12 +3,23 @@ using GeometryBasics using ProgressMeter using CSV using DataFrames +using HDF5 -include("get_group_annotation_positions_over_time.jl") +# include("get_group_annotation_positions_over_time.jl") +using ShroffCelegansModels: CelegansModel, get_datasets_info, get_group_annotation_positions_over_time, annotation_positions -function average_annotations(datasets::Vector{ShroffCelegansModels.Datasets.NormalizedDataset}) - cache = my_annotation_position_cache - group_annotation_positions_over_time = get_group_annotation_positions_over_time(datasets, cache) +function average_annotations( + datasets::Vector{ShroffCelegansModels.Datasets.NormalizedDataset}; + cache::Dict{String, Vector{Vector{Point3{Float64}}}} = my_annotation_position_cache, + timepoints::Union{AbstractVector{Float64}, Integer} = LinRange(0,1,201), + avg_models::Vector{<: CelegansModel} = avg_models +) + if isa(timepoints, Integer) + N_timepoints = timepoints + timepoints = LinRange(0, 1, N_timepoints) + end + group_annotation_positions_over_time = get_group_annotation_positions_over_time(datasets, cache, timepoints; avg_models = avg_models) + group_annotation_positions_over_time::Vector{Vector{Dict{String, Point3{Float64}}}} #common_annotations = intersect(map(datasets_info) do dataset_info # collect(keys(dataset_info.annotation_dict)) #end...) @@ -17,22 +28,28 @@ function average_annotations(datasets::Vector{ShroffCelegansModels.Datasets.Norm # common_annotations annotations = intersect(map(datasets_info) do dataset_info collect(keys(dataset_info.annotation_dict)) - end...) + end...)::Vector{String} positions = map(eachindex(first(group_annotation_positions_over_time))) do j map(annotations) do name mean(map(eachindex(group_annotation_positions_over_time)) do i group_annotation_positions_over_time[i][j][name] end) - end - end + end::Vector{Point3{Float64}} + end::Vector{Vector{Point3{Float64}}} return (; annotations, positions) end # average_annotations_dict = average_annotations(datasets) -function average_annotations(datasets::Dict{String, Vector{ShroffCelegansModels.Datasets.NormalizedDataset}}) +function average_annotations( + datasets::Dict{String, Vector{ShroffCelegansModels.Datasets.NormalizedDataset}}; + cache::Dict{String, Vector{Vector{Point3{Float64}}}} = my_annotation_position_cache, + timepoints::Union{AbstractVector{Float64}, Integer} = LinRange(0,1,201), + avg_models::Vector{<: CelegansModel} = avg_models + +) average_annotations_dict = Dict(keys(datasets) .=> map(collect(keys(datasets))) do k - average_annotations(datasets[k]) + average_annotations(datasets[k]; cache, timepoints, avg_models) end) return average_annotations_dict end diff --git a/src/demo_averaging/average_sliders.jl b/src/demo_averaging/average_sliders.jl index e30acb1..9006a40 100644 --- a/src/demo_averaging/average_sliders.jl +++ b/src/demo_averaging/average_sliders.jl @@ -13,7 +13,7 @@ function average_sliders(models::Vector{<:AbstractCelegansModel}) n_ellipse_pts = length(transverse_splines(model)) colorscheme = :cyclic_wrwbw_40_90_c42_n256 - shading = MakieCore.automatic + shading = Makie.automatic color=colorschemes[colorscheme][1:256÷n_ellipse_pts:256] colorrange = (1,n_ellipse_pts) @@ -92,7 +92,7 @@ function average_sliders(smts::ShroffCelegansModels.StraightenedModelTimeSeries) n_ellipse_pts = length(transverse_splines(model)) colorscheme = :cyclic_wrwbw_40_90_c42_n256 - shading = MakieCore.automatic + shading = Makie.automatic color=colorschemes[colorscheme][1:256÷n_ellipse_pts:256] colorrange = (1,n_ellipse_pts) @@ -173,4 +173,4 @@ function record_average_sliders(smts::ShroffCelegansModels.StraightenedModelTime set_close_to!(sg.sliders[1], i) println(i) end -end \ No newline at end of file +end diff --git a/src/demo_averaging/debug_annotation_ap_axis.jl b/src/demo_averaging/debug_annotation_ap_axis.jl index f2350b0..e5adbb3 100644 --- a/src/demo_averaging/debug_annotation_ap_axis.jl +++ b/src/demo_averaging/debug_annotation_ap_axis.jl @@ -203,16 +203,24 @@ function debug_annotation_ap_axis( alpha = 0.5, inspectable = false ) - connect!(twisted_mesh_plot.visible, contour_mesh_toggle.active) + # connect!(twisted_mesh_plot.visible, contour_mesh_toggle.active) + on(contour_mesh_toggle.active) do s + twisted_mesh_plot.visible = s + end lines!(ax_twisted, twisted_central_spline) scatter!(ax_twisted, twisted_central_pts) cs_lines = lines!(ax_twisted, twisted_central_line_match) - connect!(cs_lines.visible, central_spline_lines_toggle.active) + # connect!(cs_lines.visible, central_spline_lines_toggle.active) + on(central_spline_lines_toggle.active) do s + central_spline_lines_toggle.visible = s + end meshscatter!(ax_twisted, twisted_seam_cells; markersize = 1.0, color = :gray, alpha = 0.5, transparency = true) ms_annotation_cells = meshscatter!(ax_twisted, twisted_annotation_cells; markersize = 1.0, color = use_myuntwist ? :gold : :blue, alpha = 0.5, transparency = true) text!(ax_twisted, twisted_seam_cell_labels; text = twisted_seam_cell_text, align = (:right, :bottom)) ann_txt = text!(ax_twisted, twisted_annotation_cells; text = twisted_annotation_text, align = (:right, :bottom)) - connect!(ann_txt.visible, annotation_text_toggle.active) + on(annotation_text_toggle.active) do s + ann_txt.visible = s + end @info "twisted_seam_cell_labels" twisted_seam_cell_labels[] tmodel.names distances = Observable(Float64[]) @@ -226,21 +234,17 @@ function debug_annotation_ap_axis( z = LinRange(0, 1, Npts) # max_distance = Observable(max_r.(z) .* voxel_size .* first(sliders.sliders[2].range[])) max_distance = Observable(Float64[]) - lines!(ax_distance, central_spline_arc_lengths, distances) + distances_lines = lines!(ax_distance, central_spline_arc_lengths[], distances[]) hlines!(ax_distance, selected_distance) - lines!(ax_distance, central_spline_arc_lengths, max_distance) - scatter!(ax_distance, central_spline_arc_lengths, distances, color = distances, colormap = Reverse(:viridis)) - scatter!(ax_twisted, distance_central_pts, color = distances, colormap = Reverse(:viridis)) + max_distance_lines = lines!(ax_distance, central_spline_arc_lengths[], max_distance) + distances_scatter = scatter!(ax_distance, central_spline_arc_lengths[], distances[], color = distances[], colormap = Reverse(:viridis)) + distance_central_pts_scatter = scatter!(ax_twisted, distance_central_pts, color = distances[], colormap = Reverse(:viridis)) selected_twisted_annotation_cell = Observable([twisted_annotation_cells[][selected_annotation_idx[]]]) meshscatter!(ax_twisted, selected_twisted_annotation_cell, color = :red, markersize=1.1) - ratio = @lift try - $distances ./ $max_distance - catch err - ones(size($max_distance)) - end - lines!(ax_ratio, central_spline_arc_lengths, ratio) - hlines!(ax_ratio, 1.0, linestyle = :dash) + ratio = Observable(distances[]) + ratio_lines = lines!(ax_ratio, central_spline_arc_lengths[], ratio) + hlines!(ax_ratio, 1.0, linestyle = :solid) nt_obs = Observable(0.0) @@ -342,19 +346,31 @@ function debug_annotation_ap_axis( Npts = length(tmodel) z = LinRange(0, 1, Npts) central_pts = swapyz_scale.(cs.(z)) - central_spline_arc_lengths.val = [0; cumsum(norm.(diff(central_pts)))] - distance_central_pts[] = central_pts + _central_spline_arc_lengths = [0; cumsum(norm.(diff(central_pts)))] + central_spline_arc_lengths[] = _central_spline_arc_lengths + # distance_central_pts[] = central_pts max_r = ShroffCelegansModels.max_radius_function(tmodel) expansion_factor_value = sliders.sliders[3].value[] - max_distance[] = max_r.(z) .* voxel_size .* expansion_factor_value + _max_distance = max_r.(z) .* voxel_size .* expansion_factor_value + # max_distance[] = max_r.(z) .* voxel_size .* expansion_factor_value + Makie.update!(max_distance_lines, arg1 = _central_spline_arc_lengths, arg2 = _max_distance) pt = twisted_annotation_cells[][idx] - distances[] = norm.(central_pts .- pt) + _distances = norm.(central_pts .- pt) + distances[] = _distances + # distances[] = norm.(central_pts .- pt) + Makie.update!(distances_lines, arg1 = _central_spline_arc_lengths, arg2 = _distances) + Makie.update!(distances_scatter, arg1 = _central_spline_arc_lengths, arg2 = _distances, color = _distances) + Makie.update!(distance_central_pts_scatter, arg1 = central_pts, color = _distances) + + _ratio = _distances ./ _max_distance + Makie.update!(ratio_lines, arg1 = _central_spline_arc_lengths, arg2 = _ratio) + #autolimits!(ax_distance) #ylims!(ax_distance, nothing) - limits!(ax_distance, (0, 200), (0, maximum(distances[]))) - limits!(ax_ratio, (0, 200), (0, maximum(ratio[]))) + limits!(ax_distance, (0, 200), (0, maximum(_distances))) + limits!(ax_ratio, (0, 200), (0, maximum(_ratio))) selected_distance[] = norm(twisted_central_pts[][idx] - pt) selected_annotation_name[] = twisted_annotation_text[][idx] diff --git a/src/demo_averaging/debug_average_models_with_annotations.jl b/src/demo_averaging/debug_average_models_with_annotations.jl index e39e75c..3aefe2c 100644 --- a/src/demo_averaging/debug_average_models_with_annotations.jl +++ b/src/demo_averaging/debug_average_models_with_annotations.jl @@ -183,7 +183,8 @@ function debug_average_models_with_annotations( meshscatter!(ax, _annotation_cells; markersize = 1.0, color = use_myuntwist ? :gold : :blue, alpha = 1) text!(ax, _seam_cell_labels; text = [replace.(model.names[1:2:end], 'L' => 'R'); model.names[1:2:end]], align = (:right, :bottom)) ann_txt = text!(ax, _annotation_cells; text = _annotation_text, align = (:right, :bottom)) - connect!(ann_txt.visible, annotation_text_toggle.active) + #connect!(ann_txt.visible, annotation_text_toggle.active) + ann_txt.visible = annotation_text_toggle.active #lines!(ax, _lines, color = :black) ylims!(ax, (0, 200)) @@ -528,4 +529,4 @@ function debug_average_models_with_annotations( display(f) f -end \ No newline at end of file +end diff --git a/src/demo_averaging/explicit_export.jl b/src/demo_averaging/explicit_export.jl new file mode 100644 index 0000000..e8465cc --- /dev/null +++ b/src/demo_averaging/explicit_export.jl @@ -0,0 +1,39 @@ +function get_seam_cells_explicit_df(avg_models=avg_models) + seam_cell_names = ["a0L", "a0R", "H0L", "H0R", "H1L", "H1R", "H2L", "H2R", "V1L", "V1R", "V2L", "V2R", "V3L", "V3R", "V4L", "V4R", "V5L", "V5R", "V6L", "V6R", "TL", "TR"] + # right then left + seam_cell_names = seam_cell_names[[2:2:end; 1:2:end]] + seam_cell_lineage_names = get.( + (positional_to_lineage_dict,), + seam_cell_names, + missing + ) + dfs = map(enumerate(avg_models)) do (i, model) + pts = seam_cell_pts(model, 2) + pts = swapyz_scale.(pts) + DataFrame( + lineage_name = seam_cell_lineage_names, + minutes_post_first_cleavage = (i - 1) * 370 / (length(avg_models) - 1) +381, + LR_micrometers = pts .|> x -> x[1], + DV_micrometers = pts .|> x -> x[3], + AP_micrometers = pts .|> x -> x[2], + ) + end + subset(vcat(dfs...), :lineage_name => ByRow(!ismissing)) +end + +pretwich_explicit_df = get_pretwitch_explicit_df() +CSV.write("2026_04_02_pretwitch.csv", pretwitch_explicit_df) + +annotation_name_translation_df = get_annotation_name_translation_df() +positional_to_lineage_dict = Dict(annotation_name_translation_df.var"Positional Model Cell Name" .=> annotation_name_translation_df.var"Lineage Name") +df = CSV.read("smoothed_average_annotations_r020_theta020_z030_for_ben.csv", DataFrame) +posttwitch_for_ben_explicit_df = select(df, :cell => ByRow(cell -> positional_to_lineage_dict[cell]) => :lineage_name, :time => :minutes_post_first_cleavage, :x => :LR_micrometers, :z => :DV_micrometers, :y=> :AP_micrometers) +posttwitch_for_ben_explicit_df = vcat(posttwitch_for_ben_explicit_df, get_seam_cells_explicit_df(avg_models)) +subset!(posttwitch_for_ben_explicit_df, :lineage_name => ByRow(!ismissing)) +CSV.write("2026_04_02_posttwitch.csv", posttwitch_for_ben_explicit_df) + + + + +single_df = vcat(pretwitch_explicit_df, posttwitch_for_ben_explicit_df) + diff --git a/src/demo_averaging/fix_annotation_ap_axis.jl b/src/demo_averaging/fix_annotation_ap_axis.jl index 5741430..3d4d916 100644 --- a/src/demo_averaging/fix_annotation_ap_axis.jl +++ b/src/demo_averaging/fix_annotation_ap_axis.jl @@ -1,19 +1,26 @@ -using Makie using ShroffCelegansModels -using Printf -using GeometryBasics -using JSON3 -using Dates -using Sockets +using ShroffCelegansModels.Makie +using ShroffCelegansModels.Printf +using ShroffCelegansModels.GeometryBasics +using ShroffCelegansModels.JSON3 +using ShroffCelegansModels.Dates +using ShroffCelegansModels.Sockets +using ShroffCelegansModels.HDF5 + const ANNOTATION_PERSIST_SERVER_PORT = 3129 +annotation_changes_path() = get(ENV, "ANNOTATION_CHANGES_PATH", joinpath(@__DIR__, "..", "..", "annotation_changes.h5")) + function fix_annotation_ap_axis( avg_models, dataset::ShroffCelegansModels.Datasets.NormalizedDataset; use_myuntwist::Bool = false, cache::Dict{String} = use_myuntwist ? my_annotation_position_cache : annotation_position_cache, - ip_address::Sockets.IPAddr = Sockets.getipaddr() + ip_address::Sockets.IPAddr = Sockets.getipaddr(), + initial_timepoint::Number = 0.0, + initial_annotation::Union{String, Nothing} = nothing, + annotation_timepoint_listener::Union{Function, Nothing} = nothing, ) second(x) = x[2] @@ -206,7 +213,14 @@ function fix_annotation_ap_axis( # annotation_menu = Menu(f[6, 1:2], options = twisted_annotation_text) menu_options = sort!(collect(values(dataset.cell_key.mapping))) - annotation_menu = Menu(f[6, 1:2], options = menu_options) + + # Check if initial annotation is in menu options + if !isnothing(initial_annotation) && !(initial_annotation in menu_options) + @error "Initial annotation $initial_annotation not found in menu options" + initial_annotation = first(menu_options) + end + annotation_menu = Menu(f[6, 1:2], options = menu_options, default = initial_annotation) + @info "initial annotation" initial_annotation menu_options initial_selected_idx = findfirst(==(first(menu_options)), twisted_annotation_text[]) if isnothing(initial_selected_idx) @error "Could not locate first menu option in twisted_annotation_text" first(menu_options) @@ -223,6 +237,7 @@ function fix_annotation_ap_axis( twisted_seam_cell_text = Observable(String.([tmodel.names[2:2:end]; tmodel.names[1:2:end]])) + twisted_mesh_plot = mesh!( ax_twisted, twisted_mesh; @@ -232,18 +247,31 @@ function fix_annotation_ap_axis( alpha = 0.5, inspectable = false ) - connect!(twisted_mesh_plot.visible, contour_mesh_toggle.active) + #connect!(twisted_mesh_plot.visible, contour_mesh_toggle.active) + twisted_mesh_plot.visible = false + on(contour_mesh_toggle.active) do v + twisted_mesh_plot.visible = v + end lines!(ax_twisted, twisted_central_spline) scatter!(ax_twisted, twisted_central_pts) cs_lines = lines!(ax_twisted, twisted_central_line_match) - connect!(cs_lines.visible, central_spline_lines_toggle.active) + #connect!(cs_lines.visible, central_spline_lines_toggle.active) + cs_lines.visible = false + on(central_spline_lines_toggle.active) do v + cs_lines.visible = v + end meshscatter!(ax_twisted, twisted_seam_cells; markersize = 1.0, color = :gray, alpha = 0.5, transparency = true) ms_annotation_cells = meshscatter!(ax_twisted, twisted_annotation_cells; markersize = 1.0, color = use_myuntwist ? :gold : :blue, alpha = 0.5, transparency = true) text!(ax_twisted, twisted_seam_cell_labels; text = twisted_seam_cell_text, align = (:right, :bottom)) ann_txt = text!(ax_twisted, twisted_annotation_cells; text = twisted_annotation_text, align = (:right, :bottom)) - connect!(ann_txt.visible, annotation_text_toggle.active) + #connect!(ann_txt.visible, annotation_text_toggle.active) + ann_txt.visible = false + on(annotation_text_toggle.active) do v + ann_txt.visible = v + end @info "twisted_seam_cell_labels" twisted_seam_cell_labels[] tmodel.names + distances = Observable(Float64[]) selected_distance = Observable(0.0) distance_central_pts = Observable(Point3f[]) @@ -254,21 +282,26 @@ function fix_annotation_ap_axis( Npts = length(tmodel) z = LinRange(0, 1, Npts) max_distance = Observable(Float64[]) - lines!(ax_distance, central_spline_arc_lengths, distances) + distances_lines = lines!(ax_distance, central_spline_arc_lengths[], distances[]) hlines!(ax_distance, selected_distance) - lines!(ax_distance, central_spline_arc_lengths, max_distance) - scatter!(ax_distance, central_spline_arc_lengths, distances, color = distances, colormap = Reverse(:viridis)) - scatter!(ax_twisted, distance_central_pts, color = distances, colormap = Reverse(:viridis)) + max_distance_lines = lines!(ax_distance, central_spline_arc_lengths[], max_distance) + distances_scatter = scatter!(ax_distance, central_spline_arc_lengths[], distances[], color = distances[], colormap = Reverse(:viridis)) + distance_central_pts_scatter = scatter!(ax_twisted, distance_central_pts, color = distances[], colormap = Reverse(:viridis)) selected_twisted_annotation_cell = Observable([twisted_annotation_cells[][selected_annotation_idx[]]]) meshscatter!(ax_twisted, selected_twisted_annotation_cell, color = :red, markersize=1.1) + + #= ratio = @lift try $distances ./ $max_distance catch err ones(size($max_distance)) end - lines!(ax_ratio, central_spline_arc_lengths, ratio) - hlines!(ax_ratio, 1.0, linestyle = :dash) + =# + ratio = Observable(distances[]) + ratio_lines = lines!(ax_ratio, central_spline_arc_lengths[], ratio) + # hlines!(ax_ratio, 1.0, linestyle = :dash) + hlines!(ax_ratio, 1.0, linestyle = :solid) nt_obs = Observable(0.0) @@ -339,12 +372,16 @@ function fix_annotation_ap_axis( nt_obs[] = nt end selected_z_position[] = z_positions[][value-first(cell_key_range)+1] + if !isnothing(annotation_timepoint_listener) + annotation_timepoint_listener(annotation_menu.selection[],value) + end @info "Timepoint slider" value end on(throttle(0.1, expansion_factor_slider.value)) do expansion_factor_value # TODO compute value from timepoint slider - value = time_normalized_slider.value[] + # value = time_normalized_slider.value[] + value = nt_obs[] tmodel = mts_nt(value) annotation_positions = twisted_annotation_positions(value) if !ismissing(tmodel) @@ -365,6 +402,7 @@ function fix_annotation_ap_axis( function plot_distance(idx) + println("plot_distance") selected_annotation_idx[] = idx #println(idx) try @@ -376,19 +414,32 @@ function fix_annotation_ap_axis( Npts = length(tmodel) z = LinRange(0, 1, Npts) central_pts = swapyz_scale.(cs.(z)) - central_spline_arc_lengths.val = [0; cumsum(norm.(diff(central_pts)))] - distance_central_pts[] = central_pts + # central_spline_arc_lengths.val = [0; cumsum(norm.(diff(central_pts)))] + _central_spline_arc_lengths = [0; cumsum(norm.(diff(central_pts)))] + central_spline_arc_lengths[] = _central_spline_arc_lengths + # distance_central_pts[] = central_pts max_r = ShroffCelegansModels.max_radius_function(tmodel) expansion_factor_value = expansion_factor_slider.value[] - max_distance[] = max_r.(z) .* voxel_size .* expansion_factor_value + _max_distance = max_r.(z) .* voxel_size .* expansion_factor_value + # max_distance[] = max_r.(z) .* voxel_size .* expansion_factor_value + Makie.update!(max_distance_lines, arg1 = _central_spline_arc_lengths, arg2 = _max_distance) pt = twisted_annotation_cells[][idx] - distances[] = norm.(central_pts .- pt) + _distances = norm.(central_pts .- pt) + distances[] = _distances + #distances[] = norm.(central_pts .- pt) + Makie.update!(distances_lines, arg1 = _central_spline_arc_lengths, arg2 = _distances) + Makie.update!(distances_scatter, arg1 = _central_spline_arc_lengths, arg2 = _distances, color = _distances) + Makie.update!(distance_central_pts_scatter, arg1 = central_pts, color = _distances) + + _ratio = _distances ./ _max_distance + Makie.update!(ratio_lines, arg1 = _central_spline_arc_lengths, arg2 = _ratio) + #autolimits!(ax_distance) #ylims!(ax_distance, nothing) - limits!(ax_distance, (0, 200), (0, maximum(distances[]))) - limits!(ax_ratio, (0, 200), (0, maximum(ratio[]))) + limits!(ax_distance, (0, 200), (0, maximum(_distances))) + limits!(ax_ratio, (0, 200), (0, maximum(_ratio))) selected_distance[] = norm(twisted_central_pts[][idx] - pt) selected_annotation_name[] = twisted_annotation_text[][idx] @@ -414,20 +465,21 @@ function fix_annotation_ap_axis( original_z_positions = let idx=1 Observable((x->x[idx][2]).(original_annotation_positions_over_time)) end - lines!(ax_z, cell_key_range, original_z_positions; color = :gray, linestyle = :dash, label = "Original Z positions") + lines!(ax_z, cell_key_range, original_z_positions; color = :gray, linestyle = :solid, label = "Original Z positions") + z_lines = lines!(ax_z, cell_key_range, z_positions) vlines!(ax_z, timepoint_slider.value, color = :red) DataInspector(ax_z) selected_z_position = Observable(z_positions[][timepoint_slider.value[]-first(cell_key_range)+1]) - vlines!(ax_distance, selected_z_position; color = :red, linestyle = :dash) - vlines!(ax_ratio, selected_z_position; color = :red, linestyle = :dash) + vlines!(ax_distance, selected_z_position; color = :red, linestyle = :solid) + vlines!(ax_ratio, selected_z_position; color = :red, linestyle = :solid) #common_annotations_text = collect(keys(annotation_dict)) common_annotations_text = _annotation_text @info common_annotations_text - h5open("annotation_changes.h5", "r", swmr=true) do h5f + h5open(annotation_changes_path(), "r", swmr=true) do h5f for time_idx in eachindex(cell_key_range) timepoint = cell_key_range[time_idx] for annotation_name in values(dataset.cell_key.mapping) @@ -435,13 +487,17 @@ function fix_annotation_ap_axis( group_name = annotation_change_group_name(dataset.path, timepoint, annotation_name) if haskey(h5f, group_name) @info "Loading annotation changes from annotations_changes.h5" group_name annotation_idx annotation_name - new_position = h5f[group_name]["new_position"][:,end] - straight_annotation_positions_over_time[time_idx][annotation_idx] = Point3f( - new_position[1], - new_position[2], - new_position[3] - ) - @info "Loaded" new_position + try + new_position = h5f[group_name]["new_position"][:,end] + straight_annotation_positions_over_time[time_idx][annotation_idx] = Point3f( + new_position[1], + new_position[2], + new_position[3] + ) + @info "Loaded" new_position + catch err + println(err) + end end end end @@ -464,6 +520,9 @@ function fix_annotation_ap_axis( catch err @error "Could not get z_positions" err end + if !isnothing(annotation_timepoint_listener) + annotation_timepoint_listener(selected, timepoint_slider.value[]) + end end end @@ -567,13 +626,15 @@ function fix_annotation_ap_axis( end notify(annotation_menu.selection) + + if !isnothing(initial_timepoint) && initial_timepoint != 0.0 + set_close_to!(timepoint_slider, initial_timepoint) + end + f end -using Sockets -using HDF5 - -@kwdef struct AnnotationChange +struct AnnotationChange ip_address::UInt64 dataset_path::String annotation_name::String @@ -587,26 +648,13 @@ function AnnotationChange(; annotation_name::String, timepoint::Int, original_position::Point, - new_z_position::Float64 + new_position::Union{Point, Nothing} = nothing, + new_z_position::Union{Float64, Nothing} = nothing, ) - return AnnotationChange( - ip_address, - dataset_path, - annotation_name, - timepoint, - original_position, - Point3d(original_position[1], new_z_position, original_position[3]) - ) -end -function AnnotationChange( - ip_address::UInt64, - dataset_path::String, - annotation_name::String, - timepoint::Int, - original_position::Point, - new_z_position::Float64 -) - new_position = Point3d(original_position[1], new_z_position, original_position[3]) + isnothing(new_position) && isnothing(new_z_position) && throw(ArgumentError("One of new_position or new_z_position must be provided")) + if isnothing(new_position) + new_position = Point3d(original_position[1], new_z_position, original_position[3]) + end return AnnotationChange( ip_address, dataset_path, @@ -653,7 +701,7 @@ function fix_annotation_ap_axis_persist_server(; port = ANNOTATION_PERSIST_SERVE c.annotation_name ) @info "Group name for HDF5: $group_name" - h5open("annotation_changes.h5", "cw", swmr=true) do h5f + h5open(annotation_changes_path(), "cw", swmr=true) do h5f if !haskey(h5f, group_name) create_group(h5f, group_name) end @@ -732,7 +780,7 @@ function shutdown_server() close(s) end -function load_annotation_changes_cache(filepath = joinpath(@__DIR__, "..", "..", "annotation_changes.h5")) +function load_annotation_changes_cache(filepath = annotation_changes_path()) # changes = Dict{String,Pair{Vector{Point3{Float64}},Vector{Point3{Float64}}}}() changes = Dict{String,Pair{Point3{Float64},Point3{Float64}}}() @@ -818,40 +866,64 @@ Returns """ function update_annotations_cache( annotations_cache::Dict{Tuple{String, UnitRange, Bool}, Vector}, - annotations_changes::Dict{String, Pair{Point3{Float64},Point3{Float64}}} + annotations_changes::Dict{String, Pair{Point3{Float64},Point3{Float64}}}; + dry_run::Bool = false ) annotations_cache_keys = keys(annotations_cache) key_map_dict = Dict(first.(annotations_cache_keys) .=> annotations_cache_keys) for (change_key, (old_pt, new_pt)) in annotations_changes - change_key_parts = splitpath(change_key) + change_key_parts = split(change_key, "\\") timepoint = tryparse(Int, change_key_parts[end-3]) if isnothing(timepoint) # Case when annotation name does not contain a slash timepoint = parse(Int, change_key_parts[end-2]) - dataset_path = joinpath(change_key_parts[begin:end-3]) + dataset_path = join(change_key_parts[begin:end-3], "\\") annotation_name = change_key_parts[end-1] else # Case when annotation name contains a slash # timepoint is change_key_parts[end-3] - dataset_path = joinpath(change_key_parts[begin:end-4]) + dataset_path = join(change_key_parts[begin:end-4], "\\") annotation_name = change_key_parts[end-2] * "/" * change_key_parts[end-1] end # Could error if dataset_path is not in key_map_dict + if !haskey(key_map_dict, dataset_path) + @warn "Dataset path $dataset_path not found in annotations cache keys, skipping change for annotation $annotation_name at timepoint $timepoint" + continue + end annotations_cache_key = key_map_dict[dataset_path] - dataset = ShroffCelegansModels.Dataset(dataset_path) + local_dataset_path = dataset_path + if Sys.isunix() + local_dataset_path = replace(local_dataset_path, raw"X:\\" => "/nearline/shroff/") + local_dataset_path = replace(local_dataset_path, "\\" => "/") + end + dataset = ShroffCelegansModels.Dataset(local_dataset_path) annotation_symbol = findfirst(==(annotation_name), dataset.cell_key.mapping) + if isnothing(annotation_symbol) + @warn "Annotation $annotation_name not found in dataset $local_dataset_path, skipping change at timepoint $timepoint" + continue + end # timepoint above is the actual timepoint, but we need to adjust it to the dataset's range timepoint = timepoint - dataset.cell_key.start + 1 if ismissing(annotations_cache[annotations_cache_key][timepoint]) @warn("Annotation $annotation_name at timepoint $timepoint is missing in cache for $annotations_cache_key") - annotations_cache[annotations_cache_key][timepoint] = Dict{String, Point3{Float64}}() - annotations_cache[annotations_cache_key][timepoint][string(annotation_symbol)] = swapyz_unscale(old_pt) + if !dry_run + annotations_cache[annotations_cache_key][timepoint] = Dict{String, Point3{Float64}}() + annotations_cache[annotations_cache_key][timepoint][string(annotation_symbol)] = swapyz_unscale(new_pt) + end end # Check old_pt matches the cached point - if annotations_cache[annotations_cache_key][timepoint][string(annotation_symbol)] != swapyz_unscale(old_pt) - @warn "Annotation point mismatch for $annotations_cache_key at timepoint $timepoint: $(annotations_cache[annotations_cache_key][timepoint][string(annotation_symbol)]) != $(swapyz_unscale(old_pt))" + try + if !isapprox(annotations_cache[annotations_cache_key][timepoint][string(annotation_symbol)], swapyz_unscale(old_pt)) + _norm = norm(annotations_cache[annotations_cache_key][timepoint][string(annotation_symbol)] - swapyz_unscale(old_pt)) + @warn """Annotation point mismatch for $annotations_cache_key at timepoint $timepoint: $(annotations_cache[annotations_cache_key][timepoint][string(annotation_symbol)]) != $(swapyz_unscale(old_pt)), norm difference: $_norm. + This may indicate the cache is out of sync with the changes, or the change does not apply cleanly to the current cache state. Consider reviewing this change and the current cache state to ensure consistency.""" + end + catch e + @warn "Error checking annotation point for $annotations_cache_key at timepoint $timepoint with annotation $annotation_symbol: $e" + end + if !dry_run + annotations_cache[annotations_cache_key][timepoint][string(annotation_symbol)] = swapyz_unscale(new_pt) end - annotations_cache[annotations_cache_key][timepoint][string(annotation_symbol)] = swapyz_unscale(new_pt) end return annotations_cache end diff --git a/src/demo_averaging/fix_average_models_with_annotations.jl b/src/demo_averaging/fix_average_models_with_annotations.jl new file mode 100644 index 0000000..56d14b4 --- /dev/null +++ b/src/demo_averaging/fix_average_models_with_annotations.jl @@ -0,0 +1,535 @@ +function fix_average_models_with_annotations( + avg_models, + dataset::ShroffCelegansModels.Datasets.NormalizedDataset; + use_myuntwist = false, + cache = use_myuntwist ? my_annotation_position_cache : annotation_position_cache +) + second(x) = x[2] + + f = Figure(size = (1920, 1080)) + + title_prewarp = Observable("Prewarp") + ax_prewarp = Axis3(f[1,2], aspect = (1, 10, 1); title = title_prewarp) + + title = Observable("Title") + ax = Axis3(f[2,2], aspect = (1, 10, 1); title) + + title_twisted = Observable("Twisted") + ax_twisted = Axis3(f[1:2,1]; title = title_twisted) + + N_timepoints = 200 + r = LinRange(0.0, 1.0, N_timepoints + 1) + sliders = SliderGrid(f[3,1:2], + (label="Time (Normalized)", range=r), + (label="Exp. Factor", range=1.0:0.01:4), + ) + slider_range = sliders.sliders[1].range[] + + annotation_text_toggle = Toggle(f) + central_spline_lines_toggle = Toggle(f) + f[4, 1:2] = grid!( + [Label(f, "Annnotation text") annotation_text_toggle Label(f, "Central spline lines") central_spline_lines_toggle] + ) + f[5, :] = buttongrid = GridLayout(tellwidth = false) + buttongrid[1, 1] = Button(f, label = "Previous") + buttongrid[1, 2] = Button(f, label = "Reset") + buttongrid[1, 3] = Button(f, label = "Next") + + + + n_upsample = 2 + + smts = ShroffCelegansModels.StraightenedModelTimeSeries(dataset) + smts_nt = let _length = length(range(dataset.cell_key)) + x -> begin + nt = x * (_length - 1) + 1.0 + smts(nt, 2) + end + end + + mts = smts.modelTimeSeries + mts_nt = let _range = range(dataset.cell_key) + x -> begin + nt = x * (length(_range) - 1) + 1.0 + nt = round(Int, nt) + title_twisted[] = "Twisted; idx = $nt, tp = $(_range[nt])" + mts(nt) + end + end + + + annotation_dict = get_cell_trajectory_dict(dataset; use_myuntwist) + + # precalculate the volumes + #= + volumes_and_lengths = map(models) do model + ShroffCelegansModels.volume_by_cross_section(model), ShroffCelegansModels.central_spline(model)(1.0)[3] + end + volumes = first.(volumes_and_lengths) + lines!(vol_ax, slider_range, volumes) + whole_idx = floor.(Int, 1:1/step(slider_range):length(slider_range)) + scatter!(vol_ax, slider_range[whole_idx], volumes[whole_idx]) + + current_volume = Observable(Point(sliders.sliders[1].value[], first(volumes))) + scatter!(vol_ax, current_volume, marker = '∘', color = :red, markersize = 50) + =# + + # lengths + #= + lengths = last.(volumes_and_lengths) + lines!(length_ax, slider_range, lengths, color = :green) + scatter!(length_ax, slider_range[whole_idx], lengths[whole_idx], color = :green) + + current_length = Observable(Point(sliders.sliders[1].value[], first(lengths))) + scatter!(length_ax, current_length, marker='∘', color = :red, markersize=50) + =# + + model = avg_models[1] + _mesh = Observable(ShroffCelegansModels.get_model_contour_mesh(model; transform_points=swapyz_scale)) + #_lines = Observable(swapyz.(cross_sections_at_knots(model))) + _seam_cells = Observable(swapyz_scale.(seam_cell_pts(model, n_upsample))) + _seam_cell_labels = Observable(_seam_cells[] .- Ref(Point3f(2,0,0))) + + smodel = smts_nt(0.0) + straight_mesh = Observable(ShroffCelegansModels.get_model_contour_mesh(smodel; transform_points=swapyz_scale)) + #_lines = Observable(swapyz.(cross_sections_at_knots(model))) + straight_seam_cells = Observable(swapyz_scale.(seam_cell_pts(smodel, n_upsample))) + straight_seam_cell_labels = Observable(straight_seam_cells[] .- Ref(Point3f(2,0,0))) + + tmodel = mts_nt(0.0) + twisted_mesh = Observable(ShroffCelegansModels.get_model_contour_mesh(tmodel; transform_points=swapyz_scale)) + #_lines = Observable(swapyz.(cross_sections_at_knots(model))) + twisted_seam_cells = Observable(swapyz_scale.(seam_cell_pts(tmodel, 0))) + twisted_seam_cell_labels = Observable(twisted_seam_cells[] .- Ref(Point3f(2,0,0))) + twisted_central_spline = Observable(swapyz_scale.(ShroffCelegansModels.central_spline(tmodel).(LinRange(0,1,length(tmodel))))) + + + function annotation_positions(nt) + _smodel = smts_nt(nt) + idx = round(Int, nt*N_timepoints + 1) + _model = avg_models[idx] + @info "annotation positions" nt + swapyz_scale.(transform_annotations( + _smodel, _model, map(values(annotation_dict)) do ann + ann(nt) + end + )) + end + + function straight_annotation_positions(nt) + @info "annotation prewarp positions" nt + swapyz_scale.(map(values(annotation_dict)) do ann + ann(nt) + end) + end + + twisted_annotation_positions = let _length = length(range(dataset.cell_key)) + function twisted_annotation_positions(nt) + idx = round(Int, nt*(_length - 1) + 1) + dict = ShroffCelegansModels.twisted_annotations(dataset, idx) + Dict(keys(dict) .=> swapyz_scale.(values(dict))) + end + end + + + if haskey(cache, dataset.path) + _annotation_positions_over_time = cache[dataset.path] + else + _annotation_positions_over_time = annotation_positions.(r) + cache[dataset.path] = _annotation_positions_over_time + end + + straight_annotation_positions_over_time = straight_annotation_positions.(r) + + _annotation_cells = Observable(_annotation_positions_over_time[1]) + straight_annotation_cells = Observable(straight_annotation_positions_over_time[1]) + twisted_positions = twisted_annotation_positions(0.0) + twisted_annotation_cells = Observable(collect(values(twisted_positions))) + # @info twisted_annotation_cells[] + # _annotation_cells = Observable(annotation_positions(0.0)) + + expansion_factor = sliders.sliders[2].value + + twisted_central_pts = swapyz_scale.(second(ShroffCelegansModels.nearest_central_pt(tmodel, swapyz_unscale.(twisted_annotation_cells[]), expansion_factor[]))) + twisted_central_pts = Observable(twisted_central_pts) + # @info twisted_central_pts[] + + twisted_central_line_match = vec(stack([twisted_annotation_cells[], twisted_central_pts[], fill!(similar(twisted_central_pts[]), Point3f(NaN))]; dims=1)) + twisted_central_line_match = Observable(twisted_central_line_match) + + function get_annotation_text(dict) + String.(get.((dataset.cell_key.mapping,), Symbol.(keys(dict)), String.(keys(dict)))) + end + + #_annotation_text = getindex.((dataset.cell_key.mapping,), Symbol.(keys(annotation_dict))) + #_annotation_text = String.(get.((dataset.cell_key.mapping,), Symbol.(keys(annotation_dict)), String.(keys(annotation_dict)))) + #straight_annotation_text = String.(get.((dataset.cell_key.mapping,), Symbol.(keys(annotation_dict)), String.(keys(annotation_dict)))) + #twisted_annotation_text = String.(get.((dataset.cell_key.mapping,), Symbol.(keys(twisted_positions)), String.(keys(twisted_positions)))) + _annotation_text = get_annotation_text(annotation_dict) + straight_annotation_text = get_annotation_text(annotation_dict) + twisted_annotation_text = get_annotation_text(twisted_positions) + twisted_annotation_text = Observable(twisted_annotation_text) + + + n_ellipse_pts = length(transverse_splines(model)) + colorscheme = :cyclic_wrwbw_40_90_c42_n256 + #shading = MakieCore.automatic + color=colorschemes[colorscheme][1:256÷n_ellipse_pts:256] + colorrange = (1,n_ellipse_pts) + + _color = Observable(repeat(color, length(model))) + straight_color = Observable(repeat(color, length(smodel))) + twisted_color = Observable(repeat(color, length(tmodel))) + + #mesh!(ax, _mesh; colorrange, color = _color, shading, transparency = true) + mesh!(ax, _mesh; colorrange, color = _color, transparency = true, alpha = 0.1) + meshscatter!(ax, _seam_cells; markersize = 1.0, color = :gray, alpha = 1) + meshscatter!(ax, _annotation_cells; markersize = 1.0, color = use_myuntwist ? :gold : :blue, alpha = 1) + text!(ax, _seam_cell_labels; text = [replace.(model.names[1:2:end], 'L' => 'R'); model.names[1:2:end]], align = (:right, :bottom)) + ann_txt = text!(ax, _annotation_cells; text = _annotation_text, align = (:right, :bottom)) + connect!(ann_txt.visible, annotation_text_toggle.active) + #lines!(ax, _lines, color = :black) + ylims!(ax, (0, 200)) + + mesh!(ax_prewarp, straight_mesh; colorrange, color = straight_color, transparency = true, alpha = 0.1) + meshscatter!(ax_prewarp, straight_seam_cells; markersize = 1.0, color = :gray, alpha = 1) + meshscatter!(ax_prewarp, straight_annotation_cells; markersize = 1.0, color = use_myuntwist ? :gold : :blue, alpha = 1) + text!(ax_prewarp, straight_seam_cell_labels; text = [replace.(model.names[1:2:end], 'L' => 'R'); model.names[1:2:end]], align = (:right, :bottom)) + ann_txt = text!(ax_prewarp, straight_annotation_cells; text = straight_annotation_text, align = (:right, :bottom)) + connect!(ann_txt.visible, annotation_text_toggle.active) + #lines!(ax_prewarp, _lines, color = :black) + ylims!(ax_prewarp, (0, 200)) + + twisted_seam_cell_text = Observable(String.([tmodel.names[2:2:end]; tmodel.names[1:2:end]])) + + mesh!(ax_twisted, twisted_mesh; colorrange, color = twisted_color, transparency = true, alpha = 0.5) + lines!(ax_twisted, twisted_central_spline) + scatter!(ax_twisted, twisted_central_pts) + cs_lines = lines!(ax_twisted, twisted_central_line_match) + connect!(cs_lines.visible, central_spline_lines_toggle.active) + meshscatter!(ax_twisted, twisted_seam_cells; markersize = 1.0, color = :gray, alpha = 0.5, transparency = true) + meshscatter!(ax_twisted, twisted_annotation_cells; markersize = 1.0, color = use_myuntwist ? :gold : :blue, alpha = 0.5, transparency = true) + text!(ax_twisted, twisted_seam_cell_labels; text = twisted_seam_cell_text, align = (:right, :bottom)) + ann_txt = text!(ax_twisted, twisted_annotation_cells; text = twisted_annotation_text, align = (:right, :bottom)) + connect!(ann_txt.visible, annotation_text_toggle.active) + @info "twisted_seam_cell_labels" twisted_seam_cell_labels[] tmodel.names + + on(throttle(0.1, sliders.sliders[1].value)) do value + idx = round(Int, value*N_timepoints + 1) + model = avg_models[idx] + n_sections = length(interpolation_points(model.central_spline)) + _mesh[] = ShroffCelegansModels.get_model_contour_mesh(model; transform_points=swapyz_scale) + _color[] = repeat(color, length(model)) + title[] = "Average over $config_path\n$(dataset.path), t = $value; number of cross sections: $n_sections" + _seam_cells[] = swapyz_scale.(seam_cell_pts(model, n_upsample)) + _seam_cell_labels[] = _seam_cells[] .- Ref(Point3f(2,0,0)) + _annotation_cells[] = _annotation_positions_over_time[idx] + + smodel = smts_nt(value) + sn_sections = length(interpolation_points(model.central_spline)) + straight_mesh[] = ShroffCelegansModels.get_model_contour_mesh(smodel; transform_points=swapyz_scale) + straight_color[] = repeat(color, length(smodel)) + title[] = "Average over $config_path\n$(dataset.path), t = $value; number of cross sections: $sn_sections" + straight_seam_cells[] = swapyz_scale.(seam_cell_pts(smodel, n_upsample)) + straight_seam_cell_labels[] = straight_seam_cells[] .- Ref(Point3f(2,0,0)) + straight_annotation_cells[] = straight_annotation_positions_over_time[idx] + + tmodel = mts_nt(value) + if !ismissing(tmodel) + twisted_mesh[] = ShroffCelegansModels.get_model_contour_mesh(tmodel; transform_points=swapyz_scale) + twisted_central_spline[] = swapyz_scale.(ShroffCelegansModels.central_spline(tmodel).(LinRange(0,1,length(tmodel)))) + twisted_color[] = repeat(color, length(tmodel)) + twisted_seam_cells[] = swapyz_scale.(seam_cell_pts(tmodel, 0)) + twisted_seam_cell_labels[] = twisted_seam_cells[] .- Ref(Point3f(2,0,0)) + twisted_seam_cell_text[] = [String.(tmodel.names[1:2:end]); String.(tmodel.names[2:2:end])] + annotation_positions = twisted_annotation_positions(value) + if !ismissing(annotation_positions) + twisted_annotation_text[] = get_annotation_text(annotation_positions) + twisted_annotation_cells[] = collect(values(annotation_positions)) + twisted_central_pts[] = swapyz_scale.(second(ShroffCelegansModels.nearest_central_pt(tmodel, swapyz_unscale.(twisted_annotation_cells[]), expansion_factor[]))) + twisted_central_line_match[] = vec(stack([twisted_annotation_cells[], twisted_central_pts[], fill!(similar(twisted_central_pts[]), Point3f(NaN))]; dims=1)) + end + end + end + + on(throttle(0.1, sliders.sliders[2].value)) do expansion_factor_value + value = sliders.sliders[1].value[] + tmodel = mts_nt(value) + annotation_positions = twisted_annotation_positions(value) + if !ismissing(tmodel) + if !ismissing(annotation_positions) + twisted_annotation_text[] = get_annotation_text(annotation_positions) + twisted_annotation_cells[] = collect(values(annotation_positions)) + twisted_central_pts[] = swapyz_scale.(second(ShroffCelegansModels.nearest_central_pt(tmodel, swapyz_unscale.(twisted_annotation_cells[]), expansion_factor_value))) + twisted_central_line_match[] = vec(stack([twisted_annotation_cells[], twisted_central_pts[], fill!(similar(twisted_central_pts[]), Point3f(NaN))]; dims=1)) + end + end + end + + display(f) + f +end + +function fix_average_models_with_annotations( + avg_models, + datasets::Vector{ShroffCelegansModels.Datasets.NormalizedDataset}; + use_myuntwist = false, + cache = use_myuntwist ? my_annotation_position_cache : annotation_position_cache +) + dataset = datasets[1] + + f = Figure(size = (1920, 1080)) + + title_prewarp = Observable("Prewarp") + ax_prewarp = Axis3(f[1,2], aspect = (1, 10, 1); title = title_prewarp) + + title = Observable("Title") + ax = Axis3(f[2,2], aspect = (1, 10, 1); title) + + title_twisted = Observable("Twisted") + ax_twisted = Axis3(f[1:2,1]; title = title_twisted) + + N_timepoints = 200 + r = LinRange(0.0, 1.0, N_timepoints + 1) + sliders = SliderGrid(f[3,1:2], + (label="Time (Normalized)", range=r), + (label="Exp. Factor", range=1.0:0.01:1.5) + ) + slider_range = sliders.sliders[1].range[] + + dataset_paths = map(x->x.path, datasets) + dataset_menu = Menu(f[4,1:2], options = zip(dataset_paths, datasets), default = datasets[2].path) + + dataset = dataset_menu.selection[] + + n_upsample = 2 + + smts = ShroffCelegansModels.StraightenedModelTimeSeries(dataset) + smts_nt = let _length = length(range(dataset.cell_key)) + x -> begin + nt = x * (_length - 1) + 1.0 + smts(nt, 2) + end + end + + mts = smts.modelTimeSeries + mts_nt = let _range = range(dataset.cell_key) + x -> begin + nt = x * (length(_range) - 1) + 1.0 + nt = round(Int, nt) + title_twisted[] = "Twisted; idx = $nt, tp = $(_range[nt])" + mts(nt) + end + end + + + annotation_dict = get_cell_trajectory_dict(dataset; use_myuntwist) + + # precalculate the volumes + #= + volumes_and_lengths = map(models) do model + ShroffCelegansModels.volume_by_cross_section(model), ShroffCelegansModels.central_spline(model)(1.0)[3] + end + volumes = first.(volumes_and_lengths) + lines!(vol_ax, slider_range, volumes) + whole_idx = floor.(Int, 1:1/step(slider_range):length(slider_range)) + scatter!(vol_ax, slider_range[whole_idx], volumes[whole_idx]) + + current_volume = Observable(Point(sliders.sliders[1].value[], first(volumes))) + scatter!(vol_ax, current_volume, marker = '∘', color = :red, markersize = 50) + =# + + # lengths + #= + lengths = last.(volumes_and_lengths) + lines!(length_ax, slider_range, lengths, color = :green) + scatter!(length_ax, slider_range[whole_idx], lengths[whole_idx], color = :green) + + current_length = Observable(Point(sliders.sliders[1].value[], first(lengths))) + scatter!(length_ax, current_length, marker='∘', color = :red, markersize=50) + =# + + model = avg_models[1] + _mesh = Observable(ShroffCelegansModels.get_model_contour_mesh(model; transform_points=swapyz_scale)) + #_lines = Observable(swapyz.(cross_sections_at_knots(model))) + _seam_cells = Observable(swapyz_scale.(seam_cell_pts(model, n_upsample))) + _seam_cell_labels = Observable(_seam_cells[] .- Ref(Point3f(2,0,0))) + + smodel = smts_nt(0.0) + straight_mesh = Observable(ShroffCelegansModels.get_model_contour_mesh(smodel; transform_points=swapyz_scale)) + #_lines = Observable(swapyz.(cross_sections_at_knots(model))) + straight_seam_cells = Observable(swapyz_scale.(seam_cell_pts(smodel, n_upsample))) + straight_seam_cell_labels = Observable(straight_seam_cells[] .- Ref(Point3f(2,0,0))) + + tmodel = mts_nt(0.0) + twisted_mesh = Observable(ShroffCelegansModels.get_model_contour_mesh(tmodel; transform_points=swapyz_scale)) + #_lines = Observable(swapyz.(cross_sections_at_knots(model))) + twisted_seam_cells = Observable(swapyz_scale.(seam_cell_pts(tmodel, 0))) + twisted_seam_cell_labels = Observable(twisted_seam_cells[] .- Ref(Point3f(2,0,0))) + + function annotation_positions(nt) + _smodel = smts_nt(nt) + idx = round(Int, nt*N_timepoints + 1) + _model = avg_models[idx] + @info "annotation positions" nt + swapyz_scale.(transform_annotations( + _smodel, _model, map(values(annotation_dict)) do ann + ann(nt) + end + )) + end + + function straight_annotation_positions(nt) + @info "annotation prewarp positions" nt + swapyz_scale.(map(values(annotation_dict)) do ann + ann(nt) + end) + end + + twisted_annotation_positions = let _length = length(range(dataset.cell_key)) + function twisted_annotation_positions(nt) + idx = round(Int, nt*(_length - 1) + 1) + dict = ShroffCelegansModels.twisted_annotations(dataset, idx) + Dict(keys(dict) .=> swapyz_scale.(values(dict))) + end + end + + + if haskey(cache, dataset.path) + _annotation_positions_over_time = cache[dataset.path] + else + _annotation_positions_over_time = annotation_positions.(r) + cache[dataset.path] = _annotation_positions_over_time + end + + straight_annotation_positions_over_time = straight_annotation_positions.(r) + + _annotation_cells = Observable(_annotation_positions_over_time[1]) + straight_annotation_cells = Observable(straight_annotation_positions_over_time[1]) + twisted_positions = twisted_annotation_positions(0.0) + twisted_annotation_cells = Observable(collect(values(twisted_positions))) + @info twisted_annotation_cells[] + # _annotation_cells = Observable(annotation_positions(0.0)) + + #_annotation_text = getindex.((dataset.cell_key.mapping,), Symbol.(keys(annotation_dict))) + _annotation_text = get.((dataset.cell_key.mapping,), Symbol.(keys(annotation_dict)), String.(keys(annotation_dict))) + straight_annotation_text = get.((dataset.cell_key.mapping,), Symbol.(keys(annotation_dict)), String.(keys(annotation_dict))) + twisted_annotation_text = get.((dataset.cell_key.mapping,), Symbol.(keys(twisted_positions)), String.(keys(twisted_positions))) + + + n_ellipse_pts = length(transverse_splines(model)) + colorscheme = :cyclic_wrwbw_40_90_c42_n256 + #shading = MakieCore.automatic + color=colorschemes[colorscheme][1:256÷n_ellipse_pts:256] + colorrange = (1,n_ellipse_pts) + + _color = Observable(repeat(color, length(model))) + straight_color = Observable(repeat(color, length(smodel))) + twisted_color = Observable(repeat(color, length(tmodel))) + + #mesh!(ax, _mesh; colorrange, color = _color, shading, transparency = true) + mesh!(ax, _mesh; colorrange, color = _color, transparency = true, alpha = 0.1) + meshscatter!(ax, _seam_cells; markersize = 1.0, color = :gray, alpha = 1) + meshscatter!(ax, _annotation_cells; markersize = 1.0, color = use_myuntwist ? :gold : :blue, alpha = 1) + text!(ax, _seam_cell_labels; text = [replace.(model.names[1:2:end], 'L' => 'R'); model.names[1:2:end]], align = (:right, :bottom)) + text!(ax, _annotation_cells; text = _annotation_text, align = (:right, :bottom)) + #lines!(ax, _lines, color = :black) + ylims!(ax, (0, 200)) + + mesh!(ax_prewarp, straight_mesh; colorrange, color = straight_color, transparency = true, alpha = 0.1) + meshscatter!(ax_prewarp, straight_seam_cells; markersize = 1.0, color = :gray, alpha = 1) + meshscatter!(ax_prewarp, straight_annotation_cells; markersize = 1.0, color = use_myuntwist ? :gold : :blue, alpha = 1) + text!(ax_prewarp, straight_seam_cell_labels; text = [replace.(model.names[1:2:end], 'L' => 'R'); model.names[1:2:end]], align = (:right, :bottom)) + text!(ax_prewarp, straight_annotation_cells; text = straight_annotation_text, align = (:right, :bottom)) + #lines!(ax_prewarp, _lines, color = :black) + ylims!(ax_prewarp, (0, 200)) + + twisted_seam_cell_text = Observable([tmodel.names[2:2:end]; tmodel.names[1:2:end]]) + + mesh!(ax_twisted, twisted_mesh; colorrange, color = twisted_color, transparency = true, alpha = 0.5) + meshscatter!(ax_twisted, twisted_seam_cells; markersize = 1.0, color = :gray, alpha = 0.5, transparency = true) + meshscatter!(ax_twisted, twisted_annotation_cells; markersize = 1.0, color = use_myuntwist ? :gold : :blue, alpha = 0.5, transparency = true) + text!(ax_twisted, twisted_seam_cell_labels; text = twisted_seam_cell_text, align = (:right, :bottom)) + text!(ax_twisted, twisted_annotation_cells; text = twisted_annotation_text, align = (:right, :bottom)) + @info "twisted_seam_cell_labels" twisted_seam_cell_labels[] tmodel.names + + on(dataset_menu.selection) do ds + dataset = ds + smts = ShroffCelegansModels.StraightenedModelTimeSeries(dataset) + smts_nt = let _length = length(range(dataset.cell_key)) + x -> begin + nt = x * (_length - 1) + 1.0 + smts(nt, 2) + end + end + + mts = smts.modelTimeSeries + mts_nt = let _length = length(range(dataset.cell_key)) + x -> begin + nt = x * (_length - 1) + 1.0 + nt = round(Int, nt) + title_twisted[] = "Twisted; idx = $nt, tp = $(_range[nt])" + mts(nt) + end + end + + + annotation_dict = get_cell_trajectory_dict(dataset; use_myuntwist) + + twisted_annotation_positions = let _length = length(range(dataset.cell_key)) + function twisted_annotation_positions(nt) + idx = round(Int, nt*(_length - 1) + 1) + dict = ShroffCelegansModels.twisted_annotations(dataset, idx) + Dict(keys(dict) .=> swapyz_scale.(values(dict))) + end + end + + + if haskey(cache, dataset.path) + _annotation_positions_over_time = cache[dataset.path] + else + _annotation_positions_over_time = annotation_positions.(r) + cache[dataset.path] = _annotation_positions_over_time + end + + straight_annotation_positions_over_time = straight_annotation_positions.(r) + + end + + on(throttle(0.1, sliders.sliders[1].value)) do value + idx = round(Int, value*N_timepoints + 1) + model = avg_models[idx] + n_sections = length(interpolation_points(model.central_spline)) + _mesh[] = ShroffCelegansModels.get_model_contour_mesh(model; transform_points=swapyz_scale) + _color[] = repeat(color, length(model)) + title[] = "Average over $config_path\n$(dataset.path), t = $value; number of cross sections: $n_sections" + _seam_cells[] = swapyz_scale.(seam_cell_pts(model, n_upsample)) + _seam_cell_labels[] = _seam_cells[] .- Ref(Point3f(2,0,0)) + _annotation_cells[] = _annotation_positions_over_time[idx] + + smodel = smts_nt(value) + sn_sections = length(interpolation_points(model.central_spline)) + straight_mesh[] = ShroffCelegansModels.get_model_contour_mesh(smodel; transform_points=swapyz_scale) + straight_color[] = repeat(color, length(smodel)) + title[] = "Average over $config_path\n$(dataset.path), t = $value; number of cross sections: $sn_sections" + straight_seam_cells[] = swapyz_scale.(seam_cell_pts(smodel, n_upsample)) + straight_seam_cell_labels[] = straight_seam_cells[] .- Ref(Point3f(2,0,0)) + straight_annotation_cells[] = straight_annotation_positions_over_time[idx] + + tmodel = mts_nt(value) + if !ismissing(tmodel) + twisted_mesh[] = ShroffCelegansModels.get_model_contour_mesh(tmodel; transform_points=swapyz_scale) + twisted_color[] = repeat(color, length(tmodel)) + twisted_seam_cells[] = swapyz_scale.(seam_cell_pts(tmodel, 0)) + twisted_seam_cell_labels[] = twisted_seam_cells[] .- Ref(Point3f(2,0,0)) + twisted_seam_cell_text[] = [tmodel.names[1:2:end]; tmodel.names[2:2:end]] + annotation_positions = twisted_annotation_positions(value) + if !ismissing(annotation_positions) + twisted_annotation_cells[] = collect(values(annotation_positions)) + end + end + end + + display(f) + f +end \ No newline at end of file diff --git a/src/demo_averaging/get_avg_models.jl b/src/demo_averaging/get_avg_models.jl index 2dfae22..fb1f126 100644 --- a/src/demo_averaging/get_avg_models.jl +++ b/src/demo_averaging/get_avg_models.jl @@ -1,4 +1,30 @@ function get_avg_models(n=201) + config_json, cell_keys, datasets = read_config_json() + + flattened_datasets = collect(Iterators.flatten(values(datasets))) + + min_length = map(flattened_datasets) do ds + length(range(ds.cell_key)) + end |> minimum + + + normal_flattened_datasets = filter(x->length(range(x.cell_key)) != 259, flattened_datasets) + normal_flattened_datasets = filter(x->x.cell_key.name != "Vab-1_Pos0",normal_flattened_datasets) + + smts_datasets = ShroffCelegansModels.StraightenedModelTimeSeries.(normal_flattened_datasets) + lengths = normal_flattened_datasets .|> x->length(range(x.cell_key)) + smts_datasets_nt = map(zip(smts_datasets, lengths)) do (ds, _length) + x -> begin + nt = x * (_length - 1) + 1.0 + # @info "Normalized time" nt + ds(nt) + end + end + models_at_nt(nt) = map(smts_datasets_nt) do ds + ds(nt) + end + + r = LinRange(0.0, 1.0, n) first_avg_model = let models = models_at_nt(r[1]) models = filter(!isnothing, models) @@ -7,7 +33,7 @@ function get_avg_models(n=201) end avg_models = Vector{typeof(first_avg_model)}(undef, length(r)) avg_models[1] = first_avg_model - @showprogress desc="Averaging models..." Threads.@threads for i in eachindex(r)[2:end] + ProgressMeter.@showprogress desc="Averaging models..." Threads.@threads for i in eachindex(r)[2:end] nt = r[i] models = models_at_nt(nt) models = filter(!isnothing, models) @@ -15,14 +41,4 @@ function get_avg_models(n=201) avg_models[i] = ShroffCelegansModels.average(models; n_upsample = 2) end return avg_models - - #= - avg_models = map(r) do nt - @info nt - models = models_at_nt(nt) - models = filter(!isnothing, models) - models = identity.(models) - ShroffCelegansModels.average(models; n_upsample = 2) - end - =# end \ No newline at end of file diff --git a/src/demo_averaging/get_cell_trajectory_dict.jl b/src/demo_averaging/get_cell_trajectory_dict.jl index 06da757..e1d910b 100644 --- a/src/demo_averaging/get_cell_trajectory_dict.jl +++ b/src/demo_averaging/get_cell_trajectory_dict.jl @@ -1,6 +1,9 @@ -using BSplineKit +using ShroffCelegansModels.BSplineKit -function get_cell_trajectory_dict(dataset::ShroffCelegansModels.Datasets.NormalizedDataset; use_myuntwist = false) +function get_cell_trajectory_dict( + dataset::ShroffCelegansModels.Datasets.NormalizedDataset; + use_myuntwist = false +)::Dict{String, Union{Missing, BSplineKit.SplineExtrapolation{<: Spline{Point3d}}}} annotations = load_straightened_annotations_over_time(dataset; use_myuntwist) cells = collect(keys(annotations[1])) @@ -28,7 +31,7 @@ function get_cell_trajectory_dict(dataset::ShroffCelegansModels.Datasets.Normali @error "There was an issue getting cell trajectory" cell dataset.path trajectory rethrow() end - end |> Dict + end |> Dict{String, Union{Missing, BSplineKit.SplineExtrapolation{<: Spline{Point3d}}}} return cell_trajectory_dict -end \ No newline at end of file +end diff --git a/src/demo_averaging/get_group_annotation_positions_over_time.jl b/src/demo_averaging/get_group_annotation_positions_over_time.jl index bd4f157..f943d77 100644 --- a/src/demo_averaging/get_group_annotation_positions_over_time.jl +++ b/src/demo_averaging/get_group_annotation_positions_over_time.jl @@ -1,3 +1,5 @@ +using ShroffCelegansModels: CelegansModel, Datasets + function get_datasets_info(datasets) use_myuntwist = true datasets_info = map(datasets) do dataset @@ -14,7 +16,6 @@ function get_datasets_info(datasets) x -> begin nt = x * (_length - 1) + 1.0 nt = round(Int, nt) - title_twisted[] = "Twisted; idx = $nt" mts(nt) end end @@ -23,14 +24,48 @@ function get_datasets_info(datasets) annotation_dict = get_cell_trajectory_dict(dataset; use_myuntwist) _annotation_text = String.(get.((dataset.cell_key.mapping,), Symbol.(keys(annotation_dict)), String.(keys(annotation_dict)))) annotation_dict = Dict(_annotation_text .=> values(annotation_dict)) - return (; dataset, smts_nt, mts_nt, annotation_dict) + return @NamedTuple{ + dataset::ShroffCelegansModels.Datasets.NormalizedDataset, + smts_nt::Function, + mts_nt::Function, + annotation_dict::Dict{String, Union{Missing, BSplineKit.SplineExtrapolation{<: Spline{Point3d}}}} + }((dataset, smts_nt, mts_nt, annotation_dict)) end return datasets_info end -function get_group_annotation_positions_over_time(datasets, cache) - use_myuntwist = true - r = LinRange(0,1,201) + +function annotation_positions(smts_nt, annotation_dict, nt; avg_models::Vector{<: CelegansModel} = avg_models) + N_timepoints = length(avg_models) - 1 + _smodel = smts_nt(nt) + idx = round(Int, nt * N_timepoints + 1) + _model = avg_models[idx] + @debug "annotation positions" nt + positions = missing + try + positions = swapyz_scale.(transform_annotations( + _smodel, _model, map(values(annotation_dict)) do ann + if ismissing(ann) + return Point3(NaN) + else + ann(nt) + end + end + )) + catch err + @error "A problem occured at $nt with avg_model[$idx]" exception = (err, Base.catch_backtrace()) + positions = [Point3(NaN) for i in eachindex(annotation_dict)] + end + return positions +end + +function get_group_annotation_positions_over_time( + datasets::Vector{ShroffCelegansModels.Datasets.NormalizedDataset}, + cache::Dict{String, Vector{Vector{Point3{Float64}}}}, # my_annotation_position_cache + normalized_timepoints::AbstractVector{Float64} = LinRange(0,1,201); + avg_models::Vector{<: CelegansModel} = avg_models +)::Vector{Vector{Dict{String, Point3{Float64}}}} + @assert length(avg_models) == length(normalized_timepoints) datasets_info = get_datasets_info(datasets) group_annotation_positions_over_time = map(datasets_info) do dataset_info dataset = dataset_info.dataset @@ -40,17 +75,24 @@ function get_group_annotation_positions_over_time(datasets, cache) _annotation_positions_over_time = cache[dataset.path] else #_annotation_positions_over_time = annotation_positions.((smts_nt,), (annotation_dict,), r) - _annotation_positions_over_time = Vector{Vector{Point3{Float64}}}(undef, length(r)) - @showprogress Threads.@threads for i in eachindex(r) - nt = r[i] - _annotation_positions_over_time[i] = annotation_positions(smts_nt, annotation_dict, nt) + _annotation_positions_over_time = Vector{Vector{Point3{Float64}}}(undef, length(normalized_timepoints)) + ProgressMeter.@showprogress Threads.@threads for i in eachindex(normalized_timepoints) + nt = normalized_timepoints[i] + _annotation_positions_over_time[i] = annotation_positions(smts_nt, annotation_dict, nt; avg_models) end cache[dataset.path] = _annotation_positions_over_time end - _annotation_positions_over_time # Vector{Vector{Point3{Float64}}} - map(_annotation_positions_over_time) do positions - Dict(keys(annotation_dict) .=> positions) + _annotation_positions_over_time::Vector{Vector{Point3{Float64}}} + try + map(_annotation_positions_over_time) do positions + Dict{String, Point3d}(keys(annotation_dict) .=> positions) + end + catch err + @error "Error creating dict for dataset $(dataset.path)" exception = (err, Base.catch_backtrace()) + map(_annotation_positions_over_time) do positions + Dict{String, Point3d}(keys(annotation_dict) .=> fill(Point3(NaN), length(keys(annotation_dict)) )) + end end - end # Vector{Vector{Dict{String, Point3{Float64}}}} # dataset, normalized time, name => position + end::Vector{Vector{Dict{String, Point3{Float64}}}} # dataset, normalized time, name => position return group_annotation_positions_over_time -end \ No newline at end of file +end diff --git a/src/demo_averaging/load_straightened_annotations_over_time.jl b/src/demo_averaging/load_straightened_annotations_over_time.jl index 6c2d655..54c9393 100644 --- a/src/demo_averaging/load_straightened_annotations_over_time.jl +++ b/src/demo_averaging/load_straightened_annotations_over_time.jl @@ -1,4 +1,8 @@ -function load_straightened_annotations_over_time(dataset::ShroffCelegansModels.Datasets.NormalizedDataset, offsets::UnitRange = 1:length(range(dataset.cell_key)); use_myuntwist::Bool = false) +function load_straightened_annotations_over_time( + dataset::ShroffCelegansModels.Datasets.NormalizedDataset, + offsets::UnitRange{Int} = 1:length(range(dataset.cell_key)); + use_myuntwist::Bool = false +)::Vector{Union{Missing, Dict{String, Point3d}}} key = (dataset.path, offsets, use_myuntwist) if haskey(annotations_cache, key) return annotations_cache[key] @@ -16,11 +20,19 @@ function load_straightened_annotations_over_time(dataset::ShroffCelegansModels.D return missing end annotation_df = CSV.read(path, DataFrame) - pts = Point3f.(eachrow(Matrix(annotation_df)[:, 2:4])) + pts = Point3d.(eachrow(Matrix(annotation_df)[:, 2:4])) pts .-= get_straightened_lattice_xy_center(dataset, time_offset) - Dict(annotation_df[:,1] .=> pts) + Dict{String, Point3d}(annotation_df[:,1] .=> pts) end annotations_cache[key] = annotations return annotations end +end + +function annotations_cache_key( + dataset::ShroffCelegansModels.Datasets.NormalizedDataset, + offsets = 1:length(range(dataset.cell_key)), + use_myuntwist = true +) + return (dataset.path, offsets, use_myuntwist) end \ No newline at end of file diff --git a/src/demo_averaging/loading.jl b/src/demo_averaging/loading.jl index 586c0a6..a362532 100644 --- a/src/demo_averaging/loading.jl +++ b/src/demo_averaging/loading.jl @@ -1,12 +1,13 @@ #const config_path = raw"D:\shroff\python_model_building\C-Elegans-Model-Generation\config_full.json" if gethostname() == "KITTISOPIKULM-2" - const config_path = raw"D:\shroff\python_model_building\C-Elegans-Model-Generation\config_2024_09_05_v1.json" -elseif gethostname() == "vm7249" - const config_path = "/groups/scicompsoft/home/kittisopikulm/src/ShroffCelegansModels.jl/config_2024_09_05_v1.json" + const config_path = raw"D:\shroff\python_model_building\C-Elegans-Model-Generation\config_2026_03_19_v2.json" +else + const config_path = joinpath(@__DIR__, "..", "..", "config", "linux", "config_2026_03_19_v2.json") end const voxel_size = 0.1625 # um using LinearAlgebra +using ShroffCelegansModels.JSON3 LinearAlgebra.BLAS.set_num_threads(12) @info "Reading Config JSON" @@ -22,30 +23,17 @@ end |> minimum normal_flattened_datasets = filter(x->length(range(x.cell_key)) != 259, flattened_datasets) normal_flattened_datasets = filter(x->x.cell_key.name != "Vab-1_Pos0",normal_flattened_datasets) -#normal_flattened_datasets = filter(x->x.path != "X:\\shrofflab\\JCC596_NU\\Untwisting_Redo\\082619_Pos3\\RegB", normal_flattened_datasets) smts_datasets = ShroffCelegansModels.StraightenedModelTimeSeries.(normal_flattened_datasets) lengths = normal_flattened_datasets .|> x->length(range(x.cell_key)) smts_datasets_nt = map(zip(smts_datasets, lengths)) do (ds, _length) x -> begin nt = x * (_length - 1) + 1.0 - # @info "Normalized time" nt ds(nt) end end models_at_nt(nt) = map(smts_datasets_nt) do ds ds(nt) end -# r = LinRange(0.0, 1.0, 201) -#= -avg_models = map(r) do nt - @info nt - models = models_at_nt(nt) - models = filter(!isnothing, models) - models = identity.(models) - ShroffCelegansModels.average(models; n_upsample = 2) -end -=# - include("../save_celegans_avg_models.jl") recalculate_avg_models = false @@ -58,28 +46,7 @@ else avg_models = load_avg_models("celegans_avg_models_2024_07_26.h5") end -#= -nothing_count = map(r) do nt - @info nt - models = models_at_nt(nt) - return sum(isnothing.(models)) - models = filter(!isnothing, models) - models = identity.(models) - ShroffCelegansModels.average(models; n_upsample = 2) -end -=# - -# Straightened annotations -const annotations_cache = Dict{Tuple{String, UnitRange, Bool}, Vector}() -# Warped annotations, with MIPAV straightening -const annotation_position_cache = Dict{String, Any}() -#const my_annotation_position_cache = Dict{String, Any}() -# Warped annotations, with Mark's straightening -const my_annotation_position_cache = Dict{String, Vector{Vector{Point3{Float64}}}}() - -# TODO: Move from demo_averaging:408 -# const annotations_cache = Dict{Tuple{String, UnitRange, Bool}, Vector}() - +using ShroffCelegansModels: annotations_cache, annotation_position_cache, my_annotation_position_cache int_ds = filter(flattened_datasets) do ds "int1dr" in values(ds.cell_key.mapping) @@ -88,15 +55,5 @@ const my_annotation_position_cache = Dict{String, Vector{Vector{Point3{Float64}} _length2 = length(range(int_ds[2].cell_key)) smts_nt2 = x -> begin nt = x * (_length2 - 1) + 1.0 - # @info "Normalized time" nt smts2(nt, 2) end - -include("save_cache.jl") - -# initialize my_annotation_position_cache -@info "Loading straightened annotation positions..." -load_annotation_cache() -@info "Loading warped annotation positions..." -load_annotations_cache() - diff --git a/src/demo_averaging/modelio.jl b/src/demo_averaging/modelio.jl index cd6aa9e..8f376f0 100644 --- a/src/demo_averaging/modelio.jl +++ b/src/demo_averaging/modelio.jl @@ -1,8 +1,8 @@ -using HDF5 -using Printf -using BSplineKit: SplineInterpolation -using GeometryBasics: Point3f, Point3 -using Makie +using ShroffCelegansModels.HDF5 +using ShroffCelegansModels.Printf +using ShroffCelegansModels.BSplineKit: SplineInterpolation +using ShroffCelegansModels.GeometryBasics: Point3f, Point3 +using ShroffCelegansModels.Makie function save_celegans_model( parent::Union{HDF5.File, HDF5.Group}, diff --git a/src/demo_averaging/read_config_json.jl b/src/demo_averaging/read_config_json.jl index 3885a06..5577173 100644 --- a/src/demo_averaging/read_config_json.jl +++ b/src/demo_averaging/read_config_json.jl @@ -1,6 +1,7 @@ function read_config_json(config_path::AbstractString = config_path) config_json = JSON3.read(config_path) cell_keys = Dict{String, Vector{ShroffCelegansModels.CellKey}}() + #= map(config_json.data.strains) do strain cell_keys[strain.name] = map(strain.folderpaths) do folder_path cell_key_path = joinpath(folder_path, "cell_key.json") @@ -16,12 +17,16 @@ function read_config_json(config_path::AbstractString = config_path) end end end + =# datasets = Dict{String, Vector{ShroffCelegansModels.NormalizedDataset}}() map(config_json.data.strains) do strain datasets[strain.name] = map(strain.folderpaths) do folder_path ShroffCelegansModels.NormalizedDataset(joinpath(folder_path, "RegB")) end + cell_keys[strain.name] = map(datasets[strain.name]) do dataset + dataset.cell_key + end end return config_json, cell_keys, datasets end \ No newline at end of file diff --git a/src/demo_averaging/resave_for_ben.jl b/src/demo_averaging/resave_for_ben.jl new file mode 100755 index 0000000..6ebc012 --- /dev/null +++ b/src/demo_averaging/resave_for_ben.jl @@ -0,0 +1,171 @@ +using HDF5 +using Printf +using DataFrames +using CSV +using Statistics + +""" + resave_for_ben(filename; target_filename = replace(filename, ".h5" => "_for_ben.csv"), time_range=(381, 751)) + +Convert Mark's HDF5 format to Ben's CSV format for Transcriptome4D integration. + +# Arguments +- `filename`: Input HDF5 file path (e.g., "edited_smoothed_average_annotations_r020_theta020_z030_with_seam_cells.h5") +- `target_filename`: Output CSV file path (default: input filename with "_for_ben.csv" suffix) +- `time_range`: Tuple of (start_time, end_time) in minutes post first cleavage (mpfc) + - Default: (381, 751) for post-twitch based on Ryan's new timeline + - 381 mpfc: first post-twitch position + - 751 mpfc: hatching time + +# Output Format +CSV file with columns: cell, time, x, y, z +- One row per cell per timepoint +- Time in minutes post first cleavage (mpfc) + +# New Timeline (Ryan's Email - Dec 2025) +- Dataset starts at 0 mpfc +- First positional data: 20 mpfc (four cell stage) +- Last pre-twitch: 380 mpfc +- First post-twitch: 381 mpfc +- Hatching: 751 mpfc + +# Example +```julia +resave_for_ben("edited_smoothed_average_annotations_r020_theta020_z030_with_seam_cells.h5") +# Output: edited_smoothed_average_annotations_r020_theta020_z030_with_seam_cells_for_ben.csv +# Time range: 381-751 mpfc (post-twitch) +``` + +# Notes +- Based on resave_for_tosif() function structure +- Uses Ryan's new timeline scale (mpfc instead of old mpf) +- Cell names from HDF5 annotation labels +- **Auto-detects number of timepoints** from HDF5 structure (no hard-coding) +- Works with any number of timepoints (201, 371, etc.) +""" +function resave_for_ben( + filename; + target_filename = replace(filename, ".h5" => "_for_ben.csv"), + time_range = (381, 751), + explicit::Bool = false +) + + if isfile(target_filename) + error("$target_filename exists") + end + + println("Reading HDF5 file: $filename") + + # Extract data from HDF5 + ben_data = h5open(filename) do h5f + all_rows = [] + + for strain in keys(h5f) + if strain == "timepoint_range" + continue + end + println("Processing strain: $strain") + + # Get annotation labels (cell names) + labels = h5f[strain]["annotations"][] + num_cells = length(labels) + + # Auto-detect number of timepoints from HDF5 structure + strain_keys = keys(h5f[strain]) + timepoint_keys = filter(k -> startswith(k, "timepoint_"), strain_keys) + num_timepoints = length(timepoint_keys) + println(" Detected $num_timepoints timepoints") + + # Read all timepoints + matrices = Matrix{Float64}[] + for tp in 1:num_timepoints + tpk = @sprintf("timepoint_%03d", tp) + ds = h5f[strain][tpk] + push!(matrices, ds[]) + end + + # Stack into 3D array: [cells × timepoints × coordinates] + positions = stack(matrices, dims=2) + + # Generate time vector (dynamically based on detected timepoints) + start_time, end_time = time_range + minutes = range(start_time, end_time, length=num_timepoints) |> collect + println(" Time spacing: $(round((end_time - start_time) / (num_timepoints - 1), digits=4)) min/timepoint") + + # Create rows for each cell × timepoint combination + for (cell_idx, cell_name) in enumerate(labels) + for (tp_idx, time) in enumerate(minutes) + # Extract x, y, z coordinates + x = positions[cell_idx, tp_idx, 1] + y = positions[cell_idx, tp_idx, 2] + z = positions[cell_idx, tp_idx, 3] + + # Create row: strain, cell, time, x, y, z + push!(all_rows, (strain=strain, cell=cell_name, time=time, x=x, y=y, z=z)) + end + end + end + + all_rows + end + + println("Creating DataFrame with $(length(ben_data)) rows") + + # Convert to DataFrame (includes strain column) + df_full = DataFrame(ben_data) + + # Find cells that appear in multiple strains + cells_per_strain = combine(groupby(df_full, [:cell, :time]), :strain => (x -> length(unique(x))) => :n_strains) + duplicate_cells = unique(cells_per_strain[cells_per_strain.n_strains .> 1, :cell]) + println("Found $(length(duplicate_cells)) cells appearing in multiple strains") + + # 1. For Ben: Averaged positions (cell, time, x, y, z) + println("Creating averaged positions for Ben...") + df_averaged = combine(groupby(df_full, [:cell, :time]), + :x => mean => :x, + :y => mean => :y, + :z => mean => :z) + sort!(df_averaged, [:cell, :time]) + + println("Writing averaged CSV for Ben: $target_filename") + CSV.write(target_filename, df_averaged, writeheader=true) + + # 2. For Ryan: Raw data for duplicate cells only (strain, cell, time, x, y, z) + ryan_duplicates_filename = replace(target_filename, ".csv" => "_ryan_duplicates.csv") + df_duplicates = filter(row -> row.cell in duplicate_cells, df_full) + sort!(df_duplicates, [:cell, :time, :strain]) + + println("Writing duplicate cells CSV for Ryan: $ryan_duplicates_filename") + CSV.write(ryan_duplicates_filename, df_duplicates, writeheader=true) + + # 3. For Ryan: Summary statistics (cell, time, mean_x, mean_y, mean_z, std_x, std_y, std_z, n_strains) + ryan_stats_filename = replace(target_filename, ".csv" => "_ryan_stats.csv") + df_stats = combine(groupby(df_full, [:cell, :time]), + :x => mean => :mean_x, + :y => mean => :mean_y, + :z => mean => :mean_z, + :x => std => :std_x, + :y => std => :std_y, + :z => std => :std_z, + :strain => (x -> length(unique(x))) => :n_strains) + + # Only keep rows where n_strains > 1 + df_stats = filter(row -> row.n_strains > 1, df_stats) + sort!(df_stats, [:cell, :time]) + + println("Writing statistics CSV for Ryan: $ryan_stats_filename") + CSV.write(ryan_stats_filename, df_stats, writeheader=true) + + println("\n✓ Conversion complete!") + println(" For Ben (averaged): $(nrow(df_averaged)) rows → $target_filename") + println(" For Ryan (duplicates): $(nrow(df_duplicates)) rows → $ryan_duplicates_filename") + println(" For Ryan (statistics): $(nrow(df_stats)) rows → $ryan_stats_filename") + println(" Unique cells: $(length(unique(df_averaged.cell)))") + println(" Cells in multiple strains: $(length(duplicate_cells))") + println(" Time range: $(extrema(df_averaged.time))") + + return df_averaged +end + +# Example usage (commented out): +# resave_for_ben("edited_smoothed_average_annotations_r020_theta020_z030_with_seam_cells.h5") diff --git a/src/demo_averaging/save_cache.jl b/src/demo_averaging/save_cache.jl index e4ec8a7..4901c87 100644 --- a/src/demo_averaging/save_cache.jl +++ b/src/demo_averaging/save_cache.jl @@ -26,9 +26,12 @@ function save_annotation_cache() end end -function save_annotations_cache(annotations_cache = annotations_cache) +function save_annotations_cache( + annotations_cache = annotations_cache; + filename = joinpath(@__DIR__, "..", "..", "annotations_cache.h5") +) # annotations_cache - h5open("annotations_cache.h5", "w") do h5f + h5open(filename, "w") do h5f for (k,v) in annotations_cache _path, _range, _my_untwist = k parts = splitpath(_path) @@ -56,7 +59,10 @@ function save_annotations_cache(annotations_cache = annotations_cache) end end -function load_annotations_cache(annotations_cache = annotations_cache) +function load_annotations_cache( + annotations_cache = annotations_cache; + filename = joinpath(@__DIR__, "..", "..", "annotations_cache.h5") +) function _descend(p::Union{HDF5.File,HDF5.Group}) for k in keys(p) _descend(p[k]) @@ -74,6 +80,9 @@ function load_annotations_cache(annotations_cache = annotations_cache) last_path = pop!(_paths) idx = tryparse(Int, last_path) P = nothing + #println("Dataset: ", d) + #println("Parent Dataset: ", parent(d)) + #println("Parent Dataset: ", parent(d)) try P = parent(parent(d)) catch err @@ -89,8 +98,8 @@ function load_annotations_cache(annotations_cache = annotations_cache) P = parent(P) end - _paths[1] = _paths[1] * ":\\" - _path = joinpath(_paths...) + _paths[1] = _paths[1] * ":" + _path = join(_paths, "\\") data = d[] pt = Point3{Float64}(data) @@ -111,7 +120,8 @@ function load_annotations_cache(annotations_cache = annotations_cache) data_cache[k2] = pt cache[idx] = data_cache end - h5open("annotations_cache.h5", "r") do h5f + @info "Loading annotations cache from $filename" + h5open(filename, "r") do h5f _descend(h5f) end diff --git a/src/demo_averaging/save_tosif.jl b/src/demo_averaging/save_tosif.jl index 547e04b..52ec437 100644 --- a/src/demo_averaging/save_tosif.jl +++ b/src/demo_averaging/save_tosif.jl @@ -7,9 +7,11 @@ function resave_for_tosif(filename; target_filename = replace(filename, ".h5" => strain_matrices = Array{Float64,3}[] annotation_labels = String[] strain_labels = String[] + num_timepoints = 0 for strain in keys(h5f) matrices = Matrix{Float64}[] - for tp in 1:201 + num_timepoints = length(filter(contains("timepoint_"), keys(h5f[strain]))) + for tp in 1:num_timepoints tpk = @sprintf("timepoint_%03d", tp) ds = h5f[strain][tpk] push!(matrices, ds[]) @@ -19,7 +21,7 @@ function resave_for_tosif(filename; target_filename = replace(filename, ".h5" => append!(strain_labels, repeat([strain], length(labels))) push!(strain_matrices, stack(matrices, dims=2)) end - minutes = (0:0.005:1) * 420 .+ 420 |> collect + minutes = range(381, stop=751, length=num_timepoints) |> collect trajectories = cat(strain_matrices..., dims=1) trajectories = trajectories[:,:,[1,3,2]] (; trajectories, annotation_labels, strain_labels, minutes) diff --git a/src/demo_averaging/seam_cell_pts.jl b/src/demo_averaging/seam_cell_pts.jl index 5c26023..40d3f61 100644 --- a/src/demo_averaging/seam_cell_pts.jl +++ b/src/demo_averaging/seam_cell_pts.jl @@ -1,7 +1,7 @@ -using BSplineKit.SplineInterpolations: interpolation_points +using ShroffCelegansModels.BSplineKit.SplineInterpolations: interpolation_points function seam_cell_pts(model, n_upsample) pts = interpolation_points(model)[1:2^n_upsample:end] _transverse_splines = transverse_splines(model) [_transverse_splines[1].(pts); _transverse_splines[17].(pts)] -end \ No newline at end of file +end diff --git a/src/demo_averaging/show_average_annotations.jl b/src/demo_averaging/show_average_annotations.jl index 0c5d26d..12a11e4 100644 --- a/src/demo_averaging/show_average_annotations.jl +++ b/src/demo_averaging/show_average_annotations.jl @@ -1,10 +1,14 @@ -using ProgressMeter -using Statistics: mean, var -using CoordinateTransformations -using FFTW: fftfreq, fft, ifft - -include("../makie.jl") -include("get_group_annotation_positions_over_time.jl") +using ShroffCelegansModels.ProgressMeter +using ShroffCelegansModels.Statistics: mean, var +using ShroffCelegansModels.CoordinateTransformations +using ShroffCelegansModels.FFTW: fftfreq, fft, ifft +using ShroffCelegansModels: swapyz_scale, swapyz_unscale, transverse_splines +using ShroffCelegansModels.ColorSchemes: colorschemes +using ShroffCelegansModels.GeometryBasics: Point3, Point3f +using ShroffCelegansModels.Observables: throttle + +#include("../makie.jl") +#include("get_group_annotation_positions_over_time.jl") function show_average_annotations( avg_models::Vector{<: ShroffCelegansModels.Types.CelegansModel}, @@ -35,9 +39,8 @@ function show_average_annotations( xlims!(ax_2d_3, (0,1)) ylims!(ax_2d_3, (0, 250)) # xlabel!("Time (Normalized)") - - - N_timepoints = 200 + + N_timepoints = length(avg_models) - 1 r = LinRange(0.0, 1.0, N_timepoints + 1) sliders = SliderGrid(f[4,1:3], (label="Time (Normalized)", range=r), @@ -51,25 +54,24 @@ function show_average_annotations( annotation_text_toggle = Toggle(f) pre_warp_toggle = Toggle(f) polar_view_toggle = Toggle(f) - menu_options = Observable(String[""]) - annotation_menu = Menu(f; options = menu_options) - f[5, 1:3] = grid!( - [1,1] => Label(f, "Annnotation text"), - [1,2] => annotation_text_toggle, - [1,3] => Label(f, "Pre-warp"), - [1,4] => pre_warp_toggle, - [1,5] => Label(f, "Annotation"), - [1,6] => annotation_menu, - [1,7] => Label(f, "Polar View"), - [1,8] => polar_view_toggle, - ) + #menu_options = Observable(String["temp"]) + #annotation_menu = Menu(f; options = menu_options) + + f[5, 1:3] = toggles = GridLayout() + toggles[1, 1:7] = [ + Label(f, "Annnotation text"), + annotation_text_toggle, + Label(f, "Pre-warp"), + pre_warp_toggle, + Label(f, "Polar View"), + polar_view_toggle, + Label(f, "Annotation"), + ] _common_path = common_path(datasets) _path = Observable(_common_path) Label(f[6, 1:3], _path) - - n_upsample = 2 # dataset = first(datasets) @@ -149,15 +151,18 @@ function show_average_annotations( =# model = avg_models[end] - + seam_cell_text = [replace.(model.names[1:2:end], 'L' => 'R'); model.names[1:2:end]] - menu_options[] = [common_annotations; seam_cell_text] + #menu_options[] = [common_annotations; seam_cell_text] + annotation_menu = Menu(f; options = [common_annotations; seam_cell_text]) + toggles[1,8] = annotation_menu _mesh = Observable(ShroffCelegansModels.get_model_contour_mesh(model; transform_points=swapyz_scale)) #_lines = Observable(swapyz.(cross_sections_at_knots(model))) _seam_cells = Observable(swapyz_scale.(seam_cell_pts(model, n_upsample))) _seam_cell_labels = Observable(_seam_cells[] .- Ref(Point3f(2,0,0))) + function annotation_positions(smts_nt, annotation_dict, nt) _smodel = smts_nt(nt) idx = round(Int, nt*N_timepoints + 1) @@ -225,7 +230,7 @@ function show_average_annotations( end end # Vector{Vector{Dict{String, Point3{Float64}}}} # dataset, normalized time, name => position =# - group_annotation_positions_over_time = get_group_annotation_positions_over_time(datasets, cache) + group_annotation_positions_over_time = get_group_annotation_positions_over_time(datasets, cache, LinRange(0,1,length(avg_models)); avg_models) # averaging _annotation_positions_over_time = map(eachindex(r)) do j @@ -308,7 +313,10 @@ function show_average_annotations( meshscatter!(ax, _selected_annotation; markersize = 1.0, color = :red, alpha = 1, inspectable = false) text!(ax, _seam_cell_labels; text = seam_cell_text, align = (:right, :bottom)) ann_txt = text!(ax, _annotation_cells; text = _annotation_text, align = (:right, :bottom)) - connect!(ann_txt.visible, annotation_text_toggle.active) + ann_txt.visible=false + on(annotation_text_toggle.active) do status + ann_txt.visible = status + end #lines!(ax, _lines, color = :black) # ylims!(ax, (0, 200)) ranges_labels = ax.scene[OldAxis][:ticks, :ranges_labels][] @@ -368,10 +376,10 @@ function show_average_annotations( Point2(polar_coord.θ, polar_coord.r) end end - lines!(polar_ax, polar_track; color = track3d_color, colormap = :lajolla) - scatter!(polar_ax, polar_annotations; color = scatter_color) - scatter!(polar_ax, polar_annotation_selected; color = :red) - text!(polar_ax, polar_annotations; text = common_annotations) + #lines!(polar_ax, polar_track; color = track3d_color, colormap = :lajolla) + #scatter!(polar_ax, polar_annotations; color = scatter_color) + #scatter!(polar_ax, polar_annotation_selected; color = :red) + #text!(polar_ax, polar_annotations; text = common_annotations) # selected annotation index a = nothing @@ -458,7 +466,7 @@ function show_average_annotations( on(throttle(0.1, sliders.sliders[2].value)) do smooth_factor value = sliders.sliders[1].value[] - idx = round(Int, value*200 + 1) + idx = round(Int, value*N_timepoints + 1) smooth_factor_θ = sliders.sliders[3].value[] smooth_factor_z = sliders.sliders[4].value[] if smooth_factor > 0 || smooth_factor_θ > 0 || smooth_factor_z > 0 diff --git a/src/demo_averaging/show_average_annotations_figure.jl b/src/demo_averaging/show_average_annotations_figure.jl index c34139b..f923701 100644 --- a/src/demo_averaging/show_average_annotations_figure.jl +++ b/src/demo_averaging/show_average_annotations_figure.jl @@ -4,7 +4,8 @@ using CoordinateTransformations using FFTW: fftfreq, fft, ifft include("../makie.jl") -include("get_group_annotation_positions_over_time.jl") +# include("get_group_annotation_positions_over_time.jl") +using ShroffCelegansModels: CelegansModel, get_datasets_info, get_group_annotation_positions_over_time, annotation_positions function yellow_figure( avg_models::Vector{<: ShroffCelegansModels.Types.CelegansModel}, diff --git a/src/demo_averaging/smooth_polar_dct1.jl b/src/demo_averaging/smooth_polar_dct1.jl index 5487688..ccbf7cd 100644 --- a/src/demo_averaging/smooth_polar_dct1.jl +++ b/src/demo_averaging/smooth_polar_dct1.jl @@ -1,5 +1,5 @@ -using CoordinateTransformations -using FFTW: fftfreq, fft, ifft +using ShroffCelegansModels.CoordinateTransformations +using ShroffCelegansModels.FFTW: fftfreq, fft, ifft function smooth_polar_dct1(positions_over_time, σ_r, σ_θ, σ_z = 0) G(σ,s) = exp.(-fftfreq(s,s).^2 ./2 ./ σ^2) @@ -48,4 +48,4 @@ function smooth_polar_dct1(positions_over_time, σ_r, σ_θ, σ_z = 0) end return positions_over_time # return @view positions_over_time[1:N] -end \ No newline at end of file +end diff --git a/src/demo_averaging/stretched_analysis.jl b/src/demo_averaging/stretched_analysis.jl index 67823c0..49e61e3 100644 --- a/src/demo_averaging/stretched_analysis.jl +++ b/src/demo_averaging/stretched_analysis.jl @@ -1,4 +1,4 @@ -using CircStats +# using CircStats function stretched_analysis(smodel) model = parent(smodel) @@ -12,4 +12,4 @@ function stretched_analysis(smodel) st1_pts = t1_pts .- cs_pts .+ scs_pts to_cylindrical = CoordinateTransformations.CylindricalFromCartesian() θ = to_cylindrical.(st1_pts) .|> x->x.θ -end \ No newline at end of file +end diff --git a/src/demo_averaging/transform_annotations.jl b/src/demo_averaging/transform_annotations.jl index f65fed8..1448d5a 100644 --- a/src/demo_averaging/transform_annotations.jl +++ b/src/demo_averaging/transform_annotations.jl @@ -1,3 +1,5 @@ +using ThinPlateSplines: tps_solve + function transform_annotations(from_model, to_model, annotations::AbstractVector{<: Point}) warp_from = ShroffCelegansModels.lattice(from_model) |> vec warp_to = ShroffCelegansModels.lattice(to_model) |> vec diff --git a/src/demo_averaging/zscore_analysis.jl b/src/demo_averaging/zscore_analysis.jl new file mode 100644 index 0000000..b783fed --- /dev/null +++ b/src/demo_averaging/zscore_analysis.jl @@ -0,0 +1,156 @@ +using ShroffCelegansModels.HDF5 +using ShroffCelegansModels.StatsBase: zscore +using ShroffCelegansModels.DataFrames +using ShroffCelegansModels.CSV +using ShroffCelegansModels.GeometryBasics +using Printf + +function zscore_analysis() + df = DataFrame(dataset=String[], embryo=String[], annotation=String[], zscore=Float64[]) + h5open("embryos_371_2026_04_10.h5") do h5f + for k in keys(h5f) + for e in keys(h5f[k]) + M = h5f[k][e][3, :, :] + zscores = zscore(sqrt.(sum(diff(M; dims=1) .^ 2; dims=1))) + pairs = Dict(attrs(h5f[k][e])["annotation_names"] .=> zscores') + deviation = filter(k -> pairs[k] > 2, keys(pairs)) + for d in deviation + println(k, ", ", e, ", ", d, ", ", pairs[d]) + push!(df, (k, e, d, pairs[d])) + end + end + end + end + return df +end + +function get_annotations_cache_keys(datasets::Dict{String, Dict{String, ShroffCelegansModels.Dataset}}) + flatened_datasets = [dataset for group in values(datasets) for dataset in values(group)] + dataset_keys = ShroffCelegansModels.annotations_cache_key.(flattened_datasets) +end +function raw_zscore_analysis( + datasets::Dict{String, Vector{ShroffCelegansModels.NormalizedDataset}}; + threshold=1, + time_threshold=1 +) + d = map(collect(keys(datasets))) do group + group => map(collect(keys(datasets[group]))) do embryo + dataset = datasets[group][embryo] + dict = raw_annotation_dict(dataset) + map(collect(keys(dict))) do annotation + timeseries = dict[annotation] + annotation => sqrt(sum(diff((x->x[3]).(skipmissing(timeseries))).^2)) + end |> Dict + end + end |> Dict + flattened_dict = Dict( + (group,embyro,annotation) => value + for (group, embyros) in d + for (embyro,annotations) in pairs(embyros) + for (annotation,value) in annotations + ) + zscore_dict = Dict(keys(flattened_dict) .=> zscore(values(flattened_dict) |> collect)) + filtered_zscore_dict = filter(zscore_dict) do (k, zscore) + zscore > threshold + end + map(keys(filtered_zscore_dict) |> collect) do k + (group, embryo, annotation) = k + dataset = datasets[group][embryo] + dict = raw_annotation_dict(dataset) + timeseries = dict[annotation] + timepoint = find_max_diff_idx(timeseries) + dataset.cell_key.start - 1 + # println(group, ", ", embryo, ", ", annotation, ", ", zscore, ", ", timepoint) + # get_fix_url(group, embryo, annotation, timepoint) + (;group, embryo, annotation, timepoint, zscore = zscore_dict[k], link = get_fix_url(group, embryo, annotation, timepoint)) + end |> DataFrame +end +function raw_annotation_dict(dataset; use_myuntwist = true) + straighted_annotations_over_time = ShroffCelegansModels.load_straightened_annotations_over_time(dataset; use_myuntwist) + mapping = dataset.cell_key.mapping + timeseries = map(keys(mapping) |> collect) do annotation_name + Vector{Union{Missing, Point3d}}(map(straighted_annotations_over_time) do d + if ismissing(d) + return missing + end + get(d, string(annotation_name), missing) + end) + end::Vector{Vector{Union{Missing, Point3d}}} + + return Dict(values(mapping) .=> timeseries) +end +function find_max_diff_idx(timeseries::Vector{Union{Missing, Point3d}}) + idx = [i for (i, point) in enumerate(timeseries) if !ismissing(point)] + delta = diff((x->x[3]).(skipmissing(timeseries))) + abs_delta = abs.(delta) + i_max = argmax(abs_delta) + if i_max == 1 || i_max == length(idx) + return idx[i_max] + end + if delta[i_max] > 0 + if delta[i_max-1] < -delta[i_max]/2 + return idx[i_max] + else + return idx[i_max+1] + end + else + if delta[i_max-1] > -delta[i_max]/2 + return idx[i_max] + else + return idx[i_max+1] + end + end +end +function find_max_diff_idx( + dataset::ShroffCelegansModels.NormalizedDataset, + annotation::String, + dict::Dict{String, Vector{Union{Missing, Point3d}}} = raw_annotation_dict(dataset) +) + find_max_diff_idx(dict[annotation]) + dataset.cell_key.start - 1 +end +function zscore_dict(dataset; use_myuntwist = true) + dict = raw_annotation_dict(dataset; use_myuntwist) + zscores = zscore(map(values(dict)) do timeseries + sqrt(sum(diff((x->x[3]).(skipmissing(timeseries))).^2)) + end) + indices = map(values(dict)) do timeseries + find_max_diff_idx(timeseries) + dataset.cell_key.start - 1 + end + + return Dict(keys(dict) .=> zip(zscores, indices)) +end +function outlier_dict(dataset; use_myuntwist = true) + dict = raw_annotation_dict(dataset; use_myuntwist) + indices = map(values(dict)) do timeseries + find_max_diff_idx(timeseries) + dataset.cell_key.start - 1 + end + return Dict(keys(dict) .=> indices) +end +function get_fix_url(group, group_idx, annotation, timepoint) + return @sprintf( + "https://%s/fix_annotation_ap_axis/%s/%d?annotation=%s&timepoint=%d", + get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"), + group, + group_idx, + annotation, + timepoint + ) +end +function dataset_to_links(datasets, group, group_idx, threshold; use_myuntwist = true) + dataset = datasets[group][group_idx] + dict = zscore_dict(dataset; use_myuntwist) + filter!(dict) do (annotation, (zscore, _)) + zscore > threshold + end + links = map(collect(keys(dict))) do annotation + (zscore, timepoint) = dict[annotation] + get_fix_url(group, group_idx, annotation, timepoint) + end + return links +end +function list_outliers(;threshold=1) + for k1 in keys(datasets) + for k2 in keys(datasets[k1]) + dataset_to_links(datasets, k1, k2, threshold) .|> println; + end + end +end diff --git a/src/makie.jl b/src/makie.jl index fa64fb4..aa59f80 100644 --- a/src/makie.jl +++ b/src/makie.jl @@ -1,9 +1,9 @@ using ShroffCelegansModels: AbstractCelegansModel, transverse_splines, get_model_contour_mesh, num_transverse_splines -using ColorSchemes: colorschemes -using MakieCore: MakieCore -using GeometryBasics: Point3, Point3f +using ShroffCelegansModels.ColorSchemes: colorschemes +using ShroffCelegansModels.Makie: Makie +using ShroffCelegansModels.GeometryBasics: Point3, Point3f using ShroffCelegansModels.Points: cross_sections -using Observables: throttle +using ShroffCelegansModels.Observables: throttle function plot_celegans_model(model::AbstractCelegansModel) r = LinRange(0, 1, length(model)) @@ -39,10 +39,10 @@ const cyclic_colorschemes = [ ] -function MakieCore.mesh( +function Makie.mesh( model::AbstractCelegansModel; colorscheme = :cyclic_tritanopic_cwrk_40_100_c20_n256, - shading = MakieCore.automatic, + shading = Makie.automatic, n_ellipse_pts = num_transverse_splines(model), color=repeat(colorschemes[colorscheme][1:256÷n_ellipse_pts:256], length(model)), colorrange = (1,n_ellipse_pts), @@ -61,11 +61,11 @@ function MakieCore.mesh( ) end -function MakieCore.mesh!( +function Makie.mesh!( axis, model::AbstractCelegansModel; colorscheme = :cyclic_wrwbw_40_90_c42_n256, - shading = MakieCore.automatic, + shading = Makie.automatic, n_ellipse_pts = num_transverse_splines(model), color=repeat(colorschemes[colorscheme][1:256÷n_ellipse_pts:256], length(model)), colorrange = (1,n_ellipse_pts), @@ -85,12 +85,12 @@ function MakieCore.mesh!( ) end -MakieCore.convert_arguments(P::Type{<: MakieCore.Mesh}, model::AbstractCelegansModel) = - MakieCore.convert_arguments(P, get_model_contour_mesh(model)) -MakieCore.convert_arguments(P::Type{<: MakieCore.Mesh}, model::AbstractCelegansModel, f::Function) = - MakieCore.convert_arguments(P, get_model_contour_mesh(model, transform_points = f)) +Makie.convert_arguments(P::Type{<: Makie.Mesh}, model::AbstractCelegansModel) = + Makie.convert_arguments(P, get_model_contour_mesh(model)) +Makie.convert_arguments(P::Type{<: Makie.Mesh}, model::AbstractCelegansModel, f::Function) = + Makie.convert_arguments(P, get_model_contour_mesh(model, transform_points = f)) -function MakieCore.convert_arguments(P::Type{<: MakieCore.Lines}, model::AbstractCelegansModel, f::Function = identity) +function Makie.convert_arguments(P::Type{<: Makie.Lines}, model::AbstractCelegansModel, f::Function = identity) splines = transverse_splines(model) r = LinRange(0, 1, length(model)) pts = map(splines) do spline @@ -106,11 +106,11 @@ function MakieCore.convert_arguments(P::Type{<: MakieCore.Lines}, model::Abstrac pts = permutedims(hcat(pts, gaps), [2,1]) |> vec pts = vcat(pts...) pts = f.(pts) - MakieCore.convert_arguments(P, pts) + Makie.convert_arguments(P, pts) end -#function MakieCore.convert_arguments(P::Type{<: MakieCore.Text}, model::AbstractCelegansModel, f::Function = identity) -function MakieCore.text!(ax, model::AbstractCelegansModel, f::Function = identity) +#function Makie.convert_arguments(P::Type{<: Makie.Text}, model::AbstractCelegansModel, f::Function = identity) +function Makie.text!(ax, model::AbstractCelegansModel, f::Function = identity) pts = ShroffCelegansModels.interpolation_points(model) splines = transverse_splines(model) # This probably swapped. 1 should be right, 17 should be left @@ -120,7 +120,7 @@ function MakieCore.text!(ax, model::AbstractCelegansModel, f::Function = identit # text!(ax, f.(right_spline.(pts)); text = ShroffCelegansModels.Types.names(model)[2:2:end]) end -# const voxel_size = 0.1625 # um +const voxel_size = 0.1625 # um swapyz(p::P) where P <: Point3 = P(p[1], p[3], p[2]) swapyz_scale(p::P) where P <: Point3 = P(p[1], p[3], p[2]) * voxel_size diff --git a/src/model_time_series.jl b/src/model_time_series.jl index 6e2e33b..89f4123 100644 --- a/src/model_time_series.jl +++ b/src/model_time_series.jl @@ -21,13 +21,14 @@ function (mts::ModelTimeSeries)(time_offset::Integer) end catch err if err isa BoundsError - @warn "BoundsError" time_offset timepoint lattice_filepath - return nothing - else - rethrow(err) + @warn "BoundsError" time_offset + # return nothing end + rethrow(err) end end +Base.length(mts::ModelTimeSeries) = length(range(mts.dataset.cell_key)) +Base.iterate(mts::ModelTimeSeries, state=1) = state > length(mts) ? nothing : (mts(state), state + 1) struct StraightenedModelTimeSeries{Model <: AbstractCelegansModel, Cache <: LRU{<: AbstractString, Union{Model,Missing}}, ModelTS <: ModelTimeSeries} modelTimeSeries::ModelTS diff --git a/src/parse_worm_dataset_path.jl b/src/parse_worm_dataset_path.jl index fdf4651..4e463e6 100644 --- a/src/parse_worm_dataset_path.jl +++ b/src/parse_worm_dataset_path.jl @@ -43,11 +43,22 @@ include("demo_averaging/get_cell_trajectory_dict.jl") include("demo_averaging/save_cache.jl") # initialize my_annotation_position_cache -@info "Loading straightened annotation positions..." -load_annotation_cache() -@info "Loading warped annotation positions..." -load_annotations_cache() - +try + if isempty(my_annotation_position_cache) + @info "Loading straightened annotation positions..." + load_annotation_cache() + end +catch err + @warn "There was an issue loading the annotation cache" err +end +try + if isempty(annotations_cache) + @info "Loading warped annotation positions..." + load_annotations_cache() + end +catch err + @warn "There was an issue loading the my annotation cache" err +end function save_annotation_position_cache( filename::String, @@ -153,7 +164,12 @@ function save_annotation_position_cache( end attrs(attributed_obj)["path"] = embryo.path attrs(attributed_obj)["normalized_time"] = collect(timepoints) - attrs(attributed_obj)["standard_minutes_post_fertilization"] = collect(timepoints .* 420 .+ 420) + if num_timepoints == 371 + attrs(attributed_obj)["standard_minutes_post_fertilization"] = collect(timepoints .* 370 .+ 381) + else + # num_timepoints == 201, which corresponds to 421 to 840 minutes + attrs(attributed_obj)["standard_minutes_post_fertilization"] = collect(timepoints .* 420 .+ 420) + end catch err #display(err) # println(err) @@ -178,7 +194,9 @@ function save_annotation_position_cache_all_dated(datasets::Dict{String, Vector{ date_str = "$(Dates.today())" date_str = replace(date_str, "-" => "_") - for (timepoints, expanded) in Iterators.product((:raw, 420), (true, false)) + # resampled_timepoints = 420, when we were doing 421 to 840 minutes + resampled_timepoints = 371 # 381 to 751 + for (timepoints, expanded) in Iterators.product((:raw, resampled_timepoints), (true, false)) tp_str = string(timepoints) if expanded tp_str *= "_expanded" diff --git a/src/save_celegans_avg_models.jl b/src/save_celegans_avg_models.jl index 2b8afcb..ecefe2a 100644 --- a/src/save_celegans_avg_models.jl +++ b/src/save_celegans_avg_models.jl @@ -1,10 +1,13 @@ using Dates using Printf -using HDF5 +using ShroffCelegansModels.HDF5 -avg_models_filename = "celegans_avg_models_" * Dates.format(now(), "yyyy_mm_dd") * ".h5" +# needs modelio.jl +include("demo_averaging/modelio.jl") -function save_avg_models(avg_models_filename = avg_models_filename, avg_models = avg_models, offset = 0) +avg_models_filename() = "celegans_avg_models_" * Dates.format(now(), "yyyy_mm_dd") * ".h5" + +function save_avg_models(avg_models_filename = avg_models_filename(), avg_models = avg_models, offset = 0) h5open(avg_models_filename, "w") do h5f for (i, m) in pairs(avg_models) save_celegans_model(h5f, @sprintf("avg_model_%03d", i + offset), m) @@ -12,7 +15,7 @@ function save_avg_models(avg_models_filename = avg_models_filename, avg_models = end end -function load_avg_models(avg_models_filename= avg_models_filename) +function load_avg_models(avg_models_filename= avg_models_filename()) avg_models = [] h5open(avg_models_filename, "r") do h5f for k in keys(h5f) @@ -26,12 +29,12 @@ function load_avg_models(avg_models_filename= avg_models_filename) identity.(avg_models) end -function save_measurements(avg_models_filename = avg_models_filename) +function save_measurements(avg_models_filename = avg_models_filename()) h5open(avg_models_filename) do h5f - attrs(h5f)["voxel_pitch_micrometers"] = 0.165 - h5f["measurements/volume"] = ShroffCelegansModels.volume_by_cross_section.(avg_models) .* 0.165^3 + attrs(h5f)["voxel_pitch_micrometers"] = 0.1625 + h5f["measurements/volume"] = ShroffCelegansModels.volume_by_cross_section.(avg_models) .* 0.1625^3 get_length(model) = ShroffCelegansModels.central_spline(model)(1.0)[3] - h5f["measurements/length"] = get_length.(avg_models) .* 0.165 + h5f["measurements/length"] = get_length.(avg_models) .* 0.1625 attrs(h5f["measurements/volume"])["units"] = "micrometers^3" attrs(h5f["measurements/length"])["units"] = "micrometers" end diff --git a/src/seam_cell_to_lineage_map.jl b/src/seam_cell_to_lineage_map.jl new file mode 100644 index 0000000..70dfa7f --- /dev/null +++ b/src/seam_cell_to_lineage_map.jl @@ -0,0 +1,573 @@ +using ShroffCelegansModels: CSV, DataFrames, GeometryBasics, HDF5 +using ShroffCelegansModels: transverse_splines +using CSV: CSV +using DataFrames: DataFrame, transform!, subset, select, nrow, eachrow, ByRow +using Printf: @sprintf +using LinearAlgebra: normalize, cross, dot, norm, I +#using GeometryBasics +#using GLMakie + +include("save_celegans_avg_models.jl") +include("demo_averaging/seam_cell_pts.jl") +include("demo_averaging/modelio.jl") + +# Mapping from embryonic lineage strings to seam cell names +const lineage_to_seam_cell_map = Dict( + "ABplaaappa" => "H0L", + "ABarpapppa" => "H0R", + "ABplaaappp" => "H1L", + "ABarpapppp" => "H1R", + "ABarppaaap" => "H2L", + "ABarpppaap" => "H2R", + "ABarppapaa" => "V1L", + "ABarppppaa" => "V1R", + "ABarppapap" => "V2L", + "ABarppppap" => "V2R", + "ABplappapa" => "V3L", + "ABprappapa" => "V3R", + "ABarppappa" => "V4L", + "ABarpppppa" => "V4R", + "ABplapapaap" => "V5L", + "ABprapapaap" => "V5R", + "ABarppappp" => "V6L", + "ABarpppppp" => "V6R", + "ABplappppp" => "TL", + "ABprappppp" => "TR" +) + +# Reverse mapping from seam cell names to embryonic lineage strings +const seam_cell_to_lineage_map = Dict( + "H0L" => "ABplaaappa", + "H0R" => "ABarpapppa", + "H1L" => "ABplaaappp", + "H1R" => "ABarpapppp", + "H2L" => "ABarppaaap", + "H2R" => "ABarpppaap", + "V1L" => "ABarppapaa", + "V1R" => "ABarppppaa", + "V2L" => "ABarppapap", + "V2R" => "ABarppppap", + "V3L" => "ABplappapa", + "V3R" => "ABprappapa", + "V4L" => "ABarppappa", + "V4R" => "ABarpppppa", + "V5L" => "ABplapapaap", + "V5R" => "ABprapapaap", + "V6L" => "ABarppappp", + "V6R" => "ABarpppppp", + "TL" => "ABplappppp", + "TR" => "ABprappppp" +) + +const left_seam_cells = ["H0L", "H1L", "H2L", "V1L", "V2L", "V3L", "V4L", "V5L", "V6L", "TL"] + +const right_seam_cells = ["H0R", "H1R", "H2R", "V1R", "V2R", "V3R", "V4R", "V5R", "V6R", "TR"] + +const seam_cell_midpoints = replace.(left_seam_cells, 'L' => 'M') + +function get_pretwitch_df() + pretwitch_df = CSV.read("final_20251205_pre-twitch_coords.csv", DataFrame) + transform!(pretwitch_df, :cell => ByRow(strip) => :cell) + return pretwitch_df +end + +function get_lineage_df(lineage::Union{String,SubString}; pretwitch_df=get_pretwitch_df()) + return subset(pretwitch_df, :cell => cell -> strip.(cell) .== lineage) +end + +function get_full_lineage_df(lineage::String; pretwitch_df=get_pretwitch_df()) + dfs = DataFrame[] + for i in 3:length(lineage) + sub_lineage = @view lineage[1:i] + df = get_lineage_df(sub_lineage; pretwitch_df=pretwitch_df) + push!(dfs, df) + end + return vcat(dfs...) +end + +function get_seam_cell_df(seam_cell::String; pretwitch_df=get_pretwitch_df()) + lineage = seam_cell_to_lineage_map[seam_cell] + return get_lineage_df(lineage; pretwitch_df=pretwitch_df) +end + +function get_seam_cell_time_and_points(seam_cell::String) + df = get_seam_cell_df(seam_cell) + times = df.time .|> Float64 + points = [Point3(df.x[i], df.y[i], df.z[i]) for i in 1:nrow(df)] + return times, points +end + +function scatter_times_and_points!(times, points) + scatter!(points, color=times) +end + +function scatter_times_and_points(times, points) + scatter(points, color=times) +end + +function dataframe_to_point3f_array(df::DataFrame) + return Point3f.(Vector.(eachrow(select(df, [:x, :y, :z])))) +end + +function get_pretwitch_points_at_time(pretwitch_df, time::Int) + timepoint_df = subset(pretwitch_df, :time => _time -> _time .== time) + return Dict(timepoint_df.cell .=> dataframe_to_point3f_array(timepoint_df)) +end + + + +function pretwitch_over_time(pretwitch_df) + f = Figure() + ax = Axis3(f[1, 1], aspect=:data) + s = Slider(f[2, 1], range=0:360, startvalue=0) + pt = get_pretwitch_points_at_time(pretwitch_df, 360) |> values |> collect + sc = Makie.meshscatter!(ax, pt, markersize=5, color=:blue) + #pt = get_pretwitch_points_at_time(pretwitch_df, 0) + #sc.positions[] = pt + on(s.value) do v + pt = get_pretwitch_points_at_time(pretwitch_df, v) |> values |> collect + sc.positions[] = pt + end + return f +end + +function get_pretwitch_annotation_points_at_time(time::Int; pretwitch_df=get_pretwitch_df()) + timepoint_df = subset(pretwitch_df, :time => _time -> _time .== time) + annotation_points = Dict{String,Point3f}() + for row in eachrow(timepoint_df) + cell = strip(row.cell) + annotation_points[cell] = Point3f(row.x, row.y, row.z) + end + return annotation_points +end + +function pretwitch_seamcells_over_time(; + pretwitch_df=get_pretwitch_df(), + avg_models=nothing, + average_annotations_dict=nothing, + left_seam_cells=["a0L"; left_seam_cells], + right_seam_cells=["a0R"; right_seam_cells], + seam_cell_midpoints=["a0M"; seam_cell_midpoints], + voxel_size=0.1625 +) + f = Figure() + ax = Axis3(f[1, 1], aspect=:data, + xlabel="L - R (μm)", + ylabel="A - P (μm)", + zlabel="D - V (μm)", + titlealign=:left + ) + xlims!(ax, -15, 15) + zlims!(ax, -15, 15) + #ylims!(ax, -75,125) + ylims!(ax, 0, 200) + s = Slider(f[2, 1], range=20:380, startvalue=0) + seam_cells = vcat(left_seam_cells, right_seam_cells) + + if !isnothing(average_annotations_dict) + posttwitch_annotations_over_time = map(1:201) do t + vcat(map(values(average_annotations_dict)) do v + v.positions[t] + end...) + end + end + + N_prewitch_timepoints = 361 + points_per_seam_cell = map(seam_cells) do seam_cell + # returns 361 points for the seam cells which are time points 20 to 380 in pretwitch_df + if seam_cell in ["a0L", "a0R"] + points = repeat([Point3f(NaN, NaN, NaN)], N_prewitch_timepoints) + else + points = get_full_lineage_seam_cell_points(seam_cell; pretwitch_df=pretwitch_df) + end + #=points .= map(points) do p + # Point3(p[3], p[1], p[1]) + end + =# + points .= ([0.0 0.0 1.0; 1.0 0.0 0.0; 0.0 1.0 0.0],) .* points + N_pretwitch_points = length(points) + if !isnothing(avg_models) + # avg_model seam cells are all marked L for some reason + left_seam_cell = replace(seam_cell, 'R' => 'L') + seam_cell_index = findfirst(isequal(left_seam_cell), avg_models[1].names) + seam_cell_index = (seam_cell_index + 1) ÷ 2 + if seam_cell == left_seam_cell + seam_cell_index += 11 + end + avg_models_points = map(avg_models) do avg_model + model_pts = seam_cell_pts(avg_model, 2) + local p = model_pts[seam_cell_index] + Point3f(p[1], p[3], p[2]) + end + append!(points, avg_models_points) + end + return seam_cell => points .* voxel_size + end |> Dict{String,Vector{Point3f}} + + last_pretwitch_H2M = (points_per_seam_cell["H2L"][N_prewitch_timepoints] + + points_per_seam_cell["H2R"][N_prewitch_timepoints]) / 2 + first_posttwitch_H2M = last_pretwitch_H2M + + if !isnothing(avg_models) + @info "Loaded avg models seam cell points" + # s.range[] = 20:(length(first(values(points_per_seam_cell)))-1)+20 + s.range[] = [20:380; LinRange(380, 381, 11)[2:end-1]; LinRange(381, 751, length(avg_models))] # pretwitch + avg models + first_posttwitch_H2M = (points_per_seam_cell["H2L"][N_prewitch_timepoints+1] + + points_per_seam_cell["H2R"][N_prewitch_timepoints+1]) / 2 + end + + #pretwitch_translation = first_posttwitch_H2M - last_pretwitch_H2M + pretwitch_translation = last_pretwitch_H2M - first_posttwitch_H2M + + left_pt = map(left_seam_cells) do seam_cell + points_per_seam_cell[seam_cell][end] + end + right_pt = map(right_seam_cells) do seam_cell + points_per_seam_cell[seam_cell][end] + end + mid_pt = (left_pt .+ right_pt) / 2 + + # Translate all points such that H2M is at the origin + H2_index = findfirst(isequal("H2M"), seam_cell_midpoints) + H2_mid_pt = mid_pt[H2_index] + #= + left_pt .-= H2_mid_pt + right_pt .-= H2_mid_pt + mid_pt .-= H2_mid_pt + =# + + annotation_pts = collect(values(get_pretwitch_annotation_points_at_time(N_prewitch_timepoints; pretwitch_df))) + annotation_pts .= ([0.0 0.0 1.0; 1.0 0.0 0.0; 0.0 1.0 0.0],) .* annotation_pts .* voxel_size + annotation_pts .-= pretwitch_translation + + N = length(left_seam_cells) + + faces = vcat( + GeometryBasics.NgonFace{3,Int}[(i, i + 1, i + N) for i in 1:N-1], + GeometryBasics.NgonFace{3,Int}[(i + 1, i + N, i + 1 + N) for i in 1:N-1] + ) + left_mesh = GeometryBasics.Mesh( + vcat(left_pt, mid_pt), + faces + ) |> Observable + right_mesh = GeometryBasics.Mesh( + vcat(right_pt, mid_pt), + faces + ) |> Observable + + Makie.mesh!(ax, left_mesh, color=:red, shading=false, alpha=0.5, transparency=true) + Makie.mesh!(ax, right_mesh, color=:green, shading=false, alpha=0.5, transparency=true) + left_sc = Makie.meshscatter!(ax, left_pt, markersize=1 * voxel_size, color=:red) + right_sc = Makie.meshscatter!(ax, right_pt, markersize=1 * voxel_size, color=:green) + mid_sc = Makie.meshscatter!(ax, mid_pt, markersize=2 * voxel_size, color=:magenta) + annotation_sc = Makie.meshscatter!(ax, annotation_pts, markersize=2 * voxel_size, color=:cyan) + left_lines = lines!(ax, left_pt, color=:red) + right_lines = lines!(ax, right_pt, color=:green) + mid_lines = lines!(ax, mid_pt, color=:magenta) + left_text = text!(ax, left_pt; text=left_seam_cells, align=(:center, :bottom)) + right_text = text!(ax, right_pt; text=right_seam_cells, align=(:center, :bottom)) + mid_text = text!(ax, mid_pt; text=seam_cell_midpoints, align=(:center, :bottom)) + on(s.value) do t + ax.title[] = "Timepoint: $(@sprintf("%06.2f", t)) mpfc $(t < 380 ? "(pretwitch)" : t < 381 ? "(straightening)" : "(posttwitch)")" + v = if t < 381 + floor(Int, t - 20 + 1) # pretwitch timepoints start at 20 + else + round(Int, (t - 381) / ((751 - 381) / 200) + 381) - 20 + 1 # avg models start after pretwitch timepoints + end + @info "" v + # Get points at time v + left_pt = map(left_seam_cells) do seam_cell + points_per_seam_cell[seam_cell][v] + end + right_pt = map(right_seam_cells) do seam_cell + points_per_seam_cell[seam_cell][v] + end + + if t > 380 && t < 381 && !isnothing(avg_models) + L = t - 380 + @info "Interpolating avg models seam cell points at L=$L" + function seam_cell_interp_point(seam_cell) + last_pretwitch_pt = points_per_seam_cell[seam_cell][N_prewitch_timepoints] + last_pretwitch_pt -= pretwitch_translation + first_posttwitch_pt = points_per_seam_cell[seam_cell][N_prewitch_timepoints+1] + last_pretwitch_pt * (1 - L) + first_posttwitch_pt * L + end + left_pt = map(seam_cell_interp_point, left_seam_cells) + right_pt = map(seam_cell_interp_point, right_seam_cells) + end + + mid_pt = (left_pt .+ right_pt) / 2 + + # Translate all points such that H2M is at the origin + H2_mid_pt = mid_pt[H2_index] + + # Translate point + #= + left_pt .-= H2_mid_pt + right_pt .-= H2_mid_pt + mid_pt .-= H2_mid_pt + =# + if t < 380 + left_pt .-= pretwitch_translation + right_pt .-= pretwitch_translation + mid_pt .-= pretwitch_translation + println("Applied pretwitch translation: ", pretwitch_translation) + println("H2_mid_pt: ", H2_mid_pt) + end + + #left_mesh[].vertices = vcat(left_pt, mid_pt) + #right_mesh[].vertices = vcat(right_pt, mid_pt) + left_mesh[] = GeometryBasics.Mesh( + vcat(left_pt, mid_pt), + faces + ) + right_mesh[] = GeometryBasics.Mesh( + vcat(right_pt, mid_pt), + faces + ) + #notify(left_mesh) + #notify(right_mesh) + + # Update scatter positions + left_sc.positions[] = left_pt + right_sc.positions[] = right_pt + mid_sc.positions[] = mid_pt + + # Update annotation positions + if isnothing(average_annotations_dict) || t < 380 + annotation_pts = collect(values(get_pretwitch_annotation_points_at_time( + min(v, N_prewitch_timepoints); pretwitch_df + ))) + annotation_pts .= ([0.0 0.0 1.0; 1.0 0.0 0.0; 0.0 1.0 0.0],) .* annotation_pts .* voxel_size + annotation_pts .-= pretwitch_translation + elseif !isnothing(average_annotations_dict) && t >= 381 + annotation_pts = posttwitch_annotations_over_time[v-361] + end + annotation_sc.positions[] = annotation_pts + + #println("Annotation pts: ", annotation_pts) + #println(left_pt) + + # Update text positions + left_text.positions[] = left_pt + right_text.positions[] = right_pt + mid_text.positions[] = mid_pt + + # Update line positions + left_lines.positions[] = left_pt + right_lines.positions[] = right_pt + mid_lines.positions[] = mid_pt + end + return f +end + +function record_pretwitch_seamcells_over_time(; + pretwitch_df=get_pretwitch_df(), + avg_models=nothing, + average_annotations_dict=nothing, +) + f = pretwitch_seamcells_over_time(; pretwitch_df=pretwitch_df, avg_models=avg_models, average_annotations_dict) + slider = f.content[2] + display(f) + readline() + record(f, "pretwitch_seamcells_over_time.mp4", 1:length(f.content[2].range[]); framerate=30) do i + set_close_to!(slider, slider.range[][i]) + end +end + +function get_full_lineage_seam_cell_points(seam_cell::String; pretwitch_df=get_pretwitch_df()) + lineage = seam_cell_to_lineage_map[seam_cell] + df = get_full_lineage_df(lineage; pretwitch_df=pretwitch_df) + return dataframe_to_point3f_array(df) +end + +function get_lattice_points(; pretwitch_df=get_pretwitch_df()) + seam_cells = vcat(left_seam_cells, right_seam_cells) + points = Dict{String,Vector{Point3f}}() + for seam_cell in seam_cells + points[seam_cell] = get_full_lineage_seam_cell_points(seam_cell; pretwitch_df=pretwitch_df) + end + return points +end + +function get_lattice_points_by_time(; pretwitch_df=get_pretwitch_df()) + seam_cells = vcat(left_seam_cells, right_seam_cells) + lattice_points = get_lattice_points(; pretwitch_df) + lattice_points_by_time = Vector{Vector{Point3f}}(undef, 361) + for t in 1:361 + lattice_points_by_time[t] = map(seam_cells) do seam_cell + lattice_points[seam_cell][t] + end + end + return lattice_points_by_time +end + +function plot_lattice_at_time( + time::Int, + origin, + rotation=I(3); + pretwitch_df=get_pretwitch_df(), + lattice_points_by_time=get_lattice_points_by_time(; pretwitch_df=pretwitch_df), + voxel_size=0.1625 +) + pretwitch_t = get_pretwitch_points_at_time(pretwitch_df, time) |> values |> collect + pretwitch_t_points = pretwitch_t .- origin + pretwitch_t_points .= (rotation,) .* pretwitch_t_points + pretwitch_t_points = Point3f.(pretwitch_t_points) + pretwitch_t_points .*= voxel_size + s = scatter(pretwitch_t_points) + left_lattice_points = lattice_points_by_time[time+1][1:length(left_seam_cells)] .- origin + left_lattice_points .= (rotation,) .* left_lattice_points + left_lattice_points = Point3f.(left_lattice_points) + left_lattice_points .*= voxel_size + right_lattice_points = lattice_points_by_time[time+1][length(left_seam_cells)+1:end] .- origin + right_lattice_points .= (rotation,) .* right_lattice_points + right_lattice_points = Point3f.(right_lattice_points) + right_lattice_points .*= voxel_size + + mid_lattice_points = (left_lattice_points .+ right_lattice_points) / 2 + + lines!(left_lattice_points, color=:red) + text!(left_lattice_points; text=left_seam_cells) + lines!(right_lattice_points, color=:green) + text!(right_lattice_points; text=right_seam_cells) + lines!(mid_lattice_points, color=:magenta) + text!(mid_lattice_points; text=seam_cell_midpoints) + return s +end + +# Rotate vector a to align with vector b +function get_rotation_matrix(a, b) + u_a = normalize(a) + u_b = normalize(b) + v = cross(u_a, u_b) # Rotation axis (scaled by sine) + c = dot(u_a, u_b) # Cosine of the angle + s = norm(v) # Sine of the angle + if s < 1e-10 + R = c > 0 ? I(3) : -I(3) # Identity if same, -Identity if opposite + else + # Skew-symmetric cross-product matrix of v + vx = [0 -v[3] v[2]; + v[3] 0 -v[1]; + -v[2] v[1] 0] + + # Rodrigues' Rotation Formula + R = I(3) + vx + (vx^2 * (1 - c) / (s^2)) + end + return R +end + +function get_mid_points_by_time(; pretwitch_df=get_pretwitch_df()) + lattice_points_by_time = get_lattice_points_by_time(; pretwitch_df) + mid_points_by_time = map(lattice_points_by_time) do lattice_points + (@view(lattice_points[1:10]) .+ @view(lattice_points[11:20])) / 2 + end +end + +R_x_to_y = get_rotation_matrix([1.0, 0.0, 0.0], [0.0, 1.0, 0.0]) +R_x_to_z = get_rotation_matrix([1.0, 0.0, 0.0], [0.0, 0.0, 1.0]) +R_rotate_90_about_x = get_rotation_matrix([0.0, 1.0, 0.0], [0.0, 0.0, 1.0]) + +H0L_points = get_full_lineage_df(seam_cell_to_lineage_map["H0L"]) |> dataframe_to_point3f_array +H0R_points = get_full_lineage_df(seam_cell_to_lineage_map["H0R"]) |> dataframe_to_point3f_array +H0_midpoints = (H0L_points .+ H0R_points) / 2 + +H2R_points = get_full_lineage_df(seam_cell_to_lineage_map["H2R"]) |> dataframe_to_point3f_array +H2L_points = get_full_lineage_df(seam_cell_to_lineage_map["H2L"]) |> dataframe_to_point3f_array +H2_midpoints = (H2L_points .+ H2R_points) / 2 + +function get_annotation_name_translation_df() + # annotation_name_translation_df = CSV.read("ryan_data\\MIPAV_PositionalModel_Packer_Naming_Correlations_v1.csv", DataFrame) + annotation_name_translation_df = CSV.read("ryan_data\\MIPAV_PositionalModel_Packer_Naming_Correlations_v5.csv", DataFrame) + return annotation_name_translation_df +end + +function best_annotation_name_match(annotation_name; annotation_name_translation_df=get_annotation_name_translation_df()) + +end + +function audit_annotation_names(flattened_datasets; annotation_name_translation_df=get_annotation_name_translation_df()) + unknown_df = DataFrame(cell_key_path=String[], annotation=String[], best_guess=String[]) + foreach(flattened_datasets) do dataset + foreach(values(dataset.cell_key.mapping)) do v + in_ryan = v ∈ annotation_name_translation_df.var"Positional Model Cell Name" + if !in_ryan + processed_v = lowercase(strip(v)) + best_guess = "" + foreach(annotation_name_translation_df.var"Positional Model Cell Name") do ryan_name + try + processed_ryan_name = lowercase(strip(ryan_name)) + if processed_v == processed_ryan_name + best_guess = ryan_name + end + catch err + @error "Error processing annotation name" v ryan_name err + end + end + cell_key_path = joinpath(dirname(dataset.path), "CellKey.csv") + @info "" cell_key_path v best_guess + push!(unknown_df, (cell_key_path, v, best_guess)) + end + end + end + return unknown_df +end + +function get_pretwitch_explicit_df( + pretwitch_df=get_pretwitch_df(); + use_micrometers=true, + voxel_size=0.1625, + avg_models=nothing +) + last_pretwitch_time_df = subset(pretwitch_df, :time => ByRow(==(360))) + last_pretwitch_H2L_df = subset(last_pretwitch_time_df, + :cell => ByRow(==(seam_cell_to_lineage_map["H2L"])) + ) + last_pretwitch_H2R_df = subset(last_pretwitch_time_df, + :cell => ByRow(==(seam_cell_to_lineage_map["H2R"])) + ) + last_pretwitch_H2M = ( + Point3f(last_pretwitch_H2L_df.x[1], last_pretwitch_H2L_df.y[1], last_pretwitch_H2L_df.z[1]) + + Point3f(last_pretwitch_H2R_df.x[1], last_pretwitch_H2R_df.y[1], last_pretwitch_H2R_df.z[1]) + ) / 2 + + if isnothing(avg_models) + @info "No avg models provided, using pretwitch H2M as reference point" + first_posttwitch_H2M = Point3f(0.0, 0.0, 0.0) + else + @info "Avg models provided, using first posttwitch H2M as reference point" + local pts = seam_cell_pts(avg_models[1], 2) + seam_cell_index = findfirst(isequal("H2L"), avg_models[1].names) + seam_cell_index = (seam_cell_index + 1) ÷ 2 + H2L_index = seam_cell_index + 11 + H2R_index = seam_cell_index + first_posttwitch_H2M = (pts[H2L_index] + pts[H2R_index]) / 2 + end + + pretwitch_df = copy(pretwitch_df) + # MPFC + pretwitch_df.time .+= 20 + # AP + pretwitch_df.x .-= last_pretwitch_H2M[1] - first_posttwitch_H2M[3] + # DV + pretwitch_df.y .-= last_pretwitch_H2M[2] - first_posttwitch_H2M[2] + # LR + pretwitch_df.z .-= last_pretwitch_H2M[3] - first_posttwitch_H2M[1] + if use_micrometers + return DataFrame( + lineage_name = pretwitch_df.cell, + minutes_post_first_cleavage = pretwitch_df.time, + LR_micrometers = pretwitch_df.z .* voxel_size, + DV_micrometers = pretwitch_df.y .* voxel_size, + AP_micrometers = pretwitch_df.x .* voxel_size + ) + else + return DataFrame( + lineage_name = pretwitch_df.cell, + minutes_post_first_cleavage = pretwitch_df.time, + LR_voxels = pretwitch_df.z, + DV_voxels = pretwitch_df.y, + AP_voxels = pretwitch_df.x + ) + end +end \ No newline at end of file diff --git a/web/Manifest.toml b/web/Manifest.toml index f6c1924..b3e8a35 100644 --- a/web/Manifest.toml +++ b/web/Manifest.toml @@ -1,8 +1,8 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.11.5" +julia_version = "1.12.3" manifest_format = "2.0" -project_hash = "b6de7f73656daa59cf3ddd435064a84acb8999d5" +project_hash = "b330c827cea7290014b5d1e5ca42706648a56b90" [[deps.AbstractFFTs]] deps = ["LinearAlgebra"] @@ -20,35 +20,11 @@ git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" version = "0.4.5" -[[deps.Accessors]] -deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] -git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" -uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" -version = "0.1.42" - - [deps.Accessors.extensions] - AxisKeysExt = "AxisKeys" - IntervalSetsExt = "IntervalSets" - LinearAlgebraExt = "LinearAlgebra" - StaticArraysExt = "StaticArrays" - StructArraysExt = "StructArrays" - TestExt = "Test" - UnitfulExt = "Unitful" - - [deps.Accessors.weakdeps] - AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" - IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" - LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" - Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - [[deps.Adapt]] deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" +git-tree-sha1 = "0761717147821d696c9470a7a86364b2fbd22fd8" uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.3.0" +version = "4.5.2" weakdeps = ["SparseArrays", "StaticArrays"] [deps.Adapt.extensions] @@ -76,43 +52,11 @@ version = "0.4.2" uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" version = "1.1.2" -[[deps.ArrayInterface]] -deps = ["Adapt", "LinearAlgebra"] -git-tree-sha1 = "9606d7832795cbef89e06a550475be300364a8aa" -uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.19.0" - - [deps.ArrayInterface.extensions] - ArrayInterfaceBandedMatricesExt = "BandedMatrices" - ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" - ArrayInterfaceCUDAExt = "CUDA" - ArrayInterfaceCUDSSExt = "CUDSS" - ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" - ArrayInterfaceChainRulesExt = "ChainRules" - ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" - 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" - 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.ArrayLayouts]] -deps = ["FillArrays", "LinearAlgebra"] -git-tree-sha1 = "4e25216b8fea1908a0ce0f5d87368587899f75be" +deps = ["FillArrays", "LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "e0b47732a192dd59b9d079a06d04235e2f833963" uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" -version = "1.11.1" +version = "1.12.2" weakdeps = ["SparseArrays"] [deps.ArrayLayouts.extensions] @@ -136,21 +80,21 @@ version = "1.1.0" [[deps.AxisArrays]] deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] -git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" +git-tree-sha1 = "4126b08903b777c88edf1754288144a0492c05ad" uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" -version = "0.4.7" +version = "0.4.8" [[deps.BSplineKit]] deps = ["ArrayLayouts", "BandedMatrices", "FastGaussQuadrature", "ForwardDiff", "LinearAlgebra", "PrecompileTools", "Random", "Reexport", "SparseArrays", "Static", "StaticArrays", "StaticArraysCore", "StatsAPI"] -git-tree-sha1 = "8950181792e94c20b204b4d25cba7f2399c5b386" +git-tree-sha1 = "02d491054afeb89b7f34331701e4474eb0b904f7" uuid = "093aae92-e908-43d7-9660-e50ee39d5a0a" -version = "0.19.0" +version = "0.19.2" [[deps.BandedMatrices]] deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "PrecompileTools"] -git-tree-sha1 = "e35c672b239c5105f597963c33e740eeb46cf0ab" +git-tree-sha1 = "02fa77c70ba84361b9bc9ff28523bd9d78519265" uuid = "aae01518-5342-5314-be14-df237901396f" -version = "1.9.4" +version = "1.11.0" [deps.BandedMatrices.extensions] BandedMatricesSparseArraysExt = "SparseArrays" @@ -165,9 +109,9 @@ uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" version = "1.11.0" [[deps.BaseDirs]] -git-tree-sha1 = "03fea4a4efe25d2069c2d5685155005fc251c0a1" +git-tree-sha1 = "bca794632b8a9bbe159d56bf9e31c422671b35e0" uuid = "18cc8868-cbac-4acf-b575-c8ff214dc66f" -version = "1.3.0" +version = "1.3.2" [[deps.BitFlags]] git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" @@ -175,10 +119,10 @@ uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" version = "0.1.9" [[deps.Bonito]] -deps = ["Base64", "CodecZlib", "Colors", "Dates", "Deno_jll", "HTTP", "Hyperscript", "LinearAlgebra", "Markdown", "MsgPack", "Observables", "RelocatableFolders", "SHA", "Sockets", "Tables", "ThreadPools", "URIs", "UUIDs", "WidgetsBase"] -git-tree-sha1 = "548dd16e479145c8ba8f8545b854ccc898a43ff6" +deps = ["Base64", "CodecZlib", "Colors", "Dates", "Deno_jll", "HTTP", "Hyperscript", "JSON", "LinearAlgebra", "Markdown", "MbedTLS", "MsgPack", "Observables", "OrderedCollections", "Random", "RelocatableFolders", "SHA", "Sockets", "Tables", "ThreadPools", "URIs", "UUIDs", "WidgetsBase"] +git-tree-sha1 = "bb43f72801f703ad3c66833bd02b8f54c7328238" uuid = "824d6782-a2ef-11e9-3a09-e5662e0c26f8" -version = "4.0.5" +version = "4.2.0" [[deps.Bzip2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -209,9 +153,9 @@ version = "1.0.1+0" [[deps.CSV]] deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] -git-tree-sha1 = "deddd8725e5e1cc49ee205a1964256043720a6c3" +git-tree-sha1 = "8d8e0b0f350b8e1c91420b5e64e5de774c2f0f4d" uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" -version = "0.10.15" +version = "0.10.16" [[deps.Cairo]] deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] @@ -221,37 +165,31 @@ version = "1.1.1" [[deps.CairoMakie]] deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] -git-tree-sha1 = "0afa2b4ac444b9412130d68493941e1af462e26a" +git-tree-sha1 = "fa072933899aae6dc61dde934febed8254e66c6a" uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" -version = "0.12.18" +version = "0.15.9" [[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" +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "d0efe2c6fdcdaa1c161d206aa8b933788397ec71" uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.18.5+0" - -[[deps.CatIndices]] -deps = ["CustomUnitRanges", "OffsetArrays"] -git-tree-sha1 = "a0f80a09780eed9b1d106a1bf62041c2efc995bc" -uuid = "aafaddc9-749c-510e-ac4f-586e18779b91" -version = "0.2.2" +version = "1.18.6+0" [[deps.ChainRulesCore]] deps = ["Compat", "LinearAlgebra"] -git-tree-sha1 = "1713c74e00545bfe14605d2a2be1712de8fbcb58" +git-tree-sha1 = "12177ad6b3cad7fd50c8b3825ce24a99ad61c18f" uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.25.1" +version = "1.26.1" weakdeps = ["SparseArrays"] [deps.ChainRulesCore.extensions] ChainRulesCoreSparseArraysExt = "SparseArrays" -[[deps.CircStats]] -deps = ["Distributions", "HypothesisTests", "LinearAlgebra", "SpecialFunctions", "Statistics"] -git-tree-sha1 = "ecfe2e9a260c4723026b4a71460cf0420def9e40" -uuid = "2f6764a1-d620-4564-9394-76eb7c776766" -version = "1.0.4" +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "REPL", "UUIDs"] +git-tree-sha1 = "cfb7a2e89e245a9d5016b70323db412b3a7438d5" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "3.0.2" [[deps.CodecZlib]] deps = ["TranscodingStreams", "Zlib_jll"] @@ -259,29 +197,39 @@ git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" uuid = "944b1d66-785c-5afd-91f1-9de20f533193" version = "0.7.8" +[[deps.CodecZstd]] +deps = ["TranscodingStreams", "Zstd_jll"] +git-tree-sha1 = "da54a6cd93c54950c15adf1d336cfd7d71f51a56" +uuid = "6b39b394-51ab-5f42-8807-6242bab2b4c2" +version = "0.8.7" + [[deps.ColorBrewer]] deps = ["Colors", "JSON"] -git-tree-sha1 = "e771a63cc8b539eca78c85b0cabd9233d6c8f06f" +git-tree-sha1 = "07da79661b919001e6863b81fc572497daa58349" uuid = "a2cac450-b92f-5266-8821-25eda20663c8" -version = "0.4.1" +version = "0.4.2" [[deps.ColorSchemes]] deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] -git-tree-sha1 = "403f2d8e209681fcbd9468a8514efff3ea08452e" +git-tree-sha1 = "b0fd3f56fa442f81e0a47815c92245acfaaa4e34" uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.29.0" +version = "3.31.0" [[deps.ColorTypes]] deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.5" +version = "0.12.1" +weakdeps = ["StyledStrings"] + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" [[deps.ColorVectorSpace]] deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] -git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.10.0" +version = "0.11.0" weakdeps = ["SpecialFunctions"] [deps.ColorVectorSpace.extensions] @@ -293,16 +241,6 @@ git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" version = "0.13.1" -[[deps.Combinatorics]] -git-tree-sha1 = "8010b6bb3388abe68d95743dcbea77650bb2eddf" -uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" -version = "1.0.3" - -[[deps.CommonSolve]] -git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" -uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" -version = "0.2.4" - [[deps.CommonSubexpressions]] deps = ["MacroTools"] git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" @@ -316,38 +254,35 @@ version = "1.0.0" [[deps.Compat]] deps = ["TOML", "UUIDs"] -git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.16.0" +version = "4.18.1" weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] CompatLinearAlgebraExt = "LinearAlgebra" +[[deps.Compiler]] +git-tree-sha1 = "382d79bfe72a406294faca39ef0c3cef6e6ce1f1" +uuid = "807dbc54-b67e-4c79-8afb-eafe4df6f2e1" +version = "0.1.1" + [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.1.1+0" - -[[deps.CompositionsBase]] -git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" -uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" -version = "0.1.2" -weakdeps = ["InverseFunctions"] - - [deps.CompositionsBase.extensions] - CompositionsBaseInverseFunctionsExt = "InverseFunctions" +version = "1.3.0+1" -[[deps.ComputationalResources]] -git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" -uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" -version = "0.3.2" +[[deps.ComputePipeline]] +deps = ["Observables", "Preferences"] +git-tree-sha1 = "3b4be73db165146d8a88e47924f464e55ab053cd" +uuid = "95dc2771-c249-4cd0-9c9f-1f3b4330693c" +version = "0.1.7" [[deps.ConcurrentUtilities]] deps = ["Serialization", "Sockets"] -git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd" +git-tree-sha1 = "21d088c496ea22914fe80906eb5bce65755e5ec8" uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" -version = "2.5.0" +version = "2.5.1" [[deps.ConstructionBase]] git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" @@ -371,16 +306,23 @@ git-tree-sha1 = "a692f5e257d332de1e554e4566a4e5a8a72de2b2" uuid = "150eb455-5306-5404-9cee-2592286d6298" version = "0.6.4" +[[deps.CoreMath]] +deps = ["CoreMath_jll"] +git-tree-sha1 = "8c0480f92b1b1796239156a1b9b1bfb1b39499b4" +uuid = "b7a15901-be09-4a0e-87d2-2e66b0e09b5a" +version = "0.1.0" + +[[deps.CoreMath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a692a4c1dc59a4b8bc0b6403876eb3250fde2bc3" +uuid = "a38c48d9-6df1-5ac9-9223-b6ada3b5572b" +version = "0.1.0+0" + [[deps.Crayons]] git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" version = "4.1.1" -[[deps.CustomUnitRanges]] -git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a" -uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" -version = "1.0.2" - [[deps.DataAPI]] git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" @@ -388,15 +330,15 @@ version = "1.16.0" [[deps.DataFrames]] deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] -git-tree-sha1 = "fb61b4812c49343d7ef0b533ba982c46021938a6" +git-tree-sha1 = "5fab31e2e01e70ad66e3e24c968c264d1cf166d6" uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" -version = "1.7.0" +version = "1.8.2" [[deps.DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" +deps = ["OrderedCollections"] +git-tree-sha1 = "e86f4a2805f7f19bec5129bc9150c38208e5dc23" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.22" +version = "0.19.4" [[deps.DataValueInterfaces]] git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" @@ -408,17 +350,11 @@ deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" version = "1.11.0" -[[deps.Dbus_jll]] -deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "473e9afc9cf30814eb67ffa5f2db7df82c3ad9fd" -uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" -version = "1.16.2+0" - [[deps.DelaunayTriangulation]] deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"] -git-tree-sha1 = "5620ff4ee0084a6ab7097a27ba0c19290200b037" +git-tree-sha1 = "c55f5a9fd67bdbc8e089b5a3111fe4292986a8e8" uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" -version = "1.6.4" +version = "1.6.6" [[deps.Deno_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -445,9 +381,9 @@ version = "1.11.0" [[deps.Distributions]] deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "3e6d038b77f22791b8e3472b7c633acea1ecac06" +git-tree-sha1 = "12184a8cf11c7cbd90a4db8b2cb2f7b6f057cc46" uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.120" +version = "0.25.124" [deps.Distributions.extensions] DistributionsChainRulesCoreExt = "ChainRulesCore" @@ -467,7 +403,7 @@ version = "0.9.5" [[deps.Downloads]] deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.6.0" +version = "1.7.0" [[deps.EarCut_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -476,21 +412,15 @@ uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" version = "2.2.4+0" [[deps.EnumX]] -git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" +git-tree-sha1 = "c49898e8438c828577f04b92fc9368c388ac783c" uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" -version = "1.0.5" - -[[deps.EpollShim_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d" -uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" -version = "0.0.20230411+1" +version = "1.0.7" [[deps.ExactPredicates]] deps = ["IntervalArithmetic", "Random", "StaticArrays"] -git-tree-sha1 = "b3f2ff58735b5f024c392fde763f29b057e4b025" +git-tree-sha1 = "83231673ea4d3d6008ac74dc5079e77ab2209d8f" uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" -version = "2.2.8" +version = "2.2.9" [[deps.ExceptionUnwrapping]] deps = ["Test"] @@ -500,9 +430,9 @@ version = "0.1.11" [[deps.Expat_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "d55dffd9ae73ff72f1c0482454dcf2ec6c6c4a63" +git-tree-sha1 = "27af30de8b5445644e8ffe3bcb0d72049c089cf1" uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.6.5+0" +version = "2.7.3+0" [[deps.Extents]] git-tree-sha1 = "b309b36a9e02fe7be71270dd8c0fd873625332b4" @@ -511,27 +441,27 @@ version = "0.1.6" [[deps.FFMPEG]] deps = ["FFMPEG_jll"] -git-tree-sha1 = "53ebe7511fa11d33bec688a9178fac4e49eeee00" +git-tree-sha1 = "95ecf07c2eea562b5adbd0696af6db62c0f52560" uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" -version = "0.4.2" +version = "0.4.5" [[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 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +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", "libva_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "66381d7059b5f3f6162f28831854008040a4e905" uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "4.4.4+1" +version = "8.0.1+1" -[[deps.FFTViews]] -deps = ["CustomUnitRanges", "FFTW"] -git-tree-sha1 = "cbdf14d1e8c7c8aacbe8b19862e0179fd08321c2" -uuid = "4f61f5a4-77b1-5117-aa51-3ab5ef4ef0cd" -version = "0.3.2" +[[deps.FFTA]] +deps = ["AbstractFFTs", "DocStringExtensions", "LinearAlgebra", "MuladdMacro", "Primes", "Random", "Reexport"] +git-tree-sha1 = "65e55303b72f4a567a51b174dd2c47496efeb95a" +uuid = "b86e33f2-c0db-4aa1-a6e0-ab43e668529e" +version = "0.3.1" [[deps.FFTW]] -deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] -git-tree-sha1 = "797762812ed063b9b94f6cc7742bc8883bb5e69e" +deps = ["AbstractFFTs", "FFTW_jll", "Libdl", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "97f08406df914023af55ade2f843c39e99c5d969" uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" -version = "1.9.0" +version = "1.10.0" [[deps.FFTW_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -541,25 +471,35 @@ version = "3.3.11+0" [[deps.FastGaussQuadrature]] deps = ["LinearAlgebra", "SpecialFunctions", "StaticArrays"] -git-tree-sha1 = "fd923962364b645f3719855c88f7074413a6ad92" +git-tree-sha1 = "0044e9f5e49a57e88205e8f30ab73928b05fe5b6" uuid = "442a2c76-b920-505d-bb47-c5924d526838" -version = "1.0.2" +version = "1.1.0" [[deps.FileIO]] deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "b66970a70db13f45b7e57fbda1736e1cf72174ea" +git-tree-sha1 = "6522cfb3b8fe97bec632252263057996cbd3de20" uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.17.0" +version = "1.18.0" weakdeps = ["HTTP"] [deps.FileIO.extensions] HTTPExt = "HTTP" [[deps.FilePaths]] -deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"] -git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629" +deps = ["FilePathsBase", "MacroTools", "Reexport"] +git-tree-sha1 = "a1b2fbfe98503f15b665ed45b3d149e5d8895e4c" uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" -version = "0.8.3" +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"] @@ -578,22 +518,17 @@ version = "1.11.0" [[deps.FillArrays]] deps = ["LinearAlgebra"] -git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a" +git-tree-sha1 = "2f979084d1e13948a3352cf64a25df6bd3b4dca3" uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.13.0" -weakdeps = ["PDMats", "SparseArrays", "Statistics"] +version = "1.16.0" +weakdeps = ["PDMats", "SparseArrays", "StaticArrays", "Statistics"] [deps.FillArrays.extensions] FillArraysPDMatsExt = "PDMats" FillArraysSparseArraysExt = "SparseArrays" + FillArraysStaticArraysExt = "StaticArrays" FillArraysStatisticsExt = "Statistics" -[[deps.FiniteDifferences]] -deps = ["ChainRulesCore", "LinearAlgebra", "Printf", "Random", "Richardson", "SparseArrays", "StaticArrays"] -git-tree-sha1 = "06d76c780d657729cf20821fb5832c6cc4dfd0b5" -uuid = "26cc04aa-876d-5657-8c51-4c34ba976000" -version = "0.12.32" - [[deps.FixedPointNumbers]] deps = ["Statistics"] git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" @@ -602,9 +537,9 @@ version = "0.8.5" [[deps.Fontconfig_jll]] deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] -git-tree-sha1 = "301b5d5d731a0654825f1f2e906990f7141a106b" +git-tree-sha1 = "f85dac9a96a01087df6e3a749840015a0ca3817d" uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" -version = "2.16.0+0" +version = "2.17.1+0" [[deps.Format]] git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" @@ -613,9 +548,9 @@ version = "1.3.7" [[deps.ForwardDiff]] deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] -git-tree-sha1 = "910febccb28d493032495b7009dce7d7f7aee554" +git-tree-sha1 = "cddeab6487248a39dae1a960fff0ac17b2a28888" uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "1.0.1" +version = "1.3.3" weakdeps = ["StaticArrays"] [deps.ForwardDiff.extensions] @@ -629,9 +564,9 @@ version = "4.1.1" [[deps.FreeType2_jll]] deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" +git-tree-sha1 = "70329abc09b886fd2c5d94ad2d9527639c421e3e" uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.13.4+0" +version = "2.14.3+1" [[deps.FreeTypeAbstraction]] deps = ["BaseDirs", "ColorVectorSpace", "Colors", "FreeType", "GeometryBasics", "Mmap"] @@ -650,46 +585,23 @@ deps = ["Random"] uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" version = "1.11.0" -[[deps.GLFW]] -deps = ["GLFW_jll"] -git-tree-sha1 = "13c52cdd876a31240da16dfb51363aed42740325" -uuid = "f7f18e0c-5ee9-5ccd-a5bf-e8befd85ed98" -version = "3.4.4" - -[[deps.GLFW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] -git-tree-sha1 = "fcb0584ff34e25155876418979d4c8971243bb89" -uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" -version = "3.4.0+2" - -[[deps.GLMakie]] -deps = ["ColorTypes", "Colors", "FileIO", "FixedPointNumbers", "FreeTypeAbstraction", "GLFW", "GeometryBasics", "LinearAlgebra", "Makie", "Markdown", "MeshIO", "ModernGL", "Observables", "PrecompileTools", "Printf", "ShaderAbstractions", "StaticArrays"] -git-tree-sha1 = "8753fba3356131357b5cd02500fe80c3668535d0" -uuid = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" -version = "0.10.18" - -[[deps.GeoFormatTypes]] -git-tree-sha1 = "8e233d5167e63d708d41f87597433f59a0f213fe" -uuid = "68eda718-8dee-11e9-39e7-89f7f65f511f" -version = "0.4.4" - -[[deps.GeoInterface]] -deps = ["DataAPI", "Extents", "GeoFormatTypes"] -git-tree-sha1 = "294e99f19869d0b0cb71aef92f19d03649d028d5" -uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" -version = "1.4.1" - [[deps.GeometryBasics]] -deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] -git-tree-sha1 = "b62f2b2d76cee0d61a2ef2b3118cd2a3215d3134" +deps = ["EarCut_jll", "Extents", "IterTools", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"] +git-tree-sha1 = "1f5a80f4ed9f5a4aada88fc2db456e637676414b" uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" -version = "0.4.11" +version = "0.5.10" + + [deps.GeometryBasics.extensions] + GeometryBasicsGeoInterfaceExt = "GeoInterface" + + [deps.GeometryBasics.weakdeps] + GeoInterface = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" -[[deps.Gettext_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" -uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" -version = "0.21.0+0" +[[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"] @@ -698,15 +610,15 @@ uuid = "59f7168a-df46-5410-90c8-f2779963d0ec" version = "5.2.3+0" [[deps.Glib_jll]] -deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "fee60557e4f19d0fe5cd169211fdda80e494f4e8" +deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "24f6def62397474a297bfcec22384101609142ed" uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.84.0+0" +version = "2.86.3+0" [[deps.Glob]] -git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" +git-tree-sha1 = "83cb0092e2792b9e3a865b6655e88f5b862607e2" uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" -version = "1.3.1" +version = "1.4.0" [[deps.Graphics]] deps = ["Colors", "LinearAlgebra", "NaNMath"] @@ -722,9 +634,9 @@ version = "1.3.15+0" [[deps.GridLayoutBase]] deps = ["GeometryBasics", "InteractiveUtils", "Observables"] -git-tree-sha1 = "dc6bed05c15523624909b3953686c5f5ffa10adc" +git-tree-sha1 = "93d5c27c8de51687a2c70ec0716e6e76f298416f" uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" -version = "0.11.1" +version = "0.11.2" [[deps.Grisu]] git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" @@ -733,9 +645,9 @@ version = "1.0.2" [[deps.HDF5]] deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"] -git-tree-sha1 = "e856eef26cf5bf2b0f95f8f4fc37553c72c8641c" +git-tree-sha1 = "491ea627ac824619f34168e29a0427a9e00e3e40" uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" -version = "0.17.2" +version = "0.17.3" [deps.HDF5.extensions] MPIExt = "MPI" @@ -744,16 +656,16 @@ version = "0.17.2" MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" [[deps.HDF5_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] -git-tree-sha1 = "e94f84da9af7ce9c6be049e9067e511e17ff89ec" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "MPIABI_jll", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "aws_c_s3_jll", "dlfcn_win32_jll", "libaec_jll", "mpif_jll"] +git-tree-sha1 = "45337643a2d97262d5fe72ce1f13e8a662d13d62" uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" -version = "1.14.6+0" +version = "2.1.2+0" [[deps.HTTP]] deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] -git-tree-sha1 = "f93655dc73d7a0b4a368e3c0bce296ae035ad76e" +git-tree-sha1 = "51059d23c8bb67911a2e6fd5130229113735fc7e" uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "1.10.16" +version = "1.11.0" [[deps.HarfBuzz_jll]] deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] @@ -762,10 +674,10 @@ uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" version = "8.5.1+0" [[deps.Hwloc_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "92f65c4d78ce8cdbb6b68daf88889950b0a99d11" +deps = ["Artifacts", "JLLWrappers", "Libdl", "XML2_jll", "Xorg_libpciaccess_jll"] +git-tree-sha1 = "baaaebd42ed9ee1bd9173cfd56910e55a8622ee1" uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" -version = "2.12.1+0" +version = "2.13.0+1" [[deps.HypergeometricFunctions]] deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] @@ -779,12 +691,6 @@ git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" version = "0.0.5" -[[deps.HypothesisTests]] -deps = ["Combinatorics", "Distributions", "LinearAlgebra", "Printf", "Random", "Roots", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "15319d5a767eb386bc4b702d5e025a0be62be293" -uuid = "09f84164-cd44-5f33-b23f-e6b0d136a0d5" -version = "0.11.5" - [[deps.IfElse]] git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" @@ -802,24 +708,12 @@ git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" uuid = "c817782e-172a-44cc-b673-b171935fbb9e" version = "0.1.7" -[[deps.ImageContrastAdjustment]] -deps = ["ImageBase", "ImageCore", "ImageTransformations", "Parameters"] -git-tree-sha1 = "eb3d4365a10e3f3ecb3b115e9d12db131d28a386" -uuid = "f332f351-ec65-5f6a-b3d1-319c6670881a" -version = "0.3.12" - [[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.ImageFiltering]] -deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "PrecompileTools", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"] -git-tree-sha1 = "eea3a5095c0c5f143e62773164ab11f67e43c4bb" -uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" -version = "0.7.10" - [[deps.ImageIO]] deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs", "WebP"] git-tree-sha1 = "696144904b76e1ca433b886b4e7edd067d76cbf7" @@ -832,17 +726,11 @@ git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec" uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" version = "0.9.10" -[[deps.ImageTransformations]] -deps = ["AxisAlgorithms", "CoordinateTransformations", "ImageBase", "ImageCore", "Interpolations", "OffsetArrays", "Rotations", "StaticArrays"] -git-tree-sha1 = "dfde81fafbe5d6516fb864dc79362c5c6b973c82" -uuid = "02fcd773-0e25-5acc-982a-7f6622650795" -version = "0.10.2" - [[deps.Imath_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "0936ba688c6d201805a83da835b55c61a180db52" +git-tree-sha1 = "dcc8d0cd653e55213df9b75ebc6fe4a8d3254c65" uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" -version = "3.1.11+0" +version = "3.2.2+0" [[deps.IndirectArrays]] git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" @@ -855,9 +743,9 @@ uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" version = "0.1.5" [[deps.InlineStrings]] -git-tree-sha1 = "6a9fde685a7ac1eb3495f8e812c5a7c3711c2d5e" +git-tree-sha1 = "8f3d257792a522b4601c24a577954b0a8cd7334d" uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" -version = "1.4.3" +version = "1.4.5" [deps.InlineStrings.extensions] ArrowTypesExt = "ArrowTypes" @@ -867,11 +755,16 @@ version = "1.4.3" ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +[[deps.IntegerMathUtils]] +git-tree-sha1 = "4c1acff2dc6b6967e7e750633c50bc3b8d83e617" +uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" +version = "0.1.3" + [[deps.IntelOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "0f14a5456bdc6b9731a5682f439a672750a09e48" +git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303" uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2025.0.4+0" +version = "2025.2.0+0" [[deps.InteractiveUtils]] deps = ["Markdown"] @@ -879,34 +772,46 @@ uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" version = "1.11.0" [[deps.Interpolations]] -deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] -git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "65d505fa4c0d7072990d659ef3fc086eb6da8208" uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" -version = "0.15.1" -weakdeps = ["Unitful"] +version = "0.16.2" +weakdeps = ["ForwardDiff", "Unitful"] [deps.Interpolations.extensions] + InterpolationsForwardDiffExt = "ForwardDiff" InterpolationsUnitfulExt = "Unitful" [[deps.IntervalArithmetic]] -deps = ["CRlibm", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Random", "RoundingEmulator"] -git-tree-sha1 = "694c52705f8b23dc5b39eeac629dc3059a168a40" +deps = ["CRlibm", "CoreMath", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Printf", "Random", "RoundingEmulator"] +git-tree-sha1 = "f1c42fcaca2d8034fe392f3e86c2e0809f75b2a1" uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" -version = "0.22.35" -weakdeps = ["DiffRules", "ForwardDiff", "IntervalSets", "LinearAlgebra", "RecipesBase", "SparseArrays"] +version = "1.0.6" [deps.IntervalArithmetic.extensions] + IntervalArithmeticArblibExt = "Arblib" IntervalArithmeticDiffRulesExt = "DiffRules" IntervalArithmeticForwardDiffExt = "ForwardDiff" IntervalArithmeticIntervalSetsExt = "IntervalSets" + IntervalArithmeticIrrationalConstantsExt = "IrrationalConstants" 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" + IrrationalConstants = "92d709cd-6900-40b7-9082-c6be49f344b6" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + [[deps.IntervalSets]] -git-tree-sha1 = "5fbb102dcb8b1a858111ae81d56682376130517d" +git-tree-sha1 = "79d6bd28c8d9bccc2229784f1bd637689b256377" uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.7.11" +version = "0.7.14" weakdeps = ["Random", "RecipesBase", "Statistics"] [deps.IntervalSets.extensions] @@ -930,9 +835,9 @@ uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" version = "1.3.1" [[deps.IrrationalConstants]] -git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" +git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758" uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.2.4" +version = "0.2.6" [[deps.Isoband]] deps = ["isoband_jll"] @@ -952,15 +857,21 @@ version = "1.0.0" [[deps.JLLWrappers]] deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +git-tree-sha1 = "0533e564aae234aff59ab625543145446d8b6ec2" uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.7.0" +version = "1.7.1" [[deps.JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"] +git-tree-sha1 = "67c6f1f085cb2671c93fe34244c9cccde30f7a26" uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.4" +version = "1.5.0" + + [deps.JSON.extensions] + JSONArrowExt = ["ArrowTypes"] + + [deps.JSON.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" [[deps.JSON3]] deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] @@ -982,27 +893,38 @@ version = "0.1.6" [[deps.JpegTurbo_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1" +git-tree-sha1 = "c0c9b76f3520863909825cbecdef58cd63de705a" uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "3.1.1+0" +version = "3.1.5+0" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "58927c485919bf17ea308d9d82156de1adf4b006" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.10.12" + +[[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 = "7d703202e65efa1369de1279c162b915e245eed1" +deps = ["Distributions", "DocStringExtensions", "FFTA", "Interpolations", "StatsBase"] +git-tree-sha1 = "4260cfc991b8885bf747801fb60dd4503250e478" uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" -version = "0.6.9" +version = "0.6.11" [[deps.LAME_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +git-tree-sha1 = "059aabebaa7c82ccb853dd4a0ee9d17796f7e1bc" uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.2+0" +version = "3.100.3+0" [[deps.LERC_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" +git-tree-sha1 = "17b94ecafcfa45e8360a4fc9ca6b583b049e4e37" uuid = "88015f11-f218-50d7-93a8-a6af411a945d" -version = "4.0.1+0" +version = "4.1.0+0" [[deps.LLVMOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -1019,12 +941,6 @@ weakdeps = ["Serialization"] [deps.LRUCache.extensions] SerializationExt = ["Serialization"] -[[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" @@ -1046,24 +962,24 @@ uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" version = "0.6.4" [[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.6.0+0" +version = "8.15.0+0" [[deps.LibGit2]] -deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"] uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" version = "1.11.0" [[deps.LibGit2_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"] uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.7.2+0" +version = "1.9.0+0" [[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +deps = ["Artifacts", "Libdl", "OpenSSL_jll"] uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.11.0+1" +version = "1.11.3+1" [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" @@ -1089,26 +1005,26 @@ version = "1.18.0+0" [[deps.Libmount_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "a31572773ac1b745e0343fe5e2c8ddda7a37e997" +git-tree-sha1 = "cc3ad4faf30015a3e8094c9b5b7f19e85bdf2386" uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.41.0+0" +version = "2.42.0+0" [[deps.Libtiff_jll]] deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "4ab7581296671007fc33f07a721631b8855f4b1d" +git-tree-sha1 = "f04133fe05eff1667d2054c53d59f9122383fe05" uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.7.1+0" +version = "4.7.2+0" [[deps.Libuuid_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "321ccef73a96ba828cd51f2ab5b9f917fa73945a" +git-tree-sha1 = "d620582b1f0cbe2c72dd1d5bd195a9ce73370ab1" uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.41.0+0" +version = "2.42.0+0" [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -version = "1.11.0" +version = "1.12.0" [[deps.LogExpFunctions]] deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] @@ -1132,33 +1048,45 @@ version = "1.11.0" [[deps.LoggingExtras]] deps = ["Dates", "Logging"] -git-tree-sha1 = "f02b56007b064fbfddb4c9cd60161b6dd0f40df3" +git-tree-sha1 = "f00544d95982ea270145636c181ceda21c4e2575" uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" -version = "1.1.0" +version = "1.2.0" + +[[deps.LoweredCodeUtils]] +deps = ["CodeTracking", "Compiler", "JuliaInterpreter"] +git-tree-sha1 = "5d4278f755440f70648d80cc6225f51e78e94094" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "3.5.1" [[deps.MKL_jll]] deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] -git-tree-sha1 = "5de60bc6cb3899cd318d80d627560fae2e2d99ae" +git-tree-sha1 = "282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa" uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -version = "2025.0.1+1" +version = "2025.2.0+0" + +[[deps.MPIABI_jll]] +deps = ["Artifacts", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "8d684b5918769c4f9423e0ee3bbdefdab82709e8" +uuid = "b5ada748-db0f-5fc0-8972-9331c762740c" +version = "0.1.4+0" [[deps.MPICH_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "3aa3210044138a1749dbd350a9ba8680869eb503" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "07dbec8aab01696edc0151a401a6cdfe95b9b885" uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" -version = "4.3.0+1" +version = "5.0.1+0" [[deps.MPIPreferences]] deps = ["Libdl", "Preferences"] -git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07" +git-tree-sha1 = "8e98d5d80b87403c311fd51e8455d4546ba7a5f8" uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" -version = "0.1.11" +version = "0.1.12" [[deps.MPItrampoline_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "ff91ca13c7c472cef700f301c8d752bc2aaff1a8" +git-tree-sha1 = "675df097f8eeb28998b2cfe3b25655af73d5f7df" uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" -version = "5.5.3+0" +version = "5.5.6+0" [[deps.MacroTools]] git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" @@ -1166,55 +1094,44 @@ uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" version = "0.5.16" [[deps.Makie]] -deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "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", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] -git-tree-sha1 = "be3051d08b78206fb5e688e8d70c9e84d0264117" +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 = "68af66ec16af8b152309310251ecb4fbfe39869f" uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -version = "0.21.18" +version = "0.24.9" -[[deps.MakieCore]] -deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"] -git-tree-sha1 = "9019b391d7d086e841cbeadc13511224bd029ab3" -uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" -version = "0.8.12" + [deps.Makie.extensions] + MakieDynamicQuantitiesExt = "DynamicQuantities" + + [deps.Makie.weakdeps] + DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821" [[deps.MappedArrays]] -git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +git-tree-sha1 = "0ee4497a4e80dbd29c058fcee6493f5219556f40" uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" -version = "0.4.2" - -[[deps.MarchingCubes]] -deps = ["PrecompileTools", "StaticArrays"] -git-tree-sha1 = "0e893025924b6becbae4109f8020ac0e12674b01" -uuid = "299715c1-40a9-479a-aaf9-4a633d36f717" -version = "0.1.11" +version = "0.4.3" [[deps.Markdown]] -deps = ["Base64"] +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 = "31a99cb7537f812e1d6be893a71804c35979f1be" +git-tree-sha1 = "7eb8cdaa6f0e8081616367c10b31b9d9b34bb02a" uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" -version = "0.6.4" +version = "0.6.7" [[deps.MbedTLS]] deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] -git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +git-tree-sha1 = "8785729fa736197687541f7053f6d8ab7fc44f92" uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.1.9" +version = "1.1.10" [[deps.MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ff69a2b1330bcb730b9ac1ab7dd680176f5896b8" uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.6+0" - -[[deps.MeshIO]] -deps = ["ColorTypes", "FileIO", "GeometryBasics", "Printf"] -git-tree-sha1 = "14a12d9153b1a1a22d669eede58b2ea2164ff138" -uuid = "7269a6da-0436-5bbc-96c2-40638cbb6118" -version = "0.4.13" +version = "2.28.1010+0" [[deps.MicrosoftMPI_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -1232,12 +1149,6 @@ version = "1.2.0" uuid = "a63ad114-7e13-5084-954f-fe012c677804" version = "1.11.0" -[[deps.ModernGL]] -deps = ["Libdl"] -git-tree-sha1 = "ac6cb1d8807a05cf1acc9680e09d2294f9d33956" -uuid = "66fc600b-dfda-50eb-8b99-91cfa97b1301" -version = "1.1.8" - [[deps.MosaicViews]] deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" @@ -1246,7 +1157,7 @@ version = "0.3.4" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2023.12.12" +version = "2025.5.20" [[deps.MsgPack]] deps = ["Serialization"] @@ -1254,6 +1165,11 @@ git-tree-sha1 = "f5db02ae992c260e4826fe78c942954b48e1d9c2" uuid = "99f44e22-a591-53d1-9472-aa23ef4bd671" version = "1.2.1" +[[deps.MuladdMacro]] +git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.4" + [[deps.NaNMath]] deps = ["OpenLibm_jll"] git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" @@ -1268,7 +1184,7 @@ version = "1.1.1" [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.2.0" +version = "1.3.0" [[deps.Observables]] git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" @@ -1285,21 +1201,21 @@ weakdeps = ["Adapt"] OffsetArraysAdaptExt = "Adapt" [[deps.Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b6aa4566bb7ae78498a5e68943863fa8b5231b59" uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.5+1" +version = "1.3.6+0" [[deps.OpenBLASConsistentFPCSR_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "567515ca155d0020a45b05175449b499c63e7015" +git-tree-sha1 = "f2b3b9e52a5eb6a3434c8cca67ad2dde011194f4" uuid = "6cdc7f73-28fd-5e50-80fb-958a8875b1af" -version = "0.3.29+0" +version = "0.3.30+0" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.27+1" +version = "0.3.29+0" [[deps.OpenEXR]] deps = ["Colors", "FileIO", "OpenEXR_jll"] @@ -1309,32 +1225,31 @@ version = "0.3.3" [[deps.OpenEXR_jll]] deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "8292dd5c8a38257111ada2174000a33745b06d4e" +git-tree-sha1 = "9ac7c730c53b3b5d9a73fb900ac4b4fc263774db" uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" -version = "3.2.4+0" +version = "3.4.9+0" [[deps.OpenLibm_jll]] deps = ["Artifacts", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.5+0" +version = "0.8.7+0" [[deps.OpenMPI_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"] -git-tree-sha1 = "047b66eb62f3cae59ed260ebb9075a32a04350f1" +git-tree-sha1 = "6d6c0ca4824268c1a7dca1f4721c535ac63d9074" uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" -version = "5.0.7+2" +version = "5.0.11+0" [[deps.OpenSSL]] -deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] -git-tree-sha1 = "f1a7e086c677df53e064e0fdd2c9d0b0833e3f6e" +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "NetworkOptions", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "1d1aaa7d449b58415f97d2839c318b70ffb525a0" uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" -version = "1.5.0" +version = "1.6.1" [[deps.OpenSSL_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "9216a80ff3682833ac4b733caa8c00390620ba5d" +deps = ["Artifacts", "Libdl"] uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.5.0+0" +version = "3.5.4+0" [[deps.OpenSpecFun_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] @@ -1344,9 +1259,9 @@ version = "0.5.6+0" [[deps.Opus_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +git-tree-sha1 = "e2bb57a313a74b8104064b7efd01406c0a50d2ff" uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.3.3+0" +version = "1.6.1+0" [[deps.OrderedCollections]] git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" @@ -1356,13 +1271,17 @@ version = "1.8.1" [[deps.PCRE2_jll]] deps = ["Artifacts", "Libdl"] uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.42.0+1" +version = "10.44.0+1" [[deps.PDMats]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "f07c06228a1c670ae4c87d1276b92c7c597fdda0" +git-tree-sha1 = "e4cff168707d441cd6bf3ff7e4832bdf34278e4a" uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.35" +version = "0.11.37" +weakdeps = ["StatsBase"] + + [deps.PDMats.extensions] + StatsBaseExt = "StatsBase" [[deps.PNGFiles]] deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] @@ -1384,15 +1303,9 @@ 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 = "275a9a6d85dc86c24d03d1837a0010226a96f540" +git-tree-sha1 = "58e5ed5e386e156bd93e86b305ebd21ac63d2d04" uuid = "36c8627f-9965-5494-a995-c6b170f724f3" -version = "1.56.3+0" - -[[deps.Parameters]] -deps = ["OrderedCollections", "UnPack"] -git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" -uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" -version = "0.12.3" +version = "1.57.1+0" [[deps.Parsers]] deps = ["Dates", "PrecompileTools", "UUIDs"] @@ -1409,7 +1322,7 @@ 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.11.0" +version = "1.12.1" weakdeps = ["REPL"] [deps.Pkg.extensions] @@ -1423,9 +1336,9 @@ version = "0.3.3" [[deps.PlotUtils]] deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] -git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" +git-tree-sha1 = "26ca162858917496748aad52bb5d3be4d26a228a" uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.4.3" +version = "1.4.4" [[deps.PolygonOps]] git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" @@ -1440,21 +1353,33 @@ version = "1.4.3" [[deps.PrecompileTools]] deps = ["Preferences"] -git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +git-tree-sha1 = "07a921781cab75691315adc645096ed5e370cb77" uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.2.1" +version = "1.3.3" [[deps.Preferences]] deps = ["TOML"] -git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +git-tree-sha1 = "8b770b60760d4451834fe79dd483e318eee709c4" uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.4.3" +version = "1.5.2" [[deps.PrettyTables]] -deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] -git-tree-sha1 = "1101cd475833706e4d0e7b122218257178f48f34" +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "REPL", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "624de6279ab7d94fc9f672f0068107eb6619732c" uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" -version = "2.4.0" +version = "3.3.2" + + [deps.PrettyTables.extensions] + PrettyTablesTypstryExt = "Typstry" + + [deps.PrettyTables.weakdeps] + Typstry = "f0ed7684-a786-439e-b1e3-3b82803b501e" + +[[deps.Primes]] +deps = ["IntegerMathUtils"] +git-tree-sha1 = "25cdd1d20cd005b52fc12cb6be3f75faaf59bb9b" +uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae" +version = "0.5.7" [[deps.Printf]] deps = ["Unicode"] @@ -1463,26 +1388,26 @@ version = "1.11.0" [[deps.ProgressMeter]] deps = ["Distributed", "Printf"] -git-tree-sha1 = "13c5103482a8ed1536a54c08d0e742ae3dca2d42" +git-tree-sha1 = "fbb92c6c56b34e1a2c4c36058f68f332bec840e7" uuid = "92933f4c-e287-5a05-a399-4b506db050ca" -version = "1.10.4" +version = "1.11.0" [[deps.PtrArrays]] -git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +git-tree-sha1 = "4fbbafbc6251b883f4d2705356f3641f3652a7fe" uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" -version = "1.3.0" +version = "1.4.0" [[deps.QOI]] deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] -git-tree-sha1 = "8b3fc30bc0390abdce15f8822c889f669baed73d" +git-tree-sha1 = "472daaa816895cb7aee81658d4e7aec901fa1106" uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" -version = "1.0.1" +version = "1.0.2" [[deps.QuadGK]] deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" +git-tree-sha1 = "5e8e8b0ab68215d7a2b14b9921a946fee794749e" uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.11.2" +version = "2.11.3" [deps.QuadGK.extensions] QuadGKEnzymeExt = "Enzyme" @@ -1490,14 +1415,8 @@ version = "2.11.2" [deps.QuadGK.weakdeps] Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" -[[deps.Quaternions]] -deps = ["LinearAlgebra", "Random", "RealDot"] -git-tree-sha1 = "994cc27cdacca10e68feb291673ec3a76aa2fae9" -uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" -version = "0.7.6" - [[deps.REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] +deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" version = "1.11.0" @@ -1521,12 +1440,6 @@ weakdeps = ["FixedPointNumbers"] [deps.Ratios.extensions] RatiosFixedPointNumbersExt = "FixedPointNumbers" -[[deps.RealDot]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" -uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" -version = "0.1.0" - [[deps.RecipesBase]] deps = ["PrecompileTools"] git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" @@ -1550,17 +1463,21 @@ git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" uuid = "ae029012-a4dd-5104-9daa-d747884805df" version = "1.3.1" -[[deps.Richardson]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "48f038bfd83344065434089c2a79417f38715c41" -uuid = "708f8203-808e-40c0-ba2d-98a6953ed40d" -version = "1.4.2" +[[deps.Revise]] +deps = ["CodeTracking", "FileWatching", "InteractiveUtils", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Preferences", "REPL", "UUIDs"] +git-tree-sha1 = "5f4f629c085b87e71125eec6773f5f872c74a47a" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.14.2" +weakdeps = ["Distributed"] + + [deps.Revise.extensions] + DistributedExt = "Distributed" [[deps.Rmath]] deps = ["Random", "Rmath_jll"] -git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4" +git-tree-sha1 = "5b3d50eb374cea306873b371d3f8d3915a018f0b" uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" -version = "0.8.0" +version = "0.9.0" [[deps.Rmath_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -1568,36 +1485,6 @@ git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" version = "0.5.1+0" -[[deps.Roots]] -deps = ["Accessors", "CommonSolve", "Printf"] -git-tree-sha1 = "3ac13765751ffc81e3531223782d9512f6023f71" -uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" -version = "2.2.7" - - [deps.Roots.extensions] - RootsChainRulesCoreExt = "ChainRulesCore" - RootsForwardDiffExt = "ForwardDiff" - RootsIntervalRootFindingExt = "IntervalRootFinding" - RootsSymPyExt = "SymPy" - RootsSymPyPythonCallExt = "SymPyPythonCall" - - [deps.Roots.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807" - SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" - SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c" - -[[deps.Rotations]] -deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"] -git-tree-sha1 = "5680a9276685d392c87407df00d57c9924d9f11e" -uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" -version = "1.7.1" -weakdeps = ["RecipesBase"] - - [deps.Rotations.extensions] - RotationsRecipesBaseExt = "RecipesBase" - [[deps.RoundingEmulator]] git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" @@ -1609,31 +1496,36 @@ version = "0.7.0" [[deps.SIMD]] deps = ["PrecompileTools"] -git-tree-sha1 = "fea870727142270bdf7624ad675901a1ee3b4c87" +git-tree-sha1 = "e24dc23107d426a096d3eae6c165b921e74c18e4" uuid = "fdea26ae-647d-5447-a871-4b548cad5224" -version = "3.7.1" +version = "3.7.2" + +[[deps.SciMLPublic]] +git-tree-sha1 = "0ba076dbdce87ba230fff48ca9bca62e1f345c9b" +uuid = "431bcebd-1456-4ced-9d72-93c2757fff0b" +version = "1.0.1" [[deps.Scratch]] deps = ["Dates"] -git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" uuid = "6c6a2e73-6563-6170-7368-637461726353" -version = "1.2.1" +version = "1.3.0" [[deps.SentinelArrays]] deps = ["Dates", "Random"] -git-tree-sha1 = "712fb0231ee6f9120e005ccd56297abbc053e7e0" +git-tree-sha1 = "ebe7e59b37c400f694f52b58c93d26201387da70" uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" -version = "1.4.8" +version = "1.4.9" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" version = "1.11.0" [[deps.ShaderAbstractions]] -deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays", "StructArrays", "Tables"] -git-tree-sha1 = "79123bc60c5507f035e6d1d9e563bb2971954ec8" +deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"] +git-tree-sha1 = "818554664a2e01fc3784becb2eb3a82326a604b6" uuid = "65257c39-d410-5151-9873-9b3e5be5013e" -version = "0.4.1" +version = "0.5.0" [[deps.SharedArrays]] deps = ["Distributed", "Mmap", "Random", "Serialization"] @@ -1647,16 +1539,16 @@ uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" version = "1.0.3" [[deps.ShroffCelegansModels]] -deps = ["BSplineKit", "CSV", "CircStats", "ColorSchemes", "Colors", "CoordinateTransformations", "DataFrames", "Dates", "FFTW", "FileIO", "FiniteDifferences", "FixedPointNumbers", "GeometryBasics", "HDF5", "ImageContrastAdjustment", "ImageCore", "ImageFiltering", "IndirectArrays", "InteractiveUtils", "Interpolations", "JSON3", "LRUCache", "LinearAlgebra", "Makie", "MakieCore", "Missings", "Observables", "Pkg", "PrecompileTools", "Printf", "ProgressMeter", "QuadGK", "Rotations", "StaticArrays", "Statistics", "StatsBase", "ThinPlateSplines", "TiffImages", "UnicodePlots"] +deps = ["BSplineKit", "CSV", "ColorSchemes", "Colors", "CoordinateTransformations", "DataFrames", "Dates", "FFTW", "FileIO", "FixedPointNumbers", "GeometryBasics", "HDF5", "InteractiveUtils", "Interpolations", "JSON3", "LRUCache", "LinearAlgebra", "Makie", "Missings", "Observables", "Pkg", "PrecompileTools", "Printf", "ProgressMeter", "QuadGK", "Sockets", "StaticArrays", "Statistics", "StatsBase", "ThinPlateSplines", "TiffImages"] path = ".." uuid = "28a312d2-d9d3-46a7-98c1-9c09f12e8c99" version = "1.0.0-DEV" [[deps.SignedDistanceFields]] -deps = ["Random", "Statistics", "Test"] -git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" +deps = ["Statistics"] +git-tree-sha1 = "3949ad92e1c9d2ff0cd4a1317d5ecbba682f4b92" uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" -version = "0.4.0" +version = "0.4.1" [[deps.SimpleBufferStream]] git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" @@ -1665,15 +1557,15 @@ version = "1.2.0" [[deps.SimpleTraits]] deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +git-tree-sha1 = "be8eeac05ec97d379347584fa9fe2f5f76795bcb" uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.4" +version = "0.9.5" [[deps.Sixel]] deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] -git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" +git-tree-sha1 = "0494aed9501e7fb65daba895fb7fd57cc38bc743" uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" -version = "0.1.3" +version = "0.1.5" [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" @@ -1681,20 +1573,20 @@ version = "1.11.0" [[deps.SortingAlgorithms]] deps = ["DataStructures"] -git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +git-tree-sha1 = "64d974c2e6fdf07f8155b5b2ca2ffa9069b608d9" uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.2.1" +version = "1.2.2" [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.11.0" +version = "1.12.0" [[deps.SpecialFunctions]] deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "41852b8679f78c8d8961eeadc8f62cef861a52e3" +git-tree-sha1 = "2700b235561b0335d5bef7097a111dc513b8655e" uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.5.1" +version = "2.7.2" weakdeps = ["ChainRulesCore"] [deps.SpecialFunctions.extensions] @@ -1702,9 +1594,9 @@ weakdeps = ["ChainRulesCore"] [[deps.StableRNGs]] deps = ["Random"] -git-tree-sha1 = "95af145932c2ed859b63329952ce8d633719f091" +git-tree-sha1 = "4f96c596b8c8258cc7d3b19797854d368f243ddc" uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" -version = "1.0.3" +version = "1.0.4" [[deps.StackViews]] deps = ["OffsetArrays"] @@ -1713,27 +1605,16 @@ uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" version = "0.1.2" [[deps.Static]] -deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] -git-tree-sha1 = "f737d444cb0ad07e61b3c1bef8eb91203c321eff" +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools", "SciMLPublic"] +git-tree-sha1 = "49440414711eddc7227724ae6e570c7d5559a086" uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" -version = "1.2.0" - -[[deps.StaticArrayInterface]] -deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] -git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" -uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" -version = "1.8.0" -weakdeps = ["OffsetArrays", "StaticArrays"] - - [deps.StaticArrayInterface.extensions] - StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" - StaticArrayInterfaceStaticArraysExt = "StaticArrays" +version = "1.3.1" [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" +git-tree-sha1 = "246a8bb2e6667f832eea063c3a56aef96429a3db" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.13" +version = "1.9.18" weakdeps = ["ChainRulesCore", "Statistics"] [deps.StaticArrays.extensions] @@ -1741,9 +1622,9 @@ weakdeps = ["ChainRulesCore", "Statistics"] StaticArraysStatisticsExt = "Statistics" [[deps.StaticArraysCore]] -git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a" uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.3" +version = "1.4.4" [[deps.Statistics]] deps = ["LinearAlgebra"] @@ -1757,21 +1638,21 @@ weakdeps = ["SparseArrays"] [[deps.StatsAPI]] deps = ["LinearAlgebra"] -git-tree-sha1 = "9d72a13a3f4dd3795a195ac5a44d7d6ff5f552ff" +git-tree-sha1 = "178ed29fd5b2a2cfc3bd31c13375ae925623ff36" uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.7.1" +version = "1.8.0" [[deps.StatsBase]] -deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "b81c5035922cc89c2d9523afc6c54be512411466" +deps = ["AliasTables", "DataAPI", "DataStructures", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "aceda6f4e598d331548e04cc6b2124a6148138e3" uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.5" +version = "0.34.10" [[deps.StatsFuns]] deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "8e45cecc66f3b42633b8ce14d431e8e57a3e242e" +git-tree-sha1 = "91f091a8716a6bb38417a6e6f274602a19aaa685" uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "1.5.0" +version = "1.5.2" weakdeps = ["ChainRulesCore", "InverseFunctions"] [deps.StatsFuns.extensions] @@ -1780,15 +1661,15 @@ weakdeps = ["ChainRulesCore", "InverseFunctions"] [[deps.StringManipulation]] deps = ["PrecompileTools"] -git-tree-sha1 = "725421ae8e530ec29bcbdddbe91ff8053421d023" +git-tree-sha1 = "d05693d339e37d6ab134c5ab53c29fce5ee5d7d5" uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" -version = "0.4.1" +version = "0.4.4" [[deps.StructArrays]] deps = ["ConstructionBase", "DataAPI", "Tables"] -git-tree-sha1 = "9537ef82c42cdd8c5d443cbc359110cbb36bae10" +git-tree-sha1 = "ad8002667372439f2e3611cfd14097e03fa4bccd" uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" -version = "0.6.21" +version = "0.7.3" [deps.StructArrays.extensions] StructArraysAdaptExt = "Adapt" @@ -1811,6 +1692,22 @@ git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8" uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" version = "1.11.0" +[[deps.StructUtils]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "aab80fbf866600f3299dd7f6656d80e7be177cfe" +uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42" +version = "2.7.2" + + [deps.StructUtils.extensions] + StructUtilsMeasurementsExt = ["Measurements"] + StructUtilsStaticArraysCoreExt = ["StaticArraysCore"] + StructUtilsTablesExt = ["Tables"] + + [deps.StructUtils.weakdeps] + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + [[deps.StyledStrings]] uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" version = "1.11.0" @@ -1822,7 +1719,7 @@ uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" [[deps.SuiteSparse_jll]] deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.7.0+0" +version = "7.8.3+2" [[deps.TOML]] deps = ["Dates"] @@ -1859,11 +1756,11 @@ version = "1.11.0" [[deps.ThinPlateSplines]] deps = ["LinearAlgebra", "Test", "Tullio"] -git-tree-sha1 = "82fbbf52cf7ed71d9bb9336b1d308e34426c3714" +git-tree-sha1 = "d89e50bd102d3d0b63a65007f4c04fca488541b1" repo-rev = "mkitti-geometrybasics-ext" repo-url = "https://github.com/mkitti/ThinPlateSplines.jl.git" uuid = "1d861738-f48e-4029-b1d3-81ce6bc7f5ab" -version = "0.2.0" +version = "0.2.1" weakdeps = ["GeometryBasics"] [deps.ThinPlateSplines.extensions] @@ -1876,16 +1773,10 @@ uuid = "b189fb0b-2eb5-4ed4-bc0c-d34c51242431" version = "2.1.1" [[deps.TiffImages]] -deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "PrecompileTools", "ProgressMeter", "SIMD", "UUIDs"] -git-tree-sha1 = "02aca429c9885d1109e58f400c333521c13d48a0" +deps = ["CodecZstd", "ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "PrecompileTools", "ProgressMeter", "SIMD", "UUIDs"] +git-tree-sha1 = "9ca5f1f2d42f80df4b8c9f6ab5a64f438bbd9976" uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" -version = "0.11.4" - -[[deps.TiledIteration]] -deps = ["OffsetArrays", "StaticArrayInterface"] -git-tree-sha1 = "1176cc31e867217b06928e2f140c90bd1bc88283" -uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" -version = "0.5.0" +version = "0.11.9" [[deps.TranscodingStreams]] git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" @@ -1899,9 +1790,9 @@ version = "0.1.0" [[deps.Tullio]] deps = ["DiffRules", "LinearAlgebra", "Requires"] -git-tree-sha1 = "972698b132b9df8791ae74aa547268e977b55f68" +git-tree-sha1 = "de0febfe1243e89f352abd4ca0e9de6c8e6190c5" uuid = "bc48ee85-29a4-5162-ae0b-a64e1601d4bc" -version = "0.3.8" +version = "0.3.9" [deps.Tullio.extensions] TullioCUDAExt = "CUDA" @@ -1916,20 +1807,15 @@ version = "0.3.8" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" [[deps.URIs]] -git-tree-sha1 = "cbbebadbcc76c5ca1cc4b4f3b0614b3e603b5000" +git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a" uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.5.2" +version = "1.6.1" [[deps.UUIDs]] deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" version = "1.11.0" -[[deps.UnPack]] -git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" -uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" -version = "1.0.2" - [[deps.Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" version = "1.11.0" @@ -1940,63 +1826,40 @@ git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" version = "0.4.1" -[[deps.UnicodePlots]] -deps = ["ColorSchemes", "ColorTypes", "Contour", "Crayons", "Dates", "LinearAlgebra", "MarchingCubes", "NaNMath", "PrecompileTools", "Printf", "SparseArrays", "StaticArrays", "StatsBase"] -git-tree-sha1 = "24c0e2df19eb3f894d28a64e7486926f38de8a49" -uuid = "b8865327-cd53-5732-bb35-84acbb429228" -version = "3.7.2" - - [deps.UnicodePlots.extensions] - FreeTypeExt = ["FileIO", "FreeType"] - ImageInTerminalExt = "ImageInTerminal" - IntervalSetsExt = "IntervalSets" - TermExt = "Term" - UnitfulExt = "Unitful" - - [deps.UnicodePlots.weakdeps] - FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" - FreeType = "b38be410-82b0-50bf-ab77-7b57e271db43" - ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" - IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" - Term = "22787eb5-b846-44ae-b979-8e399b8463ab" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - [[deps.Unitful]] deps = ["Dates", "LinearAlgebra", "Random"] -git-tree-sha1 = "d2282232f8a4d71f79e85dc4dd45e5b12a6297fb" +git-tree-sha1 = "57e1b2c9de4bd6f40ecb9de4ac1797b81970d008" uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" -version = "1.23.1" -weakdeps = ["ConstructionBase", "ForwardDiff", "InverseFunctions", "Printf"] +version = "1.28.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.VideoIO]] deps = ["ColorTypes", "Dates", "Downloads", "FFMPEG", "FFMPEG_jll", "FileIO", "Glob", "ImageCore", "PrecompileTools", "Scratch"] -git-tree-sha1 = "4b1cbd724eda8ea7316a3379b0b36c5116d67ed9" +git-tree-sha1 = "875ead370b78ae92b8aeee906109d8010afa6909" uuid = "d6d074c3-1acf-5d4c-9a43-ef38773959a2" -version = "1.1.1" +version = "1.6.1" [[deps.WGLMakie]] deps = ["Bonito", "Colors", "FileIO", "FreeTypeAbstraction", "GeometryBasics", "Hyperscript", "LinearAlgebra", "Makie", "Observables", "PNGFiles", "PrecompileTools", "RelocatableFolders", "ShaderAbstractions", "StaticArrays"] -git-tree-sha1 = "676bd14390033825be847e138108a1c53701407d" +git-tree-sha1 = "dcf36e49ebbfe068cec38d413eca7c4839a1918f" uuid = "276b4fcb-3e11-5398-bf8b-a0c2d153d008" -version = "0.10.18" - -[[deps.Wayland_jll]] -deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "XML2_jll"] -git-tree-sha1 = "49be0be57db8f863a902d59c0083d73281ecae8e" -uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" -version = "1.23.1+0" - -[[deps.Wayland_protocols_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "54b8a029ac145ebe8299463447fd1590b2b1d92f" -uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" -version = "1.44.0+0" +version = "0.13.9" [[deps.WeakRefStrings]] deps = ["DataAPI", "InlineStrings", "Parsers"] @@ -2018,9 +1881,9 @@ version = "0.1.4" [[deps.WoodburyMatrices]] deps = ["LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" +git-tree-sha1 = "248a7031b3da79a127f14e5dc5f417e26f9f6db7" uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" -version = "1.0.0" +version = "1.1.0" [[deps.WorkerUtilities]] git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" @@ -2029,21 +1892,21 @@ version = "1.6.1" [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "b8b243e47228b4a3877f1dd6aee0c5d56db7fcf4" +git-tree-sha1 = "80d3930c6347cfce7ccf96bd3bafdf079d9c0390" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.13.6+1" +version = "2.13.9+0" [[deps.XZ_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "fee71455b0aaa3440dfdd54a9a36ccef829be7d4" +git-tree-sha1 = "b29c22e245d092b8b4e8d3c09ad7baa586d9f573" uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" -version = "5.8.1+0" +version = "5.8.3+0" [[deps.Xorg_libX11_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "b5899b25d17bf1889d25906fb9deed5da0c15b3b" +git-tree-sha1 = "808090ede1d41644447dd5cbafced4731c56bd2f" uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.8.12+0" +version = "1.8.13+0" [[deps.Xorg_libXau_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -2051,12 +1914,6 @@ git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" version = "1.0.13+0" -[[deps.Xorg_libXcursor_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "6c74ca84bbabc18c4547014765d194ff0b4dc9da" -uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" -version = "1.2.4+0" - [[deps.Xorg_libXdmcp_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" @@ -2065,33 +1922,15 @@ version = "1.1.6+0" [[deps.Xorg_libXext_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "a4c0ee07ad36bf8bbce1c3bb52d21fb1e0b987fb" +git-tree-sha1 = "1a4a26870bf1e5d26cd585e38038d399d7e65706" uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.7+0" +version = "1.3.8+0" [[deps.Xorg_libXfixes_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "9caba99d38404b285db8801d5c45ef4f4f425a6d" +git-tree-sha1 = "75e00946e43621e09d431d9b95818ee751e6b2ef" uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" -version = "6.0.1+0" - -[[deps.Xorg_libXi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] -git-tree-sha1 = "a376af5c7ae60d29825164db40787f15c80c7c54" -uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" -version = "1.8.3+0" - -[[deps.Xorg_libXinerama_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"] -git-tree-sha1 = "a5bc75478d323358a90dc36766f3c99ba7feb024" -uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" -version = "1.1.6+0" - -[[deps.Xorg_libXrandr_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "aff463c82a773cb86061bce8d53a0d976854923e" -uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" -version = "1.5.5+0" +version = "6.0.2+0" [[deps.Xorg_libXrender_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] @@ -2099,30 +1938,18 @@ git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" version = "0.9.12+0" +[[deps.Xorg_libpciaccess_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "4909eb8f1cbf6bd4b1c30dd18b2ead9019ef2fad" +uuid = "a65dc6b1-eb27-53a1-bb3e-dea574b5389e" +version = "0.18.1+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_libxkbfile_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "e3150c7400c41e207012b41659591f083f3ef795" -uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" -version = "1.1.3+0" - -[[deps.Xorg_xkbcomp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] -git-tree-sha1 = "801a858fc9fb90c11ffddee1801bb06a738bda9b" -uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" -version = "1.4.7+0" - -[[deps.Xorg_xkeyboard_config_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] -git-tree-sha1 = "00af7ebdc563c9217ecc67776d1bbf037dbcebf4" -uuid = "33bec58e-1273-512f-9401-5d533626f822" -version = "2.44.0+0" - [[deps.Xorg_xtrans_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" @@ -2132,7 +1959,7 @@ version = "1.6.0+0" [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.2.13+1" +version = "1.3.1+2" [[deps.Zstd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -2140,6 +1967,66 @@ git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" version = "1.5.7+1" +[[deps.aws_c_auth_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_cal_jll", "aws_c_http_jll", "aws_c_sdkutils_jll"] +git-tree-sha1 = "8cab83c96af80a1be968251ce1a0548a7545484d" +uuid = "2b3700d1-4306-52e2-a478-c162f0c514be" +version = "0.9.6+0" + +[[deps.aws_c_cal_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"] +git-tree-sha1 = "22c0f42f4a1f0dc5dcfa8fd267c4ac407c455e7a" +uuid = "70f11efc-bab2-57f1-b0f3-22aad4e67c4b" +version = "0.9.13+0" + +[[deps.aws_c_common_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a759cb9bf456ad792cc7898a81ae333cce9ef02a" +uuid = "73048d1d-b8c4-5092-a58d-866c5e8d1e50" +version = "0.12.6+0" + +[[deps.aws_c_compression_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"] +git-tree-sha1 = "7910c72f45f44afd297c39fe43b99c56d5ed22ec" +uuid = "73a04cd5-f3d7-5bac-9290-e8adb709f224" +version = "0.3.2+0" + +[[deps.aws_c_http_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_compression_jll", "aws_c_io_jll"] +git-tree-sha1 = "e358d5a001ef7afbd4f8c5225322512819cda2f2" +uuid = "3254fc65-9028-534d-aa9d-d76d128babc6" +version = "0.10.13+0" + +[[deps.aws_c_io_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_cal_jll", "aws_c_common_jll", "s2n_tls_jll"] +git-tree-sha1 = "7e481d474b2087ee8bbf55b81bf9119f21e396d9" +uuid = "13c41daa-f319-5298-b5eb-5754e0170d52" +version = "0.26.3+0" + +[[deps.aws_c_s3_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_auth_jll", "aws_c_common_jll", "aws_c_http_jll", "aws_checksums_jll", "s2n_tls_jll"] +git-tree-sha1 = "3e9917ab25114feba657e71be41cad068b9f6595" +uuid = "bd1f34fb-993f-5903-a121-aaf302eed6d4" +version = "0.11.5+0" + +[[deps.aws_c_sdkutils_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"] +git-tree-sha1 = "c43dfba2c1ab9ea9f02f2c80e86fa16f6460244e" +uuid = "1282aa60-004d-510b-9f52-12498d409daa" +version = "0.2.4+1" + +[[deps.aws_checksums_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"] +git-tree-sha1 = "2570c8e23f4771a087b12a47edcaaa670ac05a01" +uuid = "b2a88e68-78e7-5e94-8c20-c02986ec140e" +version = "0.2.10+0" + +[[deps.dlfcn_win32_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e141d67ffe550eadfb5af1bdbdaf138031e4805f" +uuid = "c4b69c83-5512-53e3-94e6-de98773c479f" +version = "1.4.2+0" + [[deps.isoband_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" @@ -2148,44 +2035,44 @@ version = "0.2.3+0" [[deps.libaec_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "f5733a5a9047722470b95a81e1b172383971105c" +git-tree-sha1 = "1411bc34c180946d3cef591de1384012afa6edee" uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0" -version = "1.1.3+0" +version = "1.1.6+0" [[deps.libaom_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "522c1df09d05a71785765d19c9524661234738e9" +git-tree-sha1 = "850b06095ee71f0135d644ffd8a52850699581ed" uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" -version = "3.11.0+0" +version = "3.13.3+0" [[deps.libass_jll]] deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +git-tree-sha1 = "125eedcb0a4a0bba65b657251ce1d27c8714e9d6" uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.15.2+0" +version = "0.17.4+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.11.0+0" +version = "5.15.0+0" -[[deps.libdecor_jll]] -deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] -git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" -uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" -version = "0.2.2+0" +[[deps.libdrm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libpciaccess_jll"] +git-tree-sha1 = "63aac0bcb0b582e11bad965cef4a689905456c03" +uuid = "8e53e030-5e6c-5a89-a30b-be5b7263a166" +version = "2.4.125+1" [[deps.libfdk_aac_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +git-tree-sha1 = "646634dd19587a56ee2f1199563ec056c5f228df" uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.3+0" +version = "2.0.4+0" [[deps.libpng_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "002748401f7b520273e2b506f61cab95d4701ccf" +git-tree-sha1 = "e51150d5ab85cee6fc36726850f0e627ad2e4aba" uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.48+0" +version = "1.6.58+0" [[deps.libsixel_jll]] deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"] @@ -2193,48 +2080,60 @@ git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a" uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" version = "1.10.5+0" +[[deps.libva_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll", "Xorg_libXfixes_jll", "libdrm_jll"] +git-tree-sha1 = "7dbf96baae3310fe2fa0df0ccbb3c6288d5816c9" +uuid = "9a156e7d-b971-5f62-b2c9-67348b8fb97c" +version = "2.23.0+0" + [[deps.libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] -git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll"] +git-tree-sha1 = "11e1772e7f3cc987e9d3de991dd4f6b2602663a5" uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.7+2" +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 = "d2408cac540942921e7bd77272c32e58c33d8a77" +git-tree-sha1 = "4e4282c4d846e11dce56d74fa8040130b7a95cb3" uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2" -version = "1.5.0+0" +version = "1.6.0+0" + +[[deps.mpif_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIABI_jll", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "TOML"] +git-tree-sha1 = "a8083ee0737c243c8f40a4ba86a0956997facb73" +uuid = "9aeb927a-4695-514f-a259-621a69f20ec0" +version = "0.1.7+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.59.0+0" +version = "1.64.0+1" [[deps.oneTBB_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "d5a767a3bb77135a99e433afe0eb14cd7f6914c3" +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "1350188a69a6e46f799d3945beef36435ed7262f" uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" -version = "2022.0.0+0" +version = "2022.0.0+1" [[deps.p7zip_jll]] -deps = ["Artifacts", "Libdl"] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.4.0+2" +version = "17.7.0+0" + +[[deps.s2n_tls_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6b99e06a3863de281da6ff0e193a5b3706349054" +uuid = "cddc5d3d-934d-5d3a-9747-62fc12ea3f48" +version = "1.7.2+0" [[deps.x264_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7" uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" -version = "2021.5.5+0" +version = "10164.0.1+0" [[deps.x265_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e7b67590c14d487e734dcb925924c5dc43ec85f3" uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "3.5.0+0" - -[[deps.xkbcommon_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] -git-tree-sha1 = "c950ae0a3577aec97bfccf3381f66666bc416729" -uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" -version = "1.8.1+0" +version = "4.1.0+0" diff --git a/web/Project.toml b/web/Project.toml index 2048813..6d67f27 100644 --- a/web/Project.toml +++ b/web/Project.toml @@ -3,12 +3,15 @@ Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" Bonito = "824d6782-a2ef-11e9-3a09-e5662e0c26f8" CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" ColorTypes = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" +DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" +HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" MbedTLS = "739be429-bea8-5141-9913-cc70e7f3736d" +Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" ShroffCelegansModels = "28a312d2-d9d3-46a7-98c1-9c09f12e8c99" ThinPlateSplines = "1d861738-f48e-4029-b1d3-81ce6bc7f5ab" +URIs = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" VideoIO = "d6d074c3-1acf-5d4c-9a43-ef38773959a2" WGLMakie = "276b4fcb-3e11-5398-bf8b-a0c2d153d008" diff --git a/web/scripts/save_modified_times.jl b/web/scripts/save_modified_times.jl new file mode 100644 index 0000000..5535b6e --- /dev/null +++ b/web/scripts/save_modified_times.jl @@ -0,0 +1,65 @@ +""" +Scans every dataset listed in the active config_path and records the mtime of +each Decon_reg_*/.../integrated_annotation/annotations.csv file. Used by the +OpenShift CronJob to track when integrated annotations were last edited. + +Writes two HDF5 files into the directory given by MODIFIED_TIMES_DIR +(default: /data/annotations/modified_times): + + - modified_times_YYYY_mm_dd_HHMMSS.h5 (timestamped snapshot, kept as history) + - modified_times.h5 (overwritten each run, "latest" pointer) +""" + +using Dates: now, format +using ShroffCelegansModels +using ShroffCelegansModels.JSON3 +using ShroffCelegansModels.MIPAVIO: get_modified_times_unix, save_modified_times_unix + +include(joinpath(@__DIR__, "..", "..", "src", "demo_averaging", "read_config_json.jl")) + +# Write `dst` atomically: invoke `f(tmp_path)` to produce the file, then `mv` it +# into place. POSIX rename() is atomic on the same filesystem, so readers always +# see either the previous version or the new one — never a partial write. +function write_atomic(f, dst::AbstractString) + tmp = string(dst, ".tmp.", getpid(), ".", time_ns()) + try + f(tmp) + mv(tmp, dst; force=true) + catch + isfile(tmp) && rm(tmp; force=true) + rethrow() + end +end + +function main() + output_dir = get(ENV, "MODIFIED_TIMES_DIR", "/data/annotations/modified_times") + mkpath(output_dir) + + config_path = ShroffCelegansModels.config_path + @info "Loading datasets from config" config_path + _, _, datasets = read_config_json(config_path) + @info "Loaded datasets" groups=length(datasets) total=sum(length, values(datasets)) + + @info "Scanning integrated_annotation mtimes" + modified_times = get_modified_times_unix(datasets) + + timestamp = format(now(), "yyyy_mm_dd_HHMMSS") + snapshot_path = joinpath(output_dir, "modified_times_$(timestamp).h5") + latest_path = joinpath(output_dir, "modified_times.h5") + + @info "Writing snapshot" snapshot_path + write_atomic(snapshot_path) do tmp + save_modified_times_unix(datasets, modified_times; filepath=tmp) + end + + @info "Updating latest" latest_path + write_atomic(latest_path) do tmp + save_modified_times_unix(datasets, modified_times; filepath=tmp) + end + + @info "Done" +end + +if abspath(PROGRAM_FILE) == @__FILE__ + main() +end diff --git a/web/scripts/web_debug_annotation_ap_axis.jl b/web/scripts/web_debug_annotation_ap_axis.jl index f531c0b..3c540bf 100644 --- a/web/scripts/web_debug_annotation_ap_axis.jl +++ b/web/scripts/web_debug_annotation_ap_axis.jl @@ -1,6 +1,6 @@ using WGLMakie using Bonito - +using Sockets if abspath(PROGRAM_FILE) == @__FILE__ global run_web_main::Bool = true @@ -21,9 +21,10 @@ function web_debug_annotation_ap_axis(datasets = datasets) end ) ) + shroff_data_ip = "0.0.0.0" server = Server( - "shroff-data.int.janelia.org", 9180; - proxy_url="https://shroff-data.int.janelia.org/debug_annotation_ap_axis/" + shroff_data_ip, 9180; + proxy_url="https://$(get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"))/debug_annotation_ap_axis/" ) route!(server, "/" => App(menu)) for k in keys(datasets) diff --git a/web/scripts/web_debug_annotation_ap_axis_live.jl b/web/scripts/web_debug_annotation_ap_axis_live.jl index 19a0eb2..44a6a5a 100644 --- a/web/scripts/web_debug_annotation_ap_axis_live.jl +++ b/web/scripts/web_debug_annotation_ap_axis_live.jl @@ -1,5 +1,6 @@ using WGLMakie using Bonito +using Sockets if abspath(PROGRAM_FILE) == @__FILE__ @@ -21,9 +22,10 @@ function web_debug_annotation_ap_axis(datasets = datasets) end ) ) + shroff_data_ip = "0.0.0.0" server = Server( - "shroff-data.int.janelia.org", 9181; - proxy_url="https://shroff-data.int.janelia.org/debug_annotation_ap_axis_live/" + shroff_data_ip, 9181; + proxy_url="https://$(get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"))/debug_annotation_ap_axis_live/" ) route!(server, "/" => App(menu)) for k in keys(datasets) diff --git a/web/scripts/web_debug_annotation_ap_axis_retrack_live.jl b/web/scripts/web_debug_annotation_ap_axis_retrack_live.jl index 048aae1..a5da6d8 100644 --- a/web/scripts/web_debug_annotation_ap_axis_retrack_live.jl +++ b/web/scripts/web_debug_annotation_ap_axis_retrack_live.jl @@ -1,6 +1,7 @@ using Revise using WGLMakie using Bonito +using Sockets if abspath(PROGRAM_FILE) == @__FILE__ @@ -65,9 +66,10 @@ function web_debug_annotation_ap_axis(datasets = retracked_datasets) end ) ) + shroff_data_ip = "0.0.0.0" server = Server( - "shroff-data.int.janelia.org", 9281; - proxy_url="https://shroff-data.int.janelia.org/debug_annotation_ap_axis_retrack_live/" + shroff_data_ip, 9281; + proxy_url="https://$(get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"))/debug_annotation_ap_axis_retrack_live/" ) route!(server, "/" => App(menu)) for k in keys(datasets) diff --git a/web/scripts/web_fix_annotation_ap_axis.jl b/web/scripts/web_fix_annotation_ap_axis.jl index 3a329ad..d2a0023 100644 --- a/web/scripts/web_fix_annotation_ap_axis.jl +++ b/web/scripts/web_fix_annotation_ap_axis.jl @@ -1,6 +1,8 @@ using WGLMakie using Bonito - +using Revise +using HTTP +using URIs if abspath(PROGRAM_FILE) == @__FILE__ global run_web_main::Bool = true @@ -22,15 +24,25 @@ function web_debug_annotation_ap_axis(datasets = datasets) ) ) server = Server( - "shroff-data.int.janelia.org", 9381; - proxy_url="https://shroff-data.int.janelia.org/fix_annotation_ap_axis/" + "0.0.0.0", 9381; + proxy_url="https://$(get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"))/fix_annotation_ap_axis/" ) route!(server, "/" => App(menu)) for k in keys(datasets) for i in keys(datasets[k]) - route!(server, "/$k/$i" => App(; title="$k[$i]: Shroff C. elegans fix annotation AP axis") do + @info "Creating routing /$k/$i for dataset $(datasets[k][i].path)" + route!(server, "/$k/$i" => App(; title="$k[$i]: Shroff C. elegans fix annotation AP axis") do session::Bonito.Session, request::HTTP.Request empty!(annotations_cache) - return fix_annotation_ap_axis(avg_models, datasets[k][i]; use_myuntwist=true); + params = HTTP.URIs.queryparams(URI(request.target).query) + listener = (a,v) -> evaljs(session, js"history.replaceState(null, \"\", \"?annotation=\" + $a + \"&timepoint=$v\");") + return fix_annotation_ap_axis( + avg_models, + datasets[k][i]; + use_myuntwist=true, + initial_timepoint=parse(Int64, get(params, "timepoint", "0")), + initial_annotation=get(params, "annotation", nothing), + annotation_timepoint_listener=listener + ); end) end end diff --git a/web/scripts/web_meshscatter_all.jl b/web/scripts/web_meshscatter_all.jl index e0e7ddd..95ed906 100644 --- a/web/scripts/web_meshscatter_all.jl +++ b/web/scripts/web_meshscatter_all.jl @@ -8,8 +8,8 @@ function meshscatter_all_webapp() app = App(; title="Shroff Lab: C. elegans meshscatter_all") do return with_theme(meshscatter_all, theme_black()) end - server = Server(app, "shroff-data.int.janelia.org", 8082; - proxy_url="https://shroff-data.int.janelia.org/meshscatter_all/" + server = Server(app, "0.0.0.0", 8082; + proxy_url="https://$(get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"))/meshscatter_all/" ) return server end diff --git a/web/scripts/web_meshscatter_average.jl b/web/scripts/web_meshscatter_average.jl index 4fb1e06..d09640e 100644 --- a/web/scripts/web_meshscatter_average.jl +++ b/web/scripts/web_meshscatter_average.jl @@ -24,8 +24,8 @@ function meshscatter_average_webapp() black_body(meshscatter_average(average_annotation_dict; nerve_ring=true)) end end - server = Server(app, "shroff-data.int.janelia.org", 8380; - proxy_url="https://shroff-data.int.janelia.org/meshscatter_average/" + server = Server(app, "0.0.0.0", 8380; + proxy_url="https://$(get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"))/meshscatter_average/" ) route!(server, "/nerve_ring" => nerve_ring_app) return server diff --git a/web/scripts/web_meshscatter_average_dev.jl b/web/scripts/web_meshscatter_average_dev.jl index 027a18e..22619f9 100644 --- a/web/scripts/web_meshscatter_average_dev.jl +++ b/web/scripts/web_meshscatter_average_dev.jl @@ -1,6 +1,7 @@ using WGLMakie using Bonito using ShroffCelegansModels +using Sockets #push!(LOAD_PATH, "/groups/scicompsoft/home/kittisopikulm/src/ShroffCelegansModels.jl") push!(LOAD_PATH, dirname(dirname(pathof(ShroffCelegansModels)))) @@ -24,8 +25,10 @@ function meshscatter_average_webapp() black_body(meshscatter_average(average_annotation_dict; nerve_ring=true)) end end - server = Server(app, "shroff-data.int.janelia.org", 8480; - proxy_url="https://shroff-data.int.janelia.org/meshscatter_average_dev/" + + shroff_data_ip = "0.0.0.0", + server = Server(app, shroff_data_ip, 8480; + proxy_url="https://$(get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"))/meshscatter_average_dev/" ) route!(server, "/nerve_ring" => nerve_ring_app) return server diff --git a/web/scripts/web_meshscatter_average_edited.jl b/web/scripts/web_meshscatter_average_edited.jl index 115f5ee..bbb0ad9 100644 --- a/web/scripts/web_meshscatter_average_edited.jl +++ b/web/scripts/web_meshscatter_average_edited.jl @@ -1,6 +1,7 @@ using WGLMakie using Bonito using ShroffCelegansModels +using Sockets #push!(LOAD_PATH, "/groups/scicompsoft/home/kittisopikulm/src/ShroffCelegansModels.jl") push!(LOAD_PATH, dirname(dirname(pathof(ShroffCelegansModels)))) @@ -24,8 +25,9 @@ function meshscatter_average_webapp() black_body(meshscatter_average(average_annotation_dict; nerve_ring=true)) end end - server = Server(app, "shroff-data.int.janelia.org", 8580; - proxy_url="https://shroff-data.int.janelia.org/meshscatter_average_edited/" + shroff_data_ip = "0.0.0.0" + server = Server(app, shroff_data_ip, 8580; + proxy_url="https://$(get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"))/meshscatter_average_edited/" ) route!(server, "/nerve_ring" => nerve_ring_app) return server diff --git a/web/scripts/web_meshscatter_average_edited_2024_10_24.jl b/web/scripts/web_meshscatter_average_edited_2024_10_24.jl index d47e7ac..570502d 100644 --- a/web/scripts/web_meshscatter_average_edited_2024_10_24.jl +++ b/web/scripts/web_meshscatter_average_edited_2024_10_24.jl @@ -1,6 +1,7 @@ using WGLMakie using Bonito using ShroffCelegansModels +using Sockets #push!(LOAD_PATH, "/groups/scicompsoft/home/kittisopikulm/src/ShroffCelegansModels.jl") push!(LOAD_PATH, dirname(dirname(pathof(ShroffCelegansModels)))) @@ -24,8 +25,9 @@ function meshscatter_average_webapp() black_body(meshscatter_average(average_annotation_dict; nerve_ring=true)) end end - server = Server(app, "shroff-data.int.janelia.org", 8590; - proxy_url="https://shroff-data.int.janelia.org/meshscatter_average_edited_2024_10_24/" + shroff_data_ip = "0.0.0.0" + server = Server(app, shroff_data_ip, 8590; + proxy_url="https://$(get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"))/meshscatter_average_edited_2024_10_24/" ) route!(server, "/nerve_ring" => nerve_ring_app) return server diff --git a/web/scripts/web_modified_times.jl b/web/scripts/web_modified_times.jl new file mode 100644 index 0000000..b772870 --- /dev/null +++ b/web/scripts/web_modified_times.jl @@ -0,0 +1,160 @@ +using Bonito +using HDF5: h5open, attrs +using Dates: unix2datetime, format as date_format + +const PORT = 9400 + +modified_times_path() = joinpath( + get(ENV, "MODIFIED_TIMES_DIR", "/data/annotations/modified_times"), + "modified_times.h5", +) + +struct DatasetEntry + index::Int + path::String + cell_key_name::String + start::Int + stop::Int + outliers::Vector{Int} + mtimes::Vector{Float64} +end + +function read_modified_times(path::AbstractString) + h5open(path, "r") do f + groups = Dict{String, Vector{DatasetEntry}}() + for group_name in keys(f) + g = f[group_name] + indices = sort(parse.(Int, collect(keys(g)))) + entries = map(indices) do i + ds = g[string(i)] + A = attrs(ds) + DatasetEntry( + i, + string(A["path"]), + string(A["cell_key.name"]), + Int(A["cell_key.start"]), + Int(A["cell_key.end"]), + Int.(A["cell_key.outliers"]), + Float64.(read(ds)), + ) + end + groups[group_name] = entries + end + return groups + end +end + +format_unix(u::Real) = isnan(u) ? "" : date_format(unix2datetime(u), "yyyy-mm-dd HH:MM:SS") + +dataset_max(d::DatasetEntry) = (v = filter(!isnan, d.mtimes); isempty(v) ? -Inf : maximum(v)) + +function last_modified(mtimes::Vector{Float64}) + valid = filter(!isnan, mtimes) + isempty(valid) ? "n/a" : format_unix(maximum(valid)) +end + +# Indices whose value equals the (finite) maximum of `xs`. Empty if all NaN. +function argmax_finite(xs::Vector{Float64}) + valid = filter(!isnan, xs) + isempty(valid) && return Int[] + m = maximum(valid) + return findall(x -> !isnan(x) && x == m, xs) +end + +const HIGHLIGHT_STYLE = "background:#fffbcc;font-weight:bold" + +function render_groups(groups::Dict{String, Vector{DatasetEntry}}, source_mtime::Float64) + DOM.div( + DOM.h2("Integrated annotation modified times"), + DOM.p( + "Source: ", DOM.code(modified_times_path()), + " (file mtime: ", format_unix(source_mtime), ")", + ), + let + sorted_names = sort(collect(keys(groups))) + group_maxes = Dict(name => let + ms = dataset_max.(groups[name]) + isempty(ms) ? -Inf : maximum(ms) + end for name in sorted_names) + global_max = isempty(group_maxes) ? -Inf : maximum(values(group_maxes)) + map(sorted_names) do group_name + datasets = groups[group_name] + ds_maxes = dataset_max.(datasets) + group_max = group_maxes[group_name] + hot_datasets = Set(findall(==(group_max), ds_maxes)) + group_last = group_max == -Inf ? "n/a" : format_unix(group_max) + group_summary_style = group_max == global_max ? HIGHLIGHT_STYLE : "" + DOM.details( + DOM.summary( + DOM.strong(group_name), + " — ", string(length(datasets)), " datasets", + " — last modified: ", group_last, + ; style=group_summary_style, + ), + DOM.ul(map(enumerate(datasets)) do (ds_i, d) + hot_tps = Set(argmax_finite(d.mtimes)) + dataset_summary_style = ds_i in hot_datasets ? HIGHLIGHT_STYLE : "" + DOM.li(DOM.details( + DOM.summary( + "[", string(d.index), "] ", + DOM.code(d.cell_key_name), + " — last modified: ", last_modified(d.mtimes), + ; style=dataset_summary_style, + ), + DOM.div("path: ", DOM.code(d.path)), + DOM.div( + "timepoints: ", string(d.start), "–", string(d.stop), + ", outliers: ", isempty(d.outliers) ? "none" : join(d.outliers, ", "), + ), + DOM.ul(map(eachindex(d.mtimes)) do i + tp = d.start + i - 1 + u = d.mtimes[i] + label = if isnan(u) + tp in d.outliers ? "outlier" : "missing" + else + format_unix(u) + end + tp_style = i in hot_tps ? HIGHLIGHT_STYLE : "" + DOM.li("t=", string(tp), ": ", label; style=tp_style) + end), + )) + end), + ) + end + end, + ) +end + +function render_missing(path::AbstractString) + DOM.div( + DOM.h2("Integrated annotation modified times"), + DOM.p("No data yet. Expected ", DOM.code(path), " but it does not exist."), + DOM.p("This file is generated by the save-modified-times CronJob."), + ) +end + +function web_modified_times() + server = Server( + "0.0.0.0", PORT; + proxy_url="https://$(get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"))/modified_times/", + ) + route!(server, "/" => App(; title="Shroff C. elegans modified times") do + path = modified_times_path() + if !isfile(path) + return render_missing(path) + end + groups = read_modified_times(path) + return render_groups(groups, Float64(mtime(path))) + end) + return server +end + +function web_main() + server = web_modified_times() + @info "Listening" port=PORT + return server +end + +if abspath(PROGRAM_FILE) == @__FILE__ + wait(web_main()) +end diff --git a/web/scripts/web_show_average_annotations.jl b/web/scripts/web_show_average_annotations.jl index 01db435..12d8180 100644 --- a/web/scripts/web_show_average_annotations.jl +++ b/web/scripts/web_show_average_annotations.jl @@ -1,5 +1,6 @@ using WGLMakie using Bonito +using Revise if abspath(PROGRAM_FILE) == @__FILE__ @@ -7,6 +8,7 @@ if abspath(PROGRAM_FILE) == @__FILE__ end includet("../../scripts/launch_show_average_annotations.jl") +#includet("../../src/demo_averaging/show_average_annotations.jl") function web_show_average_annotations(datasets = datasets) menu = DOM.div( @@ -16,14 +18,17 @@ function web_show_average_annotations(datasets = datasets) end ) ) + shroff_data_ip = "0.0.0.0" server = Server( - "shroff-data.int.janelia.org", 8180; - proxy_url="https://shroff-data.int.janelia.org/show_average_annotations/" + shroff_data_ip, 8180; + proxy_url="https://$(get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"))/show_average_annotations/" ) route!(server, "/" => App(menu)) for k in keys(datasets) route!(server, "/$k" => App(; title="$k: Shroff C. elegans show average annotations") do return show_average_annotations(avg_models, datasets[k]; use_myuntwist=true); + #Revise.retry() + #return @invokelatest show_average_annotations(avg_models, datasets[k]; use_myuntwist=true); end) end return server diff --git a/web/scripts/web_zscore_analysis.jl b/web/scripts/web_zscore_analysis.jl new file mode 100644 index 0000000..c8e5530 --- /dev/null +++ b/web/scripts/web_zscore_analysis.jl @@ -0,0 +1,45 @@ +using WGLMakie +using Bonito +using Sockets + + +if abspath(PROGRAM_FILE) == @__FILE__ + global run_web_main::Bool = true +end + +include("../../scripts/launch_show_average_annotations.jl") +include("../../src/demo_averaging/zscore_analysis.jl") + +function web_zscore_analysis(datasets = datasets) + @info "Loading annotation changes" + annotation_changes = ShroffCelegansModels.load_annotation_changes_cache() + ShroffCelegansModels.update_annotations_cache(ShroffCelegansModels.annotations_cache, annotation_changes); + @info "Loaded annotation changes" + shroff_data_ip = "0.0.0.0" + server = Server( + shroff_data_ip, 9300; + proxy_url="https://$(get(ENV, "SHROFF_HOST", "shroff-data.int.janelia.org"))/zscore_analysis/" + ) + route!(server, "/" => App(; title="Shroff C. elegans z-score analysis") do + df = raw_zscore_analysis(datasets; threshold=-Inf) + sort!(df, :zscore, rev=true) + select!(df, :, :link => ByRow(x->DOM.a(x; href=x)) => :link) + table = Bonito.Table(df) + return table + end) + return server +end + +function web_main() + WGLMakie.activate!(; resize_to = :body) + server = web_zscore_analysis() +end + +println(@__FILE__) +println(abspath(PROGRAM_FILE)) + +if run_web_main + wait(web_main()) + println("Press enter to quit") + readline() +end diff --git a/web/static/index.html b/web/static/index.html index 45eb7fe..41ad2e7 100644 --- a/web/static/index.html +++ b/web/static/index.html @@ -10,6 +10,8 @@

Internal Shroff Data

  • Debug Annotation AP Axis (Live untwisting!)
  • Debug Annotation AP Axis Retrack (Live untwisting!)
  • Fix Annotation AP Axis
  • +
  • Z-Score Analysis
  • +
  • Annotation Modified Times
  • Mesh Scatter