diff --git a/Manifest.toml b/Manifest.toml new file mode 100644 index 0000000..16612e9 --- /dev/null +++ b/Manifest.toml @@ -0,0 +1,1345 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.9.3" +manifest_format = "2.0" +project_hash = "db002c11d9b9a342879677dd14736bf0e59bb8f8" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown", "Test"] +git-tree-sha1 = "c0d491ef0b135fd7d63cbc6404286bc633329425" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.36" + + [deps.Accessors.extensions] + AccessorsAxisKeysExt = "AxisKeys" + AccessorsIntervalSetsExt = "IntervalSets" + AccessorsStaticArraysExt = "StaticArrays" + AccessorsStructArraysExt = "StructArrays" + AccessorsUnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + Requires = "ae029012-a4dd-5104-9daa-d747884805df" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "cde29ddf7e5726c9fb511f340244ea3481267608" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.7.2" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.AssetRegistry]] +deps = ["Distributed", "JSON", "Pidfile", "SHA", "Test"] +git-tree-sha1 = "b25e88db7944f98789130d7b503276bc34bc098e" +uuid = "bf4720bc-e11a-5d0c-854e-bdca1663c893" +version = "0.1.0" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.0.1" + +[[deps.AxisArrays]] +deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] +git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" +uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" +version = "0.4.7" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.Bessels]] +git-tree-sha1 = "4435559dc39793d53a9e3d278e185e920b4619ef" +uuid = "0e736298-9ec6-45e8-9647-e4fc86a2fe38" +version = "0.2.8" + +[[deps.BibTeX]] +git-tree-sha1 = "e16505bdc7c0177d0a1709022d4ac41d51c5181d" +uuid = "7b0aa2c9-049f-5cec-894a-2b6b781bb25e" +version = "0.1.0" + +[[deps.BitFlags]] +git-tree-sha1 = "2dc09997850d68179b69dafb58ae806167a32b1b" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.8" + +[[deps.Blink]] +deps = ["Base64", "Distributed", "HTTP", "JSExpr", "JSON", "Lazy", "Logging", "MacroTools", "Mustache", "Mux", "Pkg", "Reexport", "Sockets", "WebIO"] +git-tree-sha1 = "bc93511973d1f949d45b0ea17878e6cb0ad484a1" +uuid = "ad839575-38b3-5650-b840-f874b8c74a25" +version = "0.12.9" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "575cd02e080939a33b6df6c5853d14924c08e35b" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.23.0" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CircularArrays]] +deps = ["OffsetArrays"] +git-tree-sha1 = "3f7b8a37359ae592cfa7aca7f811da045deff222" +uuid = "7a955b69-7140-5f4e-a0ed-f168c5e2e749" +version = "1.3.3" + +[[deps.CodeTracking]] +deps = ["InteractiveUtils", "UUIDs"] +git-tree-sha1 = "c0216e792f518b39b22212127d4a84dc31e4e386" +uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" +version = "1.3.5" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "59939d8a997469ee05c4b4944560a820f9ba0d73" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.4" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "67c1f244b991cad9b0aa4b7540fb758c2488b129" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.24.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.10.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.10" + +[[deps.CommonSolve]] +git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.4" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "c955881e3c981181362ae4088b35995446298b80" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.14.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.0.5+0" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "6cbbd4d241d7e6579ab354737f4dd95ca43946e1" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.4.1" + +[[deps.ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "c53fc348ca4d40d7b371e71fd52251839080cbc9" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.4" +weakdeps = ["IntervalSets", "StaticArrays"] + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseStaticArraysExt = "StaticArrays" + +[[deps.CoordinateTransformations]] +deps = ["LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "f9d7112bfff8a19a3a4ea4e03a8e6a91fe8456bf" +uuid = "150eb455-5306-5404-9cee-2592286d6298" +version = "0.6.3" + +[[deps.Dash]] +deps = ["Base64", "CodecZlib", "DashBase", "DashCoreComponents", "DashHtmlComponents", "DashTable", "DataStructures", "HTTP", "JSON", "JSON3", "MD5", "Pkg", "Sockets", "Test", "UUIDs", "YAML"] +git-tree-sha1 = "826c9960644b38dcf0689115a86b57c3f1aa7f1d" +uuid = "1b08a953-4be3-4667-9a23-3db579824955" +version = "1.5.0" + +[[deps.DashBase]] +deps = ["JSON3", "Requires"] +git-tree-sha1 = "f56a284687c4f7a67a1341a275baf733c99149ba" +uuid = "03207cf0-e2b3-4b91-9ca8-690cf0fb507e" +version = "1.0.0" + + [deps.DashBase.extensions] + DashBasePlotlyBaseExt = "PlotlyBase" + DashBasePlotlyJSExt = "PlotlyJS" + DashBasePlotsExt = "Plots" + + [deps.DashBase.weakdeps] + PlotlyBase = "a03496cd-edff-5a9b-9e67-9cda94a718b5" + PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" + Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" + +[[deps.DashBootstrapComponents]] +deps = ["Dash"] +git-tree-sha1 = "d423ae74d117320adb93a28f2c325a1664f09e0a" +uuid = "1b08a953-4be3-4667-9a23-fa6d05876a1e" +version = "1.4.1" + +[[deps.DashCoreComponents]] +git-tree-sha1 = "f50f65803f79f4d131a1dad8843fcd51c7c71f7d" +uuid = "1b08a953-4be3-4667-9a23-9da06441d987" +version = "2.0.0" + +[[deps.DashHtmlComponents]] +git-tree-sha1 = "972f71ee6c3c22841cdc6a44eca6117fb843c86c" +uuid = "1b08a953-4be3-4667-9a23-24100242a84a" +version = "2.0.0" + +[[deps.DashTable]] +git-tree-sha1 = "923491df78fc9b36191162f0f0f4b0c38467a5db" +uuid = "1b08a953-4be3-4667-9a23-f0e2ba4deb9a" +version = "5.0.0" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "0f4b5d62a88d8f59003e43c25a8a90de9eb76317" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.18" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "66c4c81f259586e8f002eacebc177e1fb06363b0" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.11" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.3" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.4+0" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.10" + +[[deps.Extents]] +git-tree-sha1 = "2140cd04483da90b2da7f99b2add0750504fc39c" +uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" +version = "0.1.2" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "c5c28c245101bd59154f649e19b038d15901b5dc" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.16.2" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra", "Random"] +git-tree-sha1 = "5b93957f6dcd33fc343044af3d48c215be2562f1" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.9.3" + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + + [deps.FillArrays.weakdeps] + PDMats = "90014a1f-27ba-587c-ab20-58faa44d9150" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.36" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FunctionalCollections]] +deps = ["Test"] +git-tree-sha1 = "04cb9cfaa6ba5311973994fe3496ddec19b6292a" +uuid = "de31a74c-ac4f-5751-b3fd-e18cd04993ca" +version = "0.5.0" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GeoInterface]] +deps = ["Extents"] +git-tree-sha1 = "d4f85701f569584f2cff7ba67a137d03f0cfb7d0" +uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" +version = "1.3.3" + +[[deps.GeoParams]] +deps = ["BibTeX", "DelimitedFiles", "ForwardDiff", "Interpolations", "KernelDensitySJ", "LaTeXStrings", "LinearAlgebra", "Loess", "Parameters", "Requires", "Roots", "Setfield", "SpecialFunctions", "Static", "StaticArrays", "Statistics", "StatsBase", "UnPack", "Unidecode", "Unitful"] +git-tree-sha1 = "bf5440b99f428fd69889fc2e72b82f2015904f6f" +uuid = "e018b62d-d9de-4a26-8697-af89c310ae38" +version = "0.5.7" + + [deps.GeoParams.extensions] + GeoParamsGLMakieExt = "GLMakie" + + [deps.GeoParams.weakdeps] + GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" + +[[deps.Geodesy]] +deps = ["CoordinateTransformations", "Dates", "LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "ed98a4429bf0a033ccc5e036120181dd52f06d31" +uuid = "0ef565a4-170c-5f04-8de2-149903a85f3d" +version = "1.1.0" + +[[deps.GeometryBasics]] +deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "5694b56ccf9d15addedc35e9a4ba9c317721b788" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.4.10" + +[[deps.GeophysicalModelGenerator]] +deps = ["Colors", "DelimitedFiles", "Downloads", "FileIO", "GeoParams", "Geodesy", "GeometryBasics", "Glob", "ImageIO", "Interpolations", "JLD2", "LinearAlgebra", "MeshIO", "NearestNeighbors", "Parameters", "Printf", "SpecialFunctions", "Statistics", "Test", "WriteVTK"] +git-tree-sha1 = "271feda2c4f68e613d2523103e851cea38d931bf" +uuid = "3700c31b-fa53-48a6-808a-ef22d5a84742" +version = "0.5.9" + + [deps.GeophysicalModelGenerator.extensions] + GLMakie_Visualisation = "GLMakie" + GMT_utils = "GMT" + + [deps.GeophysicalModelGenerator.weakdeps] + GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" + GMT = "5752ebe1-31b9-557e-87aa-f909b540aa54" + +[[deps.Glob]] +git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" +uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" +version = "1.3.1" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "db864f2d91f68a5912937af80327d288ea1f3aee" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.3" + +[[deps.Hiccup]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "6187bb2d5fcbb2007c39e7ac53308b0d371124bd" +uuid = "9fb69e20-1954-56bb-a84f-559cc56a8ff7" +version = "0.2.2" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.ImageAxes]] +deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] +git-tree-sha1 = "2e4520d67b0cef90865b3ef727594d2a58e0e1f8" +uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" +version = "0.6.11" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.7" + +[[deps.ImageCore]] +deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "b2a7eaa169c13f5bcae8131a83bc30eff8f71be0" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.2" + +[[deps.ImageIO]] +deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] +git-tree-sha1 = "bca20b2f5d00c4fbc192c3212da8fa79f4688009" +uuid = "82e4d734-157c-48bb-816b-45c225c6df19" +version = "0.6.7" + +[[deps.ImageMetadata]] +deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] +git-tree-sha1 = "355e2b974f2e3212a75dfb60519de21361ad3cb7" +uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" +version = "0.9.9" + +[[deps.Imath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3d09a9f60edf77f8a4d99f9e015e8fbf9989605d" +uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" +version = "3.1.7+0" + +[[deps.IndirectArrays]] +git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" +version = "1.0.0" + +[[deps.Inflate]] +git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.4" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.Interpolations]] +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "721ec2cf720536ad005cb38f50dbba7b02419a15" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.14.7" + +[[deps.IntervalSets]] +git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.10" + + [deps.IntervalSets.extensions] + IntervalSetsRandomExt = "Random" + IntervalSetsRecipesBaseExt = "RecipesBase" + IntervalSetsStatisticsExt = "Statistics" + + [deps.IntervalSets.weakdeps] + Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" + Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "68772f49f54b479fa88ace904f6127f0a3bb2e46" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.12" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.IterTools]] +git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.10.0" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "PrecompileTools", "Printf", "Reexport", "Requires", "TranscodingStreams", "UUIDs"] +git-tree-sha1 = "5ea6acdd53a51d897672edb694e3cc2912f3f8a7" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.4.46" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.5.0" + +[[deps.JSExpr]] +deps = ["JSON", "MacroTools", "Observables", "WebIO"] +git-tree-sha1 = "b413a73785b98474d8af24fd4c8a975e31df3658" +uuid = "97c1335a-c9c5-57fe-bc5d-ec35cebe8660" +version = "0.5.4" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JSON3]] +deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] +git-tree-sha1 = "eb3edce0ed4fa32f75a0a11217433c31d56bd48b" +uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" +version = "1.14.0" + + [deps.JSON3.extensions] + JSON3ArrowExt = ["ArrowTypes"] + + [deps.JSON3.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "fa6d0bcff8583bac20f1ffa708c3913ca605c611" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.5" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3336abae9a713d2210bb57ab484b1e065edd7d23" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.0.2+0" + +[[deps.JuliaInterpreter]] +deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] +git-tree-sha1 = "7b762d81887160169ddfc93a47e5fd7a6a3e78ef" +uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" +version = "0.9.29" + +[[deps.Kaleido_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "43032da5832754f58d14a91ffbe86d5f176acda9" +uuid = "f7e6163d-2fa5-5f23-b69c-1db539e41963" +version = "0.2.1+0" + +[[deps.KernelDensitySJ]] +deps = ["DataStructures", "Roots", "Statistics"] +git-tree-sha1 = "e698e449fef8863e3b1d589829ee131cc63987c2" +uuid = "49dc5b4e-6806-4504-b2cc-a81764e7a38b" +version = "0.2.1" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.1" + +[[deps.Lazy]] +deps = ["MacroTools"] +git-tree-sha1 = "1370f8202dac30758f3c345f9909b97f53d87d3f" +uuid = "50d2b5c4-7a5e-59d5-8109-a42b560f39c0" +version = "0.15.1" + +[[deps.LazyModules]] +git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" +version = "0.3.1" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + +[[deps.LightXML]] +deps = ["Libdl", "XML2_jll"] +git-tree-sha1 = "3a994404d3f6709610701c7dabfc03fed87a81f8" +uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179" +version = "0.9.1" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.Loess]] +deps = ["Distances", "LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "a113a8be4c6d0c64e217b472fb6e61c760eb4022" +uuid = "4345ca2d-374a-55d4-8d30-97f9976e7612" +version = "0.6.3" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "18144f3e9cbe9b15b070288eef858f71b291ce37" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.27" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.0.3" + +[[deps.LoweredCodeUtils]] +deps = ["JuliaInterpreter"] +git-tree-sha1 = "31e27f0b0bf0df3e3e951bfcc43fe8c730a219f6" +uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" +version = "2.4.5" + +[[deps.MD5]] +deps = ["Random", "SHA"] +git-tree-sha1 = "1576f756617d31eb397a4a517b68562fd28dc2b4" +uuid = "6ac74813-4b46-53a4-afec-0b5dc9d7885c" +version = "0.2.3" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.13" + +[[deps.MappedArrays]] +git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.2" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[deps.MeshIO]] +deps = ["ColorTypes", "FileIO", "GeometryBasics", "Printf"] +git-tree-sha1 = "8c26ab950860dfca6767f2bbd90fdf1e8ddc678b" +uuid = "7269a6da-0436-5bbc-96c2-40638cbb6118" +version = "0.4.11" + +[[deps.Meshes]] +deps = ["Bessels", "CircularArrays", "Distances", "IterTools", "LinearAlgebra", "NearestNeighbors", "Random", "Rotations", "SparseArrays", "StaticArrays", "StatsBase", "Tables", "TransformsBase"] +git-tree-sha1 = "3542c06ff2050b61f64a62254c2740fad832dfa0" +uuid = "eacbb407-ea5a-433e-ab97-5258b1ca43fa" +version = "0.30.5" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.1.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2022.10.11" + +[[deps.Mustache]] +deps = ["Printf", "Tables"] +git-tree-sha1 = "a7cefa21a2ff993bff0456bf7521f46fc077ddf1" +uuid = "ffc61752-8dc7-55ee-8c37-f3e9cdd09e70" +version = "1.0.19" + +[[deps.Mux]] +deps = ["AssetRegistry", "Base64", "HTTP", "Hiccup", "MbedTLS", "Pkg", "Sockets"] +git-tree-sha1 = "0bdaa479939d2a1f85e2f93e38fbccfcb73175a5" +uuid = "a975b10e-0019-58db-a62f-e48ff68538c9" +version = "1.0.1" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NearestNeighbors]] +deps = ["Distances", "StaticArrays"] +git-tree-sha1 = "ded64ff6d4fdd1cb68dfcbb818c69e144a5b2e4c" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.16" + +[[deps.Netpbm]] +deps = ["FileIO", "ImageCore", "ImageMetadata"] +git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" +uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" +version = "1.1.1" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.Observables]] +git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" +uuid = "510215fc-4207-5dde-b226-833fc4488ee2" +version = "0.5.5" + +[[deps.OffsetArrays]] +git-tree-sha1 = "6a731f2b5c03157418a20c12195eb4b74c8f8621" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.13.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[deps.OpenEXR]] +deps = ["Colors", "FileIO", "OpenEXR_jll"] +git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" +uuid = "52e1d378-f018-4a11-a4be-720524705ac7" +version = "0.3.2" + +[[deps.OpenEXR_jll]] +deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "a4ca623df1ae99d09bc9868b008262d0c0ac1e4f" +uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" +version = "3.1.4+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "af81a32750ebc831ee28bdaaba6e1067decef51e" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.4.2" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "60e3045590bd104a16fefb12836c00c0ef8c7f8c" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.13+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.3" + +[[deps.PNGFiles]] +deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] +git-tree-sha1 = "67186a2bc9a90f9f85ff3cc8277868961fb57cbd" +uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" +version = "0.4.3" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.Pidfile]] +deps = ["FileWatching", "Test"] +git-tree-sha1 = "2d8aaf8ee10df53d0dfb9b8ee44ae7c04ced2b03" +uuid = "fa939f87-e72e-5be4-a000-7fc836dbe307" +version = "1.3.0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.2" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + +[[deps.PlotlyBase]] +deps = ["ColorSchemes", "Dates", "DelimitedFiles", "DocStringExtensions", "JSON", "LaTeXStrings", "Logging", "Parameters", "Pkg", "REPL", "Requires", "Statistics", "UUIDs"] +git-tree-sha1 = "56baf69781fc5e61607c3e46227ab17f7040ffa2" +uuid = "a03496cd-edff-5a9b-9e67-9cda94a718b5" +version = "0.8.19" + +[[deps.PlotlyJS]] +deps = ["Base64", "Blink", "DelimitedFiles", "JSExpr", "JSON", "Kaleido_jll", "Markdown", "Pkg", "PlotlyBase", "PlotlyKaleido", "REPL", "Reexport", "Requires", "WebIO"] +git-tree-sha1 = "e62d886d33b81c371c9d4e2f70663c0637f19459" +uuid = "f0f68f2c-4968-5e81-91da-67840de0976a" +version = "0.18.13" + + [deps.PlotlyJS.extensions] + CSVExt = "CSV" + DataFramesExt = ["DataFrames", "CSV"] + IJuliaExt = "IJulia" + JSON3Ext = "JSON3" + + [deps.PlotlyJS.weakdeps] + CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" + +[[deps.PlotlyKaleido]] +deps = ["Base64", "JSON", "Kaleido_jll"] +git-tree-sha1 = "2650cd8fb83f73394996d507b3411a7316f6f184" +uuid = "f2990250-8cf9-495f-b13a-cce12b45703c" +version = "2.2.4" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "763a8ceb07833dd51bb9e3bbca372de32c0605ad" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.10.0" + +[[deps.QOI]] +deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] +git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" +uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" +version = "1.0.0" + +[[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", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.RangeArrays]] +git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" +version = "0.3.2" + +[[deps.Ratios]] +deps = ["Requires"] +git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.5" +weakdeps = ["FixedPointNumbers"] + + [deps.Ratios.extensions] + RatiosFixedPointNumbersExt = "FixedPointNumbers" + +[[deps.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" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[deps.Revise]] +deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] +git-tree-sha1 = "12aa2d7593df490c407a3bbd8b86b8b515017f3e" +uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" +version = "3.5.14" + +[[deps.Roots]] +deps = ["Accessors", "ChainRulesCore", "CommonSolve", "Printf"] +git-tree-sha1 = "1ab580704784260ee5f45bffac810b152922747b" +uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" +version = "2.1.5" + + [deps.Roots.extensions] + RootsForwardDiffExt = "ForwardDiff" + RootsIntervalRootFindingExt = "IntervalRootFinding" + RootsSymPyExt = "SymPy" + RootsSymPyPythonCallExt = "SymPyPythonCall" + + [deps.Roots.weakdeps] + 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 = "2a0a5d8569f481ff8840e3b7c84bbf188db6a3fe" +uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" +version = "1.7.0" + + [deps.Rotations.extensions] + RotationsRecipesBaseExt = "RecipesBase" + + [deps.Rotations.weakdeps] + RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.1.0" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.4" + +[[deps.Sixel]] +deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] +git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" +uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" +version = "0.1.3" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.1" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "e2cfc4012a19088254b3950b85c3c1d8882d864d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.3.1" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.Static]] +deps = ["IfElse"] +git-tree-sha1 = "b366eb1eb68075745777d80861c6706c33f588ae" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "0.8.9" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "bf074c045d3d5ffd956fa0a461da38a44685d6b2" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.3" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.2" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.9.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "1d77abd07f617c4868c33d4f5b9e1dbb2643c9cf" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.2" + +[[deps.StringEncodings]] +deps = ["Libiconv_jll"] +git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb" +uuid = "69024149-9ee7-55f6-a4c4-859efe599b68" +version = "0.3.7" + +[[deps.StructArrays]] +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "f4dc295e983502292c4c3f951dbb4e985e35b3be" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.18" + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = "GPUArraysCore" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" + + [deps.StructArrays.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.StructTypes]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "ca4bccb03acf9faaf4137a9abc1881ed1841aa70" +uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" +version = "1.10.0" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+6" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "cb76cf677714c095e535e3501ac7954732aeea2d" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.11.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TiffImages]] +deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] +git-tree-sha1 = "34cc045dd0aaa59b8bbe86c644679bc57f1d5bd0" +uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" +version = "0.6.8" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "3caa21522e7efac1ba21834a03734c57b4611c7e" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.10.4" +weakdeps = ["Random", "Test"] + + [deps.TranscodingStreams.extensions] + TestExt = ["Test", "Random"] + +[[deps.TransformsBase]] +deps = ["AbstractTrees"] +git-tree-sha1 = "2412fb54902b0063c69c2bcfbec6b571120cc856" +uuid = "28dd2a49-a57a-4bfb-84ca-1a49db9b96b8" +version = "0.1.2" + +[[deps.URIs]] +git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.5.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Unidecode]] +deps = ["REPL", "Test", "Unicode"] +git-tree-sha1 = "2264362f72926965e708ee26f58824b929c72637" +uuid = "967fb449-e509-55aa-8007-234b4096b967" +version = "1.1.0" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "3c793be6df9dd77a0cf49d80984ef9ff996948fa" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.19.0" +weakdeps = ["ConstructionBase", "InverseFunctions"] + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + InverseFunctionsUnitfulExt = "InverseFunctions" + +[[deps.UrlDownload]] +deps = ["HTTP", "ProgressMeter"] +git-tree-sha1 = "758aeefcf0bfdd04cd88e6e3bc9feb9e8c7d6d70" +uuid = "856ac37a-3032-4c1c-9122-f86d88358c8b" +version = "1.0.1" + +[[deps.VTKBase]] +git-tree-sha1 = "c2d0db3ef09f1942d08ea455a9e252594be5f3b6" +uuid = "4004b06d-e244-455f-a6ce-a5f9919cc534" +version = "1.0.1" + +[[deps.WebIO]] +deps = ["AssetRegistry", "Base64", "Distributed", "FunctionalCollections", "JSON", "Logging", "Observables", "Pkg", "Random", "Requires", "Sockets", "UUIDs", "WebSockets", "Widgets"] +git-tree-sha1 = "0eef0765186f7452e52236fa42ca8c9b3c11c6e3" +uuid = "0f1e0344-ec1d-5b48-a673-e5cf874b6c29" +version = "0.8.21" + +[[deps.WebSockets]] +deps = ["Base64", "Dates", "HTTP", "Logging", "Sockets"] +git-tree-sha1 = "4162e95e05e79922e44b9952ccbc262832e4ad07" +uuid = "104b5d7c-a370-577a-8038-80a2059c5097" +version = "1.6.0" + +[[deps.Widgets]] +deps = ["Colors", "Dates", "Observables", "OrderedCollections"] +git-tree-sha1 = "fcdae142c1cfc7d89de2d11e08721d0f2f86c98a" +uuid = "cc8bc4a8-27d6-5769-a93b-9d913e69aa62" +version = "0.6.6" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "5f24e158cf4cee437052371455fe361f526da062" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "0.5.6" + +[[deps.WriteVTK]] +deps = ["Base64", "CodecZlib", "FillArrays", "LightXML", "TranscodingStreams", "VTKBase"] +git-tree-sha1 = "5817a62d8a1d00ce36bb418aceafaa49cff81b65" +uuid = "64499a7a-5c06-52f2-abe2-ccb03c286192" +version = "1.18.2" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "07e470dabc5a6a4254ffebc29a1b3fc01464e105" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.12.5+0" + +[[deps.YAML]] +deps = ["Base64", "Dates", "Printf", "StringEncodings"] +git-tree-sha1 = "e6330e4b731a6af7959673621e91645eb1356884" +uuid = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" +version = "0.4.9" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.43+1" + +[[deps.libsixel_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] +git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" +uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" +version = "1.10.3+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" diff --git a/Project.toml b/Project.toml index 1401171..9a5a0c0 100644 --- a/Project.toml +++ b/Project.toml @@ -17,6 +17,7 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Meshes = "eacbb407-ea5a-433e-ab97-5258b1ca43fa" PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" +Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" @@ -28,6 +29,7 @@ DashBootstrapComponents = "1.4.1" DelimitedFiles = "1" GeophysicalModelGenerator = "0.5.4" HTTP = "1.0" +Interpolations = "0.14" JLD2 = "0.4" JSON3 = "1" Meshes = "0.30" @@ -35,4 +37,3 @@ PlotlyJS = "0.18" Statistics = "1.9" UrlDownload = "1.0.1" julia = "1.9" -Interpolations = "0.14" \ No newline at end of file diff --git a/playground/Marcel/Matlab/GMGDataPicker.mlapp b/playground/Marcel/Matlab/GMGDataPicker.mlapp index d117b1e..4c8fad1 100644 Binary files a/playground/Marcel/Matlab/GMGDataPicker.mlapp and b/playground/Marcel/Matlab/GMGDataPicker.mlapp differ diff --git a/src/GMG_Tomo/GMG_TomoData.jl b/src/GMG_Tomo/GMG_TomoData.jl index 32d69fe..826973a 100644 --- a/src/GMG_Tomo/GMG_TomoData.jl +++ b/src/GMG_Tomo/GMG_TomoData.jl @@ -25,23 +25,18 @@ function main_layout(Datasets, max_num_users) label="File", id="id-dropdown-file"), - dbc_col([html_h1("Geo Data Picker", style = Dict("margin-top" => 0, "textAlign" => "center")), - html_h5("GeophysicalModelGenerator", style = Dict("margin-top" => 0, "textAlign" => "center"))]), - - dbc_col(html_img(src="assets/GeophysicalModelGenerator-logos_cut.png",height="140vh",), width=2), - # dbc_col(html_img(src=joinpath(pkgdir(GeoDataPicker),"src/assets/GeophysicalModelGenerator-logos_cut.png"), height="140vh"), width=2), - - #joinpath(pkgdir(GeoDataPicker),"src","GMG_Tomo/assets/logo/Logo_GMG.png") - + dbc_col(html_img(src="assets/LogoPicker.png",height="100vh",)), + dbc_col(html_img(src="assets/GMG_Logo_new.png",height="100vh",), width=2), ]), ), dbc_tabs( [ - dbc_tab(tab_id="tab-setup",label="Setup", children = [Tab_Data(Datasets)]), - dbc_tab(tab_id="tab-cross", label="Cross-sections", children = [Tab_CrossSection()]), - dbc_tab(tab_id="tab-3D", label="3D view", children = [Tab_3Dview()]) + dbc_tab(tab_id="tab-setup",label="Setup", children = [tab_data(Datasets)]), + dbc_tab(tab_id="tab-map", label="Map", children = [tab_map()]), + dbc_tab(tab_id="tab-cross", label="Cross-sections", children = [tab_cross_section()]), + dbc_tab(tab_id="tab-3D", label="3D view", children = [tab_3Dview()]) ], id = "tabs", active_tab="tab-setup", diff --git a/src/GMG_Tomo/GMG_TomoData_Plots.jl b/src/GMG_Tomo/GMG_TomoData_Plots.jl index addee2d..62cdcce 100644 --- a/src/GMG_Tomo/GMG_TomoData_Plots.jl +++ b/src/GMG_Tomo/GMG_TomoData_Plots.jl @@ -1,9 +1,9 @@ # functions to create the various plots shown in the GUI """ -Creates a topo plot & line that shows the cross-section +updates the topo plot & line that shows the cross-section """ -function plot_topo(AppData) +function plot_topo(AppData,session_id) xdata = AppData.DataTopo.lon.val[:,1] ydata = AppData.DataTopo.lat.val[1,:] zdata = AppData.DataTopo.depth.val[:,:,1]' @@ -44,30 +44,32 @@ function plot_topo(AppData) colorscale = colorscale_topo, zmin = -4, zmax = 4, - colorbar=attr(thickness=5, title="topography [km]", titleside="right"), + colorbar=attr(thickness=20, title="topography [km]", titleside="right"), ) ], - colorbar=Dict("orientation"=>"v", "len"=>0.5, "thickness"=>10), + colorbar=Dict("orientation"=>"v", "len"=>0.5, "thickness"=>20), layout = ( #title = "topography [km]", yaxis=attr( title="Latitude", - tickfont_size= 14, + tickfont_size= 16, tickfont_color="rgb(100, 100, 100)" ), xaxis=attr( title="Longitude", - tickfont_size= 14, - tickfont_color="rgb(10, 10, 10)" + tickfont_size= 16, + tickfont_color="rgb(10, 10, 10)", + scaleanchor="y", scaleratio=1/1.65, ), - + aspectmode="manual", + aspectratio=attr(x=0.8, y=1, z=1), # once we save additional cross-sections, add them here shapes = shapes, ), - scene = attr( aspectmode="manual", - aspectratio=attr(x=1, y=1, z=1) - ), + #scene = attr( aspectmode="manual", + # aspectratio=attr(x=1, y=1, z=1) # change the aspect ratio so that we have an approximately orthogonal + # ), config = (edits = (shapePosition = true,)), ) @@ -78,6 +80,9 @@ end """ Creates a plot of the cross-section with all requested options """ +# WE HERE HAVE TO UPDATE EVERYTHING WITH +# - THE NEW TOMOGRAPHIC CROSS-SECTION --> adds a new field, colormap, opacity, color z_limits +# - the switches for tomographies --> adds plot_tomographyI and plot_tomographyII function plot_cross(AppData, profile; zmax=nothing, zmin=nothing, field=:dVp_paf21, @@ -85,6 +90,8 @@ function plot_cross(AppData, profile; screenshot_opacity=0.5, screenshot_display=true, cross_section_opacity=1.0, + plot_tomography = true, + plot_tomographyII = false, plot_surfaces = false, selected_surf_data= [],EQmag=(0.1,9), plot_earthquakes= false, selected_EQ_data= [], section_width=50, ) @@ -96,7 +103,6 @@ function plot_cross(AppData, profile; Profile = ProfileData(profile); # create a GMG structure for the profile Profile, PlotCross = ExtractProfileData(Profile, AppData, field; section_width=section_width) # project data onto the profile - colorscale = colormaps[Symbol(colormap)]; println("updating cross section") @@ -132,14 +138,27 @@ function plot_cross(AppData, profile; data_plots = [] # add tomographic cross-section - push!(data_plots, heatmap(x = PlotCross.x_cart, - y = PlotCross.z_cart, - z = collect(eachcol(PlotCross.data)), - colorscale = colorscale, - colorbar=attr(thickness=5, title=String(field), titleside="right"), - zmin=zmin, zmax=zmax, - opacity = cross_section_opacity - )) + if plot_tomography + push!(data_plots, heatmap(x = PlotCross.x_cart, + y = PlotCross.z_cart, + z = collect(eachcol(PlotCross.data)), + colorscale = colorscale, + colorbar=attr(thickness=20, title=String(field), titleside="right"), + zmin=zmin, zmax=zmax, + opacity = cross_section_opacity + )) + end + # add second tomographic cross-section WORK IN PROGRESS!!! + if plot_tomographyII + push!(data_plots, heatmap(x = PlotCross.x_cart, + y = PlotCross.z_cart, + z = collect(eachcol(PlotCross.data)), + colorscale = colorscale, + colorbar=attr(thickness=20, title=String(field), titleside="right"), + zmin=zmin, zmax=zmax, + opacity = cross_section_opacity + )) + end if screenshot_display==true # Note: the name of the profile should be listed in the profuile struct @@ -204,22 +223,24 @@ function plot_cross(AppData, profile; pl = ( id = "fig_cross", data = data_plots, colorbar=Dict("orientation"=>"v", "len"=>0.5, "thickness"=>10,"title"=>"elevat"), - layout = ( title = "Cross-section", - xaxis=attr( + layout = ( xaxis=attr( title=xlab, tickfont_size= 14, - tickfont_color="rgb(100, 100, 100)" + tickfont_color="rgb(100, 100, 100)", + scaleanchor="y", scaleratio=1, + autorange=false, range=[PlotCross.x_cart[1],PlotCross.x_cart[end]], + ), yaxis=attr( title=ylab, tickfont_size= 14, tickfont_color="rgb(10, 10, 10)", - autorange=true + autorange=false, + range=[minimum(PlotCross.z_cart),0], ), shapes = shapes_data, - aspectmode="manual", - aspectratio=attr(x=1, y=1, z=1) - + #aspectmode="manual", + #aspectratio=attr(x=1, y=1, z=1) ), config = (edits = (shapePosition = true,)), ) @@ -431,7 +452,35 @@ end # This creates the topography (mapview) plot (lower left) function create_topo_plot(AppData) + + # first we have to see how large the map is to determine how we plot it + # the idea is to have an image that fills the availiable screen + #lonmin = minimum(AppData.DataTopo.lon.val[:,1]); + #lonmax = maximum(AppData.DataTopo.lon.val[:,1]); + #latmin = minimum(AppData.DataTopo.lat.val[1,:]); + #latmax = maximum(AppData.DataTopo.lat.val[1,:]); + + #lon_extent = lonmax-lonmin; + #lat_extent = latmat-latmin; + + # until plotting in map projection works here, we simply rescale the longitude axis with a factor that + # makes the plot look not too distorted + # if we want to fill the available visible space, we now have to determine the width and height on screen + #width_lon = lon_extent*0.8; + #height_lat = lat_extent; + + #if width_lon>height_lat + # plotwidth = "80vw"; + # plotheight = string(100/0.8)*"vw"; + #else + plotheight = "80vh"; + plotwidth = "80vw" + #end + + #println("AppData") + println(keys(AppData)) + html_div( dcc_graph( id = "mapview", @@ -439,10 +488,13 @@ function create_topo_plot(AppData) #animate = true, #clickData = true, animate = false, - responsive=false, + responsive=true, #clickData = true, config = PlotConfig(displayModeBar=false, scrollZoom = false), - style = attr(width="35vw", height="50vh",padding_left="0vw",) + # here we plot the map so that the angles look about right + # a quick and simple way to do this is to set the aspect ratio to something smaller. Here we used a factor derived by trial and error + # the issue is that we somehow have to make this dependent on the map itself + style = attr(width=plotwidth, height=plotheight,padding_left=string(0.5*(100-(80/1.65)))*"vh") ), style = attr(textalign="center") ) @@ -455,9 +507,9 @@ function cross_section_plot() id = "cross_section", figure = [], #plot_cross(), animate = false, - responsive=false, + responsive=true, config = PlotConfig(displayModeBar=true, modeBarButtonsToAdd=["toimage","toImage","lasso","drawopenpath","eraseshape","drawclosedpath"],displaylogo=false), - style = attr(width="70vw", height="50vh")) + style = attr(width="80vw", height="80vh")) end diff --git a/src/GMG_Tomo/Tab_3Dview.jl b/src/GMG_Tomo/Tab_3Dview.jl index c925839..9e3baee 100644 --- a/src/GMG_Tomo/Tab_3Dview.jl +++ b/src/GMG_Tomo/Tab_3Dview.jl @@ -1,5 +1,5 @@ # Tab 2 -function Tab_3Dview() +function tab_3Dview() dbc_col([ dcc_graph( id = "3D-image", diff --git a/src/GMG_Tomo/Tab_CrossSections.jl b/src/GMG_Tomo/Tab_CrossSections.jl index b13896e..292305b 100644 --- a/src/GMG_Tomo/Tab_CrossSections.jl +++ b/src/GMG_Tomo/Tab_CrossSections.jl @@ -1,165 +1,130 @@ +function tab_cross_section() + dbc_row([ + dbc_col([ + dbc_row([dbc_button("Plot cross-section",id="button-plot-cross_section",color="danger"), + dbc_button("Curve Interpretation",id="button-curve-interpretation"), + dbc_collapse( + dbc_card(dbc_cardbody([ + dbc_row([ + dbc_row(dbc_label("Options"),justify="center"), + dbc_row([dbc_col(dbc_input(placeholder="Name", id="shape-name")), + dbc_col(dbc_input(id="shape-color", type="color"), width=4) ]) + ]), + dbc_row( dbc_card(dbc_radioitems(id="selected_curves",options=[(label="",)]))), -function Tab_CrossSection() - dbc_row([dbc_col([ - # plot with cross-section - dbc_row([dbc_col([cross_section_plot()], width=8), - ], justify="center"), + dbc_row(dbc_buttongroup([ dbc_button(" - ",id="button-clear-curve"), + dbc_button("update",id="button-update-curve"), + dbc_button(" + ",id="button-add-curve")]), justify="center"), - # info below plot - dbc_row([ - dbc_col([dcc_input(id="start_val", name="start_val", type="text", value="start: 5,46",style = Dict(:width => "100%"), debounce=true)]), - dbc_col([dcc_dropdown( - id="dropdown_field", - options = [], - value = "DataTomo_dVp_paf21", - clearable=false, placeholder="Select Dataset", - ), - ]), - dbc_col([ dcc_rangeslider( - id = "colorbar-slider", - min = -5., - max = 5., - #step = .1, - value=[-3, 3], - allowCross=false, - ), - ]), - dbc_col([dcc_input(id="end_val", name="end_val", type="text", value="end: 10,45",style = Dict(:width => "100%"),placeholder="min")]) - ]), - ], width=12), - - # lower row | topography plot & buttons - dbc_row([ - # plot topography - dbc_col(html_div(create_topo_plot(AppData)), lg=(width=5, offset=2)), - - - # various menus @ lower right - dbc_col( - dbc_card([ - dcc_markdown("Profile options"), - dbc_radioitems(id="checklist_orientation",options=[(label="vertical", value=true),(label="horizontal", value=false)], inline=true, value=true), - dbc_row([dbc_col(dbc_label("depth [km]")), dbc_col(dbc_input(value=100,type="number",id="input-depth", disabled=true))]), - dbc_row(dbc_col(dbc_button("Plot profile location", id="button-plot-topography", disabled=true), width=12),justify="center"), - dbc_row(dbc_buttongroup([dbc_button(" - ", id="button-delete-profile", disabled=true), - dbc_button("update", id="button-update-profile", disabled=true), - dbc_button(" + ", id="button-add-profile", disabled=true)]), justify="center"), - - dbc_card(dbc_radioitems(id="selected_profile",options=[(label="Profile 0", value="Profile 0")]))]), align="center", - - width=2), - - - #])), align="center", width=2), - #dbc_col([ - # dbc_row([html_button(id="button-select", name="select", n_clicks=0, contentEditable=true)]) - #]) - - dbc_col([ - - dbc_row([dbc_button("Plot cross-section",id="button-plot-cross_section"), - dbc_button("Curve Interpretation",id="button-curve-interpretation"), - dbc_collapse( - dbc_card(dbc_cardbody([ - dbc_row([ - dbc_row(dbc_label("Options"),justify="center"), - dbc_row([dbc_col(dbc_input(placeholder="Name", id="shape-name")), - dbc_col(dbc_input(id="shape-color", type="color"), width=4) ]) - ]), - dbc_row( dbc_card(dbc_radioitems(id="selected_curves",options=[(label="",)]))), - - dbc_row(dbc_buttongroup([ dbc_button(" - ",id="button-clear-curve"), - dbc_button("update",id="button-update-curve"), - dbc_button(" + ",id="button-add-curve")]), justify="center"), + dbc_row(dbc_buttongroup([ dbc_button("copy",id="button-copy-curve"), + dbc_button("paste",id="button-paste-curve") + ]), justify="center") + + ]) + + ), + id="collapse", + is_open=false, + ), - dbc_row(dbc_buttongroup([ dbc_button("copy",id="button-copy-curve"), - dbc_button("paste",id="button-paste-curve") - ]), justify="center") - - ]) - - ), - id="collapse", - is_open=false, - ), + dbc_button("Earthquakes",id="button-EQ"), + dbc_collapse( + dbc_card(dbc_cardbody([ + dbc_row([ + dbc_row(dbc_switch(label="Display", id="EQ-display", value=false),justify="center"), + dbc_row(dbc_inputgroup([dbc_inputgrouptext("width [km]"), dbc_input(id="EQ-section_width", value=50, type="number")])), + dbc_row(dbc_inputgroup([dbc_inputgrouptext("min Magnitude"), dbc_input(id="EQ-minMag", value=0.1, type="number")])), + dbc_row(dbc_inputgroup([dbc_inputgrouptext("max Magnitude"), dbc_input(id="EQ-maxMag", value=8, type="number")])), + dbc_row( dbc_card(dbc_checklist(id="selected_EQ-data",options=[]))), + ]) + ])), + id="collapse-EQ", + is_open=false, + ), + dbc_button("Surfaces",id="button-Surfaces"), + dbc_collapse( + dbc_card(dbc_cardbody([ + dbc_row([ + dbc_row(dbc_switch(label="Display", id="Surfaces-display", value=false),justify="center"), + dbc_row( dbc_card(dbc_checklist(id="selected_Surface-data",options=[]))), + ]) + ])), + id="collapse-Surfaces", + is_open=false, + ), - dbc_button("Earthquakes",id="button-EQ"), - dbc_collapse( - dbc_card(dbc_cardbody([ - dbc_row([ - dbc_row(dbc_switch(label="Display", id="EQ-display", value=false),justify="center"), - dbc_row(dbc_inputgroup([dbc_inputgrouptext("width"), dbc_input(id="EQ-section_width", value=50, type="number")])), - dbc_row(dbc_inputgroup([dbc_inputgrouptext("max Mw"), dbc_input(id="EQ-minMag", value=0.1, type="number")])), - dbc_row(dbc_inputgroup([dbc_inputgrouptext("min Mw"), dbc_input(id="EQ-maxMag", value=8, type="number")])), - dbc_row( dbc_card(dbc_checklist(id="selected_EQ-data",options=[]))), - ]) - ])), - id="collapse-EQ", - is_open=false, - ), - dbc_button("Surfaces",id="button-Surfaces"), - dbc_collapse( - dbc_card(dbc_cardbody([ - dbc_row([ - dbc_row(dbc_switch(label="Display", id="Surfaces-display", value=false),justify="center"), - dbc_row( dbc_card(dbc_checklist(id="selected_Surface-data",options=[]))), - ]) - ])), - id="collapse-Surfaces", - is_open=false, - ), + dbc_button("Screenshots",id="button-Screenshots"), + dbc_collapse( + dbc_card(dbc_cardbody([ + dbc_col([dbc_switch(label="Display", id="screenshot-display", value=true), + dcc_slider(min=0.0,max=1.0,marks=Dict(0=>"0",0.5=>"opacity",1=>"1"),value=1.0, id = "screenshot-opacity", tooltip=attr(placement="bottom")), + ]), + ])), + id="collapse-Screenshots", + is_open=false, + ), + + dbc_button("Tomographic data I",id="button-Tomography"), + dbc_collapse( + dbc_card(dbc_cardbody([ + dbc_col([ + dbc_row(dbc_switch(label="Display", id="tomography-display", value=true),justify="center"), + dbc_row(dbc_switch(label="Contour", id="tomography-contour", value=false),justify="center"), + dcc_dropdown(id="dropdown_field",options = [],value = "DataTomo_dVp_paf21",clearable=false, placeholder="Select Dataset"), + dcc_rangeslider(id = "colorbar-slider",min = -5.,max = 5.,value=[-3, 3],allowCross=false), + dcc_slider(min=0.0,max=1.0,marks=Dict(0=>"0",0.5=>"opacity",1=>"1"),value=0.9, id = "tomography-opacity", tooltip=attr(placement="bottom")), + dcc_dropdown(id="colormaps_cross", options = [String.(keys(colormaps))...], value = "roma",clearable=false, placeholder="Colormap") + ]), + ])), + id="collapse-Tomography", + is_open=false, + ), + + dbc_button("Tomographic data II",id="button-TomographyII"), + dbc_collapse( + dbc_card(dbc_cardbody([ + dbc_col([ + dbc_row(dbc_switch(label="Display", id="tomography-displayII", value=false),justify="center"), + dbc_row(dbc_switch(label="Contour", id="tomography-contourII", value=false),justify="center"), + dcc_dropdown(id="dropdown_fieldII",options = [],value = "DataTomo_dVp_paf21",clearable=false, placeholder="Select Dataset"), + dcc_rangeslider(id = "colorbar-sliderII",min = -5.,max = 5.,value=[-3, 3],allowCross=false), + dcc_slider(min=0.0,max=1.0,marks=Dict(0=>"0",0.5=>"opacity",1=>"1"),value=0.9, id = "tomography-opacityII", tooltip=attr(placement="bottom")), + dcc_dropdown(id="colormaps_crossII", options = [String.(keys(colormaps))...], value = "roma",clearable=false, placeholder="Colormap") + ]), + ])), + id="collapse-TomographyII", + is_open=false, + ), + + dbc_button("Export/Import",id="button-export-import"), + dbc_collapse( + dbc_card(dbc_cardbody([ + dbc_col([ + dbc_card([dbc_row(dbc_label("Curves to be exported:"),justify="center"), + dcc_dropdown(id="curves-to-be-exported",options=[("",)],multi=true), + dbc_button("Export Curves",id="export-curves"), + dcc_download(id="download-curves", base64=true), + ])]), + dbc_card([ + dbc_button("Export Profiles",id="button-export-profiles"), + dcc_download(id="download-profiles", base64=true), + html_div(id="upload-profiles_component", dcc_upload(id="upload-profiles", children=dbc_button("Import Profiles"))), + html_div(id="upload-profiles_n"), + ]) - dbc_button("Screenshots",id="button-Screenshots"), - dbc_collapse( - dbc_card(dbc_cardbody([ - dbc_col([dbc_switch(label="Display", id="screenshot-display", value=true), - dcc_slider(min=0.0,max=1.0,marks=Dict(0=>"0",0.5=>"opacity",1=>"1"),value=1.0, id = "screenshot-opacity", tooltip=attr(placement="bottom")), - ]), - ])), - id="collapse-Screenshots", - is_open=false, - ), - - dbc_button("Tomographic data",id="button-Tomography"), - dbc_collapse( - dbc_card(dbc_cardbody([ - dbc_col([ - dcc_slider(min=0.0,max=1.0,marks=Dict(0=>"0",0.5=>"opacity",1=>"1"),value=0.9, id = "tomography-opacity", tooltip=attr(placement="bottom")), - dcc_dropdown(id="colormaps_cross", options = [String.(keys(colormaps))...], value = "roma",clearable=false, placeholder="Colormap") - ]), - ])), - id="collapse-Tomography", - is_open=false, - ), - - dbc_button("Export/Import",id="button-export-import"), - dbc_collapse( - dbc_card(dbc_cardbody([ - dbc_col([ - dbc_card([dbc_row(dbc_label("Curves to be exported:"),justify="center"), - dcc_dropdown(id="curves-to-be-exported",options=[("",)],multi=true), - dbc_button("Export Curves",id="export-curves"), - dcc_download(id="download-curves", base64=true), - ])]), - dbc_card([ - dbc_button("Export Profiles",id="button-export-profiles"), - dcc_download(id="download-profiles", base64=true), - html_div(id="upload-profiles_component", dcc_upload(id="upload-profiles", children=dbc_button("Import Profiles"))), - html_div(id="upload-profiles_n"), - ]) + ])), + id="collapse-export-import", + is_open=false, + ), + + ]) - ])), - id="collapse-export-import", - is_open=false, - ), - - ]) + + ] , align="center", width=2), - - ], align="center", width=2), - - ]) + # plot with cross-section + dbc_col([cross_section_plot()], align="center", width=10), ]) end \ No newline at end of file diff --git a/src/GMG_Tomo/Tab_CrossSections_Callback.jl b/src/GMG_Tomo/Tab_CrossSections_Callback.jl index 4ad4360..0fa9a70 100644 --- a/src/GMG_Tomo/Tab_CrossSections_Callback.jl +++ b/src/GMG_Tomo/Tab_CrossSections_Callback.jl @@ -1,6 +1,10 @@ # callbacks for the cross-sections tab function Tab_CrossSections_Callback(app) + +################### CALLBACKS RELATED TO TOPOGRAPHY PLOT ################ +################## WILL POTENTIALLY BE MOVED TO A DIFFERENT FILE + # this is the callback that is invoked if the line on the topography map is changed callback!(app, Output("start_val", "value"), Output("end_val", "value"), @@ -173,7 +177,7 @@ callback!(app, Output("mapview", "figure"), AppDataLocal = update_profile(AppDataLocal, profile, num=0) AppData = add_AppData(AppData, session_id, AppDataLocal) - fig_topo = plot_topo(AppDataLocal) + fig_topo = plot_topo(AppDataLocal,session_id) but_add_prof_disabled=false but_up_prof_disabled=false but_del_prof_disabled=false @@ -195,6 +199,10 @@ callback!(app, Output("mapview", "figure"), end +############ THIS SHOULD BE THE END OF ALL THE CALLBACKS FOR THE TOPOGRAPHY PLOT ################### + + +############ CALLBACKS FOR CROSS SECTION PLOT ############### # open/close Curve interpretation box callback!(app, @@ -269,7 +277,7 @@ callback!(app, return is_open end -# open/close tomography box +# open/close tomography I box callback!(app, Output("collapse-Tomography", "is_open"), [Input("button-Tomography", "n_clicks")], @@ -287,6 +295,24 @@ callback!(app, return is_open end +# open/close tomography II box +callback!(app, + Output("collapse-TomographyII", "is_open"), + [Input("button-TomographyII", "n_clicks")], + [State("collapse-TomographyII", "is_open")], ) do n, is_open + + if isnothing(n); n=0 end + + if n>0 + if is_open==1 + is_open = 0 + elseif is_open==0 + is_open = 1 + end + end + return is_open +end + # open/close Curve interpretation box callback!(app, Output("input-depth", "disabled"), @@ -297,12 +323,16 @@ callback!(app, return vertical end + +# CALLBACK FOR THE PLOT CROSS-SECTION BUTTON callback!(app, Output("cross_section", "figure"), Output("3D-selected_curves","options"), Output("curves-to-be-exported","options"), Output("3D-selected_curves_surf","options"), Input("button-plot-cross_section","n_clicks"), + #Input("dropdown_field","n_clicks"), # test if this triggers correctly State("dropdown_field","value"), + State("dropdown_fieldII","value"), State("colorbar-slider", "value"), State("session-id","data"), State("selected_profile","value"), @@ -310,6 +340,8 @@ callback!(app, Output("cross_section", "figure"), State("screenshot-display","value"), State("screenshot-opacity","value"), State("tomography-opacity","value"), + State("tomography-display","value"), + State("tomography-displayII","value"), State("EQ-display","value"), State("Surfaces-display","value"), State("selected_Surface-data","value"), @@ -318,19 +350,27 @@ callback!(app, Output("cross_section", "figure"), State("EQ-minMag","value"), State("EQ-maxMag","value"), - ) do n_clicks, field, colorbar_value, session_id, selected_profile, colormap_field, screenshot_display, screenshot_opacity, cross_section_opacity, - plot_earthquakes, plot_surfaces, selected_surf_data, selected_EQ_data, section_width, + ) do n_clicks, + field, fieldII, colorbar_value, session_id, selected_profile, colormap_field, screenshot_display, screenshot_opacity, cross_section_opacity, + plot_tomography, plot_tomographyII, plot_earthquakes, plot_surfaces, selected_surf_data, selected_EQ_data, section_width, EQ_minMag, EQ_maxMag AppDataLocal = get_AppData(AppData, session_id) - profile = get_active_profile(AppData, session_id, selected_profile) + + # now update the cross section plot + # here we simply aggregate the different n_clicks values + N_CLICKS = n_clicks + n_clicks_dropdown + @show profile session_id - if (n_clicks>0) && !isnothing(profile) + if (N_CLICKS>0) && !isnothing(profile) @show profile - fig_cross = plot_cross(AppDataLocal, profile, zmin=colorbar_value[1], zmax=colorbar_value[2], field=Symbol(field), colormap=colormap_field, + fig_cross = plot_cross(AppDataLocal, profile, + zmin=colorbar_value[1], zmax=colorbar_value[2], field=Symbol(field), colormap=colormap_field, screenshot_display=screenshot_display, screenshot_opacity=screenshot_opacity, cross_section_opacity=cross_section_opacity, + plot_tomography = plot_tomography, + plot_tomographyII = plot_tomographyII, plot_surfaces = plot_surfaces, selected_surf_data= selected_surf_data, plot_earthquakes=plot_earthquakes,selected_EQ_data=selected_EQ_data, section_width=section_width, EQmag = (EQ_minMag,EQ_maxMag), @@ -346,7 +386,7 @@ callback!(app, Output("cross_section", "figure"), return fig_cross, curve_names, curve_names, curve_names end - +# ??? callback!(app, Output("button-add-curve","n_clicks"), Output("selected_curves","options"), Input("button-add-curve","n_clicks"), @@ -467,7 +507,6 @@ callback!(app, end - # Export curves to disk callback!(app, Output("export-curves", "n_clicks"), diff --git a/src/GMG_Tomo/Tab_Map.jl b/src/GMG_Tomo/Tab_Map.jl new file mode 100644 index 0000000..e5ca8a4 --- /dev/null +++ b/src/GMG_Tomo/Tab_Map.jl @@ -0,0 +1,30 @@ + + +function tab_map() + dbc_row([ + + # plot topography + dbc_col(html_div(create_topo_plot(AppData))), + + # various menus for profile selection @ lower right + dbc_col( + dbc_card([ + dcc_markdown("### Profile options"), + dcc_markdown(" **Vertical profile:** Select 'vertical' and then insert the starting and ending point. After that, click on the '+' to add this profile to the list."), + dbc_radioitems(id="checklist_orientation",options=[(label="vertical", value=true),(label="horizontal", value=false)], inline=true, value=true), + dbc_row([ + dbc_col([dcc_input(id="start_val", name="start_val", type="text", value="start: 5,46",style = Dict(:width => "100%"), debounce=true)]), + dbc_col([dcc_input(id="end_val", name="end_val", type="text", value="end: 10,45",style = Dict(:width => "100%"),placeholder="min")]) + ]), + dbc_row([dbc_col(dbc_label("depth [km]")), dbc_col(dbc_input(value=100,type="number",id="input-depth", disabled=true))]), + dbc_row(dbc_col(dbc_button("Plot profile location", id="button-plot-topography", disabled=true), width=12),justify="center"), + dbc_row(dbc_buttongroup([dbc_button(" - ", id="button-delete-profile", disabled=true), + dbc_button("update", id="button-update-profile", disabled=true), + dbc_button(" + ", id="button-add-profile", disabled=true)]), justify="center"), + dbc_card(dbc_radioitems(id="selected_profile",options=[(label="Profile 0", value="Profile 0")])) + ]), align="center", + width=2), + + ]) + +end \ No newline at end of file diff --git a/src/GMG_Tomo/Tab_Map_Callback.jl b/src/GMG_Tomo/Tab_Map_Callback.jl new file mode 100644 index 0000000..c856cfc --- /dev/null +++ b/src/GMG_Tomo/Tab_Map_Callback.jl @@ -0,0 +1,605 @@ +# callbacks for the cross-sections tab +function Tab_Map_Callback(app) + +# this is the callback that is invoked if the line on the topography map is changed +callback!(app, Output("start_val", "value"), + Output("end_val", "value"), + Input("mapview", "relayoutData"), + Input("mapview", "clickData"), + State("selected_profile","value"), + State("checklist_orientation", "value"), + State("input-depth","value"), + State("session-id","data"), + State("start_val", "value"), + State("end_val", "value") + ) do value, clickData, selected_profile, vertical, depth, session_id, retStart, retEnd + global AppData + AppDataLocal = get_AppData(AppData, session_id) + trigger = get_trigger() + + # if we move the line value on the cross-section it will update this here: + start_val, end_val = get_startend_cross_section(value) + if !isempty(trigger) + AppDataUser = get_AppDataUser(AppData, session_id) + + # Update textbox values + if !isnothing(start_val) + retStart = "start: $(@sprintf("%.2f", start_val[1])),$(@sprintf("%.2f", start_val[2]))" + retEnd = "end: $(@sprintf("%.2f", end_val[1])),$(@sprintf("%.2f", end_val[2]))" + end + + # Update the active cross-section (number 0) accordingly + if !isnothing(start_val) + profile = ProfileUser(number=0, start_lonlat=start_val, end_lonlat=end_val, vertical=vertical, depth=depth) + AppDataLocal = update_profile(AppDataLocal, profile, num=0) + AppData = add_AppData(AppData, session_id, AppDataLocal) + end + + else + # set the initial cross-section + retStart = "start: 5.0,46.0" + retEnd = "end: 12.0,44.0" + end + + return retStart, retEnd +end + +# add, remove or change profiles +callback!(app, Output("button-add-profile", "n_clicks"), + Output("selected_profile", "options"), + Output("selected_cross-sections","options"), + + Output("3D-selected_profiles","options"), + + Input("button-add-profile", "n_clicks"), + Input("button-delete-profile", "n_clicks"), + Input("button-update-profile", "n_clicks"), + Input("setup-button", "n_clicks"), + Input("output-upload_state_n", "children"), # changes if we upload state + Input("upload-profiles_n","children"), # changes if we upload profiles + State("session-id","data"), + State("selected_profile", "value"), + ) do n_add, n_del, n_up, n_setup, upload_state, upload_profiles_n, session_id, selected_profile + + global AppData + AppDataUser = get_AppDataUser(AppData, session_id) + trigger = get_trigger() + + if hasfield(typeof(AppDataUser), :Profiles) + profile = deepcopy(AppDataUser.Profiles[1]) # retrieve profile + number_profiles = get_number_profiles(AppDataUser.Profiles) # get numbers + end + + if trigger == "button-add-profile.n_clicks" + profile = deepcopy(AppDataUser.Profiles[1]) + profile.number = maximum(number_profiles)+1 # new number + push!(AppDataUser.Profiles, profile) # add to data structure + AppData = set_AppDataUser(AppData, session_id, AppDataUser) + println("Added profile: vertical=$(profile.vertical)") + elseif trigger == "button-delete-profile.n_clicks" + if !isnothing(selected_profile) + if selected_profile>0 + id = findall(number_profiles .== selected_profile) + Profiles = AppDataUser.Profiles + + deleteat!(Profiles, id) + number_profiles = get_number_profiles(AppDataUser.Profiles) # get numbers + end + end + elseif trigger == "button-update-profile.n_clicks" + if !isnothing(selected_profile) + id = findall(number_profiles .== selected_profile) + profile = deepcopy(AppDataUser.Profiles[1]) # main profile + profile_selected = AppDataUser.Profiles[id[1]] # profile to be updated + + # update the coordinates (but leave polygons) + profile_selected.start_lonlat = profile.start_lonlat + profile_selected.end_lonlat = profile.end_lonlat + profile_selected.start_cart = profile.start_cart + profile_selected.end_cart = profile.end_cart + profile_selected.vertical = profile.vertical + profile_selected.depth = profile.depth + + end + elseif trigger=="output-upload_state.children" + + end + + # Get options and values + if hasfield(typeof(AppDataUser), :Profiles) + options = get_profile_options(AppDataUser.Profiles) + else + options = [(label="default profile", value=0)] + end + + return n_add, options, options, options +end + +# Main feedback that updates the topography plot +callback!(app, Output("mapview", "figure"), + Output("button-add-profile","disabled"), + Output("button-update-profile","disabled"), + Output("button-delete-profile","disabled"), + Output("selected_profile","value"), + Output("button-plot-cross_section","n_clicks"), + Input("button-plot-topography","n_clicks"), + Input("selected_profile","value"), + Input("selected_profile","options"), + Input("start_val","n_submit"), + Input("end_val","n_submit"), + Input("input-depth","n_submit"), + Input("output-upload_state", "children"), + State("checklist_orientation", "value"), + State("start_val", "value"), + State("end_val", "value"), + State("input-depth","value"), + State("session-id","data"), + State("button-plot-cross_section","n_clicks"), + prevent_initial_call=true + ) do n_clicks, selected_profile, selected_profile_options, n_start_value, n_end_value, n_depth, upload_state, vertical, start_value, end_value, depth, session_id, n_clicks_cross + global AppData + AppDataLocal = get_AppData(AppData, session_id) + + trigger = get_trigger() + if (!isnothing(n_clicks)) + AppDataUser = get_AppDataUser(AppData, session_id) + + # extract numerical values of start & end + start_val, end_val = extract_start_end_values(start_value, end_value) + if vertical==true + depth = nothing + end + + profile = ProfileUser(number=0, start_lonlat=start_val, end_lonlat=end_val, vertical=vertical, depth=depth) + + if !isnothing(selected_profile) + if selected_profile>0 + if hasfield(typeof(AppDataUser),:Profiles) + number_profiles = get_number_profiles(AppDataUser.Profiles) # get numbers + id = findall(number_profiles .== selected_profile) + if !isempty(id) + profile = deepcopy(AppDataUser.Profiles[id[1]]) + profile.number = 0 + + end + end + end + end + + + AppDataUser.Profiles[1] = profile + AppData = set_AppDataUser(AppData, session_id, AppDataUser) + AppDataLocal = get_AppData(AppData, session_id) + AppDataLocal = update_profile(AppDataLocal, profile, num=0) + AppData = add_AppData(AppData, session_id, AppDataLocal) + + fig_topo = plot_topo(AppDataLocal) + but_add_prof_disabled=false + but_up_prof_disabled=false + but_del_prof_disabled=false + + else + fig_topo = []; + but_add_prof_disabled = true + but_up_prof_disabled = true + but_del_prof_disabled = true + end + if isnothing(n_clicks_cross) + n_clicks_cross=0 + else + n_clicks_cross += 1 + end + + #selected_profile = 0 + return fig_topo, but_add_prof_disabled, but_up_prof_disabled, but_del_prof_disabled, selected_profile, n_clicks_cross +end + + + +# open/close Curve interpretation box +callback!(app, + Output("collapse", "is_open"), + [Input("button-curve-interpretation", "n_clicks")], + [State("collapse", "is_open")], ) do n, is_open + + if isnothing(n); n=0 end + + if n>0 + if is_open==1 + is_open = 0 + elseif is_open==0 + is_open = 1 + end + end + return is_open + +end + +# open/close EQ interpretation box +callback!(app, + Output("collapse-EQ", "is_open"), + [Input("button-EQ", "n_clicks")], + [State("collapse-EQ", "is_open")], ) do n, is_open + + if isnothing(n); n=0 end + + if n>0 + if is_open==1 + is_open = 0 + elseif is_open==0 + is_open = 1 + end + end + return is_open +end + +# open/close Surfaces box +callback!(app, + Output("collapse-Surfaces", "is_open"), + [Input("button-Surfaces", "n_clicks")], + [State("collapse-Surfaces", "is_open")], ) do n, is_open + + if isnothing(n); n=0 end + + if n>0 + if is_open==1 + is_open = 0 + elseif is_open==0 + is_open = 1 + end + end + return is_open +end + +# open/close screenshot box +callback!(app, + Output("collapse-Screenshots", "is_open"), + [Input("button-Screenshots", "n_clicks")], + [State("collapse-Screenshots", "is_open")], ) do n, is_open + + if isnothing(n); n=0 end + + if n>0 + if is_open==1 + is_open = 0 + elseif is_open==0 + is_open = 1 + end + end + return is_open +end + +# open/close tomography box +callback!(app, + Output("collapse-Tomography", "is_open"), + [Input("button-Tomography", "n_clicks")], + [State("collapse-Tomography", "is_open")], ) do n, is_open + + if isnothing(n); n=0 end + + if n>0 + if is_open==1 + is_open = 0 + elseif is_open==0 + is_open = 1 + end + end + return is_open +end + +# open/close Curve interpretation box +callback!(app, + Output("input-depth", "disabled"), + [Input("checklist_orientation", "value")] ) do vertical + + if isnothing(vertical); vertical=true; end + + return vertical +end + +callback!(app, Output("cross_section", "figure"), + Output("3D-selected_curves","options"), + Output("curves-to-be-exported","options"), + Output("3D-selected_curves_surf","options"), + Input("button-plot-cross_section","n_clicks"), + State("dropdown_field","value"), + State("colorbar-slider", "value"), + State("session-id","data"), + State("selected_profile","value"), + State("colormaps_cross","value"), + State("screenshot-display","value"), + State("screenshot-opacity","value"), + State("tomography-opacity","value"), + State("EQ-display","value"), + State("Surfaces-display","value"), + State("selected_Surface-data","value"), + State("selected_EQ-data","value"), + State("EQ-section_width","value"), + State("EQ-minMag","value"), + State("EQ-maxMag","value"), + + ) do n_clicks, field, colorbar_value, session_id, selected_profile, colormap_field, screenshot_display, screenshot_opacity, cross_section_opacity, + plot_earthquakes, plot_surfaces, selected_surf_data, selected_EQ_data, section_width, + EQ_minMag, EQ_maxMag + + AppDataLocal = get_AppData(AppData, session_id) + + profile = get_active_profile(AppData, session_id, selected_profile) + @show profile session_id + if (n_clicks>0) && !isnothing(profile) + @show profile + fig_cross = plot_cross(AppDataLocal, profile, zmin=colorbar_value[1], zmax=colorbar_value[2], field=Symbol(field), colormap=colormap_field, + screenshot_display=screenshot_display, screenshot_opacity=screenshot_opacity, + cross_section_opacity=cross_section_opacity, + plot_surfaces = plot_surfaces, selected_surf_data= selected_surf_data, + plot_earthquakes=plot_earthquakes,selected_EQ_data=selected_EQ_data, + section_width=section_width, EQmag = (EQ_minMag,EQ_maxMag), + ) + + curve_names = get_curve_names(AppDataLocal.AppDataUser.Profiles) + @show keys(fig_cross) + else + fig_cross = [] + curve_names = [] + end + + return fig_cross, curve_names, curve_names, curve_names +end + + +callback!(app, Output("button-add-curve","n_clicks"), + Output("selected_curves","options"), + Input("button-add-curve","n_clicks"), + Input("button-clear-curve","n_clicks"), + Input("button-update-curve","n_clicks"), + Input("button-copy-curve","n_clicks"), + Input("button-paste-curve","n_clicks"), + Input("cross_section","figure"), + Input("cross_section", "relayoutData"), + State("session-id","data"), + State("selected_profile","value"), + State("selected_curves","options"), + State("shape-name", "value"), + State("shape-color","value"), + State("selected_curves","value") + ) do n_add, n_del, n_update, n_copy, n_paste, fig_cross, fig_selected_data, session_id, selected_profile, curve_names, name, + color, selected_curves + global AppData + AppDataLocal = get_AppData(AppData, session_id) + + trigger = get_trigger() + shapes = get_current_shapes(fig_cross) + profile = get_active_profile(AppData, session_id, selected_profile) + + # update options + curve_names = polygon_names(profile) + + if profile != [] + if trigger == "button-add-curve.n_clicks" + + # create a curve struct from the latest shape + if !isempty(shapes) + curve = set_curve(shapes[end], profile; name=name, color=color, linewidth=1) + + # ensure that a curve with this name does not yet exist + if !any(curve_names .== curve.name) + push!(profile.Polygons, curve) + end + end + + elseif trigger == "button-clear-curve.n_clicks" + id = findall(curve_names .== selected_curves) + if !isempty(id) + deleteat!(profile.Polygons, id) + println("deleted curve") + end + + elseif trigger == "button-update-curve.n_clicks" + id = findall(curve_names .== selected_curves) + if !isempty(id) + curve_names_selected = String.(keys(fig_selected_data)) + curve = profile.Polygons[id[1]] + if any(contains.(curve_names_selected,"shapes[")) + # Update data & color + shape = fig_selected_data[Symbol(curve_names_selected[1])] + curve.data = shape + curve.shape = merge(curve.shape, (data_curve=shape, )) + update_curve!(curve, profile) # update lon/lat/depth + println("updated data on curve") + end + curve.color = color + + profile.Polygons[id[1]] = curve + println("updated curve: $selected_curves") + end + + elseif trigger == "button-copy-curve.n_clicks" + println("button-copy-curve.n_clicks") + id = findall(curve_names .== selected_curves) + if !isempty(id) + curve = deepcopy(profile.Polygons[id[1]]) + AppDataUser = get_AppDataUser(AppData, session_id) + AppDataUser = merge(AppDataUser, (copy=curve,)) + AppData = set_AppDataUser(AppData, session_id, AppDataUser) + + println("copied curve: $selected_curves") + end + elseif trigger == "button-paste-curve.n_clicks" + + # ensure that a curve with this name does not yet exist + AppDataUser = get_AppDataUser(AppData, session_id) + profile = get_active_profile(AppData, session_id, selected_profile) + if AppDataUser.copy != [] + curve = AppDataUser.copy + update_curve!(curve, profile) # update lon/lat/depth + + push!(profile.Polygons, curve) + println("pasted curve: $selected_curves") + end + + end + + end + + curve_names = polygon_names(profile) + + return n_add, curve_names +end + + + +# export/import button & field +callback!(app, + Output("collapse-export-import", "is_open"), + [Input("button-export-import", "n_clicks")], + [State("collapse-export-import", "is_open")], ) do n, is_open + + if isnothing(n); n=0 end + + if n>0 + if is_open==1 + is_open = 0 + elseif is_open==0 + is_open = 1 + end + end + return is_open +end + + + +# Export curves to disk +callback!(app, + Output("export-curves", "n_clicks"), + Output("download-curves", "data"), + Input("export-curves", "n_clicks"), + State("curves-to-be-exported", "value"), + State("session-id","data"), + prevent_initial_call=true + ) do n_clicks, selected_curves, session_id + + global AppData + AppDataUser = get_AppDataUser(AppData, session_id) + Profiles = AppDataUser.Profiles + + SaveData = NamedTuple() + for curve_name in selected_curves + data_NT = retrieve_curves(Profiles, curve_name) + + SaveData = merge(SaveData, data_NT) + end + + # export this to local disk + save("ExportCurves.jld2", "Data",SaveData) + file_data = read("ExportCurves.jld2") + + # Save data to file + println("Downloading the selected curves to file: ExportCurves.jld2"); + println("Open this with:"); + println("julia> using JLD2, GeophysicalModelGenerator"); + println("julia> curves = load_object(\"ExportCurves.jld2\")"); + println("curves is a NamedTuple with the selected curves (vectors with different curves) the curves") + + return n_clicks, dcc_send_bytes(file_data, "ExportCurves.jld2") +end + + +# Export profiles to disk +callback!(app, + Output("button-export-profiles", "n_clicks"), + Output("download-profiles", "data"), + Input("button-export-profiles", "n_clicks"), + State("session-id","data"), + prevent_initial_call=true + ) do n_clicks, session_id + + global AppData + AppDataUser = get_AppDataUser(AppData, session_id) + Profiles = AppDataUser.Profiles + + # export this to local disk + save("ExportProfiles.jld2", "Profiles",Profiles) + file_data = read("ExportProfiles.jld2") + + # Save data to file + println("Downloading the exported profiles to file: ExportProfiles.jld2"); + println("Open this with:"); + println("julia> using JLD2, GeophysicalModelGenerator"); + println("julia> Profiles = load_object(\"ExportProfiles.jld2\")"); + println("Profiles is a NamedTuple with the selected profiles and curves") + println("You can import it again at a later stage & overwrite the current profiles") + + + return n_clicks, dcc_send_bytes(file_data, "ExportProfiles.jld2") +end + + +# Import profiles from disk +callback!(app, + Output("upload-profiles_n", "children"), + Output("upload-profiles_component","children"), # this is a bug workaround - see https://github.com/plotly/dash-core-components/issues/816 + Input("upload-profiles", "contents"), + State("upload-profiles", "filename"), + State("upload-profiles", "last_modified"), + State("session-id", "data"), + prevent_initial_call=true + ) do contents,filename, last_modified, session_id + global AppData + + @show filename, contents + children = "" + if !(contents isa Nothing) + println("uploading Profiles with filename $filename") + + # process uploaded binary stream and save it to file + filename_dir = parse_uploaded_jld2_file(contents, filename, "uploaded_data_profiles"); + + Profiles_uploaded = load_object(filename_dir) + + # do some basic checking + if !isa(Profiles_uploaded, Vector{ProfileUser}) + error("Profiles_uploaded appears to not have the correct type") + else + println("Uploading profiles:") + for prof in Profiles_uploaded + println(" $(prof.name)") + end + end + AppDataUser = get_AppDataUser(AppData, session_id) + + # Merge the new profiles with the existing ones if the coordinates match + Profiles_existing = AppDataUser.Profiles + for prof_upload in Profiles_uploaded + for (i,prof_exist) in enumerate(Profiles_existing) + if prof_exist.start_lonlat == prof_upload.start_lonlat && + prof_exist.end_lonlat == prof_upload.end_lonlat + Profiles_existing[i] = prof_upload; + end + end + end + + for prof in Profiles_existing + Profiles_uploaded = push!(Profiles_uploaded, prof) + end + Profiles_uploaded = unique(Profiles_uploaded) + + # Save data into global structure + AppDataUser = merge(AppDataUser, (Profiles=Profiles_uploaded,)) + AppData = set_AppDataUser(AppData, session_id, AppDataUser) + + println("Merge new profiles with existing ones (replacing the ones with duplicate names)") + children = zip(contents, filename, last_modified) + + return children, dcc_upload(id="upload-profiles", children=dbc_button("Import Profiles")) + end + + return nothing +end + + + + + +return app + +end \ No newline at end of file diff --git a/src/GMG_Tomo/Tab_Setup.jl b/src/GMG_Tomo/Tab_Setup.jl index 139ae36..c595e96 100644 --- a/src/GMG_Tomo/Tab_Setup.jl +++ b/src/GMG_Tomo/Tab_Setup.jl @@ -1,5 +1,5 @@ # Tab 2 -function Tab_Data(Datasets) +function tab_data(Datasets) dbc_col([ dbc_row([dbc_label("id=",id="label-id")]), diff --git a/src/GMG_Tomo/Tab_Setup_Callbacks.jl b/src/GMG_Tomo/Tab_Setup_Callbacks.jl index 87a48c6..1d3acfe 100644 --- a/src/GMG_Tomo/Tab_Setup_Callbacks.jl +++ b/src/GMG_Tomo/Tab_Setup_Callbacks.jl @@ -21,7 +21,8 @@ callback!(app, Output("setup-button", "n_clicks"), Output("button-plot-topography", "n_clicks"), Output("button-plot-topography", "disabled"), Output("tabs","activ_tab"), - Output("dropdown_field", "options"), + Output("dropdown_field", "options"), + Output("dropdown_fieldII", "options"), Output("loading-output-1","children"), Output("selected_EQ-data", "options"), Output("selected_Surface-data", "options"), @@ -133,7 +134,7 @@ callback!(app, Output("setup-button", "n_clicks"), end - return n+1, n_topo, plot_button_topo_disabled, active_tab, options_fields, "", + return n+1, n_topo, plot_button_topo_disabled, active_tab, options_fields, options_fields, "", options_EQ_fields, options_Surf_fields,options_EQ_fields, options_Surf_fields end diff --git a/src/GMG_Tomo/utils_curves.jl b/src/GMG_Tomo/utils_curves.jl index 955ead9..b9a9352 100644 --- a/src/GMG_Tomo/utils_curves.jl +++ b/src/GMG_Tomo/utils_curves.jl @@ -173,6 +173,7 @@ function polygon_names(profile::ProfileUser) return poly_names end +### WHAT IS HAPPENING BELOW? polygon_names(profile::Nothing) = [] @@ -189,6 +190,7 @@ function mesh_names(profile::ProfileUser) return poly_names end +### WHAT IS HAPPENING BELOW? polygon_names(mesh::Nothing) = [] diff --git a/src/GeoDataPicker.jl b/src/GeoDataPicker.jl index 27c59c3..45c70ef 100644 --- a/src/GeoDataPicker.jl +++ b/src/GeoDataPicker.jl @@ -18,6 +18,7 @@ include("GMG_Tomo/utils.jl") include("GMG_Tomo/utils_curves.jl") include("GMG_Tomo/GMG_TomoData_Plots.jl") include("GMG_Tomo/Tab_CrossSections.jl") +include("GMG_Tomo/Tab_Map.jl") include("GMG_Tomo/Tab_3Dview.jl") include("GMG_Tomo/Tab_Setup.jl") include("GMG_Tomo/GMG_TomoData.jl") @@ -45,7 +46,9 @@ function GMG_TomoData(; Datasets = Default_datasets(dir = pkgdir(GeoDataPicker)) # Setup main app #app = dash(external_stylesheets=[dbc_themes.CYBORG]) - app = dash(external_stylesheets = [dbc_themes.BOOTSTRAP], prevent_initial_callbacks=false) + app = dash(external_stylesheets = [dbc_themes.SANDSTONE], prevent_initial_callbacks=false) + + # full list of themes: CERULEAN, COSMO, CYBORG, DARKLY, FLATLY, JOURNAL, LITERA, LUMEN, LUX, MATERIA, MINTY, MORPH, PULSE, QUARTZ, SANDSTONE, SIMPLEX, SKETCHY, SLATE, SOLAR, SPACELAB, SUPERHERO, UNITED, VAPOR, YETI, ZEPHYR app.title = "GMG Data Picker" app.layout = main_layout(Datasets, max_num_users) diff --git a/src/assets/GMG_Logo_new.png b/src/assets/GMG_Logo_new.png new file mode 100644 index 0000000..b12fffb Binary files /dev/null and b/src/assets/GMG_Logo_new.png differ diff --git a/src/assets/LogoPicker.png b/src/assets/LogoPicker.png new file mode 100644 index 0000000..63788e2 Binary files /dev/null and b/src/assets/LogoPicker.png differ diff --git a/src/download_GMG_temp.jld2 b/src/download_GMG_temp.jld2 new file mode 100644 index 0000000..070dcfc Binary files /dev/null and b/src/download_GMG_temp.jld2 differ