diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 0000000..fa0f909 --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,40 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + test: + name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} + strategy: + fail-fast: false + matrix: + version: ['1.10', '1.9'] + os: [ubuntu-latest, macos-latest, windows-latest] + arch: [x64] + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v4 + + + - uses: julia-actions/setup-julia@v1 + with: + version: ${{ matrix.version }} + arch: ${{ matrix.arch }} + + - uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Install matplotlib + run: pip install matplotlib + + - name: Build Julia package + uses: julia-actions/julia-buildpkg@v1 + + - name: Run tests + uses: julia-actions/julia-runtest@v1 \ No newline at end of file diff --git a/.github/workflows/Documentation.yml b/.github/workflows/Documentation.yml new file mode 100644 index 0000000..5c27c20 --- /dev/null +++ b/.github/workflows/Documentation.yml @@ -0,0 +1,55 @@ +name: Documentation + +on: + pull_request: + branches: + - main + + push: + branches: + - main + tags: '*' + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: julia-actions/setup-julia@latest + with: + version: '1.9' + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Install Python dependencies + run: | + python -m pip install --upgrade pip + pip install matplotlib + + - name: Configure PyCall + run: | + echo "ENV[\"PYTHON\"] = \"$(which python)\"" >> julia-python.jl + cat julia-python.jl + - name: Install dependencies + env: + PYTHON: "" # rebulid PyCall + run: | + julia --project=docs -e ' + using Pkg + Pkg.develop(PackageSpec(path=pwd())) + Pkg.build("PyCall") # rebuild PyCall + Pkg.instantiate() + ' + + # - name: Install dependencies + # run: julia --color=yes --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()' + + - name: Build and deploy docs + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # For authentication with GitHub Actions token + DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} # For authentication with SSH deploy key + PYTHON: "" + run: julia --color=yes --project=docs/ docs/make.jl diff --git a/Manifest.toml b/Manifest.toml index 6fde1a7..5c58ecf 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -2,7 +2,7 @@ julia_version = "1.9.4" manifest_format = "2.0" -project_hash = "7e152d2d35411584ff1aff678a180e8b7b17745d" +project_hash = "42e8d2375f7ac41097869299af750f2164bd0eb4" [[deps.AMD]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"] @@ -28,24 +28,24 @@ uuid = "7f219486-4aa7-41d6-80a7-e08ef20ceed7" version = "0.8.2" [[deps.Accessors]] -deps = ["CompositionsBase", "ConstructionBase", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown"] -git-tree-sha1 = "b392ede862e506d451fc1616e79aa6f4c673dab8" +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "0ba8f4c1f06707985ffb4804fdad1bf97b233897" uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" -version = "0.1.38" +version = "0.1.41" [deps.Accessors.extensions] - AccessorsAxisKeysExt = "AxisKeys" - AccessorsDatesExt = "Dates" - AccessorsIntervalSetsExt = "IntervalSets" - AccessorsStaticArraysExt = "StaticArrays" - AccessorsStructArraysExt = "StructArrays" - AccessorsTestExt = "Test" - AccessorsUnitfulExt = "Unitful" + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" [deps.Accessors.weakdeps] AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" - Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Requires = "ae029012-a4dd-5104-9daa-d747884805df" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" @@ -54,12 +54,13 @@ version = "0.1.38" [[deps.Adapt]] deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "50c3c56a52972d78e8be9fd135bfb91c9574c140" +git-tree-sha1 = "cd8b948862abee8f3d3e9b73a102a9ca924debb0" uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.1.1" -weakdeps = ["StaticArrays"] +version = "4.2.0" +weakdeps = ["SparseArrays", "StaticArrays"] [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" AdaptStaticArraysExt = "StaticArrays" [[deps.AliasTables]] @@ -69,9 +70,9 @@ uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" version = "1.1.3" [[deps.ArgCheck]] -git-tree-sha1 = "a3a402a35a2f7e0b87828ccabbd5ebfbebe356b4" +git-tree-sha1 = "680b3b8759bd4c54052ada14e52355ab69e07876" uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" -version = "2.3.0" +version = "2.4.0" [[deps.ArgTools]] uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" @@ -209,32 +210,37 @@ version = "0.1.1" [[deps.CUDA]] deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CUDA_Driver_jll", "CUDA_Runtime_Discovery", "CUDA_Runtime_jll", "Crayons", "DataFrames", "ExprTools", "GPUArrays", "GPUCompiler", "KernelAbstractions", "LLVM", "LLVMLoopInfo", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "NVTX", "Preferences", "PrettyTables", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "StaticArrays", "Statistics"] -git-tree-sha1 = "baa8ea7a1ea63316fa3feb454635215773c9c845" +git-tree-sha1 = "fdd9dfb67dfefd548f51000cc400bb51003de247" uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" -version = "5.2.0" -weakdeps = ["ChainRulesCore", "SpecialFunctions"] +version = "5.4.3" [deps.CUDA.extensions] ChainRulesCoreExt = "ChainRulesCore" + EnzymeCoreExt = "EnzymeCore" SpecialFunctionsExt = "SpecialFunctions" + [deps.CUDA.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + [[deps.CUDA_Driver_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] -git-tree-sha1 = "d01bfc999768f0a31ed36f5d22a76161fc63079c" +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "325058b426c2b421e3d2df3d5fa646d72d2e3e7e" uuid = "4ee394cb-3365-5eb0-8335-949819d2adfc" -version = "0.7.0+1" +version = "0.9.2+0" [[deps.CUDA_Runtime_Discovery]] deps = ["Libdl"] -git-tree-sha1 = "38f830504358e9972d2a0c3e5d51cb865e0733df" +git-tree-sha1 = "33576c7c1b2500f8e7e6baa082e04563203b3a45" uuid = "1af6417a-86b4-443c-805f-a4643ffb695f" -version = "0.2.4" +version = "0.3.5" [[deps.CUDA_Runtime_jll]] deps = ["Artifacts", "CUDA_Driver_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "8e25c009d2bf16c2c31a70a6e9e8939f7325cc84" +git-tree-sha1 = "afea94249b821dc754a8ca6695d3daed851e1f5a" uuid = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" -version = "0.11.1+0" +version = "0.14.1+0" [[deps.CatIndices]] deps = ["CustomUnitRanges", "OffsetArrays"] @@ -244,9 +250,9 @@ version = "0.2.2" [[deps.ChainRulesCore]] deps = ["Compat", "LinearAlgebra"] -git-tree-sha1 = "3e4b134270b372f2ed4d4d0e936aabaefc1802bc" +git-tree-sha1 = "1713c74e00545bfe14605d2a2be1712de8fbcb58" uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.25.0" +version = "1.25.1" weakdeps = ["SparseArrays"] [deps.ChainRulesCore.extensions] @@ -260,15 +266,15 @@ version = "0.1.13" [[deps.CodecZlib]] deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "bce6804e5e6044c6daab27bb533d1295e4a2e759" +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.6" +version = "0.7.8" [[deps.ColorSchemes]] deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] -git-tree-sha1 = "c785dfb1b3bfddd1da557e861b919819b82bbe5b" +git-tree-sha1 = "403f2d8e209681fcbd9468a8514efff3ea08452e" uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.27.1" +version = "3.29.0" [[deps.ColorTypes]] deps = ["FixedPointNumbers", "Random"] @@ -323,9 +329,9 @@ version = "0.3.2" [[deps.ConcurrentUtilities]] deps = ["Serialization", "Sockets"] -git-tree-sha1 = "ea32b83ca4fefa1768dc84e504cc0a94fb1ab8d1" +git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd" uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" -version = "2.4.2" +version = "2.5.0" [[deps.Conda]] deps = ["Downloads", "JSON", "VersionParsing"] @@ -432,9 +438,9 @@ uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" [[deps.Distributions]] deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "3101c32aab536e7a27b1763c0797dba151b899ad" +git-tree-sha1 = "0b4190661e8a4e51a842070e7dd4fae440ddb7f4" uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.113" +version = "0.25.118" [deps.Distributions.extensions] DistributionsChainRulesCoreExt = "ChainRulesCore" @@ -459,9 +465,9 @@ version = "1.6.0" [[deps.ExceptionUnwrapping]] deps = ["Test"] -git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" +git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" -version = "0.1.10" +version = "0.1.11" [[deps.ExprTools]] git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" @@ -476,15 +482,15 @@ version = "0.3.2" [[deps.FFTW]] deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] -git-tree-sha1 = "4820348781ae578893311153d69049a93d05f39d" +git-tree-sha1 = "7de7c78d681078f027389e067864a8d53bd7c3c9" uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" -version = "1.8.0" +version = "1.8.1" [[deps.FFTW_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "4d81ed14783ec49ce9f2e168208a12ce1815aa25" uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" -version = "3.3.10+1" +version = "3.3.10+3" [[deps.FLoops]] deps = ["BangBang", "Compat", "FLoopsBase", "InitialValues", "JuliaVariables", "MLStyle", "Serialization", "Setfield", "Transducers"] @@ -505,9 +511,13 @@ version = "0.3.2" [[deps.FileIO]] deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "62ca0547a14c57e98154423419d8a342dca75ca9" +git-tree-sha1 = "b66970a70db13f45b7e57fbda1736e1cf72174ea" uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.16.4" +version = "1.17.0" +weakdeps = ["HTTP"] + + [deps.FileIO.extensions] + HTTPExt = "HTTP" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" @@ -532,9 +542,9 @@ version = "0.5.0" [[deps.Functors]] deps = ["LinearAlgebra"] -git-tree-sha1 = "166c544477f97bbadc7179ede1c1868e0e9b426b" +git-tree-sha1 = "64d8e93700c7a3f28f717d265382d52fac9fa1c1" uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" -version = "0.4.7" +version = "0.4.12" [[deps.Future]] deps = ["Random"] @@ -553,10 +563,10 @@ uuid = "46192b85-c4d5-4398-a991-12ede77f4527" version = "0.1.6" [[deps.GPUCompiler]] -deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "Scratch", "TimerOutputs", "UUIDs"] -git-tree-sha1 = "a846f297ce9d09ccba02ead0cae70690e072a119" +deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "Preferences", "Scratch", "Serialization", "TOML", "TimerOutputs", "UUIDs"] +git-tree-sha1 = "ab29216184312f99ff957b32cd63c2fe9c928b91" uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" -version = "0.25.0" +version = "0.26.7" [[deps.HDF5]] deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"] @@ -572,15 +582,15 @@ version = "0.17.2" [[deps.HDF5_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] -git-tree-sha1 = "82a471768b513dc39e471540fdadc84ff80ff997" +git-tree-sha1 = "e94f84da9af7ce9c6be049e9067e511e17ff89ec" uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" -version = "1.14.3+3" +version = "1.14.6+0" [[deps.HTTP]] -deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] -git-tree-sha1 = "1336e07ba2eb75614c99496501a8f4b233e9fafe" +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "c67b33b085f6e2faf8bf79a61962e7339a81129c" uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "1.10.10" +version = "1.10.15" [[deps.Hiccup]] deps = ["MacroTools", "Test"] @@ -596,15 +606,15 @@ version = "0.1.17" [[deps.Hwloc_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "50aedf345a709ab75872f80a2779568dc0bb461b" +git-tree-sha1 = "f93a9ce66cd89c9ba7a4695a47fd93b4c6bc59fa" uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" -version = "2.11.2+1" +version = "2.12.0+0" [[deps.HypergeometricFunctions]] deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] -git-tree-sha1 = "b1c2585431c382e3fe5805874bda6aea90a95de9" +git-tree-sha1 = "2bd56245074fab4015b9174f24ceba8293209053" uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" -version = "0.3.25" +version = "0.3.27" [[deps.IfElse]] git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" @@ -625,9 +635,9 @@ version = "0.3.12" [[deps.ImageCore]] deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] -git-tree-sha1 = "b219503865f42a12ad20ea67082e0fdb69b73ad9" +git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3" uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" -version = "0.10.3" +version = "0.10.5" [[deps.ImageDistances]] deps = ["Distances", "ImageCore", "ImageMorphology", "LinearAlgebra", "Statistics"] @@ -637,9 +647,9 @@ version = "0.2.17" [[deps.ImageFiltering]] deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "PrecompileTools", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"] -git-tree-sha1 = "432ae2b430a18c58eb7eca9ef8d0f2db90bc749c" +git-tree-sha1 = "33cb509839cc4011beb45bde2316e64344b0f92b" uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" -version = "0.7.8" +version = "0.7.9" [[deps.ImageGeoms]] deps = ["FillArrays", "LazyGrids", "Requires"] @@ -671,9 +681,9 @@ uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" version = "0.3.1" [[deps.InlineStrings]] -git-tree-sha1 = "45521d31238e87ee9f9732561bfee12d4eebd52d" +git-tree-sha1 = "6a9fde685a7ac1eb3495f8e812c5a7c3711c2d5e" uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" -version = "1.4.2" +version = "1.4.3" [deps.InlineStrings.extensions] ArrowTypesExt = "ArrowTypes" @@ -685,9 +695,9 @@ version = "1.4.2" [[deps.IntelOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "10bd689145d2c3b2a9844005d01087cc1194e79e" +git-tree-sha1 = "0f14a5456bdc6b9731a5682f439a672750a09e48" uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2024.2.1+0" +version = "2025.0.4+0" [[deps.Interact]] deps = ["CSSUtil", "InteractBase", "JSON", "Knockout", "Observables", "OrderedCollections", "Reexport", "WebIO", "Widgets"] @@ -737,14 +747,14 @@ weakdeps = ["Dates", "Test"] InverseFunctionsTestExt = "Test" [[deps.InvertedIndices]] -git-tree-sha1 = "0dc7b50b8d436461be01300fd8cd45aa0274b038" +git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe" uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" -version = "1.3.0" +version = "1.3.1" [[deps.IrrationalConstants]] -git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +git-tree-sha1 = "e2222959fbc6c19554dc15174c81bf7bf3aa691c" uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.2.2" +version = "0.2.4" [[deps.IterTools]] git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" @@ -764,9 +774,9 @@ version = "1.0.0" [[deps.JLLWrappers]] deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "be3dc50a92e5a386872a493a10050136d4703f9b" +git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.6.1" +version = "1.7.0" [[deps.JSExpr]] deps = ["JSON", "MacroTools", "Observables", "WebIO"] @@ -799,10 +809,10 @@ uuid = "f7e6163d-2fa5-5f23-b69c-1db539e41963" version = "0.1.0+0" [[deps.KernelAbstractions]] -deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] -git-tree-sha1 = "e73a077abc7fe798fe940deabe30ef6c66bdde52" +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] +git-tree-sha1 = "80d268b2f4e396edc5ea004d1e0f569231c71e9e" uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" -version = "0.9.29" +version = "0.9.34" [deps.KernelAbstractions.extensions] EnzymeExt = "EnzymeCore" @@ -856,17 +866,11 @@ version = "0.8.0" [deps.KomaMRIPlots.weakdeps] PlutoPlotly = "8e989ff0-3d88-8e9f-f020-2b208a939ff0" -[[deps.LDLFactorizations]] -deps = ["AMD", "LinearAlgebra", "SparseArrays", "Test"] -git-tree-sha1 = "70f582b446a1c3ad82cf87e62b878668beef9d13" -uuid = "40e66cde-538c-5869-a4ad-c39174c6795b" -version = "0.10.1" - [[deps.LLVM]] deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Requires", "Unicode"] -git-tree-sha1 = "839c82932db86740ae729779e610f07a1640be9a" +git-tree-sha1 = "020abd49586480c1be84f57da0017b5d3db73f7c" uuid = "929cbde3-209d-540e-8aea-75f648917ca0" -version = "6.6.3" +version = "8.0.0" weakdeps = ["BFloat16s"] [deps.LLVM.extensions] @@ -874,9 +878,9 @@ weakdeps = ["BFloat16s"] [[deps.LLVMExtra_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "88b916503aac4fb7f701bb625cd84ca5dd1677bc" +git-tree-sha1 = "c2636c264861edc6d305e6b4d528f09566d24c5e" uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" -version = "0.0.29+0" +version = "0.0.30+0" [[deps.LLVMLoopInfo]] git-tree-sha1 = "2e5c102cfc41f48ae4740c7eca7743cc7e7b75ea" @@ -939,9 +943,9 @@ uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" [[deps.Libiconv_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "61dfdba58e585066d8bce214c5a51eaa0539f269" +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" -version = "1.17.0+1" +version = "1.18.0+0" [[deps.LightXML]] deps = ["Libdl", "XML2_jll"] @@ -972,14 +976,20 @@ weakdeps = ["FFTW", "NFFT", "Wavelets"] LinearOperatorWaveletExt = "Wavelets" [[deps.LinearOperators]] -deps = ["FastClosures", "LDLFactorizations", "LinearAlgebra", "Printf", "Requires", "SparseArrays", "TimerOutputs"] -git-tree-sha1 = "f06df3a46255879cbccae1b5b6dcb16994c31be7" +deps = ["FastClosures", "LinearAlgebra", "Printf", "Requires", "SparseArrays", "TimerOutputs"] +git-tree-sha1 = "f55281226cdae8edea2c850fda88d8f5a03485b6" uuid = "5c8ed15e-5a4c-59e4-a42b-c7e8811fb125" -version = "2.7.0" -weakdeps = ["ChainRulesCore"] +version = "2.9.0" [deps.LinearOperators.extensions] + LinearOperatorsCUDAExt = "CUDA" LinearOperatorsChainRulesCoreExt = "ChainRulesCore" + LinearOperatorsLDLFactorizationsExt = "LDLFactorizations" + + [deps.LinearOperators.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + LDLFactorizations = "40e66cde-538c-5869-a4ad-c39174c6795b" [[deps.LogExpFunctions]] deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] @@ -1039,15 +1049,15 @@ weakdeps = ["FillArrays"] [[deps.MAT]] deps = ["BufferedStreams", "CodecZlib", "HDF5", "SparseArrays"] -git-tree-sha1 = "ed1cf0a322d78cee07718bed5fd945e2218c35a1" +git-tree-sha1 = "1d2dd9b186742b0f317f2530ddcbf00eebb18e96" uuid = "23992714-dd62-5051-b70f-ba57cb901cac" -version = "0.10.6" +version = "0.10.7" [[deps.MKL_jll]] deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] -git-tree-sha1 = "f046ccd0c6db2832a9f639e2c669c6fe867e5f4f" +git-tree-sha1 = "5de60bc6cb3899cd318d80d627560fae2e2d99ae" uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -version = "2024.2.0+0" +version = "2025.0.1+1" [[deps.MLStyle]] git-tree-sha1 = "bc38dff0548128765760c79eb7388a4b37fae2c8" @@ -1056,9 +1066,9 @@ version = "0.4.17" [[deps.MPICH_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "7715e65c47ba3941c502bffb7f266a41a7f54423" +git-tree-sha1 = "3aa3210044138a1749dbd350a9ba8680869eb503" uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" -version = "4.2.3+0" +version = "4.3.0+1" [[deps.MPIPreferences]] deps = ["Libdl", "Preferences"] @@ -1068,15 +1078,15 @@ version = "0.1.11" [[deps.MPItrampoline_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "70e830dab5d0775183c99fc75e4c24c614ed7142" +git-tree-sha1 = "ff91ca13c7c472cef700f301c8d752bc2aaff1a8" uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" -version = "5.5.1+0" +version = "5.5.3+0" [[deps.MRIBase]] deps = ["AbstractNFFTs", "LinearAlgebra", "NFFTTools"] -git-tree-sha1 = "a96ba4ecb38712ebc395891e375dac99adb8bd72" +git-tree-sha1 = "57979500dbdd130fc92359f1ecd6714051ed78eb" uuid = "f7771a9a-6e57-4e71-863b-6e4b6a2f17df" -version = "0.4.2" +version = "0.4.4" [[deps.MRICoilSensitivities]] deps = ["FFTW", "FLoops", "LinearAlgebra", "MRIBase", "Printf", "Reexport"] @@ -1104,9 +1114,9 @@ version = "0.2.1" [[deps.MRIReco]] deps = ["AxisArrays", "FLoops", "LinearAlgebra", "MRIBase", "MRIOperators", "PrecompileTools", "ProgressMeter", "Random", "Reexport", "RegularizedLeastSquares", "Unitful"] -git-tree-sha1 = "648ebc967ac4d42fdd57c12a9918a1119a7cbf9a" +git-tree-sha1 = "bcfb3ad4f2d515d5495eb7191cdfe4ec109cf3f6" uuid = "bdf86e05-2d2b-5731-a332-f3fe1f9e047f" -version = "0.8.1" +version = "0.8.0" [[deps.MRISimulation]] deps = ["LinearAlgebra", "MRIBase", "MRIOperators", "Printf", "ProgressMeter", "Reexport", "StatsBase"] @@ -1115,10 +1125,9 @@ uuid = "8988da37-ea20-4fa6-9af7-8a6f6f9a8970" version = "0.1.2" [[deps.MacroTools]] -deps = ["Markdown", "Random"] -git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" +git-tree-sha1 = "72aebe0b5051e5143a079a4685a46da330a40472" uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.13" +version = "0.5.15" [[deps.ManualMemory]] git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" @@ -1164,9 +1173,9 @@ version = "0.2.0" [[deps.MicrosoftMPI_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "f12a29c4400ba812841c6ace3f4efbb6dbb3ba01" +git-tree-sha1 = "bc95bf4149bf535c09602e3acdf950d9b4376227" uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" -version = "10.1.4+2" +version = "10.1.4+3" [[deps.Missings]] deps = ["DataAPI"] @@ -1217,15 +1226,15 @@ version = "0.2.6" [[deps.NVTX]] deps = ["Colors", "JuliaNVTXCallbacks_jll", "Libdl", "NVTX_jll"] -git-tree-sha1 = "53046f0483375e3ed78e49190f1154fa0a4083a1" +git-tree-sha1 = "6a6f8bfaa91bb2e40ff562ab9f30dc827741daef" uuid = "5da4648a-3479-48b8-97b9-01cb529c0a1f" -version = "0.3.4" +version = "0.3.5" [[deps.NVTX_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ce3269ed42816bf18d500c9f63418d4b0d9f5a3b" +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "2c7b791c1eba364e4a70aabdea4ddc1f5ca53911" uuid = "e98f9f5b-d649-5603-91fd-7774390e6439" -version = "3.1.0+2" +version = "3.1.1+0" [[deps.NameResolution]] deps = ["PrettyPrint"] @@ -1248,9 +1257,9 @@ uuid = "510215fc-4207-5dde-b226-833fc4488ee2" version = "0.5.5" [[deps.OffsetArrays]] -git-tree-sha1 = "1a27764e945a152f7ca7efa04de513d473e9542e" +git-tree-sha1 = "5e1897147d1ff8d98883cda2be2187dcf57d8f0c" uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.14.1" +version = "1.15.0" weakdeps = ["Adapt"] [deps.OffsetArrays.extensions] @@ -1267,10 +1276,10 @@ uuid = "05823500-19ac-5b8b-9628-191a04bc5112" version = "0.8.1+0" [[deps.OpenMPI_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "e25c1778a98e34219a00455d6e4384e017ea9762" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"] +git-tree-sha1 = "da913f03f17b449951e0461da960229d4a3d1a8c" uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" -version = "4.1.6+0" +version = "5.0.7+1" [[deps.OpenSSL]] deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] @@ -1280,20 +1289,20 @@ version = "1.4.3" [[deps.OpenSSL_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10" +git-tree-sha1 = "a9697f1d06cc3eb3fb3ad49cc67f2cfabaac31ea" uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.0.15+1" +version = "3.0.16+0" [[deps.OpenSpecFun_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" -version = "0.5.5+0" +version = "0.5.6+0" [[deps.OrderedCollections]] -git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" +git-tree-sha1 = "cc4054e898b852042d7b503313f7ad03de99c3dd" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.6.3" +version = "1.8.0" [[deps.PDMats]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] @@ -1331,16 +1340,28 @@ uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" version = "1.9.2" [[deps.PlotlyBase]] -deps = ["ColorSchemes", "Dates", "DelimitedFiles", "DocStringExtensions", "JSON", "LaTeXStrings", "Logging", "Parameters", "Pkg", "REPL", "Requires", "Statistics", "UUIDs"] -git-tree-sha1 = "56baf69781fc5e61607c3e46227ab17f7040ffa2" +deps = ["ColorSchemes", "Colors", "Dates", "DelimitedFiles", "DocStringExtensions", "JSON", "LaTeXStrings", "Logging", "Parameters", "Pkg", "REPL", "Requires", "Statistics", "UUIDs"] +git-tree-sha1 = "90af5c9238c1b3b25421f1fdfffd1e8fca7a7133" uuid = "a03496cd-edff-5a9b-9e67-9cda94a718b5" -version = "0.8.19" +version = "0.8.20" + + [deps.PlotlyBase.extensions] + DataFramesExt = "DataFrames" + DistributionsExt = "Distributions" + IJuliaExt = "IJulia" + JSON3Ext = "JSON3" + + [deps.PlotlyBase.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" [[deps.PlotlyJS]] deps = ["Base64", "Blink", "DelimitedFiles", "JSExpr", "JSON", "Kaleido_jll", "Markdown", "Pkg", "PlotlyBase", "PlotlyKaleido", "REPL", "Reexport", "Requires", "WebIO"] -git-tree-sha1 = "e62d886d33b81c371c9d4e2f70663c0637f19459" +git-tree-sha1 = "e415b25fdec06e57590a7d5ac8e0cf662fa317e2" uuid = "f0f68f2c-4968-5e81-91da-67840de0976a" -version = "0.18.13" +version = "0.18.15" [deps.PlotlyJS.extensions] CSVExt = "CSV" @@ -1355,10 +1376,10 @@ version = "0.18.13" JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" [[deps.PlotlyKaleido]] -deps = ["Base64", "JSON", "Kaleido_jll"] -git-tree-sha1 = "3210de4d88af7ca5de9e26305758a59aabc48aac" +deps = ["Artifacts", "Base64", "JSON", "Kaleido_jll"] +git-tree-sha1 = "ba551e47d7eac212864fdfea3bd07f30202b4a5b" uuid = "f2990250-8cf9-495f-b13a-cce12b45703c" -version = "2.2.5" +version = "2.2.6" [[deps.PolyesterWeave]] deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] @@ -1367,10 +1388,10 @@ uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" version = "0.2.2" [[deps.Polynomials]] -deps = ["LinearAlgebra", "RecipesBase", "Requires", "Setfield", "SparseArrays"] -git-tree-sha1 = "1a9cfb2dc2c2f1bd63f1906d72af39a79b49b736" +deps = ["LinearAlgebra", "OrderedCollections", "RecipesBase", "Requires", "Setfield", "SparseArrays"] +git-tree-sha1 = "555c272d20fc80a2658587fb9bbda60067b93b7c" uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" -version = "4.0.11" +version = "4.0.19" [deps.Polynomials.extensions] PolynomialsChainRulesCoreExt = "ChainRulesCore" @@ -1419,14 +1440,14 @@ uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" [[deps.ProgressMeter]] deps = ["Distributed", "Printf"] -git-tree-sha1 = "763a8ceb07833dd51bb9e3bbca372de32c0605ad" +git-tree-sha1 = "8f6bc219586aef8baf0ff9a5fe16ee9c70cb65e4" uuid = "92933f4c-e287-5a05-a399-4b506db050ca" -version = "1.10.0" +version = "1.10.2" [[deps.PtrArrays]] -git-tree-sha1 = "77a42d78b6a92df47ab37e177b2deac405e1c88f" +git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" -version = "1.2.1" +version = "1.3.0" [[deps.PyCall]] deps = ["Conda", "Dates", "Libdl", "LinearAlgebra", "MacroTools", "Serialization", "VersionParsing"] @@ -1436,15 +1457,15 @@ version = "1.96.4" [[deps.PyPlot]] deps = ["Colors", "LaTeXStrings", "PyCall", "Sockets", "Test", "VersionParsing"] -git-tree-sha1 = "0371ca706e3f295481cbf94c8c36692b072285c2" +git-tree-sha1 = "d2c2b8627bbada1ba00af2951946fb8ce6012c05" uuid = "d330b81b-6aea-500a-939a-2ce795aea3ee" -version = "2.11.5" +version = "2.11.6" [[deps.QuadGK]] deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "cda3b045cf9ef07a08ad46731f5a3165e56cf3da" +git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.11.1" +version = "2.11.2" [deps.QuadGK.extensions] QuadGKEnzymeExt = "Enzyme" @@ -1524,9 +1545,9 @@ version = "0.10.0" [[deps.Requires]] deps = ["UUIDs"] -git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.3.0" +version = "1.3.1" [[deps.Rmath]] deps = ["Random", "Rmath_jll"] @@ -1579,18 +1600,18 @@ version = "1.2.1" [[deps.SentinelArrays]] deps = ["Dates", "Random"] -git-tree-sha1 = "d0553ce4031a081cc42387a9b9c8441b7d99f32d" +git-tree-sha1 = "712fb0231ee6f9120e005ccd56297abbc053e7e0" uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" -version = "1.4.7" +version = "1.4.8" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" [[deps.Setfield]] deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] -git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" -version = "1.1.1" +version = "1.1.2" [[deps.SharedArrays]] deps = ["Distributed", "Mmap", "Random", "Serialization"] @@ -1616,9 +1637,9 @@ uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [[deps.SpecialFunctions]] deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "2f5d4697f21388cbe1ff299430dd169ef97d7e14" +git-tree-sha1 = "64cca0c26b4f31ba18f13f6c12af7c85f478cfde" uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.4.0" +version = "2.5.0" weakdeps = ["ChainRulesCore"] [deps.SpecialFunctions.extensions] @@ -1655,9 +1676,9 @@ weakdeps = ["OffsetArrays", "StaticArrays"] [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "777657803913ffc7e8cc20f0fd04b634f871af8f" +git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.8" +version = "1.9.13" weakdeps = ["ChainRulesCore", "Statistics"] [deps.StaticArrays.extensions] @@ -1814,9 +1835,9 @@ uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" [[deps.Unitful]] deps = ["Dates", "LinearAlgebra", "Random"] -git-tree-sha1 = "d95fe458f26209c66a187b1114df96fd70839efd" +git-tree-sha1 = "c0667a8e676c53d390a09dc6870b3d8d6650e2bf" uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" -version = "1.21.0" +version = "1.22.0" weakdeps = ["ConstructionBase", "InverseFunctions"] [deps.Unitful.extensions] @@ -1828,12 +1849,6 @@ git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278" uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" version = "0.2.1" -[[deps.UnsafeAtomicsLLVM]] -deps = ["LLVM", "UnsafeAtomics"] -git-tree-sha1 = "bf2c553f25e954a9b38c9c0593a59bb13113f9e5" -uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" -version = "0.1.5" - [[deps.VectorizationBase]] deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] git-tree-sha1 = "4ab62a49f1d8d9548a1c8d1a75e5f55cf196f64e" @@ -1847,9 +1862,9 @@ version = "1.3.0" [[deps.Wavelets]] deps = ["DSP", "FFTW", "LinearAlgebra", "Reexport", "SpecialFunctions", "Statistics"] -git-tree-sha1 = "f514f9b16f6a15552c6aad7b03afc7b9a8478ef4" +git-tree-sha1 = "d0ec97a100abbe47a5e9a02361841da49cce6029" uuid = "29a6e085-ba6d-5f35-a997-948ac2efa89a" -version = "0.10.0" +version = "0.10.1" [[deps.WebIO]] deps = ["AssetRegistry", "Base64", "Distributed", "FunctionalCollections", "JSON", "Logging", "Observables", "Pkg", "Random", "Requires", "Sockets", "UUIDs", "WebSockets", "Widgets"] @@ -1865,9 +1880,9 @@ version = "1.6.0" [[deps.Widgets]] deps = ["Colors", "Dates", "Observables", "OrderedCollections"] -git-tree-sha1 = "fcdae142c1cfc7d89de2d11e08721d0f2f86c98a" +git-tree-sha1 = "e9aeb174f95385de31e70bd15fa066a505ea82b9" uuid = "cc8bc4a8-27d6-5769-a93b-9d913e69aa62" -version = "0.6.6" +version = "0.6.7" [[deps.WoodburyMatrices]] deps = ["LinearAlgebra", "SparseArrays"] @@ -1877,9 +1892,9 @@ version = "1.0.0" [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "6a451c6f33a176150f315726eba8b92fbfdb9ae7" +git-tree-sha1 = "b8b243e47228b4a3877f1dd6aee0c5d56db7fcf4" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.13.4+0" +version = "2.13.6+1" [[deps.Zlib_jll]] deps = ["Libdl"] @@ -1888,9 +1903,9 @@ version = "1.2.13+0" [[deps.libaec_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "46bf7be2917b59b761247be3f317ddf75e50e997" +git-tree-sha1 = "f5733a5a9047722470b95a81e1b172383971105c" uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0" -version = "1.1.2+0" +version = "1.1.3+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] @@ -1904,9 +1919,9 @@ version = "1.52.0+1" [[deps.oneTBB_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "7d0ea0f4895ef2f5cb83645fa689e52cb55cf493" +git-tree-sha1 = "d5a767a3bb77135a99e433afe0eb14cd7f6914c3" uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" -version = "2021.12.0+0" +version = "2022.0.0+0" [[deps.p7zip_jll]] deps = ["Artifacts", "Libdl"] diff --git a/Project.toml b/Project.toml index ef937b4..06f980b 100644 --- a/Project.toml +++ b/Project.toml @@ -39,11 +39,18 @@ ThreadsX = "ac1d9e8a-700a-412c-b207-f0111f4b6c0d" [compat] Interpolations = "0.15" -KomaMRI = "0.8.0" -KomaMRIBase = "0.8.1" -KomaMRICore = "0.8.0" -KomaMRIFiles = "0.8.0" -KomaMRIPlots = "0.8.0" +KomaMRI = "=0.8.0" +KomaMRIBase = "=0.8.1" +KomaMRICore = "=0.8.0" +KomaMRIFiles = "=0.8.0" +KomaMRIPlots = "=0.8.0" LinearOperators = "2" -MRIReco = "0.8" +MRIReco = "=0.8.0" RegularizedLeastSquares = "0.10.0" + +[extras] +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +MRISimulation = "8988da37-ea20-4fa6-9af7-8a6f6f9a8970" + +[targets] +test = ["Test", "MRISimulation"] diff --git a/README.md b/README.md index b1b3b6e..08b1da4 100644 --- a/README.md +++ b/README.md @@ -1,52 +1,53 @@ # HighOrderMRI.jl -This is a Julia toolbox for MR simulation and reconstruction that can incorporate dynamic field changes associated with the gradients throughout the sequence. -This is an extension of KomaMRI.jl (https://github.com/JuliaHealth/KomaMRI.jl), a Julia package for highly efficient MR simulations. +[![CI](https://github.com/BennyZhang-Codes/HighOrderMRI.jl/actions/workflows/CI.yml/badge.svg)](https://github.com/BennyZhang-Codes/HighOrderMRI.jl/actions/workflows/CI.yml) [![Documentation](https://github.com/BennyZhang-Codes/HighOrderMRI.jl/actions/workflows/Documentation.yml/badge.svg)](https://github.com/BennyZhang-Codes/HighOrderMRI.jl/actions/workflows/Documentation.yml) -For MRI image reconstruction with field dynamics, we have built an extended signal encoding operator `HighOrderOp` to construct the signal equation. `HighOrderOp` inherits from `AbstractLinearOperator` in LinearOperators.jl. Then, image reconstruction problem can be solved using algorithms from `RegularizedLeastSquares.jl`. +This is a Julia toolbox for MR simulation and reconstruction that can incorporate dynamic field changes associated with the gradients throughout the sequence. This is an extension of [KomaMRI.jl](https://github.com/JuliaHealth/KomaMRI.jl) (a Julia package for highly efficient MR simulations) and [MRIReco.jl](https://github.com/MagneticResonanceImaging/MRIReco.jl) (a Julia package for MRI reconstruction). + +For MRI image reconstruction with field dynamics, we have built an extended signal encoding operator `HighOrderOp` to construct the signal equation. `HighOrderOp` inherits from `AbstractLinearOperator` in [LinearOperators.jl](https://github.com/JuliaSmoothOptimizers/LinearOperators.jl). Then, image reconstruction problem can be solved using algorithms from [RegularizedLeastSquares.jl](https://github.com/JuliaImageRecon/RegularizedLeastSquares.jl). + +If you use the toolbox, please consider citing the following abstracts: + +[1] Zhang, Z., Auerbach, E. J., Bratch, A., Grant, A. N., Zhuo, Y., He, S., Chen, L., Ugurbil, K., Wu, X. "A stitching method for dynamic field monitoring using NMR probes", 2024 ISMRM, Singapore + +[2] Zhang, J., Zuo, Z., Xue, R., Zhuo, Y., Cushing, C., Bratch, A., Auerbach, E. J., Grant, A. N., Ugurbil, K., Wu, X., Zhang, Z. "A stitching method for dynamic field monitoring using NMR probes: validation in simulation and human experiments", 2025 ISMRM, Hawaii ## Features * Support up to 2nd or 3rd order spherical harmonic terms. -* Off-resonance and coil-sensitivities were integrated into the `HighOrderOp`. +* Support parrallel imaging and off-resonance correction with extended signal encoding operator `HighOrderOp`. * Support the model-based synchronization delay estimation algorithm (Dubovan PI, Baron CA. 2023, [https://doi.org/10.1002/mrm.29460](https://doi.org/10.1002/mrm.29460)). -* GPU acceleration with `CUDA.jl` (only NVIDIA GPU supported now). If the GPU memory is not enough, the calculation can be divided into blocks. +* GPU acceleration with `CUDA.jl` (only NVIDIA GPU has been tested). If the GPU memory is not enough, the calculation can be divided into blocks. + +## Demo This repository provides a set of demo scripts that allow users to perform simulations and reconstructions using both our data stitching method and the standard approach. -You may run the [demos](https://github.com/BennyZhang-Codes/HighOrderMRI/blob/master/demo), to grab an idea of how this toolbox can be used to simulate MRI signals given a pulseq sequence and dynamic field changes measured using a field camera. +You may run the [demo](https://github.com/BennyZhang-Codes/HighOrderMRI.jl/tree/main/demo), to grab an idea of how this toolbox can be used to simulate MRI signals given a pulseq sequence and dynamic field changes measured using a field camera. -If you use the toolbox, please consider citing the following abstract: +### [Recon and Synchronization](https://github.com/BennyZhang-Codes/HighOrderMRI.jl/tree/main/demo/Recon) -Zhang, Z., Auerbach, E. J., Bratch, A., Grant, A. N., Zhuo, Y., He, S., Chen, L., Ugurbil, K., Wu, X. "A stitching method for dynamic field monitoring using NMR probes", 2024 ISMRM, Singapore +For MRI reconstruction incorporating measured field dynamics, we first estimate the synchronization delay between the MRI data and the field measurements. The final reconstruction is then performed using the synchronized field dynamics. -## Methods +This demo includes single-shot spiral imaging data (7T, 1 mm in-plane resolution, ~29 ms readout), nominal kspace trajectory (Nominal) and field dynamics measured (with Dynamic Field Camera) using both our data stitching method (Stitched) and the conventional single measurement approach (Standard). -To enable the sequence simulation with higher spatial order terms of time-resolved field dynamics, we extended **KomaMRI.jl** by including the fields up to second order in the calculation of $B_{z}$: +In this case, our data stitching method performs comparably to the standard method. For further details on how our data stitching method outperforms conventional approaches, please refer to our abstracts mentioned above. -$$ -B_{z}(t)=\sum_{l}b_l(t)h_l(\boldsymbol{r}) + \frac{\Delta\omega(\boldsymbol{r})}{\gamma}, -$$ +| ![1p0_Nominal](demo/Recon/result/Nominal.png) | ![1p0_Standard](demo/Recon/result/Standard.png) | ![1p0_Stitched](demo/Recon/result/Stitched.png) | ![1p0_Stitched_wo_dB0](demo/Recon/result/Stitched_wo_dB0.png) | +| ------------------------------------------- | --------------------------------------------- | --------------------------------------------- | ----------------------------------------------------------- | -where $b_l(t)$ are the fields derived from the field dynamics for spherical harmonic basis functions $h_l(\boldsymbol{r})$. $l$ is the index denotes different spherical harmonic terms, $\Delta\omega(\boldsymbol{r})$ is the off-resonance field, $\gamma$ is the gyromagnetic ratio, and $\boldsymbol{r}$ is the position vector. -For image reconstruction, we implemented an extended signal encoding model based on **MRIReco.jl**. The measured or simulated MRI signal $s$ received in the coil $p$ at time $t$ can be describe by the model as follows: +### [Sim and Recon for single-channel](https://github.com/BennyZhang-Codes/HighOrderMRI.jl/tree/main/demo/Sim_SingleChannel) -$$ -{s}_p(t)={\sum_n}{c}_p\left({\boldsymbol r}_n\right)m\left({\boldsymbol r}_n\right) {e}^{i \phi}{e}^{i\Delta \omega \left({\boldsymbol r}_n\right){t}} -$$ +This demo simulates and reconstructs a fully-sampled single-shot spiral sequence (1 mm resolution) [[.seq file]](https://github.com/BennyZhang-Codes/HighOrderMRI.jl/blob/main/demo/Sim_SingleChannel/1mm_R1.seq) with field dynamics and ΔB₀. Reconstruction is based on a extended signal encoding model, which includes the field dynamics (up to second-order) and off-resonance. -$$ -\phi = {\sum_{l}}{k}_l\left({t} \right){h}_l\left({\boldsymbol r}_n\right) -$$ +### [Sim and Recon for multi-channel](https://github.com/BennyZhang-Codes/HighOrderMRI.jl/tree/main/demo/Sim_MultiChannel) -where $k_l(t)$ are the coefficients measured by NMR probes and $m$ represents magnetization. Using this model, images can be reconstructed with measured field dynamics and static off-resonance by iterative SENSE algorithm. +This demo simulates and reconstructs an under-sampled single-shot spiral sequence (1 mm resolution, R=4) [[.seq file]](https://github.com/BennyZhang-Codes/HighOrderMRI.jl/blob/main/demo/Sim_MultiChannel/7T_1p0_200_r4.seq) with field dynamics and ΔB₀. -## Demo +### [Multi-echo Gradient Echo (ME-GRE)](https://github.com/BennyZhang-Codes/HighOrderMRI.jl/tree/main/demo/Multi-echo_GRE) -1. [Sim and Recon for single-channel](https://github.com/BennyZhang-Codes/HighOrderMRI/tree/master/demo/SingleChannel): Simulation and reconstruction of a fully-sampled single-shot spiral sequence (1 mm resolution) [[.seq file]](https://github.com/BennyZhang-Codes/HighOrderMRI/blob/master/demo/SingleChannel/1mm_R1.seq) with field dynamics and ΔB₀. Reconstruction is based on a extended signal encoding model, which includes the field dynamics (up to second-order) and off-resonance. -2. [Sim and Recon for multi-channel](https://github.com/BennyZhang-Codes/HighOrderMRI/tree/master/demo/MultiChannel): Simulation and reconstruction of a under-sampled single-shot spiral sequence (1 mm resolution, R=4) [[.seq file]](https://github.com/BennyZhang-Codes/HighOrderMRI/blob/master/demo/MultiChannel/xw_sp2d_7T-1mm-200-r4-noSync-fa90.seq) with field dynamics and ΔB₀. -3. [Multi-echo Gradient Echo (ME-GRE)](https://github.com/BennyZhang-Codes/HighOrderMRI/blob/master/demo/Muti-echo_GRE): estimating ΔB₀ map (MRIFieldmaps.jl) and coil-sensitivity map (ESPIRiT) from the ME-GRE data in the [ISMRMRD](https://github.com/ismrmrd/ismrmrd) format. Additionally, the ME-GRE sequence can be modified within the [source code](https://github.com/BennyZhang-Codes/HighOrderMRI/blob/master/demo/Muti-echo_GRE/pulseq) ([Pulseq](https://github.com/pulseq/pulseq), MATLAB version). +This demo estimates the ΔB₀ map using [MRIFieldmaps.jl](https://github.com/MagneticResonanceImaging/MRIFieldmaps.jl) and the coil sensitivity map using ESPIRiT, based on ME-GRE data in the [ISMRMRD](https://github.com/ismrmrd/ismrmrd) format. Additionally, the ME-GRE sequence can be modified within the [source code](https://github.com/BennyZhang-Codes/HighOrderMRI.jl/tree/main/demo/Multi-echo_GRE/pulseq) ([Pulseq](https://github.com/pulseq/pulseq), MATLAB version). -### Required dependencies: +## Required dependencies: The current version is mainly based on two other packages: KomaMRI.jl (version: 0.8.0) and MRIReco.jl (version: 0.8.0). @@ -57,7 +58,7 @@ The current version is mainly based on two other packages: KomaMRI.jl (version: - `MRIFieldmaps` 0.0.3 - `PyPlot` 2.11.5 -### Copyright & License Notice +## Copyright & License Notice This software is copyrighted by the Regents of the University of Minnesota. It can be freely used for educational and research purposes by non-profit institutions and US government agencies only. Other organizations are allowed to use this software only for evaluation purposes, and any further uses will require prior approval. The software may not be sold or redistributed without prior approval. diff --git a/demo/MultiChannel/plt_results.jl b/demo/MultiChannel/plt_results.jl deleted file mode 100644 index ecc2b78..0000000 --- a/demo/MultiChannel/plt_results.jl +++ /dev/null @@ -1,169 +0,0 @@ -using MAT -import Statistics: quantile -using PyPlot, PyCall -mpl_axes_grid1 = pyimport("mpl_toolkits.axes_grid1") -mcolors = matplotlib.colors - -mat_file = "$(@__DIR__)/demo/MultiChannel/snrInf_cgnr_40_L2_0.0.mat" # *.mat file path -results = MAT.matread(mat_file); -#= -"csm" => [a.u.] Coil-Sensitivity -"b0map" => [Hz] B0 map -"headmask" => Head mask -"x_ref" => Proton density map -"imgs" => [a.u.] Image data, reconstruction results -"signal" => [a.u.] Signal data, simulated signal -"labels" => Image labels -=# -csm = results["csm"]; -B0map = results["b0map"]; -headmask = results["headmask"]; -x_ref = results["x_ref"]; -imgs = results["imgs"]; -signal = results["signal"]; -labels = results["labels"]; - -x, y = size(headmask); -headcountour = zeros(x, y); -α = zeros(x, y); -for i = 1:x, j = 1:x - if headmask[i,j] == 1 - if i == 1 || i == x || j == 1 || j == y - headcountour[i,j] = 1 - α[i,j] = 1 - elseif (headmask[i-1,j] == 0 || headmask[i+1,j] == 0 || headmask[i,j-1] == 0 || headmask[i,j+1] == 0) - headcountour[i,j] = 1 - α[i,j] = 1 - end - end -end -img_headcountour = cat(headcountour, headcountour, headcountour, α; dims=3); # with alpha channel -img_headref = cat(x_ref, x_ref, x_ref, headmask; dims=3); # with alpha channel - - - -matplotlib.rc("mathtext", default="regular") -matplotlib.rc("figure", dpi=100) -# matplotlib.rc("font", family="Arial") # "Times New Roman" -matplotlib.rcParams["mathtext.default"] -figure_width = 5/2.54 -figure_height = 5/2.54 -linewidth = 0.5 -ticklength = 1.5 -fontsize_legend = 5 -fontsize_label = 6 -fontsize_ticklabel = 7 -fontsize_subfigure = 8 -pad_labeltick = 2 -pad_label = 2 -color_facecolor = "#ffffff" -color_label = "#000000" - -vmaxp = 99; -vminp = 1; - - - -############################################################################# -# plot reconstructed images -############################################################################# -nImg, nX, nY = size(imgs) -# vmin, vmax = quantile(abs.(imgs)[:], 0), quantile(abs.(imgs)[:], 0.98) -for idx = 1 : nImg - img = abs.(imgs)[idx,:,:] - label = labels[idx] - fig, axs = plt.subplots(nrows=1, ncols=1, figsize=(figure_width, figure_height), facecolor=color_facecolor, squeeze=false) - ax = axs[1, 1] - ax.set_facecolor(color_facecolor) - ax.tick_params(axis="both", bottom=false, top=false, left=false, right=false, labelbottom=false, labeltop=false, labelleft=false, labelright=false) - for spine in ax.spines # "left", "right", "bottom", "top" - ax.spines[spine].set_visible(false) - end - vmin, vmax = quantile(img[:], vminp/100), quantile(img[:], vmaxp/100) - ax.imshow(img, cmap="gray", vmin=vmin, vmax=vmax) - ax.set_title(label, fontsize=fontsize_label, color=color_label) - fig.tight_layout(pad=0) - # fig.savefig("$(outpath)/img_$(idx).png", dpi=300, transparent=true) -end - -############################################################################# -# plot off-resonance map -############################################################################# -fig, axs = plt.subplots(nrows=1, ncols=1, figsize=(figure_width, figure_height), facecolor=color_facecolor, squeeze=false) -ax = axs[1,1] -ax.set_facecolor(color_facecolor) -ax.tick_params(axis="both", bottom=false, top=false, left=false, right=false, labelbottom=false, labeltop=false, labelleft=false, labelright=false) -for spine in ax.spines # "left", "right", "bottom", "top" - ax.spines[spine].set_visible(false) -end - -ai = ax.imshow(B0map, cmap="jet")#, interpolation="gaussian") # "bilinear", "spline36", "gaussian" -# ax.imshow(img_headref, cmap="gray", alpha=0.1) -ax.imshow(img_headcountour, cmap="gray", alpha=1) -ax.set_title("ΔB₀ map", fontsize=fontsize_label, color=color_label) -divider = mpl_axes_grid1.make_axes_locatable(ax) -cax = divider.append_axes("right", size="5%", pad=0.02) -cax.set_title("[Hz]", fontsize=fontsize_ticklabel, color=color_label, pad=pad_label) -cb = fig.colorbar(ai, cax=cax) -cb.ax.tick_params(color=color_label, labelcolor=color_label, labelsize=fontsize_ticklabel,length=ticklength, width=linewidth, pad=pad_labeltick) -cb.outline.set_visible(false) -cb.update_ticks() -fig.tight_layout(pad=0) - -######################################################################## -# plot proton density map -######################################################################## -# colorbar setting for the ρ map of the phantom -ρ_values = sort(unique(x_ref)) -cm_gray = plt.cm.get_cmap("gray") -cm_gray_ref = cm_gray.from_list("gray_ref", cm_gray(ρ_values), length(ρ_values)) -norm = mcolors.BoundaryNorm([-1; ρ_values] , cm_gray_ref.N) - - -fig, axs = plt.subplots(nrows=1, ncols=1, figsize=(figure_width, figure_height), facecolor=color_facecolor, squeeze=false) -ax = axs[1,1] -ax.set_facecolor(color_facecolor) -ax.tick_params(axis="both", bottom=false, top=false, left=false, right=false, labelbottom=false, labeltop=false, labelleft=false, labelright=false) -for spine in ax.spines # "left", "right", "bottom", "top" - ax.spines[spine].set_visible(false) -end -ax.imshow(x_ref, cmap="gray") # "bilinear", "spline36", "gaussian" -divider = mpl_axes_grid1.make_axes_locatable(ax) -cax = divider.append_axes("right", size="5%", pad=0.02) -ax.set_title("Proton density", fontsize=fontsize_label, color=color_label) -cax.set_title("[a.u.]", fontsize=fontsize_ticklabel, color=color_label, pad=pad_label) -cb = fig.colorbar(plt.cm.ScalarMappable(cmap=cm_gray_ref, norm=norm), cax=cax, drawedges=true) -cb.minorticks_off() -cb.ax.tick_params(color=color_label, labelcolor=color_label, labelsize=fontsize_ticklabel, length=ticklength, width=linewidth, pad=pad_labeltick) -cb.set_ticks(ρ_values - (ρ_values - [-1; ρ_values][1:end-1]) / 2) -cb.set_ticklabels([string(round(v, digits=2)) for v in ρ_values]) -cb.ax.tick_params(size=0) -# cb.outline.set_visible(false) -cb.outline.set_edgecolor(color_label) -cb.outline.set_linewidth(linewidth) -cb.dividers.set_color(color_label) -cb.dividers.set_linewidth(linewidth) -fig.tight_layout(pad=0) - -############################################################################# -# plot signal in each channel -############################################################################# -figure_width = 12/2.54 -figure_height = 6/2.54 - -nSample, nCha = size(signal); -fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(figure_width, figure_height), facecolor=color_facecolor) -ax.tick_params(axis="both", bottom=false, top=false, left=false, right=false, labelbottom=false, labeltop=false, labelleft=false, labelright=false) -for spine in ax.spines # "left", "right", "bottom", "top" - ax.spines[spine].set_color(color_label) - ax.spines[spine].set_visible(false) -end -ax.set_facecolor(color_facecolor) -fig.tight_layout(pad=0) -for cha = 1 : nCha - ax.plot(abs.(signal[:, cha]), linewidth=0.5, color="C$(cha%9)", label="Channel $(cha)") -end -ax.legend(fontsize=fontsize_legend, labelcolor=color_label, ncols=3, - loc="upper right", bbox_to_anchor=(1,1), - frameon=false, handlelength=1, handletextpad=0.5, columnspacing=1,labelspacing=0.2) -fig.tight_layout(pad=0) diff --git a/demo/Recon/1_Synchronization.jl b/demo/Recon/1_Synchronization.jl new file mode 100644 index 0000000..0c43c8d --- /dev/null +++ b/demo/Recon/1_Synchronization.jl @@ -0,0 +1,63 @@ +using HighOrderMRI +using MAT, Interpolations +using CUDA +CUDA.device!(0) + +T = Float64; +path = joinpath(@__DIR__, "demo/Recon") +data_file = "$(path)/data_1p0_200_r4.mat" + +@info "data file: $(data_file)" +data = matread(data_file); + +csm = data["gre_csm"]; # coil sensitivity map +b0 = data["gre_b0"]; # ΔB0 map +mask = data["gre_mask"]; # mask + +kdata = data["kdata"]; # spiral k-space data +datatime = data["datatime"]; # time stamps of k-space data +matrixSize = data["matrixSize"]; # matrix size +FOV = data["FOV"]; # field of view + +k0_ecc = data["k0_ecc"]; # b0 compensation of scanner from ECC model +dt = data["dfc_dt"]; # dwell time of field dynamics +ksphaStitched = data["dfc_ksphaStitched"]; # coefficients of the field dynamics with data stitching method +ksphaStandard = data["dfc_ksphaStandard"]; # coefficients of the field dynamics with standard method +startStitched = data["dfc_startStitched"]; # start time of the field dynamics with data stitching method +startStandard = data["dfc_startStandard"]; # start time of the field dynamics with standard method + +ksphaNominal = data["ksphaNominal"]; # nominal kspace trajectory, kx, ky +startNominal = data["startNominal"]; # start time of the nominal trajectory + +# settings for synchronization between the MRI data and the field dynamics +Δx, Δy, Δz = T.(FOV ./ matrixSize); +nX, nY, nZ = matrixSize; +gridding = Grid(nX, nY, nZ, Δx, Δy, Δz; exchange_xy=true, reverse_x=false, reverse_y=true) + +intermode = AkimaMonotonicInterpolation() +iter_max = 20; +JumpFact = 6; +Δτ_min = T.(0.001); +λ = T.(0); + +recon_terms = "111"; +nBlock = 20; +use_gpu = true; +verbose = false; + +kdata = kdata ./ exp.(1im.*k0_ecc)'; + +tau_Stitched = FindDelay_v2(gridding, Complex{T}.(kdata), T.(ksphaStitched[:,:]), T.(startStitched/dt), T.(dt/dt); + intermode=AkimaMonotonicInterpolation(), JumpFact=JumpFact, iter_max=iter_max, Δτ_min=Δτ_min, λ=λ, + fieldmap=T.(b0*dt), csm=Complex{T}.(csm), recon_terms=recon_terms, nBlock=nBlock, use_gpu=use_gpu, verbose=verbose) +@info "tau_Stitched: $(tau_Stitched) us" + +tau_Standard = FindDelay_v2(gridding, Complex{T}.(kdata), T.(ksphaStandard[:,:]), T.(startStandard/dt), T.(dt/dt); + intermode=AkimaMonotonicInterpolation(), JumpFact=JumpFact, iter_max=iter_max, Δτ_min=Δτ_min, λ=λ, + fieldmap=T.(b0*dt), csm=Complex{T}.(csm), recon_terms=recon_terms, nBlock=nBlock, use_gpu=use_gpu, verbose=verbose) +@info "tau_Standard: $(tau_Standard) us" + +tau_Nominal = FindDelay_v2(gridding, Complex{T}.(kdata), T.(ksphaNominal[:,:]), T.(startNominal/dt), T.(dt/dt); + intermode=AkimaMonotonicInterpolation(), JumpFact=JumpFact, iter_max=iter_max, Δτ_min=Δτ_min, λ=λ, + fieldmap=T.(b0*dt), csm=Complex{T}.(csm), recon_terms=recon_terms, nBlock=nBlock, use_gpu=use_gpu, verbose=verbose) +@info "tau_Nominal: $(tau_Nominal) us" diff --git a/demo/Recon/2_Recon.jl b/demo/Recon/2_Recon.jl new file mode 100644 index 0000000..6590eb3 --- /dev/null +++ b/demo/Recon/2_Recon.jl @@ -0,0 +1,136 @@ +using MAT +using CUDA +CUDA.device!(0) + +T = Float64; +path = joinpath(@__DIR__, "demo/Recon") +data_file = "$(path)/data_1p0_200_r4.mat" + +@info "data file: $(data_file)" +data = matread(data_file); + +csm = data["gre_csm"]; # coil sensitivity map +b0 = data["gre_b0"]; # ΔB0 map +mask = data["gre_mask"]; # mask + +kdata = data["kdata"]; # spiral k-space data +datatime = data["datatime"]; # time stamps of k-space data +matrixSize = data["matrixSize"]; # matrix size +FOV = data["FOV"]; # field of view + +k0_ecc = data["k0_ecc"]; # b0 compensation of scanner from ECC model +dt = data["dfc_dt"]; # dwell time of field dynamics +ksphaStitched = data["dfc_ksphaStitched"]; # coefficients of the field dynamics with data stitching method +ksphaStandard = data["dfc_ksphaStandard"]; # coefficients of the field dynamics with standard method +startStitched = data["dfc_startStitched"]; # start time of the field dynamics with data stitching method +startStandard = data["dfc_startStandard"]; # start time of the field dynamics with standard method + +ksphaNominal = data["ksphaNominal"]; # nominal kspace trajectory, kx, ky +startNominal = data["startNominal"]; # start time of the nominal trajectory + +tau_Nominal = data["tau_Nominal"]; # synchronization delay between the nominal trajectory and the MRI data +tau_Stitched = data["tau_Stitched"]; # synchronization delay between the stitched trajectory and the MRI data +tau_Standard = data["tau_Standard"]; # synchronization delay between the standard trajectory and the MRI data + + +# comparion of the field dynamics with or without synchronization +# plt_ksphas([InterpTrajTime(ksphaStitched, dt, startStitched, datatime), InterpTrajTime(ksphaStitched, dt, startStitched+tau_Stitched*dt, datatime)], dt) +# plt_ksphas([InterpTrajTime(ksphaStandard, dt, startStandard, datatime), InterpTrajTime(ksphaStandard, dt, startStandard+tau_Standard*dt, datatime)], dt) +# plt_ksphas([InterpTrajTime(ksphaNominal , dt, startNominal , datatime), InterpTrajTime(ksphaNominal , dt, startNominal +tau_Nominal *dt, datatime)], dt) + +ksphaStitched = InterpTrajTime(ksphaStitched, dt, startStitched+tau_Stitched*dt, datatime); +ksphaStandard = InterpTrajTime(ksphaStandard, dt, startStandard+tau_Standard*dt, datatime); +ksphaNominal = InterpTrajTime(ksphaNominal , dt, startNominal +tau_Nominal *dt, datatime); + +# prepare some parameters for reconstruction +# 1. gridding +Δx, Δy, Δz = T.(FOV ./ matrixSize); +nX, nY, nZ = matrixSize; +gridding = Grid(nX, nY, nZ, Δx, Δy, Δz; exchange_xy=true, reverse_x=false, reverse_y=true) + +# 2. sampling density +weightStitched = SampleDensity(ksphaStitched'[2:3,:], (nX, nY)); +weightStandard = SampleDensity(ksphaStandard'[2:3,:], (nX, nY)); +weightNominal = SampleDensity( ksphaNominal'[2:3,:], (nX, nY)); + +use_gpu = true; +verbose = false; +nBlock = 20; + +solver = "cgnr"; reg = "L2"; iter = 20; λ = 1e-9 +recParams = Dict{Symbol,Any}() +recParams[:reconSize] = (nX, nY) +recParams[:regularization] = reg # ["L2", "L1", "L21", "TV", "LLR", "Positive", "Proj", "Nuclear"] +recParams[:λ] = λ +recParams[:iterations] = iter +recParams[:solver] = solver + + +########################################################################### +# recon with field dynamics measured by our data stitching method +########################################################################### +kdata = data["kdata"]; +kdata = kdata ./ exp.(1im.*k0_ecc)'; + +labelStitched = [ "Stitched", "Stitched_wo_dB0"]; +recons = [ "111", "111"]; +kdatas = [ kdata, kdata]; +weights = [weightStitched, weightStitched]; +b0s = [ b0, b0.*0]; +imgStitched = Array{Complex{T},3}(undef, nX, nY, length(labelStitched)); +idxs = collect(1:length(labelStitched)); +for (idx, label, recon, kdata, weight, b0) in zip(idxs, labelStitched, recons, kdatas, weights, b0s) + @info "[$(idx)] $(label)" + HOOp = HighOrderOp(gridding, T.(ksphaStitched'), T.(datatime); recon_terms=recon, k_nominal=ksphaNominal[:, 2:4]', + nBlock=nBlock, csm=Complex{T}.(csm), fieldmap=T.(b0), use_gpu=use_gpu, verbose=verbose); + @time x = recon_HOOp(HOOp, Complex{T}.(kdata), Complex{T}.(weight), recParams); + imgStitched[:, :, idx] = x; + fig = plt_image(abs.(x); title=label, vmaxp=99.9) + fig.savefig("$(path)/$(label).png", dpi=300, transparent=false, bbox_inches="tight", pad_inches=0.0) +end + +########################################################################### +# recon with field dynamics measured by conventional single measurement +########################################################################### +kdata = data["kdata"]; +kdata = kdata ./ exp.(1im.*k0_ecc)'; + +labelStandard = [ "Standard"]; +recons = [ "111"]; +kdatas = [ kdata]; +weights = [weightStandard]; +b0s = [ b0]; +imgStandard = Array{Complex{T},3}(undef, nX, nY, length(labelStandard)); +idxs = collect(1:length(labelStandard)); +for (idx, label, recon, kdata, weight, b0) in zip(idxs, labelStandard, recons, kdatas, weights, b0s) + @info "[$(idx)] $(label)" + HOOp = HighOrderOp(gridding, T.(ksphaStandard'), T.(datatime); recon_terms=recon, k_nominal=ksphaNominal[:, 2:4]', + nBlock=nBlock, csm=Complex{T}.(csm), fieldmap=T.(b0), use_gpu=use_gpu, verbose=verbose); + @time x = recon_HOOp(HOOp, Complex{T}.(kdata), Complex{T}.(weight), recParams); + imgStandard[:, :, idx] = x; + fig = plt_image(abs.(x); title=label, vmaxp=99.9) + fig.savefig("$(path)/$(label).png", dpi=300, transparent=false, bbox_inches="tight", pad_inches=0.0) +end + + +########################################################################### +# recon with nominal trajectory +########################################################################### +kdata = data["kdata"]; + +labelNominal = [ "Nominal"]; +recons = [ "010"]; +kdatas = [ kdata]; +weights = [weightNominal]; +b0s = [ b0]; +imgNominal = Array{Complex{T},3}(undef, nX, nY, length(labelNominal)); +idxs = collect(1:length(labelNominal)); +for (idx, label, recon, kdata, weight, b0) in zip(idxs, labelNominal, recons, kdatas, weights, b0s) + @info "[$(idx)] $(label)" + HOOp = HighOrderOp(gridding, T.(ksphaNominal'), T.(datatime); recon_terms=recon, k_nominal=ksphaNominal[:, 2:4]', + nBlock=nBlock, csm=Complex{T}.(csm), fieldmap=T.(b0), use_gpu=use_gpu, verbose=verbose); + @time x = recon_HOOp(HOOp, Complex{T}.(kdata), Complex{T}.(weight), recParams); + imgNominal[:, :, idx] = x; + fig = plt_image(abs.(x); title=label, vmaxp=99.9) + fig.savefig("$(path)/$(label).png", dpi=300, transparent=false, bbox_inches="tight", pad_inches=0.0) +end diff --git a/demo/Recon/data_1p0_200_r4.mat b/demo/Recon/data_1p0_200_r4.mat new file mode 100644 index 0000000..e98cc39 Binary files /dev/null and b/demo/Recon/data_1p0_200_r4.mat differ diff --git a/demo/Recon/result/Nominal.png b/demo/Recon/result/Nominal.png new file mode 100644 index 0000000..9a75674 Binary files /dev/null and b/demo/Recon/result/Nominal.png differ diff --git a/demo/Recon/result/Standard.png b/demo/Recon/result/Standard.png new file mode 100644 index 0000000..7d9b0a0 Binary files /dev/null and b/demo/Recon/result/Standard.png differ diff --git a/demo/Recon/result/Stitched.png b/demo/Recon/result/Stitched.png new file mode 100644 index 0000000..9bb2653 Binary files /dev/null and b/demo/Recon/result/Stitched.png differ diff --git a/demo/Recon/result/Stitched_wo_dB0.png b/demo/Recon/result/Stitched_wo_dB0.png new file mode 100644 index 0000000..608a668 Binary files /dev/null and b/demo/Recon/result/Stitched_wo_dB0.png differ diff --git a/demo/Sim_MultiChannel/7T_1p0_200_r4.mat b/demo/Sim_MultiChannel/7T_1p0_200_r4.mat new file mode 100644 index 0000000..40106b1 Binary files /dev/null and b/demo/Sim_MultiChannel/7T_1p0_200_r4.mat differ diff --git a/demo/Sim_MultiChannel/7T_1p0_200_r4.seq b/demo/Sim_MultiChannel/7T_1p0_200_r4.seq new file mode 100644 index 0000000..2e5ba34 --- /dev/null +++ b/demo/Sim_MultiChannel/7T_1p0_200_r4.seq @@ -0,0 +1,8627 @@ +# Pulseq sequence file +# Created by MATLAB mr toolbox + +[VERSION] +major 1 +minor 4 +revision 1 + +[DEFINITIONS] +AdcRasterTime 1e-07 +BlockDurationRaster 1e-05 +FOV 0.2 0.2 0.004 +GradientRasterTime 1e-05 +Name 7T_1p0_200_r4_max51_fa90 +RadiofrequencyRasterTime 1e-06 +Slice_Thickness 0.002 +TE 0.005 +TR 0.5 +accelerationFactor 4 +adc_DwellTime 1e-06 +adc_effectiveTime 0.968927497 +adc_length 29000 +adc_nSegments 29 +adc_segmentDuration 0.001 +adc_segmentLength 1000 +doFastestPrescan 0 +flipAngle 90 +isSpiral 1 +matrixSize 200 200 1 +nRepetitions 1 +nSlices 1 +readoutGradientDuration 0.02994 +resolution 0.001 +skope_acqDuration 0.03114 +skope_gradFreeDelay 0.0002 +skope_interleaveTR 0.49 +skope_maxSegmentDuration 0.02994 +skope_minimalTR 0.11 +skope_nDynamics 1 +skope_nInterleaves 1 +skope_nPrescans 0 +skope_nSegments2measure 1 +skope_stitchMode concurrent +skope_trig2AdcTime 0.0002 +skope_trigChannel ext1 +skope_triggerDelays 0 +useSingleAdcSegment4Prescan 0 + +# Format of blocks: +# NUM DUR RF GX GY GZ ADC EXT +[BLOCKS] + 1 0 0 0 0 0 0 1 + 2 887 1 0 0 1 0 0 + 3 228 2 0 0 2 0 0 + 4 78 0 0 0 3 0 0 + 5 288 0 0 0 0 0 0 + 6 20 0 0 0 0 0 2 + 7 2994 0 4 5 0 1 0 + 8 193 0 7 8 6 0 0 + 9 44500 0 0 0 0 0 0 +10 0 0 0 0 0 0 3 +11 0 0 0 0 0 0 4 + +# Format of RF events: +# id amplitude mag_id phase_id time_shape_id delay freq phase +# .. Hz .... .... .... us Hz rad +[RF] +1 314.149 1 2 3 100 -1028.21 25.8417 +2 502.45 4 5 0 140 0 -0 + +# Format of arbitrary gradients: +# time_shape_id of 0 means default timing (stepping with grad_raster starting at 1/2 of grad_raster) +# id amplitude amp_shape_id time_shape_id delay +# .. Hz/m .. .. us +[GRADIENTS] +4 -1.75235e+06 6 0 0 +5 1.74352e+06 7 0 0 +7 640.09 8 9 0 +8 42179.1 10 9 0 + +# Format of trapezoid gradients: +# id amplitude rise flat fall delay +# .. Hz/m us us us us +[TRAP] + 1 2.5e+06 350 50 350 8120 + 2 1e+06 140 2000 140 0 + 3 -2.54762e+06 360 60 360 0 + 6 2.54777e+06 360 1210 360 0 + +# Format of ADC events: +# id num dwell delay freq phase +# .. .. ns us Hz rad +[ADC] +1 29000 1000 0 0 0 + +# Format of extension lists: +# id type ref next_id +# next_id of 0 terminates the list +# Extension list is followed by extension specifications +[EXTENSIONS] +1 1 1 0 +2 2 1 0 +3 3 1 0 +4 3 2 0 + +# Extension specification for digital output and input triggers: +# id type channel delay (us) duration (us) +extension TRIGGERS 2 +1 1 3 0 10 + +# Extension specification for setting labels: +# id set labelstring +extension LABELSET 1 +1 0 SLC + +# Extension specification for increasing labels: +# id set labelstring +extension LABELINC 3 +1 1 SLC +2 1 REP + +# Sequence Shapes +[SHAPES] + +shape_id 1 +num_samples 800 +0 +0 +173 +1e-07 +0 +0 +4 +1e-07 +0 +0 +1 +1e-07 +0 +1e-07 +0 +1e-07 +0 +1e-07 +1e-07 +2 +2e-07 +1e-07 +2e-07 +2e-07 +1 +3e-07 +3e-07 +1 +4e-07 +4e-07 +0 +5e-07 +5e-07 +0 +6e-07 +7e-07 +8e-07 +9e-07 +1e-06 +1.1e-06 +1.3e-06 +1.4e-06 +1.6e-06 +1.8e-06 +2e-06 +2.3e-06 +2.5e-06 +2.9e-06 +3.1e-06 +3.6e-06 +4e-06 +4.4e-06 +5e-06 +5.5e-06 +6.2e-06 +6.9e-06 +7.7e-06 +8.5e-06 +9.5e-06 +1.05e-05 +1.17e-05 +1.3e-05 +1.43e-05 +1.6e-05 +1.76e-05 +1.95e-05 +2.16e-05 +2.38e-05 +2.64e-05 +2.9e-05 +3.2e-05 +3.53e-05 +3.88e-05 +4.27e-05 +4.7e-05 +5.16e-05 +5.66e-05 +6.22e-05 +6.81e-05 +7.46e-05 +8.17e-05 +8.94e-05 +9.76e-05 +0.0001067 +0.0001165 +0.0001271 +0.0001385 +0.0001508 +0.0001643 +0.0001786 +0.0001941 +0.0002108 +0.0002289 +0.0002482 +0.000269 +0.0002913 +0.0003153 +0.0003409 +0.0003685 +0.0003979 +0.0004293 +0.000463 +0.0004989 +0.0005372 +0.0005779 +0.0006214 +0.0006676 +0.0007168 +0.0007689 +0.0008243 +0.000883 +0.0009452 +0.001011 +0.0010806 +0.0011541 +0.0012318 +0.0013137 +0.0013999 +0.0014907 +0.0015862 +0.0016866 +0.001792 +0.0019025 +0.0020183 +0.0021395 +0.0022662 +0.0023988 +0.002537 +0.0026811 +0.0028314 +0.0029877 +0.0031502 +0.0033189 +0.0034941 +0.0036755 +0.0038634 +0.0040576 +0.0042583 +0.0044654 +0.0046789 +0.0048986 +0.0051245 +0.0053567 +0.0055947 +0.0058387 +0.0060883 +0.0063434 +0.0066038 +0.0068692 +0.0071393 +0.007414 +0.0076926 +0.0079752 +0.008261 +0.0085498 +0.0088411 +0.0091345 +0.0094294 +0.0097253 +0.0100218 +0.010318 +0.0106135 +0.0109077 +0.0111998 +0.0114892 +0.0117753 +0.0120572 +0.0123341 +0.0126056 +0.0128705 +0.0131282 +0.0133781 +0.013619 +0.0138503 +0.0140713 +0.0142809 +0.0144785 +0.0146632 +0.0148342 +0.0149908 +0.015132 +0.0152573 +0.0153658 +0.0154568 +0.0155297 +0.0155835 +0.015618 +0.0156324 +0.0156261 +0.0155986 +0.0155495 +0.0154783 +0.0153846 +0.0152681 +0.0151285 +0.0149656 +0.0147793 +0.0145693 +0.0143357 +0.0140786 +0.013798 +0.0134938 +0.0131667 +0.0128165 +0.0124439 +0.0120491 +0.0116327 +0.0111951 +0.010737 +0.0102591 +0.009762 +0.0092466 +0.0087137 +0.0081641 +0.007599 +0.0070192 +0.0064257 +0.0058197 +0.0052024 +0.0045748 +0.0039382 +0.0032939 +0.002643 +0.0019869 +0.0013268 +0.000664 +0 +-0.000664 +-0.0013268 +-0.0019869 +-0.002643 +-0.0032939 +-0.0039382 +-0.0045748 +-0.0052024 +-0.0058197 +-0.0064257 +-0.0070192 +-0.007599 +-0.0081641 +-0.0087137 +-0.0092466 +-0.009762 +-0.0102591 +-0.010737 +-0.0111951 +-0.0116327 +-0.0120491 +-0.0124439 +-0.0128165 +-0.0131667 +-0.0134938 +-0.013798 +-0.0140786 +-0.0143357 +-0.0145693 +-0.0147793 +-0.0149656 +-0.0151285 +-0.0152681 +-0.0153846 +-0.0154783 +-0.0155495 +-0.0155986 +-0.0156261 +-0.0156324 +-0.015618 +-0.0155835 +-0.0155297 +-0.0154568 +-0.0153658 +-0.0152573 +-0.015132 +-0.0149908 +-0.0148342 +-0.0146632 +-0.0144785 +-0.0142809 +-0.0140713 +-0.0138503 +-0.013619 +-0.0133781 +-0.0131282 +-0.0128705 +-0.0126056 +-0.0123341 +-0.0120572 +-0.0117753 +-0.0114892 +-0.0111998 +-0.0109077 +-0.0106135 +-0.010318 +-0.0100218 +-0.0097253 +-0.0094294 +-0.0091345 +-0.0088411 +-0.0085498 +-0.008261 +-0.0079752 +-0.0076926 +-0.007414 +-0.0071393 +-0.0068692 +-0.0066038 +-0.0063434 +-0.0060883 +-0.0058387 +-0.0055947 +-0.0053567 +-0.0051245 +-0.0048986 +-0.0046789 +-0.0044654 +-0.0042583 +-0.0040576 +-0.0038634 +-0.0036755 +-0.0034941 +-0.0033189 +-0.0031502 +-0.0029877 +-0.0028314 +-0.0026811 +-0.002537 +-0.0023988 +-0.0022662 +-0.0021395 +-0.0020183 +-0.0019025 +-0.001792 +-0.0016866 +-0.0015862 +-0.0014907 +-0.0013999 +-0.0013137 +-0.0012318 +-0.0011541 +-0.0010806 +-0.001011 +-0.0009452 +-0.000883 +-0.0008243 +-0.0007689 +-0.0007168 +-0.0006676 +-0.0006214 +-0.0005779 +-0.0005372 +-0.0004989 +-0.000463 +-0.0004293 +-0.0003979 +-0.0003685 +-0.0003409 +-0.0003153 +-0.0002913 +-0.000269 +-0.0002482 +-0.0002289 +-0.0002108 +-0.0001941 +-0.0001786 +-0.0001643 +-0.0001508 +-0.0001385 +-0.0001271 +-0.0001165 +-0.0001067 +-9.76e-05 +-8.94e-05 +-8.17e-05 +-7.46e-05 +-6.81e-05 +-6.22e-05 +-5.66e-05 +-5.16e-05 +-4.7e-05 +-4.27e-05 +-3.88e-05 +-3.53e-05 +-3.2e-05 +-2.9e-05 +-2.64e-05 +-2.38e-05 +-2.16e-05 +-1.95e-05 +-1.76e-05 +-1.6e-05 +-1.43e-05 +-1.3e-05 +-1.17e-05 +-1.05e-05 +-9.5e-06 +-8.5e-06 +-7.7e-06 +-6.9e-06 +-6.2e-06 +-5.5e-06 +-5e-06 +-4.4e-06 +-4e-06 +-3.6e-06 +-3.1e-06 +-2.9e-06 +-2.5e-06 +-2.3e-06 +-2e-06 +-1.8e-06 +-1.6e-06 +-1.4e-06 +-1.3e-06 +-1.1e-06 +-1e-06 +-9e-07 +-8e-07 +-7e-07 +-6e-07 +-5e-07 +-5e-07 +0 +-4e-07 +-4e-07 +0 +-3e-07 +-3e-07 +1 +-2e-07 +-2e-07 +1 +-1e-07 +-2e-07 +-1e-07 +-1e-07 +2 +0 +-1e-07 +0 +-1e-07 +0 +-1e-07 +0 +0 +1 +-1e-07 +0 +0 +4 +-1e-07 +0 +0 +172 + +shape_id 2 +num_samples 800 +0 +0 +798 + +shape_id 3 +num_samples 800 +5 +10 +10 +797 + +shape_id 4 +num_samples 2000 +8.00403207e-05 +0.000240364508 +0.000401019348 +0.000562011973 +0.000723349541 +0.000885039232 +0.00104708825 +0.00120950381 +0.00137229317 +0.00153546357 +0.00169902229 +0.00186297663 +0.00202733387 +0.00219210134 +0.00235728635 +0.00252289623 +0.00268893833 +0.00285541997 +0.00302234851 +0.0031897313 +0.00335757566 +0.00352588896 +0.00369467853 +0.00386395171 +0.00403371583 +0.00420397822 +0.00437474618 +0.00454602702 +0.00471782802 +0.00489015647 +0.00506301962 +0.00523642471 +0.00541037896 +0.00558488958 +0.00575996374 +0.0059356086 +0.00611183128 +0.00628863889 +0.00646603849 +0.00664403713 +0.00682264182 +0.00700185952 +0.00718169717 +0.00736216167 +0.00754325988 +0.00772499862 +0.00790738467 +0.00809042475 +0.00827412556 +0.00845849372 +0.00864353582 +0.0088292584 +0.00901566795 +0.00920277089 +0.00939057359 +0.00957908236 +0.00976830346 +0.00995824308 +0.0101489073 +0.0103403023 +0.010532434 +0.0107253083 +0.0109189311 +0.0111133082 +0.0113084453 +0.011504348 +0.0117010218 +0.0118984724 +0.012096705 +0.0122957249 +0.0124955375 +0.0126961479 +0.012897561 +0.013099782 +0.0133028156 +0.0135066667 +0.01371134 +0.01391684 +0.0141231712 +0.0143303381 +0.014538345 +0.014747196 +0.0149568952 +0.0151674467 +0.0153788543 +0.0155911217 +0.0158042527 +0.0160182508 +0.0162331194 +0.0164488618 +0.0166654812 +0.0168829808 +0.0171013634 +0.0173206319 +0.017540789 +0.0177618373 +0.0179837793 +0.0182066172 +0.0184303533 +0.0186549897 +0.0188805282 +0.0191069707 +0.0193343189 +0.0195625742 +0.019791738 +0.0200218116 +0.020252796 +0.0204846923 +0.0207175012 +0.0209512233 +0.0211858593 +0.0214214094 +0.0216578738 +0.0218952527 +0.0221335458 +0.022372753 +0.0226128737 +0.0228539075 +0.0230958536 +0.0233387111 +0.0235824789 +0.0238271557 +0.0240727403 +0.0243192309 +0.0245666259 +0.0248149234 +0.0250641213 +0.0253142173 +0.025565209 +0.0258170938 +0.0260698689 +0.0263235313 +0.0265780779 +0.0268335054 +0.0270898102 +0.0273469887 +0.027605037 +0.027863951 +0.0281237265 +0.028384359 +0.0286458439 +0.0289081764 +0.0291713514 +0.0294353637 +0.029700208 +0.0299658786 +0.0302323697 +0.0304996753 +0.0307677893 +0.0310367052 +0.0313064165 +0.0315769162 +0.0318481975 +0.0321202531 +0.0323930756 +0.0326666574 +0.0329409906 +0.0332160671 +0.0334918789 +0.0337684173 +0.0340456737 +0.0343236393 +0.0346023049 +0.0348816612 +0.0351616987 +0.0354424076 +0.035723778 +0.0360057997 +0.0362884624 +0.0365717553 +0.0368556677 +0.0371401885 +0.0374253065 +0.03771101 +0.0379972875 +0.0382841269 +0.0385715162 +0.0388594428 +0.0391478942 +0.0394368576 +0.0397263198 +0.0400162676 +0.0403066874 +0.0405975656 +0.040888888 +0.0411806406 +0.0414728087 +0.0417653779 +0.0420583332 +0.0423516594 +0.0426453412 +0.042939363 +0.0432337089 +0.043528363 +0.0438233088 +0.04411853 +0.0444140097 +0.0447097309 +0.0450056764 +0.0453018288 +0.0455981703 +0.0458946831 +0.0461913489 +0.0464881493 +0.0467850658 +0.0470820795 +0.0473791712 +0.0476763217 +0.0479735113 +0.0482707202 +0.0485679285 +0.0488651157 +0.0491622615 +0.049459345 +0.0497563453 +0.0500532411 +0.050350011 +0.0506466334 +0.0509430862 +0.0512393473 +0.0515353944 +0.0518312048 +0.0521267557 +0.0524220239 +0.0527169862 +0.0530116189 +0.0533058983 +0.0535998004 +0.0538933009 +0.0541863753 +0.0544789989 +0.0547711468 +0.0550627938 +0.0553539144 +0.0556444831 +0.055934474 +0.0562238609 +0.0565126176 +0.0568007175 +0.0570881339 +0.0573748397 +0.0576608078 +0.0579460106 +0.0582304205 +0.0585140096 +0.0587967498 +0.0590786127 +0.0593595699 +0.0596395924 +0.0599186514 +0.0601967176 +0.0604737615 +0.0607497536 +0.0610246639 +0.0612984624 +0.0615711188 +0.0618426026 +0.062112883 +0.0623819292 +0.0626497099 +0.0629161939 +0.0631813496 +0.0634451452 +0.0637075488 +0.0639685282 +0.0642280511 +0.0644860847 +0.0647425965 +0.0649975534 +0.0652509222 +0.0655026696 +0.065752762 +0.0660011657 +0.0662478466 +0.0664927707 +0.0667359036 +0.0669772109 +0.0672166577 +0.0674542093 +0.0676898304 +0.0679234859 +0.0681551404 +0.0683847582 +0.0686123034 +0.0688377402 +0.0690610324 +0.0692821436 +0.0695010374 +0.069717677 +0.0699320257 +0.0701440465 +0.0703537021 +0.0705609553 +0.0707657685 +0.0709681042 +0.0711679244 +0.0713651913 +0.0715598667 +0.0717519123 +0.0719412897 +0.0721279604 +0.0723118855 +0.0724930264 +0.0726713438 +0.0728467988 +0.0730193519 +0.0731889639 +0.073355595 +0.0735192057 +0.073679756 +0.0738372062 +0.0739915159 +0.0741426452 +0.0742905535 +0.0744352006 +0.0745765458 +0.0747145484 +0.0748491676 +0.0749803626 +0.0751080923 +0.0752323155 +0.0753529912 +0.0754700778 +0.0755835341 +0.0756933184 +0.0757993891 +0.0759017046 +0.076000223 +0.0760949024 +0.0761857008 +0.0762725762 +0.0763554864 +0.0764343891 +0.0765092422 +0.0765800031 +0.0766466295 +0.0767090788 +0.0767673085 +0.0768212758 +0.0768709382 +0.0769162527 +0.0769571767 +0.0769936671 +0.0770256812 +0.0770531758 +0.0770761081 +0.0770944348 +0.077108113 +0.0771170994 +0.077121351 +0.0771208244 +0.0771154765 +0.0771052639 +0.0770901435 +0.0770700718 +0.0770450056 +0.0770149014 +0.0769797161 +0.0769394061 +0.0768939281 +0.0768432387 +0.0767872945 +0.0767260523 +0.0766594685 +0.0765874999 +0.076510103 +0.0764272345 +0.0763388511 +0.0762449095 +0.0761453664 +0.0760401785 +0.0759293026 +0.0758126955 +0.075690314 +0.0755621149 +0.0754280553 +0.0752880919 +0.0751421819 +0.0749902822 +0.07483235 +0.0746683424 +0.0744982165 +0.0743219297 +0.0741394393 +0.0739507026 +0.0737556772 +0.0735543206 +0.0733465903 +0.0731324441 +0.0729118397 +0.072684735 +0.072451088 +0.0722108567 +0.0719639991 +0.0717104736 +0.0714502385 +0.0711832521 +0.0709094731 +0.0706288601 +0.0703413718 +0.0700469671 +0.069745605 +0.0694372447 +0.0691218453 +0.0687993663 +0.0684697671 +0.0681330074 +0.067789047 +0.0674378458 +0.0670793639 +0.0667135613 +0.0663403986 +0.0659598363 +0.0655718349 +0.0651763554 +0.0647733587 +0.064362806 +0.0639446587 +0.0635188781 +0.0630854261 +0.0626442644 +0.0621953552 +0.0617386605 +0.0612741429 +0.060801765 +0.0603214895 +0.0598332794 +0.059337098 +0.0588329087 +0.058320675 +0.0578003608 +0.0572719301 +0.0567353472 +0.0561905765 +0.0556375827 +0.0550763308 +0.0545067859 +0.0539289134 +0.0533426788 +0.0527480481 +0.0521449874 +0.0515334629 +0.0509134414 +0.0502848895 +0.0496477744 +0.0490020635 +0.0483477244 +0.0476847248 +0.0470130331 +0.0463326175 +0.0456434468 +0.0449454899 +0.044238716 +0.0435230947 +0.0427985957 +0.0420651892 +0.0413228455 +0.0405715352 +0.0398112293 +0.0390418992 +0.0382635163 +0.0374760525 +0.0366794799 +0.0358737712 +0.035058899 +0.0342348365 +0.0334015571 +0.0325590346 +0.031707243 +0.0308461567 +0.0299757505 +0.0290959995 +0.028206879 +0.0273083648 +0.026400433 +0.02548306 +0.0245562226 +0.0236198978 +0.0226740633 +0.0217186967 +0.0207537764 +0.0197792808 +0.0187951889 +0.0178014798 +0.0167981334 +0.0157851296 +0.0147624487 +0.0137300716 +0.0126879794 +0.0116361537 +0.0105745762 +0.00950322938 +0.00842209586 +0.00733115872 +0.00623040142 +0.00511980783 +0.00399936221 +0.00286904922 +0.00172885393 +0.000578761804 +0.000581241276 +0.00175116902 +0.00293103474 +0.00412085131 +0.00532063119 +0.00653038645 +0.00775012871 +0.00897986916 +0.0102196186 +0.0114693874 +0.0127291854 +0.0139990221 +0.0152789067 +0.0165688476 +0.0178688532 +0.019178931 +0.0204990885 +0.0218293325 +0.0231696693 +0.024520105 +0.025880645 +0.0272512944 +0.0286320578 +0.0300229394 +0.0314239427 +0.0328350711 +0.0342563274 +0.0356877137 +0.037129232 +0.0385808836 +0.0400426695 +0.04151459 +0.0429966451 +0.0444888344 +0.0459911567 +0.0475036107 +0.0490261944 +0.0505589054 +0.0521017407 +0.0536546971 +0.0552177706 +0.0567909568 +0.058374251 +0.0599676478 +0.0615711413 +0.0631847253 +0.064808393 +0.0664421371 +0.0680859497 +0.0697398226 +0.071403747 +0.0730777137 +0.0747617128 +0.076455734 +0.0781597667 +0.0798737994 +0.0815978204 +0.0833318175 +0.0850757777 +0.0868296879 +0.0885935342 +0.0903673023 +0.0921509773 +0.0939445439 +0.0957479862 +0.097561288 +0.0993844323 +0.101217402 +0.103060178 +0.104912744 +0.106775079 +0.108647165 +0.110528981 +0.112420508 +0.114321723 +0.116232606 +0.118153134 +0.120083286 +0.122023037 +0.123972364 +0.125931244 +0.127899651 +0.129877561 +0.131864948 +0.133861785 +0.135868045 +0.137883703 +0.139908729 +0.141943096 +0.143986775 +0.146039737 +0.148101951 +0.150173388 +0.152254016 +0.154343804 +0.15644272 +0.158550733 +0.160667808 +0.162793912 +0.164929012 +0.167073073 +0.169226059 +0.171387936 +0.173558667 +0.175738216 +0.177926545 +0.180123617 +0.182329394 +0.184543837 +0.186766907 +0.188998565 +0.19123877 +0.193487481 +0.195744657 +0.198010257 +0.200284238 +0.202566557 +0.204857172 +0.207156039 +0.209463112 +0.211778348 +0.214101701 +0.216433126 +0.218772576 +0.221120004 +0.223475363 +0.225838605 +0.228209682 +0.230588545 +0.232975145 +0.235369432 +0.237771356 +0.240180865 +0.24259791 +0.245022437 +0.247454396 +0.249893732 +0.252340393 +0.254794325 +0.257255474 +0.259723785 +0.262199204 +0.264681674 +0.267171139 +0.269667543 +0.272170829 +0.274680939 +0.277197815 +0.279721399 +0.282251633 +0.284788455 +0.287331808 +0.289881629 +0.29243786 +0.295000437 +0.297569301 +0.300144388 +0.302725636 +0.305312982 +0.307906363 +0.310505714 +0.313110972 +0.315722071 +0.318338946 +0.320961532 +0.323589763 +0.326223571 +0.328862891 +0.331507654 +0.334157793 +0.33681324 +0.339473926 +0.342139782 +0.344810738 +0.347486725 +0.350167672 +0.352853509 +0.355544164 +0.358239567 +0.360939645 +0.363644326 +0.366353537 +0.369067205 +0.371785257 +0.374507619 +0.377234217 +0.379964975 +0.382699821 +0.385438677 +0.388181468 +0.390928118 +0.393678551 +0.39643269 +0.399190458 +0.401951777 +0.404716569 +0.407484757 +0.410256262 +0.413031004 +0.415808906 +0.418589886 +0.421373866 +0.424160765 +0.426950502 +0.429742997 +0.432538169 +0.435335936 +0.438136217 +0.440938928 +0.443743989 +0.446551316 +0.449360826 +0.452172436 +0.454986062 +0.457801621 +0.460619029 +0.4634382 +0.466259051 +0.469081496 +0.471905451 +0.474730829 +0.477557545 +0.480385513 +0.483214647 +0.48604486 +0.488876066 +0.491708177 +0.494541107 +0.497374768 +0.500209071 +0.50304393 +0.505879256 +0.508714961 +0.511550957 +0.514387154 +0.517223463 +0.520059796 +0.522896063 +0.525732174 +0.52856804 +0.531403571 +0.534238677 +0.537073267 +0.539907251 +0.542740539 +0.545573039 +0.54840466 +0.551235312 +0.554064904 +0.556893343 +0.559720539 +0.562546399 +0.565370832 +0.568193746 +0.571015048 +0.573834648 +0.576652451 +0.579468367 +0.582282301 +0.585094163 +0.587903858 +0.590711295 +0.59351638 +0.596319019 +0.599119122 +0.601916593 +0.604711339 +0.607503268 +0.610292286 +0.6130783 +0.615861216 +0.61864094 +0.62141738 +0.62419044 +0.626960029 +0.629726051 +0.632488414 +0.635247023 +0.638001785 +0.640752606 +0.643499392 +0.646242049 +0.648980484 +0.651714603 +0.654444311 +0.657169516 +0.659890124 +0.66260604 +0.665317171 +0.668023423 +0.670724703 +0.673420918 +0.676111972 +0.678797774 +0.681478229 +0.684153245 +0.686822727 +0.689486583 +0.69214472 +0.694797043 +0.697443461 +0.70008388 +0.702718208 +0.705346351 +0.707968218 +0.710583714 +0.713192749 +0.71579523 +0.718391064 +0.720980159 +0.723562424 +0.726137767 +0.728706096 +0.731267318 +0.733821344 +0.736368082 +0.73890744 +0.741439329 +0.743963656 +0.746480331 +0.748989264 +0.751490365 +0.753983544 +0.75646871 +0.758945775 +0.761414648 +0.76387524 +0.766327463 +0.768771227 +0.771206444 +0.773633025 +0.776050882 +0.778459927 +0.780860072 +0.78325123 +0.785633314 +0.788006237 +0.790369911 +0.79272425 +0.795069169 +0.79740458 +0.799730399 +0.802046539 +0.804352916 +0.806649445 +0.808936042 +0.811212621 +0.813479099 +0.815735392 +0.817981416 +0.82021709 +0.822442329 +0.824657051 +0.826861175 +0.829054618 +0.831237299 +0.833409136 +0.83557005 +0.837719958 +0.839858782 +0.841986442 +0.844102857 +0.846207949 +0.848301639 +0.85038385 +0.852454502 +0.854513518 +0.856560821 +0.858596335 +0.860619982 +0.862631687 +0.864631373 +0.866618967 +0.868594392 +0.870557575 +0.872508441 +0.874446916 +0.876372928 +0.878286404 +0.880187271 +0.882075458 +0.883950892 +0.885813503 +0.88766322 +0.889499973 +0.891323693 +0.893134309 +0.894931753 +0.896715957 +0.898486853 +0.900244374 +0.901988452 +0.903719021 +0.905436014 +0.907139368 +0.908829015 +0.910504892 +0.912166935 +0.91381508 +0.915449265 +0.917069425 +0.9186755 +0.920267428 +0.921845148 +0.923408599 +0.924957721 +0.926492455 +0.928012741 +0.929518522 +0.931009739 +0.932486336 +0.933948254 +0.935395438 +0.936827832 +0.938245381 +0.93964803 +0.941035725 +0.942408413 +0.94376604 +0.945108554 +0.946435903 +0.947748035 +0.949044901 +0.950326449 +0.951592631 +0.952843397 +0.954078698 +0.955298487 +0.956502717 +0.95769134 +0.958864312 +0.960021585 +0.961163115 +0.962288859 +0.963398771 +0.964492809 +0.965570931 +0.966633094 +0.967679258 +0.96870938 +0.969723423 +0.970721345 +0.971703108 +0.972668673 +0.973618004 +0.974551063 +0.975467814 +0.97636822 +0.977252247 +0.978119861 +0.978971027 +0.979805712 +0.980623884 +0.98142551 +0.98221056 +0.982979002 +0.983730806 +0.984465944 +0.985184387 +0.985886105 +0.986571072 +0.987239262 +0.987890647 +0.988525203 +0.989142904 +0.989743726 +0.990327647 +0.990894642 +0.99144469 +0.991977769 +0.992493858 +0.992992937 +0.993474987 +0.993939988 +0.994387923 +0.994818773 +0.995232522 +0.995629154 +0.996008653 +0.996371003 +0.996716192 +0.997044205 +0.99735503 +0.997648654 +0.997925065 +0.998184254 +0.998426209 +0.998650921 +0.998858382 +0.999048583 +0.999221517 +0.999377177 +0.999515557 +0.999636651 +0.999740455 +0.999826964 +0.999896176 +0.999948087 +0.999982695 +1 +1 +0.999982695 +0.999948087 +0.999896176 +0.999826964 +0.999740455 +0.999636651 +0.999515557 +0.999377177 +0.999221517 +0.999048583 +0.998858382 +0.998650921 +0.998426209 +0.998184254 +0.997925065 +0.997648654 +0.99735503 +0.997044205 +0.996716192 +0.996371003 +0.996008653 +0.995629154 +0.995232522 +0.994818773 +0.994387923 +0.993939988 +0.993474987 +0.992992937 +0.992493858 +0.991977769 +0.99144469 +0.990894642 +0.990327647 +0.989743726 +0.989142904 +0.988525203 +0.987890647 +0.987239262 +0.986571072 +0.985886105 +0.985184387 +0.984465944 +0.983730806 +0.982979002 +0.98221056 +0.98142551 +0.980623884 +0.979805712 +0.978971027 +0.978119861 +0.977252247 +0.97636822 +0.975467814 +0.974551063 +0.973618004 +0.972668673 +0.971703108 +0.970721345 +0.969723423 +0.96870938 +0.967679258 +0.966633094 +0.965570931 +0.964492809 +0.963398771 +0.962288859 +0.961163115 +0.960021585 +0.958864312 +0.95769134 +0.956502717 +0.955298487 +0.954078698 +0.952843397 +0.951592631 +0.950326449 +0.949044901 +0.947748035 +0.946435903 +0.945108554 +0.94376604 +0.942408413 +0.941035725 +0.93964803 +0.938245381 +0.936827832 +0.935395438 +0.933948254 +0.932486336 +0.931009739 +0.929518522 +0.928012741 +0.926492455 +0.924957721 +0.923408599 +0.921845148 +0.920267428 +0.9186755 +0.917069425 +0.915449265 +0.91381508 +0.912166935 +0.910504892 +0.908829015 +0.907139368 +0.905436014 +0.903719021 +0.901988452 +0.900244374 +0.898486853 +0.896715957 +0.894931753 +0.893134309 +0.891323693 +0.889499973 +0.88766322 +0.885813503 +0.883950892 +0.882075458 +0.880187271 +0.878286404 +0.876372928 +0.874446916 +0.872508441 +0.870557575 +0.868594392 +0.866618967 +0.864631373 +0.862631687 +0.860619982 +0.858596335 +0.856560821 +0.854513518 +0.852454502 +0.85038385 +0.848301639 +0.846207949 +0.844102857 +0.841986442 +0.839858782 +0.837719958 +0.83557005 +0.833409136 +0.831237299 +0.829054618 +0.826861175 +0.824657051 +0.822442329 +0.82021709 +0.817981416 +0.815735392 +0.813479099 +0.811212621 +0.808936042 +0.806649445 +0.804352916 +0.802046539 +0.799730399 +0.79740458 +0.795069169 +0.79272425 +0.790369911 +0.788006237 +0.785633314 +0.78325123 +0.780860072 +0.778459927 +0.776050882 +0.773633025 +0.771206444 +0.768771227 +0.766327463 +0.76387524 +0.761414648 +0.758945775 +0.75646871 +0.753983544 +0.751490365 +0.748989264 +0.746480331 +0.743963656 +0.741439329 +0.73890744 +0.736368082 +0.733821344 +0.731267318 +0.728706096 +0.726137767 +0.723562424 +0.720980159 +0.718391064 +0.71579523 +0.713192749 +0.710583714 +0.707968218 +0.705346351 +0.702718208 +0.70008388 +0.697443461 +0.694797043 +0.69214472 +0.689486583 +0.686822727 +0.684153245 +0.681478229 +0.678797774 +0.676111972 +0.673420918 +0.670724703 +0.668023423 +0.665317171 +0.66260604 +0.659890124 +0.657169516 +0.654444311 +0.651714603 +0.648980484 +0.646242049 +0.643499392 +0.640752606 +0.638001785 +0.635247023 +0.632488414 +0.629726051 +0.626960029 +0.62419044 +0.62141738 +0.61864094 +0.615861216 +0.6130783 +0.610292286 +0.607503268 +0.604711339 +0.601916593 +0.599119122 +0.596319019 +0.59351638 +0.590711295 +0.587903858 +0.585094163 +0.582282301 +0.579468367 +0.576652451 +0.573834648 +0.571015048 +0.568193746 +0.565370832 +0.562546399 +0.559720539 +0.556893343 +0.554064904 +0.551235312 +0.54840466 +0.545573039 +0.542740539 +0.539907251 +0.537073267 +0.534238677 +0.531403571 +0.52856804 +0.525732174 +0.522896063 +0.520059796 +0.517223463 +0.514387154 +0.511550957 +0.508714961 +0.505879256 +0.50304393 +0.500209071 +0.497374768 +0.494541107 +0.491708177 +0.488876066 +0.48604486 +0.483214647 +0.480385513 +0.477557545 +0.474730829 +0.471905451 +0.469081496 +0.466259051 +0.4634382 +0.460619029 +0.457801621 +0.454986062 +0.452172436 +0.449360826 +0.446551316 +0.443743989 +0.440938928 +0.438136217 +0.435335936 +0.432538169 +0.429742997 +0.426950502 +0.424160765 +0.421373866 +0.418589886 +0.415808906 +0.413031004 +0.410256262 +0.407484757 +0.404716569 +0.401951777 +0.399190458 +0.39643269 +0.393678551 +0.390928118 +0.388181468 +0.385438677 +0.382699821 +0.379964975 +0.377234217 +0.374507619 +0.371785257 +0.369067205 +0.366353537 +0.363644326 +0.360939645 +0.358239567 +0.355544164 +0.352853509 +0.350167672 +0.347486725 +0.344810738 +0.342139782 +0.339473926 +0.33681324 +0.334157793 +0.331507654 +0.328862891 +0.326223571 +0.323589763 +0.320961532 +0.318338946 +0.315722071 +0.313110972 +0.310505714 +0.307906363 +0.305312982 +0.302725636 +0.300144388 +0.297569301 +0.295000437 +0.29243786 +0.289881629 +0.287331808 +0.284788455 +0.282251633 +0.279721399 +0.277197815 +0.274680939 +0.272170829 +0.269667543 +0.267171139 +0.264681674 +0.262199204 +0.259723785 +0.257255474 +0.254794325 +0.252340393 +0.249893732 +0.247454396 +0.245022437 +0.24259791 +0.240180865 +0.237771356 +0.235369432 +0.232975145 +0.230588545 +0.228209682 +0.225838605 +0.223475363 +0.221120004 +0.218772576 +0.216433126 +0.214101701 +0.211778348 +0.209463112 +0.207156039 +0.204857172 +0.202566557 +0.200284238 +0.198010257 +0.195744657 +0.193487481 +0.19123877 +0.188998565 +0.186766907 +0.184543837 +0.182329394 +0.180123617 +0.177926545 +0.175738216 +0.173558667 +0.171387936 +0.169226059 +0.167073073 +0.164929012 +0.162793912 +0.160667808 +0.158550733 +0.15644272 +0.154343804 +0.152254016 +0.150173388 +0.148101951 +0.146039737 +0.143986775 +0.141943096 +0.139908729 +0.137883703 +0.135868045 +0.133861785 +0.131864948 +0.129877561 +0.127899651 +0.125931244 +0.123972364 +0.122023037 +0.120083286 +0.118153134 +0.116232606 +0.114321723 +0.112420508 +0.110528981 +0.108647165 +0.106775079 +0.104912744 +0.103060178 +0.101217402 +0.0993844323 +0.097561288 +0.0957479862 +0.0939445439 +0.0921509773 +0.0903673023 +0.0885935342 +0.0868296879 +0.0850757777 +0.0833318175 +0.0815978204 +0.0798737994 +0.0781597667 +0.076455734 +0.0747617128 +0.0730777137 +0.071403747 +0.0697398226 +0.0680859497 +0.0664421371 +0.064808393 +0.0631847253 +0.0615711413 +0.0599676478 +0.058374251 +0.0567909568 +0.0552177706 +0.0536546971 +0.0521017407 +0.0505589054 +0.0490261944 +0.0475036107 +0.0459911567 +0.0444888344 +0.0429966451 +0.04151459 +0.0400426695 +0.0385808836 +0.037129232 +0.0356877137 +0.0342563274 +0.0328350711 +0.0314239427 +0.0300229394 +0.0286320578 +0.0272512944 +0.025880645 +0.024520105 +0.0231696693 +0.0218293325 +0.0204990885 +0.019178931 +0.0178688532 +0.0165688476 +0.0152789067 +0.0139990221 +0.0127291854 +0.0114693874 +0.0102196186 +0.00897986916 +0.00775012871 +0.00653038645 +0.00532063119 +0.00412085131 +0.00293103474 +0.00175116902 +0.000581241276 +0.000578761804 +0.00172885393 +0.00286904922 +0.00399936221 +0.00511980783 +0.00623040142 +0.00733115872 +0.00842209586 +0.00950322938 +0.0105745762 +0.0116361537 +0.0126879794 +0.0137300716 +0.0147624487 +0.0157851296 +0.0167981334 +0.0178014798 +0.0187951889 +0.0197792808 +0.0207537764 +0.0217186967 +0.0226740633 +0.0236198978 +0.0245562226 +0.02548306 +0.026400433 +0.0273083648 +0.028206879 +0.0290959995 +0.0299757505 +0.0308461567 +0.031707243 +0.0325590346 +0.0334015571 +0.0342348365 +0.035058899 +0.0358737712 +0.0366794799 +0.0374760525 +0.0382635163 +0.0390418992 +0.0398112293 +0.0405715352 +0.0413228455 +0.0420651892 +0.0427985957 +0.0435230947 +0.044238716 +0.0449454899 +0.0456434468 +0.0463326175 +0.0470130331 +0.0476847248 +0.0483477244 +0.0490020635 +0.0496477744 +0.0502848895 +0.0509134414 +0.0515334629 +0.0521449874 +0.0527480481 +0.0533426788 +0.0539289134 +0.0545067859 +0.0550763308 +0.0556375827 +0.0561905765 +0.0567353472 +0.0572719301 +0.0578003608 +0.058320675 +0.0588329087 +0.059337098 +0.0598332794 +0.0603214895 +0.060801765 +0.0612741429 +0.0617386605 +0.0621953552 +0.0626442644 +0.0630854261 +0.0635188781 +0.0639446587 +0.064362806 +0.0647733587 +0.0651763554 +0.0655718349 +0.0659598363 +0.0663403986 +0.0667135613 +0.0670793639 +0.0674378458 +0.067789047 +0.0681330074 +0.0684697671 +0.0687993663 +0.0691218453 +0.0694372447 +0.069745605 +0.0700469671 +0.0703413718 +0.0706288601 +0.0709094731 +0.0711832521 +0.0714502385 +0.0717104736 +0.0719639991 +0.0722108567 +0.072451088 +0.072684735 +0.0729118397 +0.0731324441 +0.0733465903 +0.0735543206 +0.0737556772 +0.0739507026 +0.0741394393 +0.0743219297 +0.0744982165 +0.0746683424 +0.07483235 +0.0749902822 +0.0751421819 +0.0752880919 +0.0754280553 +0.0755621149 +0.075690314 +0.0758126955 +0.0759293026 +0.0760401785 +0.0761453664 +0.0762449095 +0.0763388511 +0.0764272345 +0.076510103 +0.0765874999 +0.0766594685 +0.0767260523 +0.0767872945 +0.0768432387 +0.0768939281 +0.0769394061 +0.0769797161 +0.0770149014 +0.0770450056 +0.0770700718 +0.0770901435 +0.0771052639 +0.0771154765 +0.0771208244 +0.077121351 +0.0771170994 +0.077108113 +0.0770944348 +0.0770761081 +0.0770531758 +0.0770256812 +0.0769936671 +0.0769571767 +0.0769162527 +0.0768709382 +0.0768212758 +0.0767673085 +0.0767090788 +0.0766466295 +0.0765800031 +0.0765092422 +0.0764343891 +0.0763554864 +0.0762725762 +0.0761857008 +0.0760949024 +0.076000223 +0.0759017046 +0.0757993891 +0.0756933184 +0.0755835341 +0.0754700778 +0.0753529912 +0.0752323155 +0.0751080923 +0.0749803626 +0.0748491676 +0.0747145484 +0.0745765458 +0.0744352006 +0.0742905535 +0.0741426452 +0.0739915159 +0.0738372062 +0.073679756 +0.0735192057 +0.073355595 +0.0731889639 +0.0730193519 +0.0728467988 +0.0726713438 +0.0724930264 +0.0723118855 +0.0721279604 +0.0719412897 +0.0717519123 +0.0715598667 +0.0713651913 +0.0711679244 +0.0709681042 +0.0707657685 +0.0705609553 +0.0703537021 +0.0701440465 +0.0699320257 +0.069717677 +0.0695010374 +0.0692821436 +0.0690610324 +0.0688377402 +0.0686123034 +0.0683847582 +0.0681551404 +0.0679234859 +0.0676898304 +0.0674542093 +0.0672166577 +0.0669772109 +0.0667359036 +0.0664927707 +0.0662478466 +0.0660011657 +0.065752762 +0.0655026696 +0.0652509222 +0.0649975534 +0.0647425965 +0.0644860847 +0.0642280511 +0.0639685282 +0.0637075488 +0.0634451452 +0.0631813496 +0.0629161939 +0.0626497099 +0.0623819292 +0.062112883 +0.0618426026 +0.0615711188 +0.0612984624 +0.0610246639 +0.0607497536 +0.0604737615 +0.0601967176 +0.0599186514 +0.0596395924 +0.0593595699 +0.0590786127 +0.0587967498 +0.0585140096 +0.0582304205 +0.0579460106 +0.0576608078 +0.0573748397 +0.0570881339 +0.0568007175 +0.0565126176 +0.0562238609 +0.055934474 +0.0556444831 +0.0553539144 +0.0550627938 +0.0547711468 +0.0544789989 +0.0541863753 +0.0538933009 +0.0535998004 +0.0533058983 +0.0530116189 +0.0527169862 +0.0524220239 +0.0521267557 +0.0518312048 +0.0515353944 +0.0512393473 +0.0509430862 +0.0506466334 +0.050350011 +0.0500532411 +0.0497563453 +0.049459345 +0.0491622615 +0.0488651157 +0.0485679285 +0.0482707202 +0.0479735113 +0.0476763217 +0.0473791712 +0.0470820795 +0.0467850658 +0.0464881493 +0.0461913489 +0.0458946831 +0.0455981703 +0.0453018288 +0.0450056764 +0.0447097309 +0.0444140097 +0.04411853 +0.0438233088 +0.043528363 +0.0432337089 +0.042939363 +0.0426453412 +0.0423516594 +0.0420583332 +0.0417653779 +0.0414728087 +0.0411806406 +0.040888888 +0.0405975656 +0.0403066874 +0.0400162676 +0.0397263198 +0.0394368576 +0.0391478942 +0.0388594428 +0.0385715162 +0.0382841269 +0.0379972875 +0.03771101 +0.0374253065 +0.0371401885 +0.0368556677 +0.0365717553 +0.0362884624 +0.0360057997 +0.035723778 +0.0354424076 +0.0351616987 +0.0348816612 +0.0346023049 +0.0343236393 +0.0340456737 +0.0337684173 +0.0334918789 +0.0332160671 +0.0329409906 +0.0326666574 +0.0323930756 +0.0321202531 +0.0318481975 +0.0315769162 +0.0313064165 +0.0310367052 +0.0307677893 +0.0304996753 +0.0302323697 +0.0299658786 +0.029700208 +0.0294353637 +0.0291713514 +0.0289081764 +0.0286458439 +0.028384359 +0.0281237265 +0.027863951 +0.027605037 +0.0273469887 +0.0270898102 +0.0268335054 +0.0265780779 +0.0263235313 +0.0260698689 +0.0258170938 +0.025565209 +0.0253142173 +0.0250641213 +0.0248149234 +0.0245666259 +0.0243192309 +0.0240727403 +0.0238271557 +0.0235824789 +0.0233387111 +0.0230958536 +0.0228539075 +0.0226128737 +0.022372753 +0.0221335458 +0.0218952527 +0.0216578738 +0.0214214094 +0.0211858593 +0.0209512233 +0.0207175012 +0.0204846923 +0.020252796 +0.0200218116 +0.019791738 +0.0195625742 +0.0193343189 +0.0191069707 +0.0188805282 +0.0186549897 +0.0184303533 +0.0182066172 +0.0179837793 +0.0177618373 +0.017540789 +0.0173206319 +0.0171013634 +0.0168829808 +0.0166654812 +0.0164488618 +0.0162331194 +0.0160182508 +0.0158042527 +0.0155911217 +0.0153788543 +0.0151674467 +0.0149568952 +0.014747196 +0.014538345 +0.0143303381 +0.0141231712 +0.01391684 +0.01371134 +0.0135066667 +0.0133028156 +0.013099782 +0.012897561 +0.0126961479 +0.0124955375 +0.0122957249 +0.012096705 +0.0118984724 +0.0117010218 +0.011504348 +0.0113084453 +0.0111133082 +0.0109189311 +0.0107253083 +0.010532434 +0.0103403023 +0.0101489073 +0.00995824308 +0.00976830346 +0.00957908236 +0.00939057359 +0.00920277089 +0.00901566795 +0.0088292584 +0.00864353582 +0.00845849372 +0.00827412556 +0.00809042475 +0.00790738467 +0.00772499862 +0.00754325988 +0.00736216167 +0.00718169717 +0.00700185952 +0.00682264182 +0.00664403713 +0.00646603849 +0.00628863889 +0.00611183128 +0.0059356086 +0.00575996374 +0.00558488958 +0.00541037896 +0.00523642471 +0.00506301962 +0.00489015647 +0.00471782802 +0.00454602702 +0.00437474618 +0.00420397822 +0.00403371583 +0.00386395171 +0.00369467853 +0.00352588896 +0.00335757566 +0.0031897313 +0.00302234851 +0.00285541997 +0.00268893833 +0.00252289623 +0.00235728635 +0.00219210134 +0.00202733387 +0.00186297663 +0.00169902229 +0.00153546357 +0.00137229317 +0.00120950381 +0.00104708825 +0.000885039232 +0.000723349541 +0.000562011973 +0.000401019348 +0.000240364508 +8.00403207e-05 + +shape_id 5 +num_samples 2000 +0.5 +0 +0 +497 +-0.5 +0 +0 +997 +0.5 +0 +0 +497 + +shape_id 6 +num_samples 2994 +0.0340085553 +0.0441244858 +0.021747989 +-0.0111129998 +-0.0458773326 +-0.0764384086 +-0.0984563381 +-0.109597534 +-0.10926543 +-0.0981556603 +-0.0778258026 +-0.0503435344 +-0.0180169729 +0.0168064538 +0.0518871055 +0.0851977012 +0.114993998 +0.139858154 +0.158719959 +0.170860225 +0.17589993 +0.173778278 +0.164722351 +0.149210801 +0.127933642 +0.101749938 +0.0716449906 +0.0386882821 +0.00399330447 +-0.0313198731 +-0.066158606 +-0.0994877462 +-0.130355439 +-0.157914455 +-0.181438988 +-0.200336959 +-0.214158 +-0.222597276 +-0.225495542 +-0.222835648 +-0.214736 +-0.201441308 +-0.18331106 +-0.160806183 +-0.134474283 +-0.1049339 +-0.0728581945 +-0.0389583758 +-0.00396732021 +0.0313764055 +0.0663437586 +0.100229472 +0.132365116 +0.162130799 +0.188965386 +0.212375131 +0.231940659 +0.247322265 +0.258263547 +0.26459343 +0.266226506 +0.263162011 +0.255481236 +0.243343804 +0.226982645 +0.206698044 +0.182850777 +0.155854532 +0.126167761 +0.0942851236 +0.0607286765 +0.0260389451 +-0.00923396946 +-0.0445391231 +-0.0793331737 +-0.113088421 +-0.145300349 +-0.175494594 +-0.203233195 +-0.228120195 +-0.249806388 +-0.267993298 +-0.282436294 +-0.292946903 +-0.299394173 +-0.30170536 +-0.299865643 +-0.293917152 +-0.283957251 +-0.270136122 +-0.252653699 +-0.231756067 +-0.207731337 +-0.180905098 +-0.151635504 +-0.12030808 +-0.0873303097 +-0.0531260936 +-0.0181301411 +0.0172176304 +0.0524776235 +0.0872159466 +0.121009596 +0.153451382 +0.184154577 +0.212757149 +0.238925654 +0.262358735 +0.282790029 +0.299990807 +0.313771919 +0.323985403 +0.330525471 +0.333329118 +0.332376065 +0.327688482 +0.319329929 +0.30740416 +0.292053347 +0.273455904 +0.251824086 +0.227401192 +0.200458467 +0.171291833 +0.140218392 +0.107572781 +0.0737034046 +0.0389686065 +0.00373280848 +-0.0316373375 +-0.0667767503 +-0.101325633 +-0.134933063 +-0.167260428 +-0.197984674 +-0.226801341 +-0.253427357 +-0.277603574 +-0.299097017 +-0.317702852 +-0.333246035 +-0.345582638 +-0.354600858 +-0.360221701 +-0.362399356 +-0.361121246 +-0.356407704 +-0.348311402 +-0.336916529 +-0.322337604 +-0.304717998 +-0.284228377 +-0.261064774 +-0.235446427 +-0.207613667 +-0.177825335 +-0.146356332 +-0.113494934 +-0.079540026 +-0.0447983684 +-0.00958172263 +0.0257959244 +0.0610211806 +0.0957839903 +0.129780317 +0.162714714 +0.194302853 +0.224273771 +0.252372184 +0.278360435 +0.30202033 +0.323154908 +0.341589779 +0.35717439 +0.369783133 +0.379316087 +0.385699573 +0.388886555 +0.388856796 +0.385616718 +0.37919909 +0.369662531 +0.35709079 +0.341591828 +0.323296713 +0.302358335 +0.278949993 +0.253263814 +0.225509054 +0.195910276 +0.164705435 +0.132143879 +0.0984842912 +0.0639925776 +0.0289397308 +-0.00640032223 +-0.0417528677 +-0.076844533 +-0.111405378 +-0.145170934 +-0.177884181 +-0.209297436 +-0.239174156 +-0.267290633 +-0.29343757 +-0.317421534 +-0.33906627 +-0.358213872 +-0.374725819 +-0.388483837 +-0.399390595 +-0.407370259 +-0.412368867 +-0.414354559 +-0.413317664 +-0.409270537 +-0.4022473 +-0.392303427 +-0.379515244 +-0.363979152 +-0.345810749 +-0.325143899 +-0.302129715 +-0.276935214 +-0.249742054 +-0.220745243 +-0.190151554 +-0.158177986 +-0.125050282 +-0.0910011733 +-0.0562687539 +-0.0210948295 +0.0142768475 +0.0496022144 +0.084638612 +0.119146393 +0.152890611 +0.185642463 +0.217180958 +0.247294177 +0.275780814 +0.302451298 +0.32712911 +0.349651767 +0.369871905 +0.387658044 +0.402895494 +0.415486789 +0.425352511 +0.432431284 +0.436680556 +0.438076188 +0.436613028 +0.432304397 +0.425182078 +0.415296061 +0.402713782 +0.387520004 +0.369815802 +0.349717921 +0.327358098 +0.302881812 +0.27644749 +0.248225433 +0.218396484 +0.187150965 +0.154687432 +0.121211263 +0.0869334071 +0.0520690453 +0.0168361779 +-0.0185457307 +-0.0538571031 +-0.0888796295 +-0.123397599 +-0.157199197 +-0.190077783 +-0.22183315 +-0.252272688 +-0.281212493 +-0.308478441 +-0.333907196 +-0.357347143 +-0.378659211 +-0.397717622 +-0.414410581 +-0.428640865 +-0.440326317 +-0.449400252 +-0.455811758 +-0.459525892 +-0.460523798 +-0.458802736 +-0.454375996 +-0.447272729 +-0.43753769 +-0.425230878 +-0.410427102 +-0.393215463 +-0.373698752 +-0.351992778 +-0.328225623 +-0.302536835 +-0.275076564 +-0.246004634 +-0.215489577 +-0.183707624 +-0.150841648 +-0.117080095 +-0.0826158792 +-0.0476452644 +-0.0123667376 +0.0230201241 +0.058315783 +0.0933218617 +0.127842249 +0.161684183 +0.194659315 +0.226584729 +0.257283931 +0.286587797 +0.314335467 +0.34037519 +0.364565114 +0.386774012 +0.406881948 +0.424780871 +0.440375151 +0.453582042 +0.464332061 +0.472569283 +0.478251587 +0.481350805 +0.481852808 +0.47975751 +0.475078837 +0.467844525 +0.458095907 +0.445887631 +0.431287304 +0.414375104 +0.395243276 +0.373995525 +0.350746445 +0.325620865 +0.298753197 +0.270286606 +0.240372206 +0.209168257 +0.176839349 +0.143555466 +0.109491042 +0.0748240737 +0.0397352059 +0.00440672948 +-0.0309783544 +-0.066237254 +-0.101188369 +-0.135652197 +-0.169452208 +-0.202415821 +-0.234375223 +-0.265168123 +-0.294638698 +-0.322638319 +-0.349026102 +-0.373669836 +-0.396446534 +-0.417242783 +-0.435955664 +-0.452492982 +-0.466773525 +-0.478727929 +-0.488298425 +-0.495439285 +-0.50011729 +-0.502311171 +-0.502012382 +-0.499224638 +-0.493963814 +-0.486258323 +-0.476148104 +-0.463685231 +-0.448932946 +-0.431965606 +-0.412868361 +-0.391736252 +-0.368674386 +-0.343796578 +-0.317225568 +-0.289091662 +-0.259532656 +-0.228692705 +-0.196721884 +-0.163775283 +-0.130012298 +-0.0955958513 +-0.0606915614 +-0.0254669814 +0.0099092474 +0.0452681802 +0.0804413812 +0.115261728 +0.149564194 +0.183186605 +0.215970455 +0.24776151 +0.278410743 +0.307774663 +0.335716457 +0.362105987 +0.386821068 +0.40974731 +0.430779213 +0.449820247 +0.466783316 +0.481591461 +0.494177477 +0.504485104 +0.512468339 +0.518092222 +0.521332837 +0.522176946 +0.520622831 +0.516679372 +0.510366513 +0.501715168 +0.490766459 +0.477572261 +0.46219439 +0.444704289 +0.425183156 +0.403720915 +0.380416077 +0.355375475 +0.328713251 +0.300550659 +0.271015559 +0.240241477 +0.208367244 +0.175536391 +0.141896264 +0.107597515 +0.0727934401 +0.0376391726 +0.0022910588 +-0.03309403 +-0.0683594399 +-0.103349383 +-0.137909626 +-0.171888227 +-0.205136107 +-0.2375077 +-0.268861657 +-0.299061437 +-0.327975767 +-0.355479276 +-0.381453098 +-0.4057853 +-0.428371239 +-0.449114094 +-0.467925311 +-0.484724929 +-0.499441745 +-0.512013707 +-0.522388177 +-0.530522172 +-0.536382337 +-0.539945118 +-0.541196876 +-0.540133925 +-0.536762528 +-0.531098687 +-0.523168142 +-0.513006231 +-0.500657714 +-0.486176578 +-0.469625673 +-0.451076459 +-0.430608692 +-0.408310065 +-0.384275809 +-0.358608273 +-0.331416419 +-0.302815371 +-0.272925924 +-0.241874012 +-0.209790168 +-0.176808964 +-0.14306843 +-0.108709459 +-0.0738752233 +-0.0387105772 +-0.00336144668 +0.0320257767 +0.067304843 +0.102330247 +0.13695783 +0.171045361 +0.204453115 +0.237044439 +0.268686303 +0.299249829 +0.328610805 +0.356650179 +0.383254524 +0.408316481 +0.431735176 +0.45341661 +0.473274015 +0.491228178 +0.507207739 +0.521149454 +0.532998423 +0.542708283 +0.550241368 +0.555568829 +0.558670727 +0.559536075 +0.55816286 +0.55455802 +0.548737386 +0.54072559 +0.530555942 +0.518270264 +0.503918704 +0.487559503 +0.469258743 +0.449090061 +0.42713433 +0.403479321 +0.378219336 +0.35145481 +0.323291904 +0.293842069 +0.263221587 +0.231551108 +0.198955159 +0.16556165 +0.131501361 +0.0969074243 +0.0619148022 +0.0266597532 +-0.00872069871 +-0.0440892979 +-0.0793090891 +-0.114243946 +-0.148759094 +-0.182721626 +-0.216001009 +-0.248469579 +-0.280003025 +-0.310480851 +-0.33978683 +-0.367809434 +-0.394442247 +-0.419584356 +-0.443140717 +-0.465022502 +-0.485147416 +-0.50343999 +-0.519831849 +-0.534261966 +-0.546676847 +-0.557030717 +-0.565285668 +-0.571411784 +-0.575387224 +-0.577198285 +-0.576839421 +-0.574313258 +-0.569630578 +-0.562810206 +-0.553878927 +-0.542871371 +-0.529829859 +-0.514804221 +-0.497851591 +-0.479036217 +-0.458429146 +-0.436107933 +-0.412156351 +-0.386664066 +-0.359726286 +-0.331443423 +-0.301920699 +-0.27126769 +-0.239597944 +-0.207028554 +-0.17367972 +-0.139674324 +-0.105137436 +-0.0701958412 +-0.0349775901 +0.000388465736 +0.035773144 +0.0710474247 +0.106082916 +0.140752304 +0.174929802 +0.208491624 +0.241316469 +0.27328588 +0.304284674 +0.334201339 +0.362928522 +0.39036336 +0.416407752 +0.440968722 +0.463958808 +0.485296457 +0.504906067 +0.522718293 +0.538670329 +0.55270632 +0.564777221 +0.574840981 +0.582862761 +0.588815292 +0.592678551 +0.594439846 +0.594094003 +0.591643577 +0.587098343 +0.580475355 +0.571799145 +0.561101582 +0.548421351 +0.533804005 +0.517302142 +0.498974763 +0.478886996 +0.45711018 +0.433721618 +0.408803868 +0.382444682 +0.354736985 +0.325778061 +0.295669299 +0.264516141 +0.232427443 +0.199514996 +0.165893401 +0.131679562 +0.0969921288 +0.0619512756 +0.0266782331 +-0.00870522116 +-0.0440770672 +-0.0793155495 +-0.114299542 +-0.148908946 +-0.183025244 +-0.21653167 +-0.249313737 +-0.281259776 +-0.312260907 +-0.342211758 +-0.371010847 +-0.398560427 +-0.424767459 +-0.449543599 +-0.47280514 +-0.494474172 +-0.514477971 +-0.532749423 +-0.549227936 +-0.563858434 +-0.576592484 +-0.587388318 +-0.596210121 +-0.603029558 +-0.607824559 +-0.610579843 +-0.611287584 +-0.609945979 +-0.606560843 +-0.60114449 +-0.593715769 +-0.584300926 +-0.572931899 +-0.559647862 +-0.544493913 +-0.527521203 +-0.508787391 +-0.4883551 +-0.46629332 +-0.442675708 +-0.417581252 +-0.391093785 +-0.363301238 +-0.334296295 +-0.304174873 +-0.273036988 +-0.240985452 +-0.208126135 +-0.174567389 +-0.140419586 +-0.105795067 +-0.0708073505 +-0.0355711783 +-0.000201794855 +0.0351852051 +0.070474363 +0.105550706 +0.140300118 +0.174609678 +0.208368146 +0.241466059 +0.273796518 +0.305254894 +0.335740002 +0.365153381 +0.393400824 +0.420391299 +0.446038733 +0.470260688 +0.49298027 +0.514124671 +0.533627108 +0.551425301 +0.567463384 +0.581690346 +0.594061916 +0.604538934 +0.613089255 +0.619685995 +0.624309509 +0.626945451 +0.627586892 +0.626232133 +0.622886993 +0.617562389 +0.610276748 +0.601053424 +0.589923126 +0.576921342 +0.562090569 +0.545477976 +0.527137201 +0.507126512 +0.485509902 +0.462356002 +0.437738282 +0.411734835 +0.38442766 +0.355903245 +0.326251142 +0.295564989 +0.26394088 +0.231478269 +0.19827867 +0.164446023 +0.130085995 +0.0953057279 +0.0602136369 +0.0249188244 +-0.0104690091 +-0.0458400825 +-0.0810848017 +-0.116094101 +-0.150759759 +-0.184974877 +-0.218633854 +-0.251633278 +-0.28387155 +-0.31524981 +-0.345671919 +-0.375044577 +-0.403278331 +-0.430286689 +-0.455987625 +-0.480302899 +-0.503158506 +-0.524485563 +-0.544219119 +-0.562299951 +-0.578673539 +-0.593290475 +-0.606107479 +-0.617085848 +-0.626193265 +-0.633402944 +-0.638693423 +-0.64205001 +-0.643462997 +-0.642928929 +-0.640450615 +-0.636035869 +-0.629699198 +-0.621460524 +-0.611345139 +-0.59938478 +-0.585615926 +-0.570080632 +-0.552826708 +-0.533906271 +-0.513376867 +-0.491300898 +-0.467744755 +-0.442779731 +-0.41648109 +-0.388927662 +-0.360202415 +-0.330391445 +-0.299583828 +-0.267871871 +-0.235350191 +-0.202115651 +-0.168267356 +-0.133905911 +-0.099133318 +-0.0640528018 +-0.0287682551 +0.00661592514 +0.041995153 +0.0772650254 +0.112321532 +0.14706148 +0.181382747 +0.215184449 +0.248367467 +0.280834678 +0.312490966 +0.343243822 +0.373003681 +0.401683681 +0.429200277 +0.455473741 +0.480427762 +0.503989888 +0.526092147 +0.54667082 +0.565666396 +0.583024256 +0.598694888 +0.612633266 +0.624799494 +0.635159244 +0.643683264 +0.650347386 +0.65513307 +0.658027531 +0.659022985 +0.658117155 +0.655313565 +0.650621195 +0.644054085 +0.635631777 +0.625379453 +0.613327274 +0.599510358 +0.583968985 +0.566748599 +0.54789908 +0.527474857 +0.505534924 +0.482142734 +0.457365524 +0.431274395 +0.403944207 +0.375453406 +0.345883433 +0.315318697 +0.283846402 +0.25155633 +0.218540344 +0.184892241 +0.150707546 +0.116083238 +0.0811173829 +0.0459088648 +0.0105571759 +-0.0248378912 +-0.0601765623 +-0.0953593374 +-0.130287247 +-0.164862143 +-0.198987033 +-0.232566292 +-0.265505888 +-0.297713683 +-0.329099715 +-0.359576518 +-0.389059175 +-0.41746561 +-0.444716858 +-0.470737307 +-0.495454967 +-0.518801409 +-0.540712089 +-0.561126549 +-0.579988598 +-0.597246538 +-0.612853021 +-0.626765314 +-0.638945452 +-0.649360335 +-0.657981909 +-0.664787003 +-0.669757421 +-0.672880083 +-0.674147039 +-0.673555525 +-0.67110796 +-0.66681171 +-0.660679238 +-0.65272806 +-0.642980683 +-0.631464594 +-0.618212086 +-0.603260075 +-0.586650112 +-0.568428259 +-0.548644943 +-0.527354849 +-0.504616725 +-0.480493119 +-0.455050305 +-0.428358094 +-0.40048963 +-0.371521185 +-0.341531977 +-0.310603858 +-0.278821129 +-0.246270331 +-0.213040001 +-0.179220423 +-0.144903384 +-0.110181924 +-0.0751500533 +-0.0399025204 +-0.00453455912 +0.0308583704 +0.0661808418 +0.101337721 +0.136234425 +0.170777186 +0.204873276 +0.238431263 +0.271361256 +0.303575144 +0.33498683 +0.365512458 +0.395070638 +0.423582678 +0.450972736 +0.477168045 +0.502099105 +0.525699862 +0.54790788 +0.568664497 +0.587914976 +0.605608649 +0.621699063 +0.636144046 +0.648905828 +0.659951146 +0.669251322 +0.67678233 +0.682524854 +0.686464331 +0.688590973 +0.688899794 +0.687390621 +0.684068082 +0.678941554 +0.672025159 +0.663337714 +0.652902683 +0.640748089 +0.62690645 +0.611414678 +0.594313974 +0.575649711 +0.555471315 +0.53383212 +0.510789235 +0.486403375 +0.460738695 +0.433862619 +0.405845666 +0.376761258 +0.346685518 +0.315697078 +0.28387686 +0.251307867 +0.218074963 +0.184264648 +0.149964834 +0.11526461 +0.0802540148 +0.0450237968 +0.00966518246 +-0.025730363 +-0.0610713714 +-0.0962666083 +-0.131225307 +-0.165857402 +-0.200073761 +-0.233786411 +-0.266908762 +-0.299355831 +-0.331044455 +-0.361893503 +-0.391824078 +-0.420759718 +-0.44862659 +-0.475353667 +-0.500872915 +-0.525119456 +-0.548031727 +-0.56955164 +-0.589624715 +-0.608200217 +-0.625231282 +-0.640675025 +-0.654492646 +-0.666649521 +-0.677115282 +-0.685863888 +-0.692873685 +-0.698127454 +-0.701612446 +-0.703320404 +-0.703247585 +-0.701394751 +-0.697767173 +-0.692374597 +-0.685231221 +-0.676355647 +-0.665770831 +-0.653504017 +-0.639586656 +-0.62405433 +-0.606946645 +-0.588307133 +-0.568183134 +-0.546625668 +-0.523689304 +-0.499432019 +-0.473915042 +-0.447202701 +-0.419362253 +-0.390463711 +-0.360579669 +-0.329785112 +-0.298157227 +-0.265775205 +-0.232720045 +-0.199074341 +-0.164922084 +-0.130348442 +-0.0954395513 +-0.0602822987 +-0.024964106 +0.0104272892 +0.0458040509 +0.0810784629 +0.116163145 +0.150971271 +0.18541678 +0.219414591 +0.252880809 +0.285732933 +0.317890055 +0.349273057 +0.379804806 +0.409410338 +0.438017039 +0.465554823 +0.491956299 +0.517156929 +0.541095188 +0.563712704 +0.584954403 +0.604768633 +0.623107285 +0.639925913 +0.655183822 +0.668844186 +0.680874119 +0.691244743 +0.699931254 +0.706912982 +0.71217343 +0.715700312 +0.717485572 +0.717525401 +0.715820236 +0.712374756 +0.707197862 +0.700302643 +0.691706351 +0.681430364 +0.669500105 +0.655944969 +0.640798256 +0.624097087 +0.605882302 +0.586198363 +0.565093236 +0.542618271 +0.518828074 +0.493780367 +0.46753587 +0.440158128 +0.41171334 +0.382270208 +0.351899769 +0.320675226 +0.28867176 +0.255966356 +0.22263761 +0.188765543 +0.154431414 +0.119717513 +0.0847069505 +0.0494834747 +0.0141312659 +-0.0212652626 +-0.0566216659 +-0.091853667 +-0.126877355 +-0.161609401 +-0.195967248 +-0.229869301 +-0.26323512 +-0.295985608 +-0.328043195 +-0.35933202 +-0.389778095 +-0.419309533 +-0.447856688 +-0.475352285 +-0.501731592 +-0.526932567 +-0.550896005 +-0.573565661 +-0.594888383 +-0.61481433 +-0.633296967 +-0.650293171 +-0.665763354 +-0.679671548 +-0.691985473 +-0.702676606 +-0.711720372 +-0.719096066 +-0.72478686 +-0.728779893 +-0.731066276 +-0.731641113 +-0.730503514 +-0.727656735 +-0.723107955 +-0.716868281 +-0.708952757 +-0.699380311 +-0.688173689 +-0.67535953 +-0.66096824 +-0.645033774 +-0.627593638 +-0.608688801 +-0.588363575 +-0.566665597 +-0.543645743 +-0.519357801 +-0.493858442 +-0.467207089 +-0.439465764 +-0.410699032 +-0.380973823 +-0.35035914 +-0.318925974 +-0.286747145 +-0.253897124 +-0.220451947 +-0.186488934 +-0.152086488 +-0.117323961 +-0.0822814711 +-0.0470397329 +-0.0116798632 +0.0237168537 +0.059069116 +0.0942957799 +0.129316033 +0.164049639 +0.198417105 +0.232339824 +0.265740255 +0.298542072 +0.330670458 +0.362052245 +0.392615964 +0.42229205 +0.451012959 +0.4787135 +0.505330935 +0.530804934 +0.55507778 +0.578094466 +0.599803077 +0.620154768 +0.639103667 +0.65660707 +0.672625523 +0.687123283 +0.700068009 +0.711430761 +0.721186129 +0.729312383 +0.735791859 +0.740610377 +0.74375743 +0.745226189 +0.745013889 +0.743121682 +0.739554232 +0.734319899 +0.72743078 +0.718903127 +0.708756585 +0.697014296 +0.683702881 +0.668852812 +0.652497995 +0.634675432 +0.615425305 +0.594791123 +0.572819712 +0.549560549 +0.525065872 +0.499390682 +0.472592908 +0.444732678 +0.41587235 +0.386076461 +0.355411889 +0.323947201 +0.291752602 +0.258899862 +0.225462377 +0.19151466 +0.157132227 +0.122391514 +0.0873698164 +0.0521449028 +0.016794901 +-0.0186018 +-0.0539667627 +-0.089221732 +-0.124288727 +-0.159090183 +-0.19354931 +-0.22759011 +-0.261137477 +-0.29411742 +-0.326457505 +-0.358086621 +-0.388935133 +-0.418935276 +-0.448021466 +-0.476129915 +-0.503198853 +-0.529169194 +-0.553984385 +-0.577590118 +-0.599934655 +-0.620969682 +-0.640649492 +-0.658931063 +-0.675774654 +-0.691144199 +-0.705006347 +-0.71733081 +-0.728091378 +-0.737265163 +-0.744832257 +-0.750776363 +-0.755085468 +-0.757750501 +-0.758765647 +-0.758129441 +-0.755843946 +-0.751914205 +-0.746349005 +-0.739161407 +-0.730367269 +-0.719985648 +-0.708039915 +-0.694556489 +-0.679564571 +-0.663097054 +-0.645190381 +-0.625883379 +-0.605217872 +-0.58323938 +-0.559995603 +-0.535536668 +-0.509916008 +-0.483189271 +-0.455414017 +-0.426650447 +-0.396961005 +-0.366409578 +-0.335062028 +-0.302986249 +-0.2702512 +-0.236927219 +-0.203086231 +-0.1688009 +-0.134144748 +-0.0991922911 +-0.0640184552 +-0.0286985549 +0.0066917247 +0.0420766945 +0.0773806884 +0.112528268 +0.147444481 +0.182054764 +0.21628533 +0.25006343 +0.283317028 +0.315975371 +0.347969314 +0.379230718 +0.409693193 +0.439292515 +0.46796572 +0.49565204 +0.522293377 +0.54783311 +0.572217251 +0.595394899 +0.617316816 +0.637936828 +0.657212156 +0.675101829 +0.691568387 +0.706577919 +0.720098448 +0.732101966 +0.742563995 +0.751462115 +0.758778327 +0.764497943 +0.768608514 +0.771102392 +0.771974845 +0.771223663 +0.768851634 +0.764863979 +0.759268845 +0.752079264 +0.74331027 +0.732980305 +0.721112211 +0.707730557 +0.692863795 +0.676543955 +0.658804742 +0.639684069 +0.619222379 +0.597462055 +0.574449558 +0.550232952 +0.524862686 +0.498392576 +0.470877528 +0.442375174 +0.412945417 +0.382649178 +0.351550062 +0.319712852 +0.287203569 +0.254090279 +0.220441583 +0.186327428 +0.151818819 +0.116987142 +0.0819047801 +0.0466443744 +0.0112789013 +-0.024118427 +-0.0594744505 +-0.0947160947 +-0.129770688 +-0.164565757 +-0.199029739 +-0.233091577 +-0.266681028 +-0.299729306 +-0.332168105 +-0.363931079 +-0.394953044 +-0.425170041 +-0.454520716 +-0.482944436 +-0.510383338 +-0.536781488 +-0.562084398 +-0.586241241 +-0.609202101 +-0.63092051 +-0.651352553 +-0.670455963 +-0.688192952 +-0.704526761 +-0.719424704 +-0.732856935 +-0.744795562 +-0.755217675 +-0.764101371 +-0.771429475 +-0.777187481 +-0.781363331 +-0.783950001 +-0.784941426 +-0.784336861 +-0.782137593 +-0.778348109 +-0.772977374 +-0.766035469 +-0.757538013 +-0.747501825 +-0.735947814 +-0.722900139 +-0.708384703 +-0.692432355 +-0.675074629 +-0.656347755 +-0.636289597 +-0.614940788 +-0.592345379 +-0.568548382 +-0.543599055 +-0.517547182 +-0.490446041 +-0.462350367 +-0.433316738 +-0.403404327 +-0.372672885 +-0.341185069 +-0.309003818 +-0.276194311 +-0.242822462 +-0.208955334 +-0.174661204 +-0.140008693 +-0.105067623 +-0.0699078646 +-0.0346000397 +0.000785203961 +0.0361770019 +0.0715045913 +0.106697285 +0.141684916 +0.176397435 +0.210765867 +0.244721403 +0.278196677 +0.31112487 +0.343440523 +0.375079533 +0.405978734 +0.436077306 +0.465314884 +0.493634312 +0.520978677 +0.547294683 +0.572529626 +0.596634145 +0.619560451 +0.641263279 +0.661700253 +0.680830523 +0.698617393 +0.715024862 +0.73002202 +0.743578211 +0.755668268 +0.76626742 +0.775356114 +0.78291594 +0.788932852 +0.793395101 +0.796294163 +0.797625043 +0.797384835 +0.795575234 +0.792199085 +0.787264608 +0.780780506 +0.772761284 +0.763221596 +0.752181938 +0.739662941 +0.72569077 +0.710291997 +0.693498118 +0.675341515 +0.655858699 +0.635087621 +0.613069518 +0.589847567 +0.565467448 +0.539977159 +0.513426518 +0.485867887 +0.457354902 +0.427943799 +0.397691667 +0.366658118 +0.334903292 +0.302489649 +0.269479958 +0.235938998 +0.201931702 +0.16752463 +0.1327844 +0.0977788061 +0.0625756495 +0.0272434195 +-0.00814942017 +-0.043534226 +-0.0788423952 +-0.114005668 +-0.148955829 +-0.183625531 +-0.217947475 +-0.251855742 +-0.285284468 +-0.318169667 +-0.350447417 +-0.382056153 +-0.412934389 +-0.443023439 +-0.472264734 +-0.5006029 +-0.527982747 +-0.554352611 +-0.57966112 +-0.603860677 +-0.62690416 +-0.648748355 +-0.669350775 +-0.688672866 +-0.706677152 +-0.723329968 +-0.73859918 +-0.752456196 +-0.764874527 +-0.775830793 +-0.785304409 +-0.793277314 +-0.79973502 +-0.804664873 +-0.808058608 +-0.809909053 +-0.810214194 +-0.808972446 +-0.806187954 +-0.801864839 +-0.796013215 +-0.788643025 +-0.779770106 +-0.769410288 +-0.757584841 +-0.744315504 +-0.729628667 +-0.713551924 +-0.696116463 +-0.677355599 +-0.657305025 +-0.63600351 +-0.613491019 +-0.589811368 +-0.565008658 +-0.539131174 +-0.512227068 +-0.484348463 +-0.455547423 +-0.425879313 +-0.395399858 +-0.364167137 +-0.332240158 +-0.299679274 +-0.266546267 +-0.232903416 +-0.198814642 +-0.16434388 +-0.129556491 +-0.0945177602 +-0.0592938767 +-0.0239510317 +0.0114442411 +0.0468254171 +0.0821259975 +0.117279773 +0.152220631 +0.186883286 +0.221202466 +0.255114249 +0.288554821 +0.321461902 +0.353773852 +0.385430234 +0.416372274 +0.446541683 +0.475882982 +0.504340657 +0.531862561 +0.558396827 +0.583894528 +0.60830829 +0.631592392 +0.653704486 +0.674602507 +0.694248996 +0.712606515 +0.729641992 +0.745323633 +0.759622367 +0.77251265 +0.783969635 +0.79397375 +0.802505369 +0.80954999 +0.815094354 +0.819128314 +0.821645521 +0.822640333 +0.822112707 +0.820062586 +0.816494981 +0.811416522 +0.804836461 +0.796768323 +0.787225935 +0.77622859 +0.763795851 +0.74995139 +0.734721263 +0.718132977 +0.700218609 +0.681010195 +0.660544273 +0.638858398 +0.615992451 +0.59198951 +0.566892905 +0.54074994 +0.513608214 +0.485517896 +0.456531088 +0.426700473 +0.396081698 +0.364730448 +0.332704585 +0.300063001 +0.266865216 +0.233172585 +0.19904644 +0.164549492 +0.129744864 +0.094696084 +0.0594674018 +0.0241230345 +-0.0112724197 +-0.0466544073 +-0.0819583519 +-0.117120021 +-0.152075241 +-0.186760459 +-0.221112644 +-0.255069081 +-0.288568465 +-0.321549613 +-0.3539528 +-0.385719464 +-0.416791519 +-0.447113326 +-0.476629543 +-0.505286783 +-0.533033745 +-0.559819507 +-0.585596487 +-0.61031785 +-0.633938709 +-0.656417422 +-0.67771255 +-0.697786425 +-0.716603077 +-0.734127958 +-0.750330814 +-0.765181779 +-0.778654394 +-0.790725372 +-0.801372044 +-0.8105765 +-0.818322143 +-0.824594655 +-0.82938429 +-0.83268161 +-0.834481275 +-0.834780976 +-0.833579284 +-0.830879729 +-0.826687108 +-0.821008603 +-0.813855939 +-0.805241207 +-0.795180308 +-0.783692307 +-0.770796935 +-0.756518408 +-0.740882506 +-0.72391673 +-0.705652778 +-0.686122905 +-0.665362073 +-0.643408519 +-0.620300786 +-0.596080697 +-0.570792102 +-0.544479557 +-0.517190831 +-0.488974691 +-0.459881132 +-0.429962839 +-0.399272888 +-0.367865898 +-0.335798436 +-0.303127231 +-0.269910566 +-0.236207883 +-0.202078813 +-0.167584232 +-0.132785534 +-0.0977443617 +-0.0625230782 +-0.0271841525 +0.00820976381 +0.043595903 +0.0789116074 +0.114094265 +0.149081744 +0.183812111 +0.218223849 +0.252256449 +0.285849633 +0.318944009 +0.351481622 +0.383404782 +0.414657204 +0.445184361 +0.47493206 +0.503848039 +0.531882011 +0.558984148 +0.585107035 +0.61020539 +0.634234537 +0.657152641 +0.678920122 +0.699498161 +0.718851125 +0.736945764 +0.753749711 +0.76923406 +0.783372419 +0.796139368 +0.80751313 +0.817474603 +0.826005692 +0.833092041 +0.838722148 +0.842885511 +0.845575359 +0.846787994 +0.846520641 +0.844774176 +0.841552753 +0.836861367 +0.83070848 +0.82310601 +0.814066642 +0.803606267 +0.791744321 +0.77850101 +0.763899378 +0.747966009 +0.730728331 +0.712216179 +0.692462786 +0.671502403 +0.649371189 +0.626108427 +0.601754664 +0.576351841 +0.549944614 +0.522579171 +0.494302601 +0.465164236 +0.435215091 +0.404506714 +0.373092391 +0.341027021 +0.308365861 +0.275165391 +0.241483407 +0.207378041 +0.172908144 +0.138133459 +0.103114044 +0.0679102509 +0.0325828864 +-0.00280711646 +-0.0381988032 +-0.0735311582 +-0.108743421 +-0.143774986 +-0.178565509 +-0.213055319 +-0.247185206 +-0.280896389 +-0.314131081 +-0.346832524 +-0.378944409 +-0.410411626 +-0.441180716 +-0.471198837 +-0.500414394 +-0.528777793 +-0.556240731 +-0.582755924 +-0.608278166 +-0.632764527 +-0.656172861 +-0.678463069 +-0.699597827 +-0.719541176 +-0.738258787 +-0.755719064 +-0.771893028 +-0.78675273 +-0.800272818 +-0.812431179 +-0.823207196 +-0.832582246 +-0.840540789 +-0.847070177 +-0.852158928 +-0.855798371 +-0.857983285 +-0.858710142 +-0.857977433 +-0.855786742 +-0.852142785 +-0.847051434 +-0.840521273 +-0.832564181 +-0.823194078 +-0.812426539 +-0.800279989 +-0.786775976 +-0.771937256 +-0.755788822 +-0.738358456 +-0.719676361 +-0.699773835 +-0.678684549 +-0.656444825 +-0.633092487 +-0.608666765 +-0.583209043 +-0.556762969 +-0.529373092 +-0.501085526 +-0.471948207 +-0.442010741 +-0.411323391 +-0.379937843 +-0.347907233 +-0.315285715 +-0.282128029 +-0.248489987 +-0.214428393 +-0.180000548 +-0.145264223 +-0.11027781 +-0.0751001779 +-0.0397903312 +-0.00440749127 +0.030988963 +0.066339716 +0.101585569 +0.136667461 +0.171526643 +0.206104938 +0.240344499 +0.274188019 +0.307578962 +0.340461826 +0.37278164 +0.404484386 +0.435517244 +0.465828844 +0.495368555 +0.524087075 +0.551936681 +0.578871496 +0.604846561 +0.629818588 +0.653746186 +0.67659017 +0.698312459 +0.718876891 +0.738249465 +0.756398707 +0.773294426 +0.788908517 +0.803215221 +0.816191565 +0.827816076 +0.838069404 +0.846934684 +0.854397971 +0.860447115 +0.865071988 +0.868265037 +0.870021624 +0.870339275 +0.869217311 +0.86665768 +0.862665061 +0.85724673 +0.85041147 +0.842170631 +0.832538091 +0.821530515 +0.80916601 +0.795464971 +0.780450146 +0.764146927 +0.746582385 +0.727785363 +0.707786918 +0.686620351 +0.664320973 +0.640925338 +0.616471978 +0.591001264 +0.564555569 +0.537178343 +0.50891452 +0.479810593 +0.449914627 +0.419275902 +0.387944575 +0.35597206 +0.323410871 +0.290314619 +0.256737485 +0.222734424 +0.188361136 +0.153673972 +0.118729735 +0.0835855038 +0.0482987268 +0.0129270871 +-0.0224716334 +-0.0578396851 +-0.0931193636 +-0.128253111 +-0.163183646 +-0.197854159 +-0.232208178 +-0.266189752 +-0.299743561 +-0.332815107 +-0.365350791 +-0.397297681 +-0.428603856 +-0.459218478 +-0.489092065 +-0.518176312 +-0.546423971 +-0.573789247 +-0.60022783 +-0.62569723 +-0.65015634 +-0.673565499 +-0.695886861 +-0.717084409 +-0.737124313 +-0.755974302 +-0.773603872 +-0.789984624 +-0.805090239 +-0.818896862 +-0.831382342 +-0.842526529 +-0.852311559 +-0.86072183 +-0.867744349 +-0.873367991 +-0.877583703 +-0.880384838 +-0.881767074 +-0.881728735 +-0.880270173 +-0.877393742 +-0.873104217 +-0.867408694 +-0.860316791 +-0.85184032 +-0.841992898 +-0.830790487 +-0.818251264 +-0.80439569 +-0.78924652 +-0.772828068 +-0.755166786 +-0.736291163 +-0.71623168 +-0.695020966 +-0.672693119 +-0.649283952 +-0.624831091 +-0.599373836 +-0.572953235 +-0.545611821 +-0.517393319 +-0.488342938 +-0.458507231 +-0.427934021 +-0.39667242 +-0.36477238 +-0.332284857 +-0.299261771 +-0.265755889 +-0.231820775 +-0.197510641 +-0.162880154 +-0.127984518 +-0.0928793539 +-0.0576205999 +-0.0222644169 +0.0131329483 +0.0485152051 +0.0838260925 +0.119009481 +0.154009472 +0.188770551 +0.223237571 +0.257355844 +0.291071263 +0.324330386 +0.35708054 +0.389270004 +0.42084783 +0.45176404 +0.481969748 +0.511417215 +0.540059961 +0.567852963 +0.594752352 +0.620715667 +0.645701981 +0.669671938 +0.692587841 +0.71441386 +0.735115691 +0.754660744 +0.773018331 +0.790159655 +0.806057871 +0.820688302 +0.834028152 +0.846056484 +0.85675452 +0.866105599 +0.874095202 +0.88071107 +0.885943201 +0.889783455 +0.892225947 +0.893267028 +0.892905268 +0.891141459 +0.88797881 +0.883422478 +0.877479724 +0.870160044 +0.861475111 +0.851438734 +0.840066913 +0.82737785 +0.81339151 +0.798129917 +0.781617127 +0.763879154 +0.744943916 +0.7248413 +0.703602998 +0.681262259 +0.657854107 +0.633415234 +0.607983937 +0.581600047 +0.554304947 +0.526141392 +0.497153336 +0.467386049 +0.436886012 +0.405700834 +0.373879171 +0.341470687 +0.308525934 +0.27509618 +0.241233456 +0.206990459 +0.172420457 +0.137577204 +0.102514858 +0.0672878966 +0.0319509899 +-0.00344103543 +-0.0388332822 +-0.0741708741 +-0.109399043 +-0.144463216 +-0.179309121 +-0.213882862 +-0.248130955 +-0.282000446 +-0.315438987 +-0.348394927 +-0.380817381 +-0.412656318 +-0.443862702 +-0.474388438 +-0.504186469 +-0.533210899 +-0.561417044 +-0.588761512 +-0.615202257 +-0.640698656 +-0.66521166 +-0.688703646 +-0.711138549 +-0.732481968 +-0.752701203 +-0.771765305 +-0.789645118 +-0.806313323 +-0.821744583 +-0.835915394 +-0.84880412 +-0.860391141 +-0.870658849 +-0.879591677 +-0.887176114 +-0.893400726 +-0.898256218 +-0.901735461 +-0.903833274 +-0.904546622 +-0.903874606 +-0.901818451 +-0.898381526 +-0.893569275 +-0.887389288 +-0.879851274 +-0.870967041 +-0.860750305 +-0.849216856 +-0.836384498 +-0.822273022 +-0.806904154 +-0.790301543 +-0.772490704 +-0.753499018 +-0.733355693 +-0.712091555 +-0.689739153 +-0.666332687 +-0.64190796 +-0.616502304 +-0.590154537 +-0.562904884 +-0.534794935 +-0.505867611 +-0.476167 +-0.445738324 +-0.414627909 +-0.382883097 +-0.350552179 +-0.317684314 +-0.284329454 +-0.250538267 +-0.216362064 +-0.181852726 +-0.147062594 +-0.112044402 +-0.0768512169 +-0.0415363482 +-0.00615326814 +0.029244472 +0.0646033222 +0.0998698146 +0.134990646 +0.169912762 +0.204583445 +0.238950367 +0.27296168 +0.306566093 +0.339712956 +0.37235233 +0.404435065 +0.435912871 +0.466738391 +0.496865274 +0.526248256 +0.554843236 +0.58260727 +0.60949869 +0.635477163 +0.660503747 +0.684540955 +0.707552797 +0.729504844 +0.750364274 +0.770099923 +0.788682321 +0.806083792 +0.822278419 +0.837242067 +0.850952468 +0.863389252 +0.874533965 +0.884370098 +0.892883111 +0.900060456 +0.905891583 +0.910367958 +0.9134831 +0.915232545 +0.915613937 +0.914626885 +0.912273058 +0.908556161 +0.903481942 +0.897058184 +0.88929466 +0.880203157 +0.869797429 +0.858093187 +0.845108069 +0.830861612 +0.815375233 +0.798672199 +0.780777574 +0.761718157 +0.741522462 +0.720220705 +0.697844723 +0.67442794 +0.650005314 +0.624613278 +0.598289696 +0.571073796 +0.543006109 +0.51412842 +0.484483696 +0.454116018 +0.423070534 +0.391393367 +0.359131543 +0.326332943 +0.29304622 +0.25932073 +0.22520646 +0.190753947 +0.15601421 +0.121038667 +0.0858790657 +0.0505874008 +0.0152158406 +-0.0201833525 +-0.0555578957 +-0.0908555677 +-0.126024282 +-0.161012173 +-0.195767657 +-0.230239518 +-0.264376977 +-0.298129775 +-0.331448235 +-0.364283344 +-0.396586825 +-0.428311199 +-0.459409864 +-0.489837159 +-0.519548424 +-0.54850008 +-0.57664968 +-0.603955972 +-0.630378962 +-0.65587997 +-0.680421689 +-0.703968236 +-0.726485215 +-0.747939739 +-0.768300495 +-0.787537785 +-0.805623579 +-0.822531536 +-0.838237061 +-0.852717325 +-0.865951302 +-0.877919805 +-0.888605511 +-0.897992948 +-0.906068613 +-0.912820837 +-0.918239985 +-0.922318312 +-0.925050081 +-0.926431432 +-0.926460602 +-0.925137714 +-0.922464898 +-0.918446248 +-0.913087814 +-0.906397603 +-0.898385559 +-0.889063538 +-0.878445301 +-0.866546496 +-0.853384622 +-0.838979014 +-0.823350802 +-0.806522896 +-0.788519931 +-0.769368242 +-0.749095822 +-0.727732283 +-0.705308806 +-0.6818581 +-0.657414349 +-0.632013161 +-0.605691527 +-0.578487747 +-0.550441388 +-0.521593223 +-0.491985168 +-0.461660221 +-0.430662401 +-0.399036683 +-0.36682893 +-0.334085831 +-0.300854825 +-0.267184042 +-0.233122228 +-0.198718653 +-0.164023096 +-0.129085711 +-0.0939569873 +-0.0586876668 +-0.0233286757 +0.0120689533 +0.0474541529 +0.0827758963 +0.117983266 +0.153025536 +0.18785224 +0.222413229 +0.256658775 +0.290539624 +0.32400706 +0.357012983 +0.389509979 +0.421451389 +0.452791365 +0.48348495 +0.51348813 +0.542757903 +0.571252338 +0.598930634 +0.62575318 +0.651681607 +0.676678847 +0.700709182 +0.723738293 +0.745733313 +0.766662873 +0.786497137 +0.805207852 +0.822768391 +0.839153774 +0.854340724 +0.868307671 +0.881034826 +0.892504157 +0.90269945 +0.911606319 +0.91921222 +0.925506404 +0.930480158 +0.934126546 +0.936440493 +0.937418944 +0.937060685 +0.935366371 +0.932338606 +0.927981925 +0.922302708 +0.915309197 +0.907011539 +0.89742175 +0.886553631 +0.874422819 +0.861046754 +0.846444618 +0.830637331 +0.813647526 +0.795499499 +0.776219185 +0.75583413 +0.734373375 +0.71186757 +0.68834877 +0.663850469 +0.63840754 +0.612056178 +0.584833848 +0.556779241 +0.527932202 +0.498333687 +0.4680257 +0.437051229 +0.405454186 +0.373279345 +0.340572291 +0.307379324 +0.273747429 +0.239724177 +0.205357686 +0.170696513 +0.135789654 +0.100686396 +0.0654362994 +0.0300891059 +-0.00530532547 +-0.0406970911 +-0.0760363027 +-0.111273178 +-0.14635809 +-0.181241663 +-0.215874785 +-0.250208767 +-0.28419533 +-0.317786708 +-0.350935719 +-0.383595801 +-0.415721115 +-0.44726661 +-0.478188022 +-0.508442021 +-0.537986216 +-0.56677923 +-0.594780757 +-0.621951617 +-0.648253815 +-0.673650587 +-0.698106449 +-0.721587261 +-0.744060248 +-0.765494073 +-0.785858858 +-0.805126239 +-0.823269393 +-0.840263089 +-0.856083703 +-0.870709276 +-0.884119528 +-0.896295857 +-0.907221457 +-0.916881161 +-0.925261741 +-0.932351573 +-0.938140997 +-0.942622064 +-0.945788739 +-0.947636803 +-0.948163775 +-0.947369109 +-0.945254152 +-0.941822011 +-0.93707762 +-0.931027733 +-0.923680987 +-0.915047765 +-0.905140295 +-0.893972418 +-0.881559924 +-0.867920239 +-0.853072425 +-0.837037313 +-0.819837329 +-0.801496506 +-0.782040481 +-0.761496359 +-0.739892839 +-0.717260014 +-0.693629406 +-0.669033924 +-0.643507779 +-0.617086478 +-0.589806748 +-0.561706481 +-0.532824702 +-0.503201507 +-0.472877954 +-0.441896125 +-0.410298964 +-0.378130221 +-0.345434469 +-0.312256962 +-0.278643609 +-0.244640898 +-0.210295847 +-0.175655914 +-0.140768953 +-0.105683143 +-0.070446916 +-0.0351088883 +0.000282197544 +0.0356775452 +0.0710283723 +0.106285978 +0.14140181 +0.176327532 +0.211015068 +0.245416736 +0.279485214 +0.313173689 +0.346435878 +0.379226101 +0.411499359 +0.443211363 +0.474318626 +0.50477849 +0.534549209 +0.563590015 +0.591861143 +0.61932391 +0.645940753 +0.671675248 +0.696492257 +0.720357869 +0.743239508 +0.765105975 +0.785927447 +0.805675552 +0.824323418 +0.841845623 +0.858218381 +0.873419417 +0.88742816 +0.900225504 +0.911794209 +0.922118576 +0.931184669 +0.938980302 +0.94549503 +0.950719951 +0.954648239 +0.957274623 +0.958595796 +0.958610099 +0.957317656 +0.954720429 +0.950822086 +0.945628157 +0.939145877 +0.931384064 +0.922353661 +0.91206708 +0.900538423 +0.8877835 +0.873819879 +0.85866664 +0.842344553 +0.824875964 +0.806284717 +0.786596243 +0.765837399 +0.744036495 +0.721223261 +0.69742872 +0.672685318 +0.64702671 +0.620487774 +0.593104601 +0.564914395 +0.535955424 +0.506266995 +0.475889415 +0.4448639 +0.413232519 +0.38103809 +0.348324291 +0.315135345 +0.281516231 +0.247512393 +0.213169845 +0.178535001 +0.143654665 +0.108575961 +0.0733462434 +0.0380130869 +0.00262416188 +-0.0327727952 +-0.0681300661 +-0.103399997 +-0.138535079 +-0.173487976 +-0.20821166 +-0.242659392 +-0.276784838 +-0.31054209 +-0.34388579 +-0.37677112 +-0.409153896 +-0.440990677 +-0.47223877 +-0.502856188 +-0.532801958 +-0.56203587 +-0.590518817 +-0.618212617 +-0.64508023 +-0.671085678 +-0.696194169 +-0.720372121 +-0.743587289 +-0.765808683 +-0.787006646 +-0.807152902 +-0.826220606 +-0.844184367 +-0.861020283 +-0.876705919 +-0.891220461 +-0.904544605 +-0.916660636 +-0.927552522 +-0.937205936 +-0.945608161 +-0.952748076 +-0.95861635 +-0.963205148 +-0.96650866 +-0.968522663 +-0.969244451 +-0.968673345 +-0.966810168 +-0.963657609 +-0.959220127 +-0.953503748 +-0.946516239 +-0.938267096 +-0.928767485 +-0.918030107 +-0.906069486 +-0.89290161 +-0.878544152 +-0.863016338 +-0.846339057 +-0.82853461 +-0.809626821 +-0.789640959 +-0.768603597 +-0.746542926 +-0.723488277 +-0.699470399 +-0.674521239 +-0.648674009 +-0.621963189 +-0.594424307 +-0.56609397 +-0.537009817 +-0.507210475 +-0.476735502 +-0.445625352 +-0.413921267 +-0.381665281 +-0.348900185 +-0.315669371 +-0.282016951 +-0.247987384 +-0.213625756 +-0.178977519 +-0.144088472 +-0.109004752 +-0.0737727158 +-0.0384389146 +-0.00305002758 +0.0323472337 +0.0677061674 +0.102980135 +0.138122628 +0.173087325 +0.207828149 +0.242299326 +0.276455459 +0.310251593 +0.343643284 +0.376586651 +0.409038356 +0.440955753 +0.472296916 +0.503020694 +0.533086701 +0.562455474 +0.591088569 +0.618948447 +0.645998622 +0.672203669 +0.697529266 +0.721942247 +0.745410678 +0.76790377 +0.789392218 +0.809848046 +0.829244536 +0.847556422 +0.864759782 +0.880832293 +0.895752836 +0.909502091 +0.922062103 +0.933416794 +0.943551373 +0.952452812 +0.960109524 +0.966511672 +0.971651002 +0.975520918 +0.978116401 +0.979434464 +0.979473436 +0.978233481 +0.975716444 +0.971925596 +0.966866119 +0.960544702 +0.952969528 +0.944150957 +0.934100679 +0.922831774 +0.910359208 +0.896699242 +0.881869968 +0.865890425 +0.848781834 +0.830566591 +0.811268644 +0.790913155 +0.769526717 +0.747137264 +0.723773905 +0.699467105 +0.674248593 +0.648151377 +0.621209382 +0.593457718 +0.564932459 +0.535670704 +0.505710455 +0.475090611 +0.443851102 +0.412032463 +0.379676039 +0.346823783 +0.313518317 +0.279802744 +0.245720818 +0.211316729 +0.176635068 +0.141720721 +0.106618888 +0.0713749591 +0.0360345296 +0.000643292869 +-0.0347529843 +-0.0701085693 +-0.10537781 +-0.140515171 +-0.175475317 +-0.210213126 +-0.244683765 +-0.278842765 +-0.31264615 +-0.346050405 +-0.379012487 +-0.411489976 +-0.443441066 +-0.474824559 +-0.505600113 +-0.535728235 +-0.565170265 +-0.593888357 +-0.621845666 +-0.64900625 +-0.67533518 +-0.700798679 +-0.725364298 +-0.749000567 +-0.771677223 +-0.793365196 +-0.814036709 +-0.833665211 +-0.852225643 +-0.869694564 +-0.886049677 +-0.901270027 +-0.915336287 +-0.928230333 +-0.939935715 +-0.950437831 +-0.959723405 +-0.967780721 +-0.974599456 +-0.980171057 +-0.984488388 +-0.987545962 +-0.989340409 +-0.989869551 +-0.989132804 +-0.987131252 +-0.983867412 +-0.979345499 +-0.973571706 +-0.966553646 +-0.958300399 +-0.94882259 +-0.938132432 +-0.926243477 +-0.913171141 +-0.898932524 +-0.883545801 +-0.867030795 +-0.849408579 +-0.830701604 +-0.810933804 +-0.790130694 +-0.768318978 +-0.745526469 +-0.72178229 +-0.69711663 +-0.671560872 +-0.645147899 +-0.617911439 +-0.589886172 +-0.561107782 +-0.531612884 +-0.501438897 +-0.470624436 +-0.43920874 +-0.407231775 +-0.374734125 +-0.341757095 +-0.308342468 +-0.274532845 +-0.240371152 +-0.205900746 +-0.171165329 +-0.136208929 +-0.101075846 +-0.0658106715 +-0.0304580878 +0.00493715438 +0.0403302542 +0.075676414 +0.110930878 +0.146049073 +0.180986597 +0.21569934 +0.250143423 +0.284275335 +0.318051865 +0.351430496 +0.38436917 +0.416826315 +0.44876103 +0.480132986 +0.510902502 +0.541031108 +0.570480857 +0.599214699 +0.627196429 +0.654390727 +0.680763382 +0.706281576 +0.730913132 +0.754627244 +0.77739401 +0.799184641 +0.819972064 +0.83973041 +0.858434882 +0.8760621 +0.892589819 +0.907997162 +0.922265333 +0.935376615 +0.947314611 +0.958064315 +0.967612136 +0.975946332 +0.98305695 +0.988935094 +0.993573516 +0.996966335 +0.999109189 +1 +0.99963795 +0.998023447 +0.995158642 +0.991046823 +0.985693584 +0.979106022 +0.971292547 +0.962262955 +0.952028417 +0.940601706 +0.927997788 +0.914232564 +0.899323215 +0.883288412 +0.866148017 +0.847923911 +0.828639157 +0.808317878 +0.786985433 +0.7646683 +0.741394549 +0.717193667 +0.691932214 +0.664526086 +0.634856791 +0.603307834 +0.570252329 +0.536067678 +0.50113101 +0.465812558 +0.430468945 +0.395436989 +0.361028401 +0.327525478 +0.295177951 +0.264200913 +0.234773841 +0.207040592 +0.181110247 +0.157058666 +0.134930599 +0.114742204 +0.0964838307 +0.0801229147 +0.0656069414 +0.0528662653 +0.0418168646 +0.0323628168 +0.0243985949 +0.0178110749 +0.0124812762 +0.00828584439 +0.00509825069 +0.00278979345 +0.00123036554 +0.000288938935 +-0.000165906145 +-0.000265591055 +-0.000365275965 +-0.000365275965 + +shape_id 7 +num_samples 2994 +0.00706107817 +0.0362073702 +0.0620965985 +0.0738239599 +0.0704109947 +0.0532940918 +0.02589995 +-0.00753627754 +-0.0428340166 +-0.0763532194 +-0.105205954 +-0.127307385 +-0.141342503 +-0.146691008 +-0.143332607 +-0.131744696 +-0.112799332 +-0.0876637386 +-0.0577071276 +-0.0244156847 +0.0106831208 +0.0460862023 +0.0803702156 +0.112236628 +0.140546782 +0.164347418 +0.182887322 +0.195625824 +0.202234016 +0.20258958 +0.196766127 +0.185018031 +0.1677616 +0.145553518 +0.11906737 +0.08906902 +0.0563915794 +0.0219105579 +-0.0134801799 +-0.048891223 +-0.0834587389 +-0.11636361 +-0.146848314 +-0.174231366 +-0.197919206 +-0.217415475 +-0.232327708 +-0.242371416 +-0.247371802 +-0.247263062 +-0.242085613 +-0.231981342 +-0.217187111 +-0.19802678 +-0.174901959 +-0.14828175 +-0.118691726 +-0.0867023671 +-0.0529172338 +-0.0179610604 +0.017532022 +0.0529299006 +0.0876134007 +0.12098654 +0.15248597 +0.181589502 +0.20782364 +0.230770015 +0.250070701 +0.265432358 +0.276629226 +0.283504936 +0.285973195 +0.284017379 +0.277689067 +0.267105608 +0.252446796 +0.233950756 +0.211909024 +0.186661133 +0.158588588 +0.12810847 +0.0956667242 +0.0617312666 +0.0267849524 +-0.00868140154 +-0.0441759458 +-0.0792125107 +-0.113317063 +-0.146033823 +-0.176930961 +-0.205605824 +-0.231689649 +-0.254851703 +-0.274802829 +-0.291298369 +-0.304140449 +-0.313179615 +-0.318315828 +-0.319498827 +-0.316727863 +-0.310050835 +-0.299562853 +-0.285404287 +-0.267758333 +-0.246848049 +-0.222933073 +-0.196306004 +-0.167288339 +-0.136226378 +-0.103486738 +-0.0694518762 +-0.0345154462 +0.000922318793 +0.0364592322 +0.0716956812 +0.106239033 +0.139707879 +0.171736074 +0.201976484 +0.230104504 +0.255821254 +0.278856389 +0.298970592 +0.315957684 +0.329646339 +0.3399014 +0.346624783 +0.349755995 +0.34927225 +0.345188198 +0.337555271 +0.326460676 +0.312026043 +0.294405747 +0.273784943 +0.250377323 +0.224422635 +0.196183986 +0.165944974 +0.134006655 +0.100684404 +0.0663046832 +0.0312017746 +-0.00428551861 +-0.0398171602 +-0.0750551245 +-0.109666551 +-0.143326827 +-0.175722533 +-0.206554195 +-0.235538944 +-0.262412939 +-0.286933488 +-0.308881186 +-0.328061483 +-0.344306283 +-0.357475153 +-0.367456199 +-0.374166914 +-0.377554385 +-0.377595679 +-0.374297496 +-0.367695981 +-0.357855989 +-0.344870218 +-0.328858236 +-0.309964951 +-0.288359339 +-0.264232588 +-0.237796262 +-0.20928039 +-0.178931213 +-0.147008992 +-0.113785709 +-0.0795426384 +-0.0445679045 +-0.00915404725 +0.0264044525 +0.0618136281 +0.0967824276 +0.131025066 +0.164263309 +0.196228661 +0.22666445 +0.255327777 +0.281991343 +0.306445122 +0.328497883 +0.347978532 +0.364737284 +0.378646656 +0.389602265 +0.397523438 +0.402353635 +0.404060673 +0.402636761 +0.398098349 +0.390485792 +0.379862829 +0.366315901 +0.349953295 +0.330904136 +0.309317237 +0.285359808 +0.259216047 +0.23108562 +0.20118204 +0.169730975 +0.136968465 +0.103139088 +0.0684940974 +0.0332895229 +-0.00221573894 +-0.0377618399 +-0.0730898842 +-0.107943787 +-0.142072096 +-0.175229789 +-0.207179979 +-0.237695517 +-0.266560544 +-0.293572011 +-0.318540927 +-0.34129358 +-0.361672777 +-0.379538705 +-0.394769728 +-0.407263322 +-0.416936427 +-0.423725897 +-0.427589031 +-0.428503335 +-0.426466855 +-0.421497917 +-0.413634723 +-0.402935298 +-0.389476466 +-0.373353712 +-0.354679934 +-0.333584933 +-0.310214143 +-0.28472774 +-0.25729933 +-0.228114801 +-0.197370908 +-0.165273991 +-0.132038429 +-0.0978853026 +-0.0630407535 +-0.0277346007 +0.00780129968 +0.043334507 +0.0786335494 +0.113469397 +0.147616972 +0.180856482 +0.212974934 +0.243767342 +0.273037996 +0.30060179 +0.326285117 +0.349927024 +0.371380231 +0.39051175 +0.407203775 +0.42135442 +0.432878025 +0.441705699 +0.447785746 +0.451083754 +0.451582664 +0.449282859 +0.444202103 +0.436375183 +0.42585363 +0.412705338 +0.397014079 +0.378878828 +0.358413055 +0.335743992 +0.311011775 +0.284368528 +0.255977347 +0.226011248 +0.194652089 +0.162089429 +0.128519347 +0.0941432337 +0.0591665641 +0.023797648 +-0.0117536115 +-0.0472769668 +-0.0825630663 +-0.11740468 +-0.151597901 +-0.184943321 +-0.217247167 +-0.248322396 +-0.277989747 +-0.306078729 +-0.332428564 +-0.356889054 +-0.379321391 +-0.399598889 +-0.417607639 +-0.433247096 +-0.446430572 +-0.457085656 +-0.465154549 +-0.470594306 +-0.473377003 +-0.473489809 +-0.470934977 +-0.465729752 +-0.45790619 +-0.447510901 +-0.434604713 +-0.419262254 +-0.401571464 +-0.381633037 +-0.359559795 +-0.335476003 +-0.309516621 +-0.281826507 +-0.252559573 +-0.221877889 +-0.18995076 +-0.156953768 +-0.123067778 +-0.0884779234 +-0.0533725853 +-0.01794236 +0.0176209823 +0.0531255346 +0.088380293 +0.123196178 +0.157387032 +0.190770593 +0.223169448 +0.254411972 +0.284333217 +0.312775716 +0.339590289 +0.364636783 +0.387784838 +0.408914469 +0.4279166 +0.444693608 +0.459159859 +0.471242071 +0.480879518 +0.488024334 +0.492641855 +0.494710607 +0.494222248 +0.491181682 +0.485607112 +0.477529579 +0.466992821 +0.454053237 +0.438779297 +0.421251057 +0.401559998 +0.379808352 +0.356108356 +0.330581968 +0.303360046 +0.274581494 +0.244392846 +0.212947272 +0.180403747 +0.146926465 +0.112683731 +0.0778472375 +0.0425912194 +0.00709146286 +-0.0284754622 +-0.0639331554 +-0.0991061977 +-0.133821103 +-0.167907019 +-0.20119674 +-0.23352735 +-0.264741065 +-0.294686081 +-0.323217001 +-0.350195989 +-0.37549279 +-0.398986029 +-0.420563055 +-0.440121094 +-0.457567171 +-0.472818904 +-0.485804624 +-0.496463756 +-0.504747111 +-0.510616919 +-0.514047193 +-0.515023523 +-0.513543392 +-0.509615862 +-0.503261699 +-0.494513103 +-0.483413506 +-0.470017471 +-0.454390063 +-0.43660701 +-0.416753613 +-0.394925141 +-0.371225424 +-0.345767245 +-0.318670965 +-0.290064551 +-0.260082582 +-0.228865685 +-0.19656002 +-0.163316242 +-0.129289187 +-0.0946367864 +-0.0595195518 +-0.0240997439 +0.0114594002 +0.0469943706 +0.0823421699 +0.11734103 +0.151831217 +0.185655602 +0.218660561 +0.250696534 +0.281618622 +0.311287507 +0.339569723 +0.366338361 +0.391473857 +0.414864054 +0.436404948 +0.456001302 +0.473566558 +0.489023503 +0.502304767 +0.51335259 +0.522119307 +0.52856777 +0.532671027 +0.534412521 +0.533786405 +0.530797303 +0.525460087 +0.517800054 +0.507852839 +0.495663857 +0.481288256 +0.464790778 +0.446245341 +0.425734501 +0.403349253 +0.379188656 +0.353359263 +0.325974554 +0.297154544 +0.26702526 +0.23571812 +0.20336928 +0.170119115 +0.1361116 +0.101493672 +0.0664145367 +0.031025059 +-0.00452287896 +-0.0400770406 +-0.0754855027 +-0.11059729 +-0.145263004 +-0.179335461 +-0.212670312 +-0.245126669 +-0.27656765 +-0.306860944 +-0.33587937 +-0.363501392 +-0.38961162 +-0.414101294 +-0.43686866 +-0.45781939 +-0.47686697 +-0.493933024 +-0.508947622 +-0.521849546 +-0.532586522 +-0.54111536 +-0.54740213 +-0.551422277 +-0.55316069 +-0.552611727 +-0.549779214 +-0.544676391 +-0.537325836 +-0.527759318 +-0.516017643 +-0.502150459 +-0.486216031 +-0.468280965 +-0.44841991 +-0.426715229 +-0.403256633 +-0.378140796 +-0.351470935 +-0.323356372 +-0.293912069 +-0.263258142 +-0.231519362 +-0.198824634 +-0.165306466 +-0.131100419 +-0.0963445595 +-0.0611788894 +-0.0257447816 +0.00981559111 +0.0453598278 +0.0807458691 +0.115832563 +0.150480223 +0.184551183 +0.217910332 +0.25042565 +0.281968713 +0.312415197 +0.341645353 +0.369544465 +0.39600329 +0.420918467 +0.444192906 +0.46573615 +0.485464712 +0.503302376 +0.519180472 +0.533038125 +0.544822467 +0.554488814 +0.562000822 +0.567330594 +0.570458769 +0.571374565 +0.570075801 +0.566568872 +0.5608687 +0.552998652 +0.542990423 +0.530883887 +0.516726925 +0.500575209 +0.482491965 +0.462547708 +0.440819953 +0.417392895 +0.392357067 +0.365808976 +0.337850716 +0.308589568 +0.278137568 +0.246611078 +0.214130329 +0.180818948 +0.146803479 +0.112212903 +0.077178139 +0.0418315484 +0.00630643288 +-0.029263469 +-0.0647444854 +-0.100003519 +-0.134908543 +-0.169329087 +-0.203136721 +-0.236205525 +-0.268412555 +-0.299638283 +-0.32976707 +-0.358687556 +-0.386293048 +-0.412481914 +-0.437157938 +-0.460230656 +-0.48161571 +-0.501235159 +-0.519017664 +-0.534898768 +-0.548821106 +-0.560734594 +-0.570596673 +-0.578372395 +-0.58403446 +-0.587563329 +-0.588947268 +-0.588182433 +-0.585272908 +-0.580230494 +-0.573074702 +-0.563832665 +-0.552539099 +-0.53923619 +-0.523973221 +-0.506806454 +-0.48779892 +-0.467020308 +-0.444546568 +-0.420459539 +-0.394846706 +-0.367800943 +-0.339420206 +-0.309806965 +-0.279067911 +-0.24731361 +-0.21465817 +-0.181218643 +-0.147114661 +-0.112468054 +-0.0774024337 +-0.0420426431 +-0.00651436438 +0.029056297 +0.0645433045 +0.0998211377 +0.134765181 +0.169252208 +0.203160863 +0.236371964 +0.268768917 +0.300238314 +0.330670158 +0.359958145 +0.38800021 +0.414698973 +0.439961709 +0.463700785 +0.485834337 +0.506286054 +0.524985409 +0.541868388 +0.556877385 +0.569961072 +0.581075105 +0.590182222 +0.597251746 +0.602260244 +0.605191767 +0.606037076 +0.604794241 +0.601468931 +0.596073445 +0.588627294 +0.5791574 +0.567697037 +0.554286428 +0.538972742 +0.521809023 +0.502854866 +0.482176042 +0.459843606 +0.435934581 +0.410531146 +0.383720109 +0.355593417 +0.326247014 +0.295780787 +0.264298591 +0.231907183 +0.198716433 +0.164838774 +0.130388585 +0.0954822341 +0.0602372934 +0.0247723386 +-0.010793466 +-0.046340831 +-0.0817506907 +-0.116904639 +-0.151685223 +-0.185976575 +-0.219664404 +-0.252636818 +-0.284784365 +-0.316000407 +-0.346181873 +-0.375228792 +-0.403045647 +-0.429540693 +-0.454626892 +-0.478222119 +-0.500248837 +-0.520635522 +-0.539315302 +-0.556227861 +-0.571318137 +-0.584537471 +-0.595843464 +-0.605199637 +-0.612576701 +-0.617950902 +-0.621306197 +-0.622632031 +-0.621925515 +-0.619189579 +-0.614434306 +-0.607676094 +-0.598937787 +-0.588248946 +-0.575644878 +-0.561167782 +-0.544865001 +-0.52679068 +-0.507003607 +-0.485569049 +-0.462556486 +-0.438041364 +-0.41210295 +-0.384825826 +-0.356297992 +-0.326612035 +-0.295863514 +-0.26415181 +-0.231578769 +-0.198249274 +-0.164270115 +-0.129750326 +-0.0948002479 +-0.0595316588 +-0.0240570315 +0.0115105504 +0.047057915 +0.0824721237 +0.117640734 +0.152452391 +0.186796798 +0.220565585 +0.253651992 +0.28595197 +0.317363658 +0.347788576 +0.377131079 +0.405299399 +0.432205365 +0.457764953 +0.481898623 +0.504531042 +0.525592302 +0.545016673 +0.562744636 +0.578720984 +0.592897085 +0.605229119 +0.615679674 +0.624217015 +0.630815212 +0.635455022 +0.638122337 +0.638810368 +0.637517296 +0.634248406 +0.629014522 +0.62183259 +0.612726028 +0.601723271 +0.588859668 +0.574175221 +0.557716193 +0.539534036 +0.519685108 +0.498231561 +0.475239475 +0.450780339 +0.424929629 +0.397766927 +0.36937619 +0.339844361 +0.309262332 +0.277723774 +0.245325115 +0.212165589 +0.178346214 +0.143970185 +0.109142148 +0.0739679182 +0.038554375 +0.00300885183 +-0.0325609822 +-0.0680475639 +-0.103343664 +-0.138342832 +-0.172939636 +-0.207029874 +-0.240511242 +-0.273283172 +-0.305247373 +-0.336308377 +-0.366373139 +-0.39535196 +-0.423158649 +-0.449710173 +-0.474927809 +-0.498736836 +-0.521066446 +-0.541850906 +-0.561028897 +-0.578543667 +-0.594344124 +-0.608383922 +-0.620621793 +-0.631022529 +-0.639555938 +-0.646197218 +-0.650927866 +-0.653734578 +-0.654609563 +-0.653551381 +-0.650563914 +-0.645656461 +-0.638844555 +-0.630149091 +-0.619596109 +-0.607217561 +-0.593050728 +-0.577137617 +-0.559525634 +-0.540267354 +-0.519419578 +-0.497043854 +-0.473206483 +-0.447977549 +-0.42143109 +-0.393645208 +-0.364701396 +-0.33468422 +-0.303681446 +-0.271783725 +-0.239083929 +-0.205677225 +-0.17166085 +-0.137133586 +-0.102195528 +-0.0669479171 +-0.0314927809 +0.00406744458 +0.0396300971 +0.0750926294 +0.110352945 +0.145309602 +0.179862134 +0.213911448 +0.247359978 +0.280111915 +0.312073586 +0.343153849 +0.373264053 +0.40231836 +0.430234112 +0.456932188 +0.482336818 +0.506375965 +0.528981639 +0.550090226 +0.569642198 +0.58758247 +0.603860666 +0.618431424 +0.631254058 +0.642292784 +0.651516973 +0.658901373 +0.664425885 +0.668075484 +0.669840515 +0.66971677 +0.6677055 +0.663812985 +0.658050815 +0.650435877 +0.640990427 +0.629741714 +0.616721879 +0.60196805 +0.585522227 +0.567431241 +0.54774627 +0.526522865 +0.50382086 +0.479704198 +0.454240778 +0.427502006 +0.399562772 +0.370501254 +0.340398694 +0.309339188 +0.277409283 +0.244697853 +0.211295861 +0.177296094 +0.14279292 +0.107881943 +0.0726597823 +0.0372238245 +0.00167194793 +-0.0338977583 +-0.0693872828 +-0.104698942 +-0.139735639 +-0.174401136 +-0.208600317 +-0.24223948 +-0.275226575 +-0.307471402 +-0.33888589 +-0.369384341 +-0.398883658 +-0.427303597 +-0.454566978 +-0.48059979 +-0.505331466 +-0.528695065 +-0.550627448 +-0.571069448 +-0.589966081 +-0.607266564 +-0.622924467 +-0.636897883 +-0.649149524 +-0.659646805 +-0.668361942 +-0.675272062 +-0.680359129 +-0.683610031 +-0.685016633 +-0.684575794 +-0.682289361 +-0.678164152 +-0.672211955 +-0.664449475 +-0.654898198 +-0.643584407 +-0.630539088 +-0.615797844 +-0.599400791 +-0.581392437 +-0.561821565 +-0.540741108 +-0.518207935 +-0.494282731 +-0.469029838 +-0.442517076 +-0.414815553 +-0.38599947 +-0.356145912 +-0.325334651 +-0.293647925 +-0.261170196 +-0.227987931 +-0.194189379 +-0.159864332 +-0.125103884 +-0.0900001847 +-0.0546461975 +-0.0191354492 +0.0164382165 +0.0519808885 +0.0873988391 +0.122598766 +0.157488038 +0.191974934 +0.22596889 +0.259380727 +0.292122891 +0.324109673 +0.355257437 +0.385484829 +0.414712993 +0.442865766 +0.469869884 +0.49565516 +0.520154657 +0.543304864 +0.565045851 +0.585321427 +0.604079272 +0.621271073 +0.636852642 +0.650784016 +0.663029564 +0.673558068 +0.682342794 +0.689361557 +0.69459677 +0.698035478 +0.699669396 +0.699494902 +0.69751306 +0.693729596 +0.688154878 +0.68080388 +0.67169614 +0.660855699 +0.648311034 +0.634094975 +0.618244614 +0.600801207 +0.581810051 +0.561320372 +0.539385185 +0.516061157 +0.49140845 +0.465490569 +0.438374186 +0.410128971 +0.380827405 +0.350544593 +0.319358067 +0.287347583 +0.254594918 +0.221183658 +0.187198977 +0.152727426 +0.117856705 +0.0826754408 +0.0472729619 +0.0117390684 +-0.0238361943 +-0.0593627641 +-0.0947507908 +-0.129910862 +-0.164754229 +-0.199193027 +-0.233140502 +-0.266511219 +-0.299221281 +-0.331188536 +-0.362332782 +-0.392575963 +-0.421842364 +-0.450058795 +-0.477154774 +-0.503062697 +-0.527718001 +-0.551059327 +-0.573028663 +-0.593571482 +-0.612636881 +-0.630177695 +-0.64615061 +-0.660516269 +-0.673239356 +-0.684288688 +-0.693637277 +-0.701262395 +-0.707145622 +-0.711272885 +-0.713634489 +-0.714225129 +-0.713043902 +-0.710094296 +-0.705384177 +-0.698925767 +-0.690735599 +-0.680834481 +-0.669247425 +-0.656003585 +-0.641136177 +-0.624682389 +-0.606683288 +-0.58718371 +-0.566232139 +-0.543880591 +-0.520184475 +-0.495202452 +-0.468996286 +-0.44163069 +-0.413173159 +-0.383693802 +-0.353265166 +-0.321962057 +-0.289861347 +-0.257041794 +-0.223583839 +-0.189569405 +-0.155081694 +-0.120204988 +-0.085024438 +-0.0496258578 +-0.0140955113 +0.0214800957 +0.0570144273 +0.0924211269 +0.127614227 +0.162508356 +0.197018944 +0.231062437 +0.264556489 +0.297420158 +0.329574101 +0.360940766 +0.391444573 +0.421012094 +0.44957223 +0.477056372 +0.503398568 +0.528535671 +0.552407514 +0.574957036 +0.596130399 +0.615877116 +0.634150174 +0.650906139 +0.666105258 +0.679711539 +0.691692841 +0.702020932 +0.710671607 +0.7176247 +0.722864093 +0.726377777 +0.728157873 +0.728200647 +0.726506504 +0.723079986 +0.717929748 +0.711068608 +0.702513429 +0.692285056 +0.680408292 +0.666911831 +0.651828185 +0.635193594 +0.617047934 +0.597434683 +0.576400765 +0.553996382 +0.530274928 +0.505292863 +0.479109576 +0.451787231 +0.423390629 +0.39398711 +0.363646291 +0.332439915 +0.3004417 +0.267727164 +0.234373441 +0.200459101 +0.166064 +0.131269029 +0.0961559341 +0.0608071332 +0.0253055291 +-0.0102656839 +-0.0458232118 +-0.0812838729 +-0.116564797 +-0.151583601 +-0.186258584 +-0.220508908 +-0.254254776 +-0.287417665 +-0.31992051 +-0.351687825 +-0.382645885 +-0.412722908 +-0.441849185 +-0.469957314 +-0.496982398 +-0.522862043 +-0.547536547 +-0.570949036 +-0.593045567 +-0.613775364 +-0.633090956 +-0.650948077 +-0.667305851 +-0.682126876 +-0.695377277 +-0.707027012 +-0.717049764 +-0.725422877 +-0.732127498 +-0.73714858 +-0.740474993 +-0.742099748 +-0.7420196 +-0.740235186 +-0.736751012 +-0.731575437 +-0.724720955 +-0.716203827 +-0.706043991 +-0.694265104 +-0.680894453 +-0.665963147 +-0.649505873 +-0.631560611 +-0.61216868 +-0.591374618 +-0.569226303 +-0.545774713 +-0.521073589 +-0.495179448 +-0.468151442 +-0.440051428 +-0.410943654 +-0.380894471 +-0.349972298 +-0.318247472 +-0.285792256 +-0.252680431 +-0.218987139 +-0.184788775 +-0.150162845 +-0.115187837 +-0.079942872 +-0.0445076097 +-0.00896209551 +0.0266134131 +0.0621386923 +0.0975337071 +0.132718753 +0.167614626 +0.202142936 +0.236226162 +0.269787801 +0.302752516 +0.335046498 +0.366597555 +0.397335107 +0.427190372 +0.45609667 +0.483989716 +0.510807353 +0.536489781 +0.560979768 +0.58422317 +0.606168445 +0.626766843 +0.645972586 +0.663743513 +0.680040478 +0.694827456 +0.708071696 +0.719744443 +0.72982027 +0.738277072 +0.745096225 +0.750263346 +0.753767534 +0.755601293 +0.755760725 +0.754246284 +0.75106186 +0.746214747 +0.739715853 +0.731580394 +0.721826801 +0.710476806 +0.697555718 +0.68309287 +0.6671205 +0.649673931 +0.630791967 +0.610516892 +0.58889355 +0.565969562 +0.541795838 +0.516425982 +0.489915826 +0.462323637 +0.43371051 +0.404139421 +0.373675211 +0.3423848 +0.310337098 +0.277602294 +0.244251982 +0.210359332 +0.175998529 +0.14124459 +0.106173418 +0.0708616498 +0.0353862443 +-0.00017550975 +-0.0357461414 +-0.0712482907 +-0.106604769 +-0.141738712 +-0.176573945 +-0.211034919 +-0.24504681 +-0.278536078 +-0.311430341 +-0.343658318 +-0.375150368 +-0.405838758 +-0.435657175 +-0.464541145 +-0.492428847 +-0.519260265 +-0.544977393 +-0.569525318 +-0.592851554 +-0.614905752 +-0.635640787 +-0.655012735 +-0.672979918 +-0.689503834 +-0.704549896 +-0.718085907 +-0.730082753 +-0.740515706 +-0.749362679 +-0.756604543 +-0.762226756 +-0.766217756 +-0.768568805 +-0.769275704 +-0.768337613 +-0.765756343 +-0.761538072 +-0.755692625 +-0.748232308 +-0.739173547 +-0.728536563 +-0.716343878 +-0.702621861 +-0.687400659 +-0.670712537 +-0.652593306 +-0.6330824 +-0.612221156 +-0.590054153 +-0.566629294 +-0.541996157 +-0.51620724 +-0.48931795 +-0.461385125 +-0.432468175 +-0.402628914 +-0.371930329 +-0.340437604 +-0.308217747 +-0.275338687 +-0.241870115 +-0.207882944 +-0.173448754 +-0.138640383 +-0.1035313 +-0.0681953985 +-0.0327072165 +0.00285857796 +0.0384271709 +0.0739237992 +0.109273942 +0.144403303 +0.179238345 +0.213706015 +0.247734008 +0.281251381 +0.314187839 +0.346474552 +0.378044407 +0.408831144 +0.438770834 +0.467801277 +0.495861554 +0.522893872 +0.548841917 +0.573651465 +0.597271762 +0.619653354 +0.640749971 +0.660518534 +0.678917438 +0.69590937 +0.711459363 +0.72553479 +0.738107719 +0.749151811 +0.758644461 +0.766567065 +0.772902605 +0.777639076 +0.780767016 +0.782279635 +0.782175242 +0.780453633 +0.777118928 +0.772178937 +0.765643237 +0.75752668 +0.747845945 +0.736621055 +0.72387636 +0.709637472 +0.693934766 +0.676800807 +0.658270611 +0.638383507 +0.617179837 +0.594703895 +0.571002231 +0.546123153 +0.520118764 +0.493041965 +0.464948767 +0.435897088 +0.405946105 +0.375157929 +0.343595207 +0.311322855 +0.278407038 +0.244914806 +0.210915037 +0.176476877 +0.141670824 +0.106567871 +0.0712395039 +0.0357578219 +0.0001949743 +-0.0353766345 +-0.0708847134 +-0.106257064 +-0.141421991 +-0.176307958 +-0.210844458 +-0.244961359 +-0.278589616 +-0.311661368 +-0.344109387 +-0.375868639 +-0.40687448 +-0.437064793 +-0.466378576 +-0.494756614 +-0.522142316 +-0.54847986 +-0.573717216 +-0.597802954 +-0.620689291 +-0.642330293 +-0.662682292 +-0.681705381 +-0.699360538 +-0.715613715 +-0.730431537 +-0.743785264 +-0.755648173 +-0.76599651 +-0.774810605 +-0.782072023 +-0.78776787 +-0.791885784 +-0.794418987 +-0.795362054 +-0.794713687 +-0.792475824 +-0.788652574 +-0.78325302 +-0.776287009 +-0.76777017 +-0.757718601 +-0.746153698 +-0.733098253 +-0.718578803 +-0.70262484 +-0.685267861 +-0.666543609 +-0.646488577 +-0.625144094 +-0.602551752 +-0.578757716 +-0.553808722 +-0.52775507 +-0.50064846 +-0.472542853 +-0.443494444 +-0.413560559 +-0.382801237 +-0.351276922 +-0.319050805 +-0.286186159 +-0.252748643 +-0.218803999 +-0.184419727 +-0.149663568 +-0.114604322 +-0.0793111458 +-0.0438536785 +-0.00830183971 +0.0272743322 +0.0628048106 +0.0982196185 +0.133449249 +0.16842428 +0.203076302 +0.23733698 +0.27113953 +0.304417266 +0.3371055 +0.369139778 +0.400457933 +0.430998332 +0.460701717 +0.489509836 +0.517366732 +0.544218029 +0.570011461 +0.594696981 +0.618226387 +0.640554354 +0.66163711 +0.681434389 +0.699907189 +0.7170206 +0.732740691 +0.747038146 +0.759884388 +0.771255886 +0.781129645 +0.78948807 +0.796313942 +0.801595697 +0.805322027 +0.80748747 +0.808086718 +0.807120418 +0.80458931 +0.800500116 +0.794859615 +0.787680532 +0.778975628 +0.768763511 +0.75706282 +0.743897879 +0.729293058 +0.713278193 +0.69588319 +0.677143144 +0.657093265 +0.635773615 +0.613224441 +0.589490437 +0.564616577 +0.538651821 +0.511645533 +0.48365054 +0.454720212 +0.424910824 +0.394279338 +0.362885044 +0.330788041 +0.298050182 +0.264734222 +0.230904124 +0.196624779 +0.161961805 +0.126981682 +0.0917512344 +0.0563379548 +0.0208094309 +-0.0147664179 +-0.0503216939 +-0.0857886264 +-0.121099482 +-0.156187181 +-0.190984663 +-0.225426036 +-0.259445455 +-0.292978656 +-0.325961589 +-0.358332004 +-0.390028242 +-0.420990408 +-0.451159833 +-0.480479292 +-0.508893668 +-0.536348731 +-0.562793387 +-0.588176818 +-0.612452239 +-0.63557278 +-0.657496097 +-0.678179861 +-0.697586217 +-0.715677958 +-0.73242172 +-0.747785951 +-0.761741792 +-0.774263741 +-0.785327574 +-0.794913962 +-0.803003723 +-0.80958345 +-0.814639593 +-0.818164263 +-0.820150127 +-0.820594414 +-0.819496418 +-0.816858228 +-0.812685888 +-0.806986386 +-0.799772164 +-0.791055557 +-0.780854648 +-0.769187674 +-0.75607762 +-0.741548968 +-0.725629073 +-0.708348621 +-0.689739218 +-0.669837162 +-0.648678641 +-0.626304572 +-0.602756127 +-0.578077974 +-0.552316339 +-0.525519117 +-0.497737176 +-0.469021607 +-0.439426983 +-0.40900782 +-0.377821421 +-0.345925729 +-0.313380129 +-0.280245562 +-0.246583258 +-0.212456325 +-0.177927804 +-0.143062124 +-0.107923902 +-0.0725783443 +-0.0370910761 +-0.00152779184 +0.0340455935 +0.0695632185 +0.104959408 +0.140168714 +0.175125985 +0.209766889 +0.244027165 +0.277844005 +0.311154759 +0.343898208 +0.376014207 +0.407443238 +0.438128191 +0.468011974 +0.497040288 +0.525159649 +0.552318258 +0.578467059 +0.603557225 +0.627543825 +0.650382361 +0.672031238 +0.692451468 +0.711604834 +0.729457675 +0.745976518 +0.761131812 +0.774896335 +0.787244224 +0.798154491 +0.807606242 +0.815583164 +0.822071066 +0.827057507 +0.830535048 +0.832496342 +0.832938856 +0.831862149 +0.829267611 +0.825161638 +0.819550751 +0.812446126 +0.803861167 +0.793810856 +0.782315092 +0.769393961 +0.755071652 +0.739374861 +0.722331367 +0.703973566 +0.684334222 +0.663449291 +0.641357539 +0.618098247 +0.593714705 +0.568250888 +0.541752842 +0.514269509 +0.485849971 +0.456546308 +0.42641168 +0.39550024 +0.363868632 +0.331573632 +0.298673744 +0.265228724 +0.231298576 +0.196944901 +0.162229576 +0.127215097 +0.0919647917 +0.0565419798 +0.0210104991 +-0.0145657228 +-0.0501227161 +-0.0855966022 +-0.120923681 +-0.156040429 +-0.190884061 +-0.225391923 +-0.259502181 +-0.293154008 +-0.326286786 +-0.35884156 +-0.390760156 +-0.421985152 +-0.452461397 +-0.482134159 +-0.510950345 +-0.538859288 +-0.565810598 +-0.591756555 +-0.616651451 +-0.640450249 +-0.663111375 +-0.684594598 +-0.704861162 +-0.723876163 +-0.74160545 +-0.758017313 +-0.773083847 +-0.786777611 +-0.799074539 +-0.809953904 +-0.819395567 +-0.827383504 +-0.83390428 +-0.838945559 +-0.842499501 +-0.844560126 +-0.845123174 +-0.844188984 +-0.841759154 +-0.837837597 +-0.832432683 +-0.825553629 +-0.817212449 +-0.807425291 +-0.796208919 +-0.783583215 +-0.769571761 +-0.754198667 +-0.737491309 +-0.719480273 +-0.70019668 +-0.679674903 +-0.657952016 +-0.63506569 +-0.611056672 +-0.585967952 +-0.559843149 +-0.532728677 +-0.504672782 +-0.475724332 +-0.445934617 +-0.415356402 +-0.384043011 +-0.352049764 +-0.319433127 +-0.286250023 +-0.252558902 +-0.218419049 +-0.183890073 +-0.149032625 +-0.113907872 +-0.0785771571 +-0.0431023843 +-0.00754562497 +0.0280310133 +0.0635653288 +0.0989953439 +0.134259168 +0.169295246 +0.204042691 +0.23844081 +0.272429623 +0.305950294 +0.338944307 +0.371354152 +0.403123955 +0.434198333 +0.464523107 +0.494046192 +0.522716274 +0.550483312 +0.577299742 +0.603119205 +0.627896563 +0.651589395 +0.674157113 +0.695560174 +0.715761859 +0.734728013 +0.752425339 +0.768823332 +0.783894704 +0.797613029 +0.80995449 +0.820898871 +0.830427209 +0.838522742 +0.845172394 +0.850365123 +0.854091508 +0.856345636 +0.857124567 +0.856426457 +0.854252634 +0.850608026 +0.84549862 +0.838933047 +0.830923607 +0.821484296 +0.810630972 +0.798382836 +0.784761731 +0.769790608 +0.753495286 +0.735904745 +0.717048952 +0.696960091 +0.675673332 +0.653225468 +0.629654636 +0.605001471 +0.579308916 +0.552620635 +0.524982263 +0.4964417 +0.467047785 +0.436850566 +0.405901887 +0.37425502 +0.341963756 +0.309083226 +0.275669894 +0.241780711 +0.207473354 +0.17280642 +0.137839118 +0.102630871 +0.0672416262 +0.0317316875 +-0.00383859781 +-0.0394087706 +-0.0749183591 +-0.110307135 +-0.145515015 +-0.180482196 +-0.215149485 +-0.249458222 +-0.283350162 +-0.316767872 +-0.349655101 +-0.381956147 +-0.413616242 +-0.444581999 +-0.474801468 +-0.504223391 +-0.532797994 +-0.56047748 +-0.587215342 +-0.61296625 +-0.637686815 +-0.661336042 +-0.683874023 +-0.705262633 +-0.725466086 +-0.744451108 +-0.762185512 +-0.778639387 +-0.793785562 +-0.807599162 +-0.820056687 +-0.831137218 +-0.840822884 +-0.84909777 +-0.855947752 +-0.861361433 +-0.865330624 +-0.8678488 +-0.86891157 +-0.868517345 +-0.866667722 +-0.86336578 +-0.858616944 +-0.852429424 +-0.844814492 +-0.835784771 +-0.825355307 +-0.813543847 +-0.800370973 +-0.785858541 +-0.770030769 +-0.752914399 +-0.734538756 +-0.714934346 +-0.694133864 +-0.672172282 +-0.649086874 +-0.624915966 +-0.599699824 +-0.573480676 +-0.546302736 +-0.518211125 +-0.489252566 +-0.459475395 +-0.428929574 +-0.397665797 +-0.365735986 +-0.333193287 +-0.300092053 +-0.266487197 +-0.232434442 +-0.197990335 +-0.163212167 +-0.12815758 +-0.0928846162 +-0.0574517332 +-0.0219176558 +0.0136588259 +0.0492188789 +0.0847036748 +0.120054564 +0.155213231 +0.190121599 +0.224722015 +0.258957393 +0.29277147 +0.326108484 +0.358913453 +0.39113233 +0.422712321 +0.453601552 +0.483749116 +0.51310542 +0.541622396 +0.569253529 +0.595953312 +0.621677891 +0.646385122 +0.670034973 +0.692588677 +0.714009188 +0.734261446 +0.753312657 +0.77113202 +0.787690233 +0.802960237 +0.816917217 +0.829539004 +0.840805002 +0.850696767 +0.859198246 +0.866295983 +0.871978936 +0.876237726 +0.879065481 +0.880457779 +0.880413018 +0.87893149 +0.876015579 +0.871670178 +0.865902669 +0.858723144 +0.850143291 +0.840177132 +0.828841056 +0.816153934 +0.802136929 +0.786812773 +0.770206484 +0.752345221 +0.7332585 +0.712977633 +0.691535516 +0.668967065 +0.64530908 +0.620600403 +0.594881276 +0.568193377 +0.540580068 +0.512086247 +0.48275844 +0.45264422 +0.421792325 +0.390252771 +0.358076694 +0.32531639 +0.292024855 +0.258255887 +0.2240641 +0.189504791 +0.154633891 +0.119507688 +0.0841828425 +0.0487163559 +0.0131654456 +-0.0224125696 +-0.0579603968 +-0.0934207972 +-0.128736678 +-0.1638512 +-0.19870793 +-0.23325091 +-0.267424615 +-0.301174145 +-0.334445309 +-0.367184768 +-0.399340183 +-0.430859963 +-0.461693579 +-0.49179164 +-0.521105989 +-0.549589964 +-0.577198028 +-0.603885995 +-0.629611224 +-0.654332648 +-0.678011004 +-0.700608732 +-0.722089712 +-0.742419705 +-0.76156636 +-0.779499284 +-0.796190321 +-0.811612939 +-0.825742596 +-0.838556898 +-0.850035575 +-0.860160682 +-0.868916514 +-0.87628915 +-0.882266982 +-0.886840666 +-0.890003134 +-0.891749827 +-0.892078247 +-0.890987927 +-0.888480764 +-0.884560931 +-0.879234901 +-0.872511642 +-0.864401992 +-0.854918905 +-0.844077603 +-0.831895477 +-0.818392096 +-0.803589334 +-0.787510757 +-0.770181935 +-0.751630475 +-0.731885927 +-0.710979766 +-0.688945473 +-0.665817988 +-0.641633964 +-0.616431771 +-0.590251384 +-0.56313434 +-0.535123766 +-0.506263979 +-0.476600579 +-0.446180474 +-0.415051755 +-0.383263622 +-0.350866376 +-0.317911161 +-0.284449908 +-0.250535374 +-0.216221014 +-0.181560898 +-0.146609635 +-0.111422255 +-0.0760540762 +-0.0405607018 +-0.0049979201 +0.0305783929 +0.0661123646 +0.101548244 +0.13683046 +0.171903691 +0.20671296 +0.24120373 +0.275321985 +0.309014346 +0.342228187 +0.374911563 +0.407013378 +0.438483479 +0.469272729 +0.499333073 +0.528617698 +0.55708105 +0.584678731 +0.611367753 +0.637106568 +0.661855142 +0.685575001 +0.708229401 +0.729783278 +0.750203127 +0.76945727 +0.787515873 +0.804350989 +0.819936584 +0.83424868 +0.847265338 +0.85896642 +0.869333893 +0.878351829 +0.886006416 +0.892285957 +0.89718095 +0.900684179 +0.902790365 +0.903496389 +0.902801349 +0.900706524 +0.897215372 +0.892333514 +0.886068839 +0.878431327 +0.869432926 +0.859087731 +0.847411937 +0.8344238 +0.8201436 +0.804593616 +0.787798197 +0.769783463 +0.750577352 +0.730209676 +0.708712028 +0.686117745 +0.66246184 +0.637780958 +0.61211339 +0.585498812 +0.557978319 +0.529594407 +0.500390894 +0.470412845 +0.439706497 +0.408319191 +0.376299336 +0.343696239 +0.310560049 +0.276941732 +0.242892981 +0.208466127 +0.173714061 +0.138690149 +0.103448157 +0.0680421533 +0.0325264119 +-0.00304464038 +-0.0386165112 +-0.0741347287 +-0.109544928 +-0.144792931 +-0.179824836 +-0.214587108 +-0.249026666 +-0.283090913 +-0.316727856 +-0.349886173 +-0.382515301 +-0.414565505 +-0.445987956 +-0.476734808 +-0.506759285 +-0.536015776 +-0.56445978 +-0.592048067 +-0.618738729 +-0.644491257 +-0.66926658 +-0.69302714 +-0.715736931 +-0.737361575 +-0.757868424 +-0.777226485 +-0.795406486 +-0.812380973 +-0.828124342 +-0.842612869 +-0.855824754 +-0.867740138 +-0.878341141 +-0.887611887 +-0.895538603 +-0.902109478 +-0.907314729 +-0.911146668 +-0.913599682 +-0.914670268 +-0.914357007 +-0.912660585 +-0.909583766 +-0.905131414 +-0.899310494 +-0.892130064 +-0.883601131 +-0.873736761 +-0.86255203 +-0.850064014 +-0.836291743 +-0.821256178 +-0.804980177 +-0.787488456 +-0.768807554 +-0.748965813 +-0.727993326 +-0.705921803 +-0.68278461 +-0.658616711 +-0.633454602 +-0.607336272 +-0.580301116 +-0.5523899 +-0.523644685 +-0.494108768 +-0.463826608 +-0.432843795 +-0.401206923 +-0.36896353 +-0.336162049 +-0.302851736 +-0.269082586 +-0.234905262 +-0.200371014 +-0.165531608 +-0.13043924 +-0.0951464628 +-0.059706108 +-0.0241712014 +0.0114051142 +0.0469696628 +0.0824693071 +0.117851028 +0.153062004 +0.188049697 +0.222761916 +0.257146913 +0.291153446 +0.32473086 +0.357829164 +0.3903991 +0.422392224 +0.45376098 +0.484458767 +0.514439987 +0.543660121 +0.572075816 +0.599644927 +0.626326589 +0.652081275 +0.676870848 +0.700658629 +0.723409439 +0.745089649 +0.765667244 +0.785111854 +0.803394802 +0.820489167 +0.836369795 +0.851013313 +0.864398205 +0.876504827 +0.887315437 +0.896814226 +0.90498732 +0.911822827 +0.91731083 +0.921443409 +0.924214656 +0.925620692 +0.925659585 +0.924331527 +0.921638663 +0.917585161 +0.91217724 +0.90542305 +0.897332742 +0.887918437 +0.8771942 +0.865176018 +0.851881777 +0.83733124 +0.821546007 +0.804549486 +0.786366858 +0.767025035 +0.746552629 +0.724979895 +0.702338691 +0.678662436 +0.65398605 +0.628345909 +0.601779789 +0.574326816 +0.546027385 +0.516923117 +0.487056794 +0.456472304 +0.42521456 +0.393329449 +0.360863753 +0.327865086 +0.294381821 +0.260463022 +0.226158359 +0.191518061 +0.156592807 +0.12143369 +0.0860921107 +0.050619718 +0.0150683253 +-0.0205101538 +-0.0560637933 +-0.0915407243 +-0.126889213 +-0.162057733 +-0.196995047 +-0.231650273 +-0.265972964 +-0.299913174 +-0.333421542 +-0.366449351 +-0.398948605 +-0.430872099 +-0.462173487 +-0.492807344 +-0.522729235 +-0.551895781 +-0.580264715 +-0.607794951 +-0.634446636 +-0.66018121 +-0.684961453 +-0.70875156 +-0.731517164 +-0.753225402 +-0.773844962 +-0.793346117 +-0.811700775 +-0.828882516 +-0.844866629 +-0.85963015 +-0.873151885 +-0.885412451 +-0.896394295 +-0.906081746 +-0.914460904 +-0.921519931 +-0.927248782 +-0.931639383 +-0.934685567 +-0.936383139 +-0.936729828 +-0.935725335 +-0.933371301 +-0.929671281 +-0.924630831 +-0.9182574 +-0.910560306 +-0.901550863 +-0.891242229 +-0.879649414 +-0.866789276 +-0.852680489 +-0.837343521 +-0.820800591 +-0.803075648 +-0.784194321 +-0.764183897 +-0.743073269 +-0.720892897 +-0.697674768 +-0.67345234 +-0.648260498 +-0.622135506 +-0.595114946 +-0.567237672 +-0.538543748 +-0.509074391 +-0.478871909 +-0.447979647 +-0.416441913 +-0.384303927 +-0.351611739 +-0.318412186 +-0.2847528 +-0.250681754 +-0.216247791 +-0.181500149 +-0.146488483 +-0.111262835 +-0.075873505 +-0.0403710099 +-0.00480601577 +0.0307707516 +0.066308567 +0.101756779 +0.137064893 +0.172182629 +0.207059997 +0.24164737 +0.275895566 +0.309755891 +0.343180227 +0.376121103 +0.408531749 +0.440366165 +0.471579195 +0.502126581 +0.531965029 +0.561052283 +0.589347122 +0.616809537 +0.643400669 +0.669082922 +0.693820008 +0.717576991 +0.740320333 +0.762017957 +0.782639272 +0.802155223 +0.82053834 +0.83776276 +0.853804268 +0.868640332 +0.882250154 +0.894614642 +0.905716514 +0.915540241 +0.924072148 +0.931300273 +0.937214697 +0.941807189 +0.945071477 +0.947003128 +0.947599622 +0.946860279 +0.944786253 +0.94138076 +0.936648713 +0.930597032 +0.923234273 +0.914571107 +0.904619856 +0.893394688 +0.88091158 +0.867188218 +0.852244069 +0.83610034 +0.81877982 +0.800307024 +0.780708042 +0.760010531 +0.738243687 +0.71543819 +0.691626169 +0.666841149 +0.641118001 +0.614492907 +0.587003287 +0.558687764 +0.5295861 +0.49973914 +0.469188757 +0.437977791 +0.406149988 +0.373749943 +0.340823033 +0.307415343 +0.273573631 +0.239345208 +0.204777955 +0.169920155 +0.134820517 +0.0995280465 +0.0640920104 +0.028561848 +-0.00701289137 +-0.0425826068 +-0.0780977319 +-0.113508797 +-0.148766493 +-0.183821739 +-0.218625767 +-0.253130172 +-0.287286999 +-0.321048749 +-0.354368551 +-0.38720015 +-0.419497952 +-0.451217167 +-0.482313808 +-0.512744767 +-0.542467896 +-0.571441998 +-0.599626998 +-0.626983888 +-0.65347483 +-0.679063217 +-0.703713686 +-0.72739221 +-0.750066117 +-0.771704125 +-0.792276417 +-0.811754674 +-0.830112018 +-0.847323252 +-0.863364728 +-0.87821436 +-0.891851822 +-0.904258415 +-0.915417161 +-0.925312793 +-0.93393184 +-0.941262546 +-0.947294954 +-0.952020913 +-0.95543411 +-0.957529968 +-0.958305758 +-0.957760626 +-0.95589546 +-0.952713028 +-0.948217883 +-0.942416405 +-0.935316665 +-0.926928744 +-0.917264249 +-0.906336685 +-0.894161236 +-0.880754799 +-0.866135988 +-0.850325031 +-0.833343818 +-0.815215804 +-0.795966024 +-0.775621069 +-0.754208996 +-0.73175933 +-0.708303001 +-0.683872274 +-0.658500802 +-0.632223468 +-0.605076402 +-0.577096922 +-0.548323448 +-0.51879548 +-0.488553545 +-0.457639095 +-0.426094534 +-0.393963075 +-0.361288757 +-0.328116272 +-0.294491061 +-0.260459106 +-0.226066952 +-0.191361621 +-0.156390538 +-0.121201443 +-0.0858424103 +-0.0503616951 +-0.0148077133 +0.0207710526 +0.0563261002 +0.0918089799 +0.127171355 +0.16236508 +0.197342257 +0.232055255 +0.266456903 +0.300500431 +0.334139557 +0.367328569 +0.400022425 +0.432176718 +0.463747832 +0.494692956 +0.524970123 +0.554538329 +0.583357518 +0.611388674 +0.638593877 +0.664936284 +0.690380326 +0.714891608 +0.738437006 +0.760984751 +0.782504419 +0.802966971 +0.822344815 +0.840611886 +0.857743628 +0.873717032 +0.888510535 +0.902104437 +0.914480337 +0.925621819 +0.935513857 +0.94414334 +0.951498728 +0.957570246 +0.962349903 +0.965831256 +0.968009941 +0.968883061 +0.968449739 +0.966710706 +0.96366842 +0.959327208 +0.953692959 +0.946773579 +0.938578465 +0.929118824 +0.918407487 +0.906459087 +0.893289807 +0.878917494 +0.863361704 +0.846643543 +0.828785491 +0.809811818 +0.789748032 +0.768621291 +0.746460039 +0.723294181 +0.699154892 +0.674074661 +0.648087235 +0.621227625 +0.593531949 +0.565037418 +0.535782305 +0.50580589 +0.475148408 +0.443850987 +0.411955571 +0.37950493 +0.346542529 +0.313112504 +0.279259628 +0.245029233 +0.210467111 +0.175619464 +0.140532879 +0.105254216 +0.0698306238 +0.0343093921 +-0.00126207569 +-0.0368363115 +-0.072365863 +-0.107803355 +-0.14310157 +-0.178213481 +-0.21309233 +-0.247691693 +-0.281965542 +-0.315868258 +-0.349354784 +-0.382380581 +-0.414901764 +-0.446875121 +-0.47825825 +-0.509009498 +-0.539088094 +-0.568454169 +-0.597068724 +-0.62489394 +-0.651892907 +-0.678029904 +-0.703270301 +-0.727580703 +-0.75092906 +-0.773284539 +-0.794617625 +-0.814900163 +-0.834105404 +-0.852208028 +-0.869184213 +-0.885011561 +-0.899669221 +-0.913137997 +-0.925400127 +-0.936439832 +-0.946242381 +-0.95479512 +-0.962086907 +-0.968108139 +-0.972851098 +-0.976309579 +-0.978479092 +-0.979357146 +-0.978942639 +-0.977236428 +-0.974240818 +-0.969959929 +-0.964399557 +-0.957567147 +-0.949471825 +-0.940124406 +-0.929537389 +-0.917724937 +-0.904702825 +-0.890488239 +-0.875100037 +-0.858558605 +-0.840885848 +-0.822105053 +-0.802241051 +-0.781320198 +-0.759370104 +-0.736419751 +-0.712499397 +-0.687640545 +-0.661875917 +-0.635239439 +-0.607766087 +-0.57949209 +-0.550454689 +-0.520692026 +-0.490243212 +-0.459148201 +-0.427447847 +-0.395183651 +-0.362397985 +-0.329133811 +-0.295434817 +-0.261345118 +-0.226909381 +-0.192172658 +-0.157180414 +-0.121978421 +-0.0866127142 +-0.051129531 +-0.0155752645 +0.020003648 +0.0555607477 +0.091049633 +0.126423986 +0.16163767 +0.196644759 +0.231399559 +0.265856844 +0.299971761 +0.333699846 +0.366997252 +0.399820611 +0.43212731 +0.463875143 +0.495022968 +0.525530317 +0.555357654 +0.584466231 +0.612818286 +0.640377059 +0.66710673 +0.692972629 +0.717941268 +0.741980473 +0.765059078 +0.787147286 +0.808216502 +0.828239502 +0.847190354 +0.865044498 +0.881779153 +0.897372699 +0.911805162 +0.92505792 +0.937113987 +0.947957624 +0.95757502 +0.965953925 +0.973083771 +0.978955417 +0.983561521 +0.98689611 +0.9889551 +0.989735761 +0.989237329 +0.987460778 +0.984408564 +0.980084715 +0.974495015 +0.967646719 +0.959548721 +0.950211598 +0.939647745 +0.927870998 +0.914896591 +0.900741404 +0.885423785 +0.868963432 +0.851381758 +0.832701663 +0.81294739 +0.792144428 +0.77031969 +0.747501286 +0.7237186 +0.699002344 +0.6733846 +0.64689838 +0.619577803 +0.591458017 +0.562575204 +0.532966471 +0.502669956 +0.471724782 +0.440170704 +0.408048207 +0.375398581 +0.342263664 +0.308685999 +0.274708778 +0.240375584 +0.205730437 +0.170817701 +0.135682119 +0.100368684 +0.0649226267 +0.0293893594 +-0.0061856727 +-0.0417569797 +-0.0772790872 +-0.112706575 +-0.147994137 +-0.183096722 +-0.217969533 +-0.252568071 +-0.286848185 +-0.320766148 +-0.354278621 +-0.387342899 +-0.419916973 +-0.451959319 +-0.483429191 +-0.51428649 +-0.54449187 +-0.574006871 +-0.602794099 +-0.63081706 +-0.658040122 +-0.684428733 +-0.709949272 +-0.734569218 +-0.758257616 +-0.780984512 +-0.802721087 +-0.8234398 +-0.843114371 +-0.86171966 +-0.879232453 +-0.895630703 +-0.910893773 +-0.925002292 +-0.937938493 +-0.949685724 +-0.960229615 +-0.969556969 +-0.977656167 +-0.984517017 +-0.990130849 +-0.994490404 +-0.997590626 +-0.999427918 +-1 +-0.9993063 +-0.997347674 +-0.99412656 +-0.989647513 +-0.983916288 +-0.976940467 +-0.968728824 +-0.95929184 +-0.948641263 +-0.936791113 +-0.92375659 +-0.909554168 +-0.894201925 +-0.8777192 +-0.860126696 +-0.841447252 +-0.82170447 +-0.800923352 +-0.779130113 +-0.756352181 +-0.732618386 +-0.707959084 +-0.682405273 +-0.655989318 +-0.628744426 +-0.600704817 +-0.571906084 +-0.542384655 +-0.512177676 +-0.481323208 +-0.449859998 +-0.417827583 +-0.385266515 +-0.35221777 +-0.318722866 +-0.284823856 +-0.250563295 +-0.215984291 +-0.181130358 +-0.146045207 +-0.110772858 +-0.0753575407 +-0.039843686 +-0.00427586951 +0.0313013509 +0.0668434199 +0.102305829 +0.137644114 +0.172814044 +0.207771659 +0.242473265 +0.276875466 +0.310935185 +0.344609769 +0.377857331 +0.410636393 +0.442905998 +0.474625844 +0.505756182 +0.53625836 +0.566094494 +0.595227397 +0.62362072 +0.651238896 +0.678047603 +0.704013812 +0.728926611 +0.751395193 +0.770747863 +0.786821264 +0.79947421 +0.808610265 +0.814180848 +0.816184837 +0.814666365 +0.809711209 +0.801442152 +0.790013742 +0.775606466 +0.758420884 +0.738671738 +0.716582326 +0.69237931 +0.666288034 +0.638528455 +0.609311725 +0.578837435 +0.547291505 +0.514844666 +0.481651525 +0.447850084 +0.413561724 +0.378891515 +0.343928837 +0.308748211 +0.273410296 +0.237962963 +0.202442324 +0.166873487 +0.1312703 +0.0956311277 +0.0599115256 +0.0241919235 +0.0241919235 + +shape_id 8 +num_samples 2 +1 +-0 + +shape_id 9 +num_samples 2 +0 +193 + +shape_id 10 +num_samples 2 +1 +0 + + +[SIGNATURE] +# This is the hash of the Pulseq file, calculated right before the [SIGNATURE] section was added +# It can be reproduced/verified with md5sum if the file trimmed to the position right above [SIGNATURE] +# The new line character preceding [SIGNATURE] BELONGS to the signature (and needs to be sripped away for recalculating/verification) +Type md5 +Hash 3d0e254ca015dcfbe55498338fc66656 diff --git a/demo/MultiChannel/SimRecon_MultiChannel.jl b/demo/Sim_MultiChannel/SimRecon_MultiChannel.jl similarity index 52% rename from demo/MultiChannel/SimRecon_MultiChannel.jl rename to demo/Sim_MultiChannel/SimRecon_MultiChannel.jl index 70b0449..2df4954 100644 --- a/demo/MultiChannel/SimRecon_MultiChannel.jl +++ b/demo/Sim_MultiChannel/SimRecon_MultiChannel.jl @@ -8,14 +8,14 @@ import RegularizedLeastSquares: SolverInfo # c. Create a HO_Sequence object as defined in HighOrderMRI.jl by combining the # sequence and dynamic field data. ######################################################################################### - -seq_file = "$(@__DIR__)/demo/MultiChannel/xw_sp2d_7T-1mm-200-r4.seq" # *.seq file is the pulseq's sequence file +path = joinpath(@__DIR__, "demo/Sim_MultiChannel") +seq_file = "$(path)/7T_1p0_200_r4.seq" # *.seq file is the pulseq's sequence file # under-sampling factor: R = 4 # inplane resolution: 1 mm x 1 mm # FOV: 200 mm x 200 mm -# readout duration: 29 ms +# readout duration: ~29 ms -dfc_file = "$(@__DIR__)/demo/MultiChannel/xw_sp2d_7T-1mm-200-r4.mat" # *.mat file contains the dynamic field data from both stitching method and the standard method. +dfc_file = "$(path)/7T_1p0_200_r4.mat" # *.mat file contains the dynamic field data from both stitching method and the standard method. # The dynamic field data is stored in the *.mat file with the following keys: #= "dt" [s], time interval between two time points. @@ -29,11 +29,11 @@ dfc_file = "$(@__DIR__)/demo/MultiChannel/xw_sp2d_7T-1mm-200-r4.mat" # *.mat f "ksphaStitched" [rad], coefficients of dynamic measurment (up to 2nd order) of the stitched method. =# -print("$(@__DIR__)") + # 1. read the *.seq file and reverse the sign of the gradient (axis x) seq = read_seq(seq_file)[3:end-3]; # read_seq function from KomaMRI.jl, return a struct of Sequence seq.GR[1,:] = -seq.GR[1,:]; # reverse the sign of the gradient (axis x) -plot_seq(seq) # plot_seq function from KomaMRI.jl, plot the Sequence +HighOrderMRI.KomaMRI.plot_seq(seq) # plot_seq function from KomaMRI.jl, plot the Sequence grad = MAT.matread(dfc_file); @@ -54,8 +54,8 @@ hoseqStitched.GR_dfc[2:4, :] = hoseqStitched.SEQ.GR; # copy the 1st-order nom hoseqStandard.GR_dfc[2:4, :] = hoseqStandard.SEQ.GR; # copy the 1st-order nominal gradient data from the seq object to the hoseq object hoseqStitched.GR_dfc[:,5] = GR_dfcStitched; # "5" is the index of the readout block in the spiral sequence hoseqStandard.GR_dfc[:,5] = GR_dfcStandard; # "5" is the index of the readout block in the spiral sequence -plot_seq(hoseqStitched) -plot_seq(hoseqStandard) +plt_seq(hoseqStitched) +plt_seq(hoseqStandard) ######################################################################################### @@ -70,15 +70,15 @@ nX = nY = 200; nZ = 1; # matrix size for recon # settings for Simulation B0 = true # turn on B0 T2 = false # turn off T2 -ss = 5 # set phantom down-sample factor to 5 +ss = 1 # set phantom down-sample factor to 5 location = 0.65 BHO = BlochHighOrder("111", true, true) # ["111"] turn on all order terms of dynamic field change. turn on Δw_excitation, Δw_precession -phantom = BrainPhantom(prefix="brain3D", x=0.2, y=0.2, z=0.2) # setting for Phantom: decide which phantom file to use, loading phantom from src/phantom/mat folder +phantom = BrainPhantom(prefix="brain3D", x=0.2, y=0.2, z=10.0) # setting for Phantom: decide which phantom file to use, loading phantom from src/phantom/mat folder # setting the coil sensitivity used in the simulation -csm_type = :birdcage; # a simulated birdcage coil-sensitivity -csm_nCoil = 16; # 9-channel +csm_type = :real_32cha; # a simulated birdcage coil-sensitivity +csm_nCoil = 32; # 9-channel csm_nRow = 4; -csm_nCol = 4; +csm_nCol = 8; db0_type = :quadratic; db0_max = :100.; # set the maximum off-resonance frequency in Hz for quadratic B0 map @@ -89,8 +89,7 @@ obj = brain_hophantom2D(phantom; ss=ss, location=location, db0_type=db0_type, db0_max=db0_max); obj.Δw .= B0 ? obj.Δw : obj.Δw * 0; # set Δw to 0 if B0=false obj.T2 .= T2 ? obj.T2 : obj.T2 * Inf; # cancel T2 relaxiation -# plot_phantom_map(obj, :ρ) -# plot_phantom_map_csm(obj, :mag; coil_idx=1) # [:pha, :real, :imag] plot the magnitude of coil-sensitivity in channel 1. +# plt_phantom(obj, :ρ) # 2. scanner & sim_params sys = Scanner(); @@ -98,27 +97,27 @@ sim_params = KomaMRICore.default_sim_params(); sim_params["sim_method"] = BHO; # using "BlochHighOrder" for simulation with high-order terms sim_params["return_type"] = "mat"; # setting with "mat", return the signal data for all channel sim_params["precision"] = "f64"; -sim_params["Nblocks"] = 1000; +sim_params["Nblocks"] = 1000; sim_params["gpu_device"] = 0; # 3. simulate -signal = simulate(obj, hoseqStitched, sys; sim_params); -raw = signal_to_raw_data(signal, hoseqStitched, :nominal; sim_params=copy(sim_params)); +signal = simulate(obj, hoseqStitched, sys; sim_params); +raw = signal_to_raw_data(signal, hoseqStitched, :nominal; sim_params=copy(sim_params)); img_nufft = recon_2d(raw, nX=nX, nY=nY); -fig_sos = plt_image(rotl90(sqrt.(sum(img_nufft.^2; dims=3))[:,:,1])) -fig_cha = plt_images(mapslices(rotl90, img_nufft,dims=[1,2]); dim=3, nRow= csm_nRow, nCol=csm_nCol) +fig_sos = plt_image(rotl90(sqrt.(sum(img_nufft.^2; dims=3))[:,:,1])) +fig_cha = plt_images(mapslices(rotl90, img_nufft,dims=[1,2]); dim=3, nRow= csm_nRow, nCol=csm_nCol) # 4. Adding noise to signal data -snr = 10; -data = AddNoise(signal[:,:,1], snr); +snr = 10; +data = AddNoise(signal[:,:,1], snr); nSample, nCha = size(data); # show the effect of noise -raw = signal_to_raw_data(reshape(data, (nSample, nCha, 1)), hoseqStitched, :nominal; sim_params=copy(sim_params)); - +raw = signal_to_raw_data(reshape(data, (nSample, nCha, 1)), hoseqStitched, :nominal; sim_params=copy(sim_params)); img_nufft = recon_2d(raw, nX=nX, nY=nY); -fig_sos = plt_image(rotl90(sqrt.(sum(img_nufft.^2; dims=3))[:,:,1])) -fig_cha = plt_images(mapslices(rotl90, img_nufft,dims=[1,2]); dim=3, nRow= csm_nRow, nCol=csm_nCol) +fig_sos = plt_image(rotl90(sqrt.(sum(img_nufft.^2; dims=3))[:,:,1])) +fig_cha = plt_images(mapslices(rotl90, img_nufft,dims=[1,2]); dim=3, nRow= csm_nRow, nCol=csm_nCol) + ######################################################################################### # 3. Reconstruction with HighOrderOp # a. obtain the ΔB₀ map @@ -126,23 +125,25 @@ fig_cha = plt_images(mapslices(rotl90, img_nufft,dims=[1,2]); dim=3, nRow= csm_n # c. reconstruct the signal with the encoding operator ######################################################################################### # Coil-Sensitivity Map -coil = csm_Birdcage(217, 181, csm_nCoil, verbose=true); -csm = get_center_crop(coil, nX, nY)[end:-1:1, :, :]; +coil = csm_Real_32cha(217, 181, verbose=true); +csm = get_center_crop(coil, nX, nY)[end:-1:1, :, :]; fig_csm = plt_images(abs.(csm); dim=3, nRow=csm_nRow, nCol=csm_nCol) # ΔB₀ map (the same as the one used for simulation), we will use this map in reconstruction -b0map = brain_phantom2D_reference(phantom, :Δw, (T.(nX), T.(nY)), (T.(Δx*1e3), T.(Δy*1e3)); location=location, ss=ss, db0_type=db0_type, db0_max=db0_max); -b0map = rotl90(b0map); -fig_b0map = plt_B0map(b0map) +b0map = brain_phantom2D_reference(phantom, :Δw, (T.(nX), T.(nY)), (T.(Δx*1e3), T.(Δy*1e3)); + location=location, ss=ss, db0_type=db0_type, db0_max=db0_max); +b0map = rotl90(b0map); +fig_b0map = plt_B0map(-b0map) # Proton-density map (reference) -x_ref = brain_phantom2D_reference(phantom, :ρ, (T.(nX), T.(nY)), (T.(Δx*1e3), T.(Δy*1e3)); location=location, ss=ss); -x_ref = rotl90(x_ref); +x_ref = brain_phantom2D_reference(phantom, :ρ, (T.(nX), T.(nY)), (T.(Δx*1e3), T.(Δy*1e3)); location=location, ss=ss); +x_ref = rotl90(x_ref); fig_ref = plt_image(x_ref) -headmask = brain_phantom2D_reference(phantom, :headmask, (T.(nX), T.(nY)), (T.(Δx*1e3), T.(Δy*1e3)); location=location, ss=ss); -headmask = rotl90(headmask); -fig_headmask = plt_image(headmask) +# headmask = brain_phantom2D_reference(phantom, :headmask, (T.(nX), T.(nY)), (T.(Δx*1e3), T.(Δy*1e3)); location=location, ss=ss); +# headmask = rotl90(headmask); +# fig_headmask = plt_image(headmask) + ############################################################################# # HighOrderOp, the extended signal model for high-order terms ############################################################################# @@ -165,15 +166,15 @@ x, y = x .- nX/2 .- 1, y .- nY/2 .- 1 x, y = x * Δx, y * Δy; gridding = Grid(nX=nX, nY=nY, nZ=nZ, Δx=Δx, Δy=Δy, Δz=Δz, x=T.(x), y=T.(y), z=T.(z)); -BHO = BlochHighOrder("111"); +recon_terms = "111"; #= The string "111" is a three-digit flag that indicates whether the 0th, 1st, and 2nd order terms of a measurement are used. For example, "110" means only the 0th and 1st order terms are used. =# -Nblocks = 20; # the number is set according to the GPU memory. +nBlock = 20; # the number is set according to the GPU memory. use_gpu = true; verbose = false; -solver = "admm"; regularization = "TV"; iter = 5; λ = 1e-1; -solver = "cgnr"; regularization = "L2"; iter = 100; λ = 0*1e-9; +# solver = "admm"; regularization = "TV"; iter = 5; λ = 1e-1; +solver = "cgnr"; regularization = "L2"; iter = 20; λ = 1e-9; recParams = Dict{Symbol,Any}() recParams[:reconSize] = (nX, nY) recParams[:regularization] = regularization # ["L2", "L1", "L21", "TV", "LLR", "Positive", "Proj", "Nuclear"] @@ -184,77 +185,27 @@ recParams[:solverInfo] = SolverInfo(vec(Complex{T}.(x_ref)), store_solutions=tru weight = SampleDensity(kspha_stitched'[2:3,:], (nX, nY)); -HOOp = HighOrderOp(gridding, T.(kspha_stitched[:, 1:9]'), T.(datatime); sim_method=BHO, tr_nominal=T.(kspha_nominal'), - Nblocks=Nblocks, fieldmap=T.(b0), csm=Complex{T}.(csm), use_gpu=use_gpu, verbose=verbose); +HOOp = HighOrderOp(gridding, T.(kspha_stitched'), T.(datatime); recon_terms=recon_terms, k_nominal=T.(kspha_nominal'), + nBlock=nBlock, fieldmap=T.(b0), csm=Complex{T}.(csm), use_gpu=use_gpu, verbose=verbose); + # recon with stitched measurement, with density weighting, with ΔB₀ @time x = recon_HOOp(HOOp, Complex{T}.(data), Complex{T}.(weight), recParams); -plt_image(abs.(x); vmaxp=99.9, title="w/ ΔB₀, stitched: 111, w/ density weighting") +plt_image(abs.(x); vmaxp=99.9, title="Stitched") # ssim, compared with the ground truth -println("SSIM: ", HO_SSIM(x_ref, abs.(x))) +@info "SSIM" SSIM=HO_SSIM(x_ref, abs.(x)) -solverinfo = recParams[:solverInfo]; -println(solverinfo.convMeas) # to see the reconstructed images at each iteration -iter = 25; -plt_image(reshape(abs.(solverinfo.x_iter[iter+1]), nX, nY); vmaxp=99.9) - - - -##### with ΔB₀ -# 1. nominal trajectory, BlochHighOrder("000") -HOOp1 = HighOrderOp(gridding, T.(kspha_stitched[:, 1:9]'), T.(datatime); sim_method=BlochHighOrder("000"), tr_nominal=T.(kspha_nominal'), - Nblocks=Nblocks, fieldmap=T.(b0), csm=Complex{T}.(csm), use_gpu=use_gpu, verbose=verbose); -# 2. stitched trajectory, BlochHighOrder("110") -HOOp2 = HighOrderOp(gridding, T.(kspha_stitched[:, 1:9]'), T.(datatime); sim_method=BlochHighOrder("110"), tr_nominal=T.(kspha_nominal'), - Nblocks=Nblocks, fieldmap=T.(b0), csm=Complex{T}.(csm), use_gpu=use_gpu, verbose=verbose); -# 3. stitched trajectory, BlochHighOrder("111") -HOOp3 = HighOrderOp(gridding, T.(kspha_stitched[:, 1:9]'), T.(datatime); sim_method=BlochHighOrder("111"), tr_nominal=T.(kspha_nominal'), - Nblocks=Nblocks, fieldmap=T.(b0), csm=Complex{T}.(csm), use_gpu=use_gpu, verbose=verbose); -# 4. standard trajectory, BlochHighOrder("111") -HOOp4 = HighOrderOp(gridding, T.(kspha_standard[:, 1:9]'), T.(datatime); sim_method=BlochHighOrder("111"), tr_nominal=T.(kspha_nominal'), - Nblocks=Nblocks, fieldmap=T.(b0), csm=Complex{T}.(csm), use_gpu=use_gpu, verbose=verbose); -##### w/o ΔB₀ -# 5. nominal trajectory, BlochHighOrder("000") -HOOp5 = HighOrderOp(gridding, T.(kspha_stitched[:, 1:9]'), T.(datatime); sim_method=BlochHighOrder("000"), tr_nominal=T.(kspha_nominal'), - Nblocks=Nblocks, fieldmap=T.(b0.*0), csm=Complex{T}.(csm), use_gpu=use_gpu, verbose=verbose); -# 6. stitched trajectory, BlochHighOrder("110") -HOOp6 = HighOrderOp(gridding, T.(kspha_stitched[:, 1:9]'), T.(datatime); sim_method=BlochHighOrder("110"), tr_nominal=T.(kspha_nominal'), - Nblocks=Nblocks, fieldmap=T.(b0.*0), csm=Complex{T}.(csm), use_gpu=use_gpu, verbose=verbose); -# 7. stitched trajectory, BlochHighOrder("111") -HOOp7 = HighOrderOp(gridding, T.(kspha_stitched[:, 1:9]'), T.(datatime); sim_method=BlochHighOrder("111"), tr_nominal=T.(kspha_nominal'), - Nblocks=Nblocks, fieldmap=T.(b0.*0), csm=Complex{T}.(csm), use_gpu=use_gpu, verbose=verbose); -# 8. standard trajectory, BlochHighOrder("111") -HOOp8 = HighOrderOp(gridding, T.(kspha_standard[:, 1:9]'), T.(datatime); sim_method=BlochHighOrder("111"), tr_nominal=T.(kspha_nominal'), - Nblocks=Nblocks, fieldmap=T.(b0.*0), csm=Complex{T}.(csm), use_gpu=use_gpu, verbose=verbose); - -Ops = [HOOp1, HOOp2, HOOp3, HOOp4, HOOp5, HOOp6, HOOp7, HOOp8]; - - -imgs = Array{Complex{T},3}(undef, length(Ops), nX, nY); -labels = [ "wB0_nominal", "wB0_stitched_110", "wB0_stitched_111", "wB0_standard_111", - "woB0_nominal", "woB0_stitched_110", "woB0_stitched_111", "woB0_standard_111",]; - -solver = "cgnr"; regularization = "L2"; iter = 40; λ = 0.; -recParams = Dict{Symbol,Any}() -recParams[:reconSize] = (nX, nY) -recParams[:regularization] = regularization # ["L2", "L1", "L21", "TV", "LLR", "Positive", "Proj", "Nuclear"] -recParams[:λ] = λ -recParams[:iterations] = iter -recParams[:solver] = solver +iter = 5; +plt_image(reshape(abs.(recParams[:solverInfo].x_iter[iter+1]), nX, nY); vmaxp=99.9, title="iter $(iter)") -for idx in eachindex(Ops) - @info "Recon with $(labels[idx])" - HOOp = Ops[idx] - @time x = recon_HOOp(HOOp, Complex{T}.(data), Complex{T}.(weight), recParams); - imgs[idx, :, :] = x; - plt_image(abs.(x); vmaxp=99.9, title=labels[idx]) -end -############################################################################# -# Save the results -############################################################################# -MAT.matwrite("$(@__DIR__)/demo/MultiChannel/snr$(snr)_$(solver)_$(iter)_$(regularization)_$(λ).mat", - Dict("imgs"=>imgs, "labels"=>labels, "csm"=>csm, "signal"=>data, "b0map"=>b0map, "x_ref"=>x_ref, "headmask"=>headmask)) +# recon with Nominal trajectory +recon_terms = "000"; +HOOp = HighOrderOp(gridding, T.(kspha_stitched'), T.(datatime); recon_terms=recon_terms, k_nominal=T.(kspha_nominal'), + nBlock=nBlock, fieldmap=T.(b0), csm=Complex{T}.(csm), use_gpu=use_gpu, verbose=verbose); +# recon with stitched measurement, with density weighting, with ΔB₀ +@time x = recon_HOOp(HOOp, Complex{T}.(data), Complex{T}.(weight), recParams); +plt_image(abs.(x); vmaxp=99.9, title="Nominal") diff --git a/demo/SingleChannel/1mm_R1.mat b/demo/Sim_SingleChannel/1mm_R1.mat similarity index 100% rename from demo/SingleChannel/1mm_R1.mat rename to demo/Sim_SingleChannel/1mm_R1.mat diff --git a/demo/SingleChannel/1mm_R1.seq b/demo/Sim_SingleChannel/1mm_R1.seq similarity index 100% rename from demo/SingleChannel/1mm_R1.seq rename to demo/Sim_SingleChannel/1mm_R1.seq diff --git a/demo/SingleChannel/SimRecon_SingleChannel.jl b/demo/Sim_SingleChannel/SimRecon_SingleChannel.jl similarity index 93% rename from demo/SingleChannel/SimRecon_SingleChannel.jl rename to demo/Sim_SingleChannel/SimRecon_SingleChannel.jl index 07324f7..62f248d 100644 --- a/demo/SingleChannel/SimRecon_SingleChannel.jl +++ b/demo/Sim_SingleChannel/SimRecon_SingleChannel.jl @@ -8,14 +8,14 @@ import RegularizedLeastSquares: SolverInfo # c. Create a HO_Sequence object as defined in HighOrderMRI.jl by combining the # sequence and dynamic field data. ######################################################################################### - -seq_file = "$(@__DIR__)/demo/SingleChannel/1mm_R1.seq" # *.seq file is the pulseq's sequence file +path = joinpath(@__DIR__, "demo/Sim_SingleChannel") +seq_file = "$(path)/1mm_R1.seq" # *.seq file is the pulseq's sequence file # under-sampling factor: R = 1 # inplane resolution: 1 mm x 1 mm # FOV: 150 mm x 150 mm -# readout duration: 88 ms +# readout duration: ~88 ms -dfc_file = "$(@__DIR__)/demo/SingleChannel/1mm_R1.mat" # *.mat file contains the dynamic field data from both stitching method and the standard method. +dfc_file = "$(path)/1mm_R1.mat" # *.mat file contains the dynamic field data from both stitching method and the standard method. # The dynamic field data is stored in the *.mat file with the following keys: #= "dt" [s], time interval between two time points. @@ -121,7 +121,7 @@ fig_nufft = plt_image(rotl90(img_nufft)) # ΔB₀ map (the same as the one used for simulation), we will use this map in reconstruction b0map = brain_phantom2D_reference(phantom, :Δw, (T.(nX), T.(nY)), (T.(Δx*1e3), T.(Δy*1e3)); location=location, ss=ss, db0_type=db0_type, db0_max=db0_max); b0map = rotl90(b0map); -fig_b0map = plt_B0map(b0map) +fig_b0map = plt_B0map(-b0map) # Proton-density map (the reference of recon, because we didn't consider T2 in simulation of single-shot spiral) x_ref = brain_phantom2D_reference(phantom, :ρ, (T.(nX), T.(nY)), (T.(Δx*1e3), T.(Δy*1e3)); location=location, ss=ss); @@ -171,14 +171,14 @@ HOOp = HighOrderOp(gridding, T.(kspha[:, 1:9]'), T.(datatime); recon_terms=recon # recon with stitched measurement, with density weighting, with ΔB₀ @time x1 = recon_HOOp(HOOp, Complex{T}.(data), Complex{T}.(weight), recParams); -plt_image(abs.(x1); vmaxp=99.9, title="w/ ΔB₀, stitched: 111, w/ density weighting") +plt_image(abs.(x1); vmaxp=99.9, title="Stitched, w/ ΔB₀") # recon with stitched measurement, with density weighting, without ΔB₀ HOOp = HighOrderOp(gridding, T.(kspha[:, 1:9]'), T.(datatime); recon_terms=recon_terms, k_nominal=T.(kspha_nominal'), nBlock=nBlock, fieldmap=T.(b0.*0), use_gpu=use_gpu, verbose=verbose); @time x = recon_HOOp(HOOp, Complex{T}.(data), Complex{T}.(weight), recParams); -plt_image(abs.(x); vmaxp=99.9, title="w/o ΔB₀, stitched: 111, w/ density weighting") +plt_image(abs.(x); vmaxp=99.9, title="Stitched, w/o ΔB₀") # recon with nominal trajectory, with density weighting, with ΔB₀ @@ -186,5 +186,7 @@ recon_terms = "000"; # "000" indicates that no measured field dynamics are used HOOp = HighOrderOp(gridding, T.(kspha[:, 1:9]'), T.(datatime); recon_terms=recon_terms, k_nominal=T.(kspha_nominal'), nBlock=nBlock, fieldmap=T.(b0), use_gpu=use_gpu, verbose=verbose); @time x = recon_HOOp(HOOp, Complex{T}.(data), Complex{T}.(weight), recParams); -plt_image(abs.(x); vmaxp=99.9, title="w/ ΔB₀, nominal, w/ density weighting") +plt_image(abs.(x); vmaxp=99.9, title="Nominal, w/ ΔB₀") + # you can try different recons like: "011", "101", "110"... +# try replace 'kspha_stitched' with 'kspha_standard' to see the difference between stitching and standard methods. diff --git a/docs/Project.toml b/docs/Project.toml new file mode 100644 index 0000000..873af7b --- /dev/null +++ b/docs/Project.toml @@ -0,0 +1,3 @@ +[deps] +Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +HighOrderMRI = "a40005de-7205-4c6a-ad7e-7788bd2ba738" diff --git a/docs/make.jl b/docs/make.jl new file mode 100644 index 0000000..c49f748 --- /dev/null +++ b/docs/make.jl @@ -0,0 +1,29 @@ +# push!(LOAD_PATH, "../src/") +using Documenter, HighOrderMRI + +makedocs( + sitename = "HighOrderMRI.jl", + authors = "Jinyuan Zhang, Zihao Zhang, Xiaoping Wu, and co-authors", + # modules = [HighOrderMRI], + clean = false, + doctest = false, + pages = [ + "Introduction" => "index.md", + "API Reference" =>[ + "Reconstruction" => "api/reconstruction.md", + "Simulation" => "api/simulation.md", + "Synchronization" => "api/synchronization.md", + "Plot function" => "api/plt.md", + ] + ], +) + + +deploydocs( + repo = "github.com/BennyZhang-Codes/HighOrderMRI.jl.git", + devbranch = "main", + branch = "gh-pages", + push_preview = true, + forcepush = true, + versions = ["stable" => "v^", "dev" => "main", "v#.#"], +) \ No newline at end of file diff --git a/docs/src/api/plt.md b/docs/src/api/plt.md new file mode 100644 index 0000000..531a80f --- /dev/null +++ b/docs/src/api/plt.md @@ -0,0 +1 @@ +# plt diff --git a/docs/src/api/reconstruction.md b/docs/src/api/reconstruction.md new file mode 100644 index 0000000..03fcb0e --- /dev/null +++ b/docs/src/api/reconstruction.md @@ -0,0 +1 @@ +# reconstruction diff --git a/docs/src/api/simulation.md b/docs/src/api/simulation.md new file mode 100644 index 0000000..b1c0802 --- /dev/null +++ b/docs/src/api/simulation.md @@ -0,0 +1 @@ +# simulation diff --git a/docs/src/api/synchronization.md b/docs/src/api/synchronization.md new file mode 100644 index 0000000..838ec2d --- /dev/null +++ b/docs/src/api/synchronization.md @@ -0,0 +1 @@ +# sychronization diff --git a/docs/src/index.md b/docs/src/index.md new file mode 100644 index 0000000..c01e57f --- /dev/null +++ b/docs/src/index.md @@ -0,0 +1,35 @@ +# HighOrderMRI.jl + +This is a Julia toolbox for MR simulation and reconstruction that can incorporate dynamic field changes associated with the gradients throughout the sequence. This is an extension of [KomaMRI.jl](https://github.com/JuliaHealth/KomaMRI.jl) (a Julia package for highly efficient MR simulations) and [MRIReco.jl](https://github.com/MagneticResonanceImaging/MRIReco.jl) (a Julia package for MRI reconstruction). + +For MRI image reconstruction with field dynamics, we have built an extended signal encoding operator `HighOrderOp` to construct the signal equation. `HighOrderOp` inherits from `AbstractLinearOperator` in [LinearOperators.jl](https://github.com/JuliaSmoothOptimizers/LinearOperators.jl). Then, image reconstruction problem can be solved using algorithms from [RegularizedLeastSquares.jl](https://github.com/JuliaImageRecon/RegularizedLeastSquares.jl). + +If you use the toolbox, please consider citing the following abstracts: + +[1] Zhang, Z., Auerbach, E. J., Bratch, A., Grant, A. N., Zhuo, Y., He, S., Chen, L., Ugurbil, K., Wu, X. "A stitching method for dynamic field monitoring using NMR probes", 2024 ISMRM, Singapore + +[2] Zhang, J., Zuo, Z., Xue, R., Zhuo, Y., Cushing, C., Bratch, A., Auerbach, E. J., Grant, A. N., Ugurbil, K., Wu, X., Zhang, Z. "A stitching method for dynamic field monitoring using NMR probes: validation in simulation and human experiments", 2025 ISMRM, Hawaii + +### Features + +* Support up to 2nd or 3rd order spherical harmonic terms. +* Support parrallel imaging and off-resonance correction with extended signal encoding operator `HighOrderOp`. +* Support the model-based synchronization delay estimation algorithm (Dubovan PI, Baron CA. 2023, [https://doi.org/10.1002/mrm.29460](https://doi.org/10.1002/mrm.29460)). +* GPU acceleration with `CUDA.jl` (only NVIDIA GPU has been tested). If the GPU memory is not enough, the calculation can be divided into blocks. + +--- + +### Installation Guide + +HighOrderMRI is compatible with Julia version 1.9.4. To get started with HighOrderMRI, users should first install Julia and consider using a code editor for a smoother coding experience. + +To get the HighOrder package installed, execute the following Julia command: + +```julia +import Pkg +Pkg.add(url="https://github.com/BennyZhang-Codes/HighOrderMRI.jl.git") +# or +Pkg.develop(url="https://github.com/BennyZhang-Codes/HighOrderMRI.jl.git") +``` + +--- diff --git a/src/HighOrderMRI.jl b/src/HighOrderMRI.jl index 8555d1d..73e9283 100644 --- a/src/HighOrderMRI.jl +++ b/src/HighOrderMRI.jl @@ -44,7 +44,7 @@ include("phantom/phantom.jl") include("simulation/simulation.jl") include("mrd/mrd.jl") include("reconstruction/recon.jl") -include("example/example.jl") +include("load/load.jl") include("synchronization/synchronization.jl") include("plot/plot.jl") diff --git a/src/example/example.jl b/src/example/example.jl deleted file mode 100644 index 13a1831..0000000 --- a/src/example/example.jl +++ /dev/null @@ -1,37 +0,0 @@ -include("rawdata/generate_raw.jl") -export generate_raw - -include("load_file.jl") -export load_raw, load_seq, load_dfc -export load_dfc_mat -export load_hoseq - -export demo_sim - - - - -function demo_sim() - hoseq = demo_hoseq() - - sim_params=Dict{String,Any}() - sim_method::BlochHighOrder=BlochHighOrder("000") - # plot_hoseqd(hoseq) - - # HO_Phantom - obj = brain_hophantom2D(BrainPhantom(); ss=5, location=0.8, nCoil=9) - obj.Δw .= obj.Δw * 0; # γ*1.5*(-3.45)*1e-6 * 2π - - # scanner & sim_params - sys = Scanner(); - sim_params = KomaMRICore.default_sim_params(sim_params) - sim_params["sim_method"] = sim_method; - sim_params["gpu"] = true; - sim_params["return_type"]="mat"; - - # simulate - signal = simulate(obj, hoseq, sys; sim_params); - raw = signal_to_raw_data(signal, hoseq, :nominal) - image = recon_2d(raw) - return raw, image -end \ No newline at end of file diff --git a/src/example/dfc/spiral_R1.mat b/src/load/dfc/spiral_R1.mat similarity index 100% rename from src/example/dfc/spiral_R1.mat rename to src/load/dfc/spiral_R1.mat diff --git a/src/example/dfc/spiral_R30.mat b/src/load/dfc/spiral_R30.mat similarity index 100% rename from src/example/dfc/spiral_R30.mat rename to src/load/dfc/spiral_R30.mat diff --git a/src/example/load_file.jl b/src/load/load.jl similarity index 98% rename from src/example/load_file.jl rename to src/load/load.jl index 8324872..abc3166 100644 --- a/src/example/load_file.jl +++ b/src/load/load.jl @@ -1,3 +1,8 @@ +export load_raw, load_seq, load_dfc +export load_dfc_mat +export load_hoseq + + """ seq = load_seq(; seq="spiral", r=2) diff --git a/src/example/seq/gre_R1.seq b/src/load/seq/gre_R1.seq similarity index 100% rename from src/example/seq/gre_R1.seq rename to src/load/seq/gre_R1.seq diff --git a/src/example/seq/gre_R4.seq b/src/load/seq/gre_R4.seq similarity index 100% rename from src/example/seq/gre_R4.seq rename to src/load/seq/gre_R4.seq diff --git a/src/example/seq/spiral_R1.seq b/src/load/seq/spiral_R1.seq similarity index 100% rename from src/example/seq/spiral_R1.seq rename to src/load/seq/spiral_R1.seq diff --git a/src/example/seq/spiral_R2.seq b/src/load/seq/spiral_R2.seq similarity index 100% rename from src/example/seq/spiral_R2.seq rename to src/load/seq/spiral_R2.seq diff --git a/src/example/seq/spiral_R30.seq b/src/load/seq/spiral_R30.seq similarity index 100% rename from src/example/seq/spiral_R30.seq rename to src/load/seq/spiral_R30.seq diff --git a/src/example/seq/spiral_R4.seq b/src/load/seq/spiral_R4.seq similarity index 100% rename from src/example/seq/spiral_R4.seq rename to src/load/seq/spiral_R4.seq diff --git a/src/example/seq/spiral_R6.seq b/src/load/seq/spiral_R6.seq similarity index 100% rename from src/example/seq/spiral_R6.seq rename to src/load/seq/spiral_R6.seq diff --git a/src/phantom/B0map/gaussian.jl b/src/phantom/B0map/gaussian.jl index e69de29..eb33884 100644 --- a/src/phantom/B0map/gaussian.jl +++ b/src/phantom/B0map/gaussian.jl @@ -0,0 +1 @@ +# TODO: synthetic ΔB0 map generation with Gaussian distribution \ No newline at end of file diff --git a/src/phantom/phantom.jl b/src/phantom/phantom.jl index 0eb4ff3..f0c0f21 100644 --- a/src/phantom/phantom.jl +++ b/src/phantom/phantom.jl @@ -5,6 +5,32 @@ export BrainPhantom include("SpinProperty.jl") export SpinProperty_1p5T +export load_phantom_mat +function load_phantom_mat( + objbrain::BrainPhantom; # PhantomType + axis::String="axial", # orientation + ss::Int64=4, # undersample + location::Float64=0.5, # relative location in the slice direction +) + @assert 0 <= location <= 1 "location must be between 0 and 1" + @assert axis in ["axial", "coronal", "sagittal"] "axis must be one of the following: axial, coronal, sagittal" + data = MAT.matread(objbrain.matpath)["data"] + M, N, Z = size(data) + if axis == "axial" + loc = Int32(ceil(Z*location)) + class = data[1:ss:end,1:ss:end, loc] + elseif axis == "coronal" + loc = Int32(ceil(M*location)) + class = data[loc, 1:ss:end,1:ss:end] + elseif axis == "sagittal" + loc = Int32(ceil(N*location)) + class = data[1:ss:end, loc,1:ss:end] + end + return class, loc +end + + +# HO_Phantom type, support coil-sensitivity map (CSM) include("hohantom2d.jl") export brain_hophantom2D @@ -20,7 +46,6 @@ include("phantom2d.jl") include("phantom2d_reference.jl") include("phantom3d.jl") -export load_phantom_mat export brain_phantom2D_reference # function to print the information of a Phantom object @@ -31,29 +56,3 @@ end export info - - -########## -# obj = brain_phantom2D(BrainPhantom(); ss=3, location=0.8, B0map=:quadratic, maxOffresonance=10.); info(obj); plot_phantom_map(obj, :Δw) -# ref = brain_phantom2D_reference(BrainPhantom();B0map=:quadratic,key=:Δw, maxOffresonance=10.); plot_image(ref,zmin=-10) - -# B0map = brain_phantom2D_reference(BrainPhantom(); ss=3, location=0.8,target_fov=(150, 150), target_resolution=(1,1), -# B0map=:quadratic,key=:Δw, maxOffresonance=5.); -# Nx = Ny = 150 -# Δx = Δy = 1e-3 # m - -# x, y = 1:Nx, 1:Ny -# x, y, z = vec(x .+ y'*0.0), vec(x*0.0 .+ y'), vec(x*0.0 .+ y'*0.0) #grid points -# x, y = x .- Nx/2 .- 1, y .- Ny/2 .- 1 - -# plot_bgcolor = "rgb(22,26,29)" -# grid_color = "rgb(40,52,66)" -# p1 = plot(scatter3d(x=x, y=y, z=vec(B0map), marker=attr(size=0.7), mode="markers"), Layout( -# paper_bgcolor="rgba(0,0,0,0)", -# scene=attr(xaxis=attr(backgroundcolor=plot_bgcolor,gridcolor=grid_color,zerolinecolor=grid_color), -# yaxis=attr(backgroundcolor=plot_bgcolor,gridcolor=grid_color,zerolinecolor=grid_color), -# zaxis=attr(backgroundcolor=plot_bgcolor,gridcolor=grid_color,zerolinecolor=grid_color)), -# font=attr(family="Times New Roman",color="gray"), -# width=500,height=500)) - -# savefig(p1, "/B0map3D.svg", width=500,height=500,format="svg") \ No newline at end of file diff --git a/src/phantom/phantom2d.jl b/src/phantom/phantom2d.jl index ef2580c..de0e05b 100644 --- a/src/phantom/phantom2d.jl +++ b/src/phantom/phantom2d.jl @@ -89,27 +89,4 @@ function brain_phantom2D( ) return obj end - - -function load_phantom_mat( - objbrain::BrainPhantom; # PhantomType - axis::String="axial", # orientation - ss::Int64=4, # undersample - location::Float64=0.5, # relative location in the slice direction -) - @assert 0 <= location <= 1 "location must be between 0 and 1" - @assert axis in ["axial", "coronal", "sagittal"] "axis must be one of the following: axial, coronal, sagittal" - data = MAT.matread(objbrain.matpath)["data"] - M, N, Z = size(data) - if axis == "axial" - loc = Int32(ceil(Z*location)) - class = data[1:ss:end,1:ss:end, loc] - elseif axis == "coronal" - loc = Int32(ceil(M*location)) - class = data[loc, 1:ss:end,1:ss:end] - elseif axis == "sagittal" - loc = Int32(ceil(N*location)) - class = data[1:ss:end, loc,1:ss:end] - end - return class, loc -end + \ No newline at end of file diff --git a/src/reconstruction/EncodingOperators/HighOrderOp.jl b/src/reconstruction/EncodingOperators/HighOrderOp.jl index 015c889..bdf4ffa 100644 --- a/src/reconstruction/EncodingOperators/HighOrderOp.jl +++ b/src/reconstruction/EncodingOperators/HighOrderOp.jl @@ -205,10 +205,14 @@ function prod_dt_HighOrderOp( if verbose next!(progress_bar, showvalues=[(:nBlock, block)]) end - CUDA.unsafe_free!(ϕ) - CUDA.unsafe_free!(e) + if use_gpu + CUDA.unsafe_free!(ϕ) + CUDA.unsafe_free!(e) + end + end + if use_gpu + CUDA.unsafe_free!(x) end - CUDA.unsafe_free!(x) out = out ./ sqrt(nVox) if use_gpu out = out |> cpu @@ -253,10 +257,14 @@ function prod_HighOrderOp( if verbose next!(progress_bar, showvalues=[(:nBlock, block)]) end - CUDA.unsafe_free!(ϕ) - CUDA.unsafe_free!(e) + if use_gpu + CUDA.unsafe_free!(ϕ) + CUDA.unsafe_free!(e) + end + end + if use_gpu + CUDA.unsafe_free!(x) end - CUDA.unsafe_free!(x) out = out ./ sqrt(nVox) if use_gpu out = out |> cpu @@ -305,10 +313,14 @@ function ctprod_HighOrderOp( if verbose next!(progress_bar, showvalues=[(:nBlock, block)]) end - CUDA.unsafe_free!(ϕ) - CUDA.unsafe_free!(e) + if use_gpu + CUDA.unsafe_free!(ϕ) + CUDA.unsafe_free!(e) + end + end + if use_gpu + CUDA.unsafe_free!(y) end - CUDA.unsafe_free!(y) out = out ./ sqrt(nVox) out = out .* csmC if use_gpu diff --git a/test/HighOrderOp.jl b/test/HighOrderOp.jl deleted file mode 100644 index 482d3e5..0000000 --- a/test/HighOrderOp.jl +++ /dev/null @@ -1,72 +0,0 @@ -using Test -using HighOrderMRI -using PyPlot -using MRISimulation - - -# setting some parameters -T = Float32 -nX = nY = 64; nZ = 1 -Δx = Δy = Δz = T.(1. * 1e-3) # [m] -nCha = 8; -nSample = nX * nY; -kmax_x = kmax_y = kmax_z = 1/Δx; # [m^-1] -kx = collect(range(-0.5, stop=0.5, length=nX+1))[1:nX] * kmax_x; -ky = collect(range(-0.5, stop=0.5, length=nY+1))[1:nY] * kmax_y; -kx = kx .* ones(nY)'; -ky = ky' .* ones(nX); - -kspha = zeros(9, nSample); -kspha[2, :] = vec(kx); -kspha[3, :] = vec(ky); - -grid = Grid(nX, nY, nZ, Δx, Δy, Δz; exchange_xy=true, reverse_x=false, reverse_y=true); -csm = csm_Birdcage(nX, nY, nCha); - -b0 = quadraticFieldmap(nX, nY, 50.)[:,:,1]; - -t = collect(range(-1e-6, stop=1e-6, length=nX+1))[1:nX] * nX -datatime = vec(t .* ones(nY)') - -plt_images( abs.(csm); dim=3, nRow=2, nCol=4) -plt_images(angle.(csm); dim=3, nRow=2, nCol=4) -plt_B0map(b0) - -weight = SampleDensity(kspha[2:3, :], (nX, nY)); - -# init HighOrderOpv2_i2 -Nblocks = 10 -use_gpu = true -verbose = true -BHO = BlochHighOrder("111") -HOOp = HighOrderOp(grid, T.(kspha), T.(datatime); sim_method=BHO, Nblocks=Nblocks, csm=Complex{T}.(csm), fieldmap=T.(b0), use_gpu=use_gpu, verbose=verbose); - - -# prod & ctprod -x = ones(nX*nY); # x are all ones -y = HOOp * x; -x1 = HOOp' * y; -x = reshape(x, nX, nY); -x1 = reshape(x1, nX, nY); - -# judge if x ≈ x1, with digits setting the accuracy -@test x ≈ round.(abs.(x1), digits=2) - -fig = plt.Figure() -subplot(1,3,1);plt.imshow(abs.(x1), cmap="gray");plt.title("x1");plt.axis("off") -subplot(1,3,2);plt.imshow(abs.(x-x1), cmap="gray");plt.title("abs(x-x1)");plt.axis("off") -subplot(1,3,3);plt.imshow(angle.(x1), cmap="gray");plt.title("angle(x1)");plt.axis("off") - - -W = WeightingOp(Complex{T}; weights=Complex{T}.(weight), rep=nCha) -E = ∘(W, HOOp, isWeighting=false) - -x = ones(nX*nY); # x are all ones -y_HOOp = HOOp * x; -y_E = E * x; -x_E = E' * y_E; -x_HOOp = HOOp' * y_HOOp; - -weight1 = y_E ./ y_HOOp; -@test round.(abs.(weight), digits=4) ≈ round.(abs.(weight1[1:nSample]), digits=4) - diff --git a/test/InterpTraj.jl b/test/InterpTraj.jl deleted file mode 100644 index 7fca11c..0000000 --- a/test/InterpTraj.jl +++ /dev/null @@ -1,62 +0,0 @@ -using MAT -using Interpolations - -nSample = 1000 -nTerm = 9 -dt = 1. # dwell time for trajectory is 1 - -datatime = collect(0:2.5:nSample-1); # dwell time for data is 2.5 -kspha = rand(1000, 9); -kspha1 = InterpTrajTime(kspha, dt, dt*1); -kspha2 = InterpTrajTime(kspha, dt, 0., datatime); - -plt_kspha(kspha, dt) -plt_kspha(kspha1, dt) -plt_kspha(kspha2, dt) -plt_kspha_com(kspha, kspha1, dt) - - -kspha_akima = InterpTrajTime(kspha, dt, dt*1, intermode=SteffenMonotonicInterpolation()); -kspha_linear = InterpTrajTime(kspha, dt, dt*1, intermode=AkimaMonotonicInterpolation()); -plt_kspha(kspha_linear - kspha_akima, dt) - -kspha_akima = InterpTrajTime(kspha, dt, dt*1, intermode=FritschButlandMonotonicInterpolation()); -kspha_linear = InterpTrajTime(kspha, dt, dt*1, intermode=AkimaMonotonicInterpolation()); -plt_kspha(kspha_linear - kspha_akima, dt) - - -""" -#= - Interpolate using cubic Hermite splines. The breakpoints in arrays xbp and ybp are assumed to be sorted. - Evaluate the function in all points of the array xeval. - Methods: - "Linear" yuck - "FiniteDifference" classic cubic interpolation, no tension parameter - Finite difference can overshoot for non-monotonic data - "Cardinal" cubic cardinal splines, uses tension parameter which must be between [0,1] - cubin cardinal splines can overshoot for non-monotonic data - (increasing tension decreases overshoot) - "Akima" monotonic - tangents are determined at each given point locally, - the curve obtained is close to a manually drawn curve, can overshoot for non-monotonic data - "FritschCarlson" monotonic - tangents are first initialized, then adjusted if they are not monotonic - can overshoot for non-monotonic data - "FritschButland" monotonic - faster algorithm (only requires one pass) but somewhat higher apparent "tension" - "Steffen" monotonic - also only one pass, results usually between FritschCarlson and FritschButland - Sources: - Akima (1970), "A New Method of Interpolation and Smooth Curve Fitting Based on Local Procedures", doi:10.1145/321607.321609 - Fritsch & Carlson (1980), "Monotone Piecewise Cubic Interpolation", doi:10.1137/0717021. - Fritsch & Butland (1984), "A Method for Constructing Local Monotone Piecewise Cubic Interpolants", doi:10.1137/0905021. - Steffen (1990), "A Simple Method for Monotonic Interpolation in One Dimension", http://adsabs.harvard.edu/abs/1990A%26A...239..443S - - Implementation based on http://bl.ocks.org/niclasmattsson/7bceb05fba6c71c78d507adae3d29417 -=# - -export - LinearMonotonicInterpolation, - FiniteDifferenceMonotonicInterpolation, - CardinalMonotonicInterpolation, - AkimaMonotonicInterpolation, - FritschCarlsonMonotonicInterpolation, - FritschButlandMonotonicInterpolation, - SteffenMonotonicInterpolation -""" \ No newline at end of file diff --git a/test/runtests.jl b/test/runtests.jl index 5f20aa7..3ce568d 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,20 +1,15 @@ using HighOrderMRI -println("Testing...") +using Test +using MRISimulation +@info "testing... InterpTraj.jl" +include("test_InterpTraj.jl") -brainphantom = BrainPhantom("brain3D724") +@info "testing... csm.jl" +include("test_csm.jl") +@info "testing... HighOrderOp.jl" +include("test_HighOrderOp.jl") -# setting the coil sensitivity used in the simulation -csm_type = :birdcage; # a simulated birdcage coil-sensitivity -csm_nCoil = 9; # 8-channel -csm_nRow = 3; -csm_nCol = 3; - -obj = brain_hophantom2D(brainphantom; csm_type=csm_type, csm_nCoil=csm_nCoil, csm_nRow=csm_nRow, csm_nCol=csm_nCol) -plot_phantom_map(obj, :ρ; view_2d=true) -plot_phantom_map_csm(obj, :mag; coil_idx=1, view_2d=true) -plot_phantom_map_csm(obj, :pha; coil_idx=1, view_2d=true) - -# obj = brain_phantom2D_reference(brainphantom; key=:csm, target_fov=(150,150), target_resolution=(1,1), -# csm_type=csm_type, csm_nCoil=csm_nCoil, csm_nRow=csm_nRow, csm_nCol=csm_nCol) \ No newline at end of file +@info "testing... HOPhantom.jl" +include("test_HOPhantom.jl") \ No newline at end of file diff --git a/test/test_HOPhantom.jl b/test/test_HOPhantom.jl index cf92c25..dae3ce3 100644 --- a/test/test_HOPhantom.jl +++ b/test/test_HOPhantom.jl @@ -1,6 +1,4 @@ -using HighOrderMRI - -brainphantom = BrainPhantom("brain3D724") +brainphantom = BrainPhantom(prefix="brain3D724", x=0.2, y=0.2, z=0.2) # setting the coil sensitivity used in the simulation csm_type = :rect_gaussian; # a simulated birdcage coil-sensitivity csm_nCoil = 9; # 8-channel @@ -11,13 +9,12 @@ db0_type = :quadratic; db0_max = :125.; obj = brain_hophantom2D(brainphantom; + ss=10, db0_type=db0_type, db0_max=db0_max, csm_type=csm_type, csm_nCoil=csm_nCoil, csm_nRow=csm_nRow, csm_nCol=csm_nCol) -plot_phantom_map(obj, :ρ; view_2d=true) -plot_phantom_map_csm(obj, :mag; coil_idx=5, view_2d=true) -plot_phantom_map_csm(obj, :pha; coil_idx=5, view_2d=true) +# plt_phantom_map(obj, :ρ; view_2d=true) +nSpin, nCoil = size(obj.csm) -brain_phantom2D_reference(brainphantom, :csm, (150.,150.), (1.,1.); - db0_type=db0_type, db0_max=db0_max, - csm_type=csm_type, csm_nCoil=csm_nCoil, csm_nRow=csm_nRow, csm_nCol=csm_nCol) \ No newline at end of file +@test nSpin == length(obj.x) +@test nCoil == csm_nCoil diff --git a/test/test_HighOrderOp.jl b/test/test_HighOrderOp.jl new file mode 100644 index 0000000..8de2720 --- /dev/null +++ b/test/test_HighOrderOp.jl @@ -0,0 +1,53 @@ +# setting some parameters +T = Float32; +nX = nY = 64; +nZ = 1 +Δx = Δy = Δz = T.(1. * 1e-3); # [m] +nCha = 8; +nSample = nX * nY; +kmax_x = kmax_y = kmax_z = 1/Δx; # [m^-1] +kx = collect(range(-0.5, stop=0.5, length=nX+1))[1:nX] * kmax_x; +ky = collect(range(-0.5, stop=0.5, length=nY+1))[1:nY] * kmax_y; +kx = kx .* ones(nY)'; +ky = ky' .* ones(nX); + +kspha = zeros(9, nSample); +kspha[2, :] = vec(kx); +kspha[3, :] = vec(ky); + +grid = Grid(nX, nY, nZ, Δx, Δy, Δz; exchange_xy=true, reverse_x=false, reverse_y=true); +csm = csm_Birdcage(nX, nY, nCha); + +b0 = quadraticFieldmap(nX, nY, 50.)[:,:,1]; + +t = collect(range(-1e-6, stop=1e-6, length=nX+1))[1:nX] * nX +datatime = vec(t .* ones(nY)'); + +# plt_images( abs.(csm); dim=3, nRow=2, nCol=4) +# plt_images(angle.(csm); dim=3, nRow=2, nCol=4) +# plt_B0map(b0) + +weight = SampleDensity(kspha[2:3, :], (nX, nY)); + +# init HighOrderOpv2_i2 +nBlock = 100 +use_gpu = false +verbose = false +recon_terms = "111" +HOOp = HighOrderOp(grid, T.(kspha), T.(datatime); recon_terms=recon_terms, + nBlock=nBlock, csm=Complex{T}.(csm), fieldmap=T.(b0), use_gpu=use_gpu, verbose=verbose); + +# prod & ctprod +x = ones(nX*nY); # x are all ones +y = HOOp * x; +x1 = HOOp' * y; +x = reshape(x, nX, nY); +x1 = reshape(x1, nX, nY); + +# judge if x ≈ x1, with digits setting the accuracy +@test x ≈ round.(abs.(x1), digits=2) + +# fig = plt.Figure() +# subplot(1,3,1);plt.imshow(abs.(x1), cmap="gray");plt.title("x1");plt.axis("off") +# subplot(1,3,2);plt.imshow(abs.(x-x1), cmap="gray");plt.title("abs(x-x1)");plt.axis("off") +# subplot(1,3,3);plt.imshow(angle.(x1), cmap="gray");plt.title("angle(x1)");plt.axis("off") diff --git a/test/test_InterpTraj.jl b/test/test_InterpTraj.jl new file mode 100644 index 0000000..716ae4d --- /dev/null +++ b/test/test_InterpTraj.jl @@ -0,0 +1,14 @@ +nSample = 100 +nTerm = 9 +dt = 1. # dwell time for trajectory is 1 +T = Float64 + + +datatime = T.(collect(0:2.5:nSample-1)); # dwell time for data is 2.5 +kspha = T.(sin.((collect(1:nSample)) ./ nSample .* π .* collect(1:9)')); + +kspha_del = InterpTrajTime(kspha , dt, 1*dt); +kspha_del_inv = InterpTrajTime(kspha_del, dt, -1*dt); +# plt_ksphas([kspha, kspha_del_inv], dt) + +@test kspha[2:end-2,:] ≈ kspha_del_inv[2:end-2,:] \ No newline at end of file diff --git a/test/test_csm.jl b/test/test_csm.jl index 8c6b7f5..a5aaaee 100644 --- a/test/test_csm.jl +++ b/test/test_csm.jl @@ -9,58 +9,58 @@ nCol = 6 ; nBlock = 3 ; overlap = 1 ; relative_radius = 1.5 ; -verbose = true ; +verbose = false ; @testset "csm" begin @testset "csm_Fan_binary" begin csm = load_csm(:fan, nX, nY, nCoil; nRow=nRow, nCol=nCol, overlap=overlap, relative_radius=relative_radius, verbose=verbose) @test size(csm) == (nX, nY, nCoil) @test typeof(csm) <: AbstractArray{<:Real,3} - plt_images(csm; dim=3, nRow=nRow, nCol=nCol, title="csm_Fan_binary") + # plt_images(csm; dim=3, nRow=nRow, nCol=nCol, title="csm_Fan_binary") end @testset "csm_Rect_binary" begin csm = load_csm(:rect, nX, nY, nCoil; nRow=nRow, nCol=nCol, overlap=overlap, relative_radius=relative_radius, verbose=verbose) @test size(csm) == (nX, nY, nCoil) @test typeof(csm) <: AbstractArray{<:Real,3} - plt_images(csm; dim=3, nRow=nRow, nCol=nCol, title="csm_Rect_binary") + # plt_images(csm; dim=3, nRow=nRow, nCol=nCol, title="csm_Rect_binary") end @testset "csm_Rect_gaussian" begin csm = load_csm(:rect_gaussian, nX, nY, nCoil; nRow=nRow, nCol=nCol, overlap=overlap, relative_radius=relative_radius, verbose=verbose) @test size(csm) == (nX, nY, nCoil) @test typeof(csm) <: AbstractArray{<:Number,3} - plt_images( abs.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Rect_gaussian_mag") - plt_images(angle.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Rect_gaussian_pha") + # plt_images( abs.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Rect_gaussian_mag") + # plt_images(angle.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Rect_gaussian_pha") end @testset "csm_Birdcage" begin csm = load_csm(:birdcage, nX, nY, nCoil; nRow=nRow, nCol=nCol, overlap=overlap, relative_radius=relative_radius, verbose=verbose) @test size(csm) == (nX, nY, nCoil) @test typeof(csm) <: AbstractArray{<:Number,3} - plt_images(abs.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Birdcage") + # plt_images(abs.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Birdcage") end @testset "csm_Real_32cha" begin csm = load_csm(:real_32cha, nX, nY, nCoil; nRow=nRow, nCol=nCol, overlap=overlap, relative_radius=relative_radius, verbose=verbose) @test size(csm) == (nX, nY, 32) @test typeof(csm) <: AbstractArray{<:Number,3} - plt_images(abs.(csm); dim=3, nRow=4, nCol=8, title="csm_Real_32cha") + # plt_images(abs.(csm); dim=3, nRow=4, nCol=8, title="csm_Real_32cha") end @testset "csm_Gaussian_grid" begin csm = load_csm(:gaussian_grid, nX, nY, nCoil; nRow=nRow, nCol=nCol, overlap=overlap, relative_radius=relative_radius, verbose=verbose) @test size(csm) == (nX, nY, nCoil) @test typeof(csm) <: AbstractArray{<:Number,3} - plt_images(abs.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Gaussian_grid") + # plt_images(abs.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Gaussian_grid") end @testset "csm_Gaussian_grid_block" begin csm = load_csm(:gaussian_grid_block, nX, nY, nCoil; nRow=nRow, nCol=nCol, nBlock=nBlock, relative_radius=relative_radius, verbose=verbose) @test size(csm) == (nX, nY, nCoil) @test typeof(csm) <: AbstractArray{<:Number,3} - plt_images(abs.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Gaussian_grid_block") + # plt_images(abs.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Gaussian_grid_block") end @testset "csm_Gaussian_grid_block_pha" begin csm = load_csm(:gaussian_grid_block_pha, nX, nY, nCoil; use_gpu=false, nRow=nRow, nCol=nCol, nBlock=nBlock, relative_radius=relative_radius, verbose=verbose) @test size(csm) == (nX, nY, nCoil) @test typeof(csm) <: AbstractArray{<:Number,3} - plt_images( abs.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Gaussian_grid_block_pha mag") - plt_images(angle.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Gaussian_grid_block_pha pha") + # plt_images( abs.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Gaussian_grid_block_pha mag") + # plt_images(angle.(csm); dim=3, nRow=nRow, nCol=nCol, title="csm_Gaussian_grid_block_pha pha") end end diff --git a/test/test_dB0.jl b/test/test_dB0.jl deleted file mode 100644 index e69de29..0000000