From 8fa92dc0e52f5f200e21475da6d362eb25856a64 Mon Sep 17 00:00:00 2001 From: Pixelguy14 Date: Mon, 17 Nov 2025 13:31:37 -0600 Subject: [PATCH] improved preprocessing UI, added selective spectrum plot accordig to type (centroid, profile), potentially fixed a bug to retrieve folders on dropdown selectors in startup, improved preprocessing functions and test suite, testing a version control for preprocessing steps --- Manifest.toml | 97 +++- Project.toml | 7 +- app.jl | 33 +- app.jl.html | 392 ++++++++++---- julia_imzML_visual.jl | 6 +- mask.jl | 18 + mask.jl.html | 2 +- public/css/genieapp.css | 33 +- src/BloomFilters.jl | 64 ++- src/MSIData.jl | 6 + src/MSI_src.jl | 4 + src/Preprocessing.jl | 927 ++++++++++++++++----------------- src/PreprocessingVersioning.jl | 446 ++++++++++++++++ test/readme.md | 4 +- test/run_preprocessing.jl | 735 ++++++++++++-------------- 15 files changed, 1758 insertions(+), 1016 deletions(-) create mode 100644 src/PreprocessingVersioning.jl diff --git a/Manifest.toml b/Manifest.toml index 62323b8..c6e5873 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -2,7 +2,12 @@ julia_version = "1.11.7" manifest_format = "2.0" -project_hash = "38f13d997585a9af185f1863ff626d584a7e791e" +project_hash = "7843f141174fe17a3abc4f25c3819d3195459b5a" + +[[deps.ANSIColoredPrinters]] +git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c" +uuid = "a4c015fc-c6ff-483c-b24f-f7ea428134e9" +version = "0.0.1" [[deps.ATK_jll]] deps = ["Artifacts", "Glib_jll", "JLLWrappers", "Libdl"] @@ -159,6 +164,11 @@ git-tree-sha1 = "bca794632b8a9bbe159d56bf9e31c422671b35e0" uuid = "18cc8868-cbac-4acf-b575-c8ff214dc66f" version = "1.3.2" +[[deps.Bessels]] +git-tree-sha1 = "4435559dc39793d53a9e3d278e185e920b4619ef" +uuid = "0e736298-9ec6-45e8-9647-e4fc86a2fe38" +version = "0.2.8" + [[deps.BitFlags]] git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" @@ -289,6 +299,12 @@ git-tree-sha1 = "980f01d6d3283b3dbdfd7ed89405f96b7256ad57" uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" version = "2.0.1" +[[deps.CodecBase]] +deps = ["TranscodingStreams"] +git-tree-sha1 = "40956acdbef3d8c7cc38cba42b56034af8f8581a" +uuid = "6c391c72-fb7b-5838-ba82-7cfb1bcfecbf" +version = "0.3.4" + [[deps.CodecZlib]] deps = ["TranscodingStreams", "Zlib_jll"] git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" @@ -397,6 +413,12 @@ weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] ConstructionBaseLinearAlgebraExt = "LinearAlgebra" ConstructionBaseStaticArraysExt = "StaticArrays" +[[deps.ContinuousWavelets]] +deps = ["AbstractFFTs", "Documenter", "FFTW", "Interpolations", "LinearAlgebra", "SpecialFunctions", "Wavelets"] +git-tree-sha1 = "6e883d34f7040ab2ec36c60c738ae53864819508" +uuid = "96eb917e-2868-4417-9cb6-27e7ff17528f" +version = "1.1.7" + [[deps.Contour]] git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" @@ -434,6 +456,16 @@ git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a" uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" version = "1.0.2" +[[deps.DSP]] +deps = ["Bessels", "FFTW", "IterTools", "LinearAlgebra", "Polynomials", "Random", "Reexport", "SpecialFunctions", "Statistics"] +git-tree-sha1 = "5989debfc3b38f736e69724818210c67ffee4352" +uuid = "717857b8-e6f2-59f4-9121-6e50c889abd2" +version = "0.8.4" +weakdeps = ["OffsetArrays"] + + [deps.DSP.extensions] + OffsetArraysExt = "OffsetArrays" + [[deps.DataAPI]] git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" @@ -516,6 +548,12 @@ git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" version = "0.9.5" +[[deps.Documenter]] +deps = ["ANSIColoredPrinters", "AbstractTrees", "Base64", "CodecZlib", "Dates", "DocStringExtensions", "Downloads", "Git", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "MarkdownAST", "Pkg", "PrecompileTools", "REPL", "RegistryInstances", "SHA", "TOML", "Test", "Unicode"] +git-tree-sha1 = "352b9a04e74edd16429aec79f033620cf8e780d4" +uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +version = "1.15.0" + [[deps.DotEnv]] deps = ["PrecompileTools"] git-tree-sha1 = "92e88cb68a5b10545234f46dfaeb2fa8a8a50c45" @@ -651,12 +689,6 @@ git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" version = "0.8.5" -[[deps.FlameGraphs]] -deps = ["AbstractTrees", "Colors", "FileIO", "FixedPointNumbers", "IndirectArrays", "LeftChildRightSiblingTrees", "Profile"] -git-tree-sha1 = "0166baf81babb91cf78bfcc771d8e87c43d568df" -uuid = "08572546-2f56-4bcf-ba4e-bab62c3a3f89" -version = "1.1.0" - [[deps.Fontconfig_jll]] deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] git-tree-sha1 = "f85dac9a96a01087df6e3a749840015a0ca3817d" @@ -804,6 +836,24 @@ git-tree-sha1 = "6570366d757b50fabae9f4315ad74d2e40c0560a" uuid = "59f7168a-df46-5410-90c8-f2779963d0ec" version = "5.2.3+0" +[[deps.Git]] +deps = ["Git_LFS_jll", "Git_jll", "JLLWrappers", "OpenSSH_jll"] +git-tree-sha1 = "824a1890086880696fc908fe12a17bcf61738bd8" +uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2" +version = "1.5.0" + +[[deps.Git_LFS_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "bb8471f313ed941f299aa53d32a94ab3bee08844" +uuid = "020c3dae-16b3-5ae5-87b3-4cb189e250b2" +version = "3.7.0+0" + +[[deps.Git_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "b6a684587ebe896d9f68ae777f648205940f0f70" +uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb" +version = "2.51.3+0" + [[deps.Glib_jll]] deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] git-tree-sha1 = "50c11ffab2a3d50192a228c313f05b5b5dc5acb2" @@ -885,6 +935,12 @@ git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" version = "0.3.28" +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.5" + [[deps.IfElse]] git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" @@ -1236,6 +1292,11 @@ git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" uuid = "10f19ff3-798f-405d-979b-55457f8fc047" version = "0.1.17" +[[deps.LazilyInitializedFields]] +git-tree-sha1 = "0f2da712350b020bc3957f269c9caad516383ee0" +uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" +version = "1.3.0" + [[deps.LazyArtifacts]] deps = ["Artifacts", "Pkg"] uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" @@ -1436,6 +1497,12 @@ deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" version = "1.11.0" +[[deps.MarkdownAST]] +deps = ["AbstractTrees", "Markdown"] +git-tree-sha1 = "465a70f0fc7d443a00dcdc3267a497397b8a3899" +uuid = "d0879d2d-cac2-40c8-9cee-1863dc0c7391" +version = "0.1.2" + [[deps.MathTeXEngine]] deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] git-tree-sha1 = "a370fef694c109e1950836176ed0d5eabbb65479" @@ -1785,10 +1852,6 @@ deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" version = "1.11.0" -[[deps.Profile]] -uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" -version = "1.11.0" - [[deps.ProgressMeter]] deps = ["Distributed", "Printf"] git-tree-sha1 = "fbb92c6c56b34e1a2c4c36058f68f332bec840e7" @@ -1872,6 +1935,12 @@ git-tree-sha1 = "4618ed0da7a251c7f92e869ae1a19c74a7d2a7f9" uuid = "dee08c22-ab7f-5625-9660-a9af2021b33f" version = "0.3.2" +[[deps.RegistryInstances]] +deps = ["LazilyInitializedFields", "Pkg", "TOML", "Tar"] +git-tree-sha1 = "ffd19052caf598b8653b99404058fce14828be51" +uuid = "2792f1a3-b283-48e8-9a74-f99dce5104f3" +version = "0.1.0" + [[deps.RelocatableFolders]] deps = ["SHA", "Scratch"] git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" @@ -2373,6 +2442,12 @@ git-tree-sha1 = "d1d9a935a26c475ebffd54e9c7ad11627c43ea85" uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" version = "0.21.72" +[[deps.Wavelets]] +deps = ["DSP", "FFTW", "LinearAlgebra", "Reexport", "SpecialFunctions", "Statistics"] +git-tree-sha1 = "d0ec97a100abbe47a5e9a02361841da49cce6029" +uuid = "29a6e085-ba6d-5f35-a997-948ac2efa89a" +version = "0.10.1" + [[deps.Wayland_jll]] deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll"] git-tree-sha1 = "96478df35bbc2f3e1e791bc7a3d0eeee559e60e9" diff --git a/Project.toml b/Project.toml index 242e031..d21383f 100644 --- a/Project.toml +++ b/Project.toml @@ -7,12 +7,13 @@ Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" +CodecBase = "6c391c72-fb7b-5838-ba82-7cfb1bcfecbf" ColorSchemes = "35d6a980-a343-548e-a6ea-1d62b119f2f4" Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" +ContinuousWavelets = "96eb917e-2868-4417-9cb6-27e7ff17528f" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -FlameGraphs = "08572546-2f56-4bcf-ba4e-bab62c3a3f89" GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" Genie = "c43c736e-a2d1-11e8-161f-af95117fbd1e" GenieFramework = "a59fdf5c-6bf0-4f5d-949c-a137c9e2f353" @@ -25,6 +26,8 @@ ImageFiltering = "6a3955dd-da59-5b1f-98d4-e7296123deb5" ImageMorphology = "787d08f9-d448-5407-9aad-5290dd7ab264" ImageSegmentation = "80713f31-8817-5129-9cf8-209ff8fb23e1" Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" +Interpolations = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" Libz = "2ec943e9-cfe8-584d-b93d-64dcb6d567b7" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" @@ -47,7 +50,7 @@ Accessors = "0.1" Base64 = "1.11" CSV = "0.10" CairoMakie = "0.13" -ColorSchemes = "3.31" +ColorSchemes = "3.30" Colors = "0.12" DataFrames = "1.7" Dates = "1.11" diff --git a/app.jl b/app.jl index 5e4a5ef..8dd47c6 100644 --- a/app.jl +++ b/app.jl @@ -213,6 +213,7 @@ end # == Batch Processing & Registry Variables == @private registry_init_done = false + @in refetch_folders = false @in selected_files = String[] @in available_folders = String[] @in image_available_folders = String[] @@ -1919,6 +1920,37 @@ end end end + @onbutton refetch_folders begin + # Re-load registry and update folder lists + registry = load_registry(registry_path) + all_folders = sort(collect(keys(registry)), lt=natural) + img_folders = filter(folder -> get(get(registry, folder, Dict()), "is_imzML", false), all_folders) + + available_folders = deepcopy(all_folders) + image_available_folders = deepcopy(img_folders) + + # For q-selects using image_available_folders + if !isempty(image_available_folders) + first_img_folder = first(image_available_folders) + if isempty(selected_folder_main) + selected_folder_main = first_img_folder + end + if isempty(selected_folder_compare_left) + selected_folder_compare_left = first_img_folder + end + if isempty(selected_folder_compare_right) + selected_folder_compare_right = first_img_folder + end + end + + # For q-selects using available_folders + if !isempty(available_folders) + if isempty(selected_folder_metadata) + selected_folder_metadata = first(available_folders) + end + end + end + @mounted watchplots() @onchange isready @time begin @@ -1967,7 +1999,6 @@ end image_available_folders = deepcopy(img_folders) println("UI lists updated. All: $(length(available_folders)), Images: $(length(image_available_folders))") - catch e @warn "Registry synchronization failed: $e" available_folders = [] diff --git a/app.jl.html b/app.jl.html index 1aea080..47a3673 100644 --- a/app.jl.html +++ b/app.jl.html @@ -19,7 +19,7 @@
imzML & mzML Data Pre-Treatment