diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 0000000..5c0b928 --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,40 @@ +name: CI +on: + push: + branches: + - main + - joss_review_response + tags: ['*'] + pull_request: +concurrency: + # Skip intermediate builds: always. + # Cancel intermediate builds: only if it is a pull request build. + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }} +jobs: + test: + name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + version: + - '1.9' + - '1.10' + os: + - ubuntu-latest + arch: + - x64 + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@v1 + with: + version: ${{ matrix.version }} + arch: ${{ matrix.arch }} + - uses: julia-actions/cache@v1 + - uses: julia-actions/julia-buildpkg@v1 + - uses: julia-actions/julia-runtest@v1 + - uses: julia-actions/julia-processcoverage@v1 + - uses: codecov/codecov-action@v2 + with: + files: lcov.info \ No newline at end of file diff --git a/.github/workflows/CompatHelper.yml b/.github/workflows/CompatHelper.yml new file mode 100644 index 0000000..3dfba52 --- /dev/null +++ b/.github/workflows/CompatHelper.yml @@ -0,0 +1,45 @@ +name: CompatHelper +on: + schedule: + - cron: 0 0 * * * + workflow_dispatch: +permissions: + contents: write + pull-requests: write +jobs: + CompatHelper: + runs-on: ubuntu-latest + steps: + - name: Check if Julia is already available in the PATH + id: julia_in_path + run: which julia + continue-on-error: true + - name: Install Julia, but only if it is not already available in the PATH + uses: julia-actions/setup-julia@v1 + with: + version: '1' + arch: ${{ runner.arch }} + if: steps.julia_in_path.outcome != 'success' + - name: "Add the General registry via Git" + run: | + import Pkg + ENV["JULIA_PKG_SERVER"] = "" + Pkg.Registry.add("General") + shell: julia --color=yes {0} + - name: "Install CompatHelper" + run: | + import Pkg + name = "CompatHelper" + uuid = "aa819f21-2bde-4658-8897-bab36330d9b7" + version = "3" + Pkg.add(; name, uuid, version) + shell: julia --color=yes {0} + - name: "Run CompatHelper" + run: | + import CompatHelper + CompatHelper.main() + shell: julia --color=yes {0} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COMPATHELPER_PRIV: ${{ secrets.DOCUMENTER_KEY }} + # COMPATHELPER_PRIV: ${{ secrets.COMPATHELPER_PRIV }} \ No newline at end of file diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index ad790e5..292cc16 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -34,7 +34,7 @@ jobs: with: version: '1.9' - name: Install dependencies - run: julia --project=docs -e 'using Pkg; Pkg.add("MRIGradients"); Pkg.develop(PackageSpec(path=pwd())); Pkg.add("Documenter"); Pkg.add("Literate"); Pkg.instantiate()' + run: julia --project=docs -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()' - name: Build Documents through Documenter.jl env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # For authentication with GitHub Actions token diff --git a/.gitignore b/.gitignore index 896af58..e8cb415 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ LocalPreferences.toml GIRFReco.code-workspace docs/build/ docs/src/generated/ +.vscode/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..d92d4bd --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,49 @@ +# Contributing to GIRFReco.jl +We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: + +- Reporting a bug +- Discussing the current state of the code +- Submitting a fix +- Proposing new features + +## We Develop with Github +We use github to host code, to track issues and feature requests, as well as accept pull requests. + +We actively welcome your pull requests: + +1. Fork or clone the repo and create your branch from `main`. +2. If you've added code that should be tested, add tests. +3. Add docstrings to facilitate our generated documentation. +4. Ensure your (and our) tests pass +5. Post the PR or file an issue and we will work with you + +## Any contributions you make will be under the BSD 3-Clause Software License +In short, when you submit code changes, your submissions are understood to be under the same [BSD 3-Clause License +](https://choosealicense.com/licenses/bsd-3-clause/) that covers the project. Feel free to contact the maintainers if that's a concern. + +## Report bugs using Github's [issues](https://github.com/BRAIN-TO/GIRFReco.jl/issues) +We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/BRAIN-TO/GIRFReco.jl/issues/new/choose); it's that easy! + +## Write bug reports with detail, background, and sample code + +**Great Bug Reports** tend to have: + +- A quick summary and/or background +- Steps to reproduce + - Be specific! + - Give sample code if you can, a minimum working example (MWE) is best but we understand MRI involves complicated and large data +- What you expected would happen +- What actually happens +- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) + +People *love* thorough bug reports. I'm not even kidding. + +## Use a Consistent Coding Style +* We (mostly) use Julia [Blue](https://github.com/invenia/BlueStyle) +* It would be great if you did as well + +## License +By contributing, you agree that your contributions will be licensed under its BSD 3-Clause License. + +## References +This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md) diff --git a/Project.toml b/Project.toml index e1fe6c4..bf56fdb 100644 --- a/Project.toml +++ b/Project.toml @@ -8,46 +8,27 @@ AxisArrays = "39de3d68-74b9-583c-8d2d-e117c070f3a9" DSP = "717857b8-e6f2-59f4-9121-6e50c889abd2" DelimitedFiles = "8bb1440f-4735-579b-a4ab-409b98df4dab" Dierckx = "39dd38d3-220a-591b-8e3c-4c3a8c710a94" -Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" FourierTools = "b18b359b-aebc-45ac-a139-9c0ccbb2871e" -HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" -HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" -ImageBinarization = "cbc4b850-ae4b-5111-9e64-df94c024a13d" -ImageEdgeDetection = "2b14c160-480b-11ea-1b58-656063328ff7" -ImageMorphology = "787d08f9-d448-5407-9aad-5290dd7ab264" ImageUtils = "8ad4436d-4835-5a14-8bce-3ae014d2950b" -Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -LinearOperators = "5c8ed15e-5a4c-59e4-a42b-c7e8811fb125" -Literate = "98b081ad-f1c9-55d3-8b20-4c87d4299306" MAT = "23992714-dd62-5051-b70f-ba57cb901cac" MRIBase = "f7771a9a-6e57-4e71-863b-6e4b6a2f17df" -MRICoilSensitivities = "c57eb701-aafc-44a2-a53c-128049758959" -MRIFieldmaps = "5af58b90-8a55-4daf-adb4-2008a66a38cf" MRIFiles = "5a6f062f-bf45-497d-b654-ad17aae2a530" MRIGradients = "6ea382ba-d04a-44a2-b811-544bd2aee867" -MRIOperators = "fb1137e3-90a6-46ce-a672-6e1e53d120f2" -MRIReco = "bdf86e05-2d2b-5731-a332-f3fe1f9e047f" Measures = "442fdcdd-2543-5da2-b0f3-8c86c306513e" MosaicViews = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" NFFT = "efe261a4-0d2b-5849-be55-fc731d526b0d" NFFTTools = "7424e34d-94f7-41d6-98a0-85abaf1b6c91" -NIfTI = "a3a9e032-41b5-5fc4-967a-a6b7a19844d3" -PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -PolygonInbounds = "e4521ec6-8c1d-418e-9da2-b3bc4ae105d6" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" ROMEO = "1ea8258b-a15d-4adb-ad20-01632f467a84" -RegularizedLeastSquares = "1e9c538a-f78c-5de5-8ffb-0b6dbe892d23" Scratch = "6c6a2e73-6563-6170-7368-637461726353" -SparsityOperators = "a5ff1dd3-4e0a-50db-9022-6d011c1d5846" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" -Waveforms = "cb13b1c6-351e-5134-b3ad-d6a530956a82" + [extras] CPUSummary = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" @@ -59,41 +40,21 @@ AxisArrays = "0.4.6" DSP = "0.7.8" DelimitedFiles = "1.9.1" Dierckx = "0.5.3" -Documenter = "0.27.24" FFTW = "1.7.1" FileIO = "1.16.1" -Flux = "0.13.17" FourierTools = "0.4.2" -HDF5 = "0.16.15" -HTTP = "1.9.8" -ImageBinarization = "0.2.9" -ImageEdgeDetection = "0.1.7" -ImageMorphology = "0.3.2" ImageUtils = "0.2.9" -Images = "0.25.3" -LinearOperators = "2.5.2" -Literate = "2.14.0" MAT = "0.10.5" MRIBase = "0.3.3" -MRICoilSensitivities = "0.1.1" -MRIFieldmaps = "0.0.3" MRIFiles = "0.1.6" MRIGradients = "0.1.2" -MRIOperators = "0.1.2" -MRIReco = "0.7.1" Measures = "0.3.2" MosaicViews = "0.3.4" NFFT = "0.13.3" NFFTTools = "0.2.6" -NIfTI = "0.5.9" -PlotlyJS = "0.18.10" Plots = "1.38.16" -PolygonInbounds = "0.2.0" ROMEO = "1.0.1" -RegularizedLeastSquares = "0.9.1" Scratch = "1.2.0" -SparsityOperators = "0.4.7" StatsBase = "0.33.21" Unitful = "1.14.0" -Waveforms = "0.1.1" Statistics = "1.9.0" \ No newline at end of file diff --git a/README.md b/README.md index 5ff9aea..8abb2e9 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,29 @@ [![Dev](https://img.shields.io/badge/docs-dev-blue.svg)](https://brain-to.github.io/GIRFReco) - +[![codecov](https://codecov.io/gh/BRAIN-TO/GIRFReco.jl/graph/badge.svg?token=7E3WK1GKR3)](https://codecov.io/gh/BRAIN-TO/GIRFReco.jl) # GIRFReco.jl: An open-source pipeline for spiral MRI Reconstruction in Julia ## Introduction -This package provides an image reconstruction pipeline for real-world non-Cartesian MRI, especially on spiral diffusion imaging. It is completely implemented in Julia using original code and external packages, e.g., [MRIReco.jl](https://magneticresonanceimaging.github.io/MRIReco.jl/latest/) for the off-resonance (B0) corrections & core iterative reconstruction tasks, and [MRIGradients.jl](https://github.com/BRAIN-TO/MRIGradients.jl) for the corrections of gradient waveform due to system imperfections via the Gradient Impulse Response Function (GIRF). +This package provides an image reconstruction pipeline for real-world non-Cartesian MRI, especially on spiral diffusion imaging. It is completely implemented in Julia using original code and external packages, e.g., [MRIReco.jl](https://magneticresonanceimaging.github.io/MRIReco.jl/latest/) for the off-resonance (B0) corrections & core iterative reconstruction tasks, and [MRIGradients.jl](https://github.com/BRAIN-TO/MRIGradients.jl) for the correction of gradient waveforms due to system imperfections via the Gradient Impulse Response Function (GIRF). -This repository includes working [examples](./docs/lit/examples/) for spiral reconstruction with GIRF correction of trajectory (kx-ky-kz, or k1 as the first order GIRF) and B0 eddy currents (k0 as zeroth order GIRF), iterative reconstruction (cg-SENSE) and a Cartesian reconstruction example for coil sensitivity and off-resonance map calculation. +This repository includes working [examples](./docs/lit/examples/) for spiral reconstruction with GIRF correction of trajectory (kx-ky-kz, or k1 as the first order GIRF) and B0 eddy currents (k0 as zeroth order GIRF), iterative reconstruction (cg-SENSE) and a Cartesian reconstruction example for coil sensitivity and off-resonance map calculation. -The data for the phantom reconstruction [`joss_demo.jl`](./docs/lit/examples/joss_demo.jl) is publicly available [here](https://www.doi.org/10.5281/zenodo.7779045). The path of the data, `paramsGeneral[:pathProject]`, needs to be modified accordingly in the [config file](./docs/lit/examples/ReconConfig_joss_demo.jl). +The data for the phantom reconstruction [`joss_demo.jl`](./docs/lit/examples/joss_demo.jl) is publicly available [here](https://www.doi.org/10.5281/zenodo.7779045). The path of the data, `params_general[:project_path]`, needs to be modified accordingly in the [config file](./docs/lit/examples/recon_config_joss_demo.jl). -For a full introduction, please refer to our [manuscript](./paper.md) for a full description of this package, including background, purpose, implementation, and the information of dependent packages. +For a full introduction, please refer to our [manuscript](./paper/paper.md) for a full description of this package, including background, purpose, implementation, and the information of dependent packages. ## Quick Installation -To install the package, use the following command: +To install the package, **type** the following command: ``` julia>]add GIRFReco ``` +It is also possible to install the package with the following code: +``` +using Pkg +Pkg.add("GIRFReco") +``` + ## Development Installation 1. To get started, make sure you have Julia installed (>=1.9). @@ -25,25 +31,25 @@ julia>]add GIRFReco ``` julia> ]dev GIRFReco ``` -3. Download the demonstrating data from Zenodo (https://doi.org/10.5281/zenodo.6510020) and extract to your local folder. **Make sure you have both reading and writing privileges on the data folder.** - * Note: The data downloading might take a few minutes. You can continue with step 5-10 in the meantime. -4. Open a Julia REPL under the path of your local `GIRFReco.jl` folder. We recommend using Visual Studio Code with the Julia extension as development environment. -5. In the Julia REPL, type `]` to enter the package manager. -6. In Julia package manager, Type `activate .` to activate a the Julia environment defined in `Project.toml` file in the `GIRFReco.jl` repo. -7. Add the `MRIGradients.jl` package by `add MRIGradients`. -8. Install all additional dependent packages: +3. Open a Julia REPL under the path of your local `GIRFReco.jl` folder. Our own development configuration is Visual Studio Code with the Julia extension. Other environments for Julia should work in a similar way with possible extra configurations. +4. In the Julia REPL, type `]` to enter the package manager. +5. In Julia package manager, Type `activate .` to activate a the Julia environment defined in `Project.toml` file in the `GIRFReco.jl` repo. +6. Add the `MRIGradients.jl` package by `add MRIGradients`. +7. Install all additional dependent packages: * `add MRIReco` * `add MRIFiles` * `add MRIBase` * `add ImageUtils` * `add MRICoilSensitivities` * `add FileIO` -9. Use command `instantiate` in Julia package manager to install all of the dependencies. This may be all you need to do (i.e you might be able to skip steps 7,8). +8. Use command `instantiate` in Julia package manager to install all of the dependencies. This may be all you need to do (i.e you might be able to skip steps 7,8). +9. Download the demonstrating data from Zenodo (https://doi.org/10.5281/zenodo.6510020) and extract to your local folder. **Make sure you have both reading and writing privileges on the data folder.** + * Note: The data downloading might take a few minutes. 10. Open the demo script `joss_demo.jl` under the folder `docs/lit/examples/`, make sure to set `rootProjPath` as the folder that stores demo data, then run it in Julia REPL. ## Example Results -1. **Phantom Images.** (*Presented at [ISMRM 2022, p.2435](https://archive.ismrm.org/2022/2435.html)*): using a dataset with 4 spiral interleaves for images with 1.1mm in-plane resolution. The code and dataset are both described in the [previous section](#quick-start). +1. **Phantom Images.** (*Presented at [ISMRM 2022, p.2435](https://archive.ismrm.org/2022/2435.html)*): using a dataset with 4 spiral interleaves for images with 1.1mm in-plane resolution. The code and dataset are both described in the [previous section](#quick-installation). ```bash cd docs/lit/examples diff --git a/docs/Project.toml b/docs/Project.toml new file mode 100644 index 0000000..ed2992d --- /dev/null +++ b/docs/Project.toml @@ -0,0 +1,22 @@ +[deps] +Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +Flux = "587475ba-b771-5e3f-ad9e-33799f191a9c" +GIRFReco = "cf1bd817-9e2d-403d-b1e7-15ef5a867bae" +HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" +ImageTransformations = "02fcd773-0e25-5acc-982a-7f6622650795" +ImageUtils = "8ad4436d-4835-5a14-8bce-3ae014d2950b" +Literate = "98b081ad-f1c9-55d3-8b20-4c87d4299306" +MRIBase = "f7771a9a-6e57-4e71-863b-6e4b6a2f17df" +MRICoilSensitivities = "c57eb701-aafc-44a2-a53c-128049758959" +MRIFiles = "5a6f062f-bf45-497d-b654-ad17aae2a530" +MRIGradients = "6ea382ba-d04a-44a2-b811-544bd2aee867" +MRIReco = "bdf86e05-2d2b-5731-a332-f3fe1f9e047f" +MRISimulation = "8988da37-ea20-4fa6-9af7-8a6f6f9a8970" +PlotlyJS = "f0f68f2c-4968-5e81-91da-67840de0976a" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" +RegularizedLeastSquares = "1e9c538a-f78c-5de5-8ffb-0b6dbe892d23" + +[compat] +MRIReco = "0.7.1" diff --git a/docs/lit/examples/ReconConfig_joss_demo.jl b/docs/lit/examples/ReconConfig_joss_demo.jl deleted file mode 100644 index 65055fa..0000000 --- a/docs/lit/examples/ReconConfig_joss_demo.jl +++ /dev/null @@ -1,152 +0,0 @@ -#----------------------------------------------------------------------------------- -# # [GIRFReco.jl Example Configuration File](@id example_config) -#----------------------------------------------------------------------------------- - -#= -## Introduction - -This ReconConfig.jl file describes all general reconstruction parameters, -as well as data locations and selections for an iterative non-Cartesian reconstruction that relies -on an external reference scan (Cartesian) to estimate calibration maps (coil sensitivities, B0 maps). - -All parameters are stored in a dictionary named `paramsGeneral`. - -=# -paramsGeneral = Dict{Symbol,Any}(); - -# Gyromagnetic ratio, in unit of Hz -paramsGeneral[:gamma] = 42577478; - -# General options for reconstruction script: -paramsGeneral[:doLoadMaps] = false # if true, reloads B0/SENSE maps instead of recalculating -paramsGeneral[:doSaveRecon] = true # if true, saves reconstruction and all auxiliary image data (maps) as NIfTI files -paramsGeneral[:doPlotRecon] = true # if true, plots intermediate debugging and output recon figures (needs graphics, not recommended in multi-thread mode due to PyPlot) -paramsGeneral[:doProcessMapScan] = true # if true, compute sensitivity and B0 maps from reconstructed Cartesian scan -paramsGeneral[:doSaveProcessedMapScan] = false # save ISMRMD file of preprocessed Cartesian data (before recon) -paramsGeneral[:reconId] = "v7" # unique identifier for the saved result files -paramsGeneral[:doCorrectWithB0map] = true # whether perform off-resonance correction -paramsGeneral[:doCorrectWithGIRFkxyz] = true # whether perform 1st order GIRF correction -paramsGeneral[:doCorrectWithGIRFk0] = true # whether perform 1st order GIRF correction -paramsGeneral[:doCoilCompression] = false # whether perform coil compression -paramsGeneral[:doNormalizeRecon] = false # if true, set the range of magnitude image as [0 1] - -# General parameters for reconstruction: -paramsGeneral[:numADCSamples] = 15650 # total number of ADC points BEFORE the rewinder at the end of the spiral readout. Need to check with data. # 15504 for 523, 15655 for gradient 508 -paramsGeneral[:reconSize] = [200,200, 1] # the matrix size of the reconstructed images. Needs to specify 1 on Z dimension for 2D images -paramsGeneral[:nReconIterations] = 40 # number of recon iterations (for both Cartesian and Spiral recon) -paramsGeneral[:b0mapSmoothBeta] = 0.1 # for estimateB0Maps, * `β` - Regularization parameter controlling roughness penalty (larger = smoother, default 5e-4) -paramsGeneral[:scalingFactorSaveRecon] = 1.0e9 # typical range of recon intensities is 1e-7, rescale when saving, e.g., to 0...1000 roughly for fMRI analysis -paramsGeneral[:nVirtualCoils] = 8 # if perform coil compression, the number of coils to be compressed to -paramsGeneral[:fovShift] = [-2, -5] # amount of FOV shift; in unit of number of voxels in [x,y] direction (for our in-vivo dataset this is [0, -15], change as necessary) -paramsGeneral[:sliceDistanceFactor_percent] = 400 # Scan parameters, Additional acquisition information, e.g., slice distance etc. -paramsGeneral[:nDiffusionDirections] = 6 # Need to specify total diffusion directions included in the raw data -#= - -## Data selector - -See details in the page Advanced Usage. - -Data selector is designed for calling the script repetitively through [`RunReconLoop.jl`](@__REPO_ROOT_URL__/recon/RunReconLoop.jl) -for e.g. different diffusion directions and/or different averages. -Note that the index of diffusion direction starts from 0 (b=0) to the total number in MDDW protocol, -e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs. -`boolean isCalledFromReconLoopGlobal` should be set as true if this `RunReconLoop.jl` is active. -If isCalledFromReconLoopGlobal is false or not defined, the data selector needs to be defined in the following code block. -=# -if !(@isdefined isCalledFromReconLoopGlobal) || !isCalledFromReconLoopGlobal - global selector = Dict{Symbol,Any}() - selector[:avg] = 1 - selector[:seg] = 1 - selector[:dif] = 0; -end - - -#= -## Directories and File Names - -We set directories for data reading in and results writing in this section. - -### Specifying Directories -=# - -paramsGeneral[:pathProject] = rootProjPath # Root path for the project - -#src # Paths (user-dependent) -#src # paramsGeneral[:pathData] = joinpath(paramsGeneral[:pathProject], "data", "joss_demo", "Human", "dat") -#src # paramsGeneral[:pathGradients] = joinpath(paramsGeneral[:pathProject], "data", "joss_demo", "gradients") -#src # paramsGeneral[:pathResults] = joinpath(paramsGeneral[:pathProject], "results", "joss_demo", "Human") -#src # paramsGeneral[:pathGIRF] = joinpath(paramsGeneral[:pathProject], "code", "GIRFReco", "data", "GIRF", "GIRF_ISMRM2022") -#src # paramsGeneral[:pathSaveRecon] = joinpath(paramsGeneral[:pathResults], "recon", paramsGeneral[:reconId]) - -#Path to ISMRMRD files (raw k-space data) [Input] -paramsGeneral[:pathData] = paramsGeneral[:pathProject] -#Path to spiral readout gradient files [Input] -paramsGeneral[:pathGradients] = joinpath(paramsGeneral[:pathProject],"Gradients") -#Path to GIRF files [Input] -paramsGeneral[:pathGIRF] = joinpath(paramsGeneral[:pathProject], "GIRF", "GIRF_ISMRM2022") -#Path to middle results (coil and B0 maps) files [Output] -paramsGeneral[:pathResults] = joinpath(paramsGeneral[:pathProject], "results","phantom") -#Path to final reconstructed spiral images [Output] -paramsGeneral[:pathSaveRecon] = joinpath(paramsGeneral[:pathResults], "recon", paramsGeneral[:reconId]); - -#= -### Specifying File Names -=# -paramsGeneral[:fileNameMapScan] = "Fieldmaps/meas_MID00083_FID06181_GRE_FieldMap_DualEcho_2mm.mrd" # Cartesian dual-echo file, for coil and B0 maps calculation [Input] -paramsGeneral[:fileNameMapStem] = "meas_MID00083_FID06181_GRE_FieldMap_DualEcho_2mm.mrd" -paramsGeneral[:mapTEs_ms] = [4.92, 7.38] # Two echo times, in ms -paramsGeneral[:fileNameGIRF] = ["2021Nov_PosNeg_Gx.mat", "2021Nov_PosNeg_Gy.mat", "2021Nov_PosNeg_Gz.mat"] # Calculated GIRF for each gradient axis [Input] -paramsGeneral[:fileNameGradient] = joinpath("gradients508.txt") # File name for the spiral gradient [Input] -paramsGeneral[:fileNameScan] = ["Spirals/meas_MID00072_FID06170_diffSpiral_508_Intl0_b2k_4Avg.mrd"]# ISMRMRD Raw k-space data for spiral acquisition [Input] -#Remove the comment mark of the next line if you want a multi-interleave spiral reconstruction -#paramsGeneral[:fileNameScan] = ["Spirals/meas_MID00072_FID06170_diffSpiral_508_Intl0_b2k_4Avg.mrd","Spirals/meas_MID00074_FID06172_diffSpiral_508_Intl1_b2k_4Avg.mrd","Spirals/meas_MID00076_FID06174_diffSpiral_508_Intl2_b2k_4Avg.mrd","Spirals/meas_MID00078_FID06176_diffSpiral_508_Intl3_b2k_4Avg.mrd"] -paramsGeneral[:fileNameScanStem] = "meas_MID00072_FID06170_diffSpiral_508_Intl0_b2k_4Avg.mrd" -paramsGeneral[:fileNameProcessedMapScan] = "processed_cartesian_data.h5" # file name for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) [Output] -paramsGeneral[:fileNameSaveMapRecon] = splitext(paramsGeneral[:fileNameMapStem])[1] * "_reconmap.nii" # File name for reconstructed dual-echo Cartesian images [Output] -paramsGeneral[:fileNameSaveSense] = splitext(paramsGeneral[:fileNameMapStem])[1] * "_sensemap.nii" # File name for calculated coil sensitivity maps [Output] -paramsGeneral[:fileNameSaveB0] = splitext(paramsGeneral[:fileNameMapStem])[1] * "_b0map.nii"; # File name for calculated off-resonance (B0) maps [Output] - -#= -File name for the final reconstructed spiral image. -If we reconstructing multiple spiral data files (e.g. multiple interleaves) through `RunReconLoop.jl`, -the file name for the final reconstructed image is concatenated from multiple scan file names. -Otherwise, just append `_recon.nii` as suffix to file name. -=# -if isa(paramsGeneral[:fileNameScan], AbstractVector) - paramsGeneral[:fileNameSaveRecon] = join([(x[1] * "_") for x in splitext.(paramsGeneral[:fileNameScanStem])]) * "dif$(selector[:dif])_" * "itl$(selector[:seg])_" * "avg$(selector[:avg])_" * "recon.nii"; -else - paramsGeneral[:fileNameSaveRecon] = splitext(paramsGeneral[:fileNameScanStem])[1] * "_recon.nii"; -end - -#= -### Assembling Full Paths - -Assembling directories and file names for final full pathes. -These are automated operations. -=# -paramsGeneral[:fullPathGradient] = joinpath(paramsGeneral[:pathGradients], paramsGeneral[:fileNameGradient]) # Full paths of spiral readout gradients -#src # paramsGeneral[:pathLoadMaps] = -#src # joinpath(paramsGeneral[:pathResults], "recon", paramsGeneral[:reconId]) # NOTE: If loaded from other reconId, this path might differ -paramsGeneral[:fullPathGIRF] = joinpath.(paramsGeneral[:pathGIRF], paramsGeneral[:fileNameGIRF]) # Full paths of GIRF files -paramsGeneral[:fullPathMapScan] = joinpath(paramsGeneral[:pathData], paramsGeneral[:fileNameMapScan]) # Full path of dual-echo Cartesian data -paramsGeneral[:fullPathScan] = joinpath.(paramsGeneral[:pathData], paramsGeneral[:fileNameScan]) # Full paths of raw k-space data files of spiral acquisition -paramsGeneral[:fullPathProcessedMapScan] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameProcessedMapScan]) # Full paths of pre-processed Cartesian dual-echo data [Output] -paramsGeneral[:fullPathSaveRecon] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveRecon] ) # Full paths of the reconstructed spiral image [Output] -paramsGeneral[:fullPathSaveMapRecon] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveMapRecon] ) # Full paths of reconstructed dual-echo Cartesian images [Output] -paramsGeneral[:fullPathSaveSense] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveSense] ) # Full paths of calculated coil sensitivity maps [Output] -paramsGeneral[:fullPathSaveB0] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveB0] ); # Full paths of calculated off-resonance (B0) maps [Output] - -#= -## Final Steps - -If the path for results writing is not existing, create it. - -As the last step of configuration, copy this config file -to the recon path for further checking and debugging purposes. -=# -if ~ispath(paramsGeneral[:pathSaveRecon]) - mkpath(paramsGeneral[:pathSaveRecon]) -end - -cp("recon/ReconConfig.jl", joinpath(paramsGeneral[:pathSaveRecon], "ReconConfig.jl"); force = true) - diff --git a/docs/lit/examples/joss_demo.jl b/docs/lit/examples/joss_demo.jl index f878208..81bd4cf 100644 --- a/docs/lit/examples/joss_demo.jl +++ b/docs/lit/examples/joss_demo.jl @@ -7,7 +7,7 @@ This page demonstrates an example script for using GIRFReco.jl This page was generated from the following Julia file: [`joss_demo.jl`](@__REPO_ROOT_URL__/docs/lit/examples/joss_demo.jl) -The configuration file is [`ReconConfig_joss_demo.jl`](@__REPO_ROOT_URL__/docs/lit/examples/ReconConfig_joss_demo.jl) +The configuration file is [`recon_config_joss_demo.jl`](@__REPO_ROOT_URL__/docs/lit/examples/recon_config_joss_demo.jl) =# #= @@ -17,61 +17,68 @@ The necessary Julia packages needed for spiral reconstruction. =# #Base packages for computation -using HDF5, LinearAlgebra, Dierckx, DSP, FourierTools, RegularizedLeastSquares, ImageUtils, PolygonInbounds +# using HDF5, LinearAlgebra, Dierckx, DSP, FourierTools, RegularizedLeastSquares, ImageUtils, PolygonInbounds #Packages for figure displaying -using MosaicViews, Plots, Images +# using MosaicViews, Plots, Images #Our developed packages using GIRFReco, MRIGradients #MRIReco and its sub-packages -using MRIReco, FileIO, MRIFiles, MRICoilSensitivities +using MRIReco, FileIO, MRIFiles, MRIBase, MRICoilSensitivities + +using RegularizedLeastSquares, Flux + +using ImageTransformations + +using PlotlyJS, Plots #= ## 2. Configurations for reconstruction -The following file, [`ReconConfig_joss_demo.jl`](@__REPO_ROOT_URL__/docs/lit/examples/ReconConfig_joss_demo.jl), +The following file, [`recon_config_joss_demo.jl`](@__REPO_ROOT_URL__/docs/lit/examples/recon_config_joss_demo.jl), includes general configuration for spiral reconstruction. It is necessary to execute this file to make sure all parameters are loaded. Sample Data that works with this script can be found at: https://doi.org/10.5281/zenodo.7779044 -Please download, extract and set the rootProjPath as the top level folder (should be something like /your/path/here/data-2, I've renamed mine to SPIDI) +Please download, extract and set the root_project_path as the top level folder (should be something like /your/path/here/data-2, I've renamed mine to SPIDI) =# -rootProjPath = "Your/Extracted/Data/Folder" # Root path of the data extracted from Zenodo - -include("ReconConfig_joss_demo.jl") +# root_project_path = "Your/Extracted/Data/Folder" # Root path of the data extracted from Zenodo +root_project_path = "/srv/data/ajaffray/TORONTO_COLLAB/data/joss_data_zenodo" +include("recon_config_joss_demo.jl") +plotlyjs() # Two user defined parameters, just for this script. -reloadSpiralData = true; # Set true if we need to reload raw data compulsively. -reloadGIRFData = true; # Set true if we need to reload GIRF data compulsively. +reload_spiral_data = true; # Set true if we need to reload raw data compulsively. +reload_girf_data = true; # Set true if we need to reload GIRF data compulsively. #= Choose Slice ([single number] OR [1,2,31,...]) Leave empty ([]) or remove this line to later select all slices =# -sliceChoice = []; +slice_choice = []; #= Choose which diffusion directions and averages to be processed. Diffusion direction index starts from 0 (b=0) to the total number in MDDW protocol (e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs). Index for average starts from 1. =# -diffusionDirection = 0 -idxAverage = 1 -nTotalDiffDir = paramsGeneral[:nDiffusionDirections] +diffusion_direction = 0 +idx_average = 1 +num_total_diffusion_directions = params_general[:num_total_diffusion_directions] ## Determine to reconstruct single-interleave data, or one interleave out of multi-interleave data. -isDataSingleIntlv = isa(paramsGeneral[:fullPathScan], String) +is_single_interleave = isa(params_general[:scan_fullpath], String) #= Choose which interleave to be reconstructed. -For multi-interleave data, the range of this value is [1:nTotalNumIntlv] (total number of interleaves) +For multi-interleave data, the range of this value is [1:num_total_interleaves] (total number of interleaves) For single-interleave data, it should always be set as 1; for multi-interleave data, the value set here will be used, indicating which interleaves to be merged and reconstructed. =# -startIndexIntlv = 1 +start_idx_interleave = 1 #=================================================== ## 3. Image Reconstruction @@ -80,27 +87,24 @@ The steps of image reconstruction starts here. ### 3.1 Calculation of B0 and Coil Sensitivity Maps -The first step in reconstruction pipeline is to calculate the off-resonance (B0) maps `b0Maps` -and coil sensitivity maps `senseCartesian` through the Cartesian reconstruction script -[CartesianRecon.jl](@__REPO_ROOT_URL__/recon/CartesianRecon.jl). +The first step in reconstruction pipeline is to calculate the off-resonance (B0) maps `b0_map` +and coil sensitivity maps `cartesian_sensitivity` through the Cartesian reconstruction script +[cartesian_recon.jl](@__REPO_ROOT_URL__/recon/cartesian_recon.jl). Ideally this script is execute once and the calculated maps are saved into files, which are loaded for future usage to save calculation time. -This is controlled by `doLoadMaps` in general parameters. +This is controlled by `do_load_maps` in general parameters. ===================================================# -if paramsGeneral[:doLoadMaps] && isfile(paramsGeneral[:fullPathSaveB0]) - @info "Loading SENSE and B0 maps from $(paramsGeneral[:fullPathSaveSense]) and $(paramsGeneral[:fullPathSaveB0])" - b0Maps = loadMap(paramsGeneral[:fullPathSaveB0]) +if params_general[:do_load_maps] && isfile(params_general[:b0_map_save_fullpath]) + @info "Loading SENSE and B0 maps from $(params_general[:sensitivity_save_fullpath]) and $(params_general[:b0_map_save_fullpath])" + cartesian_sensitivity = load_map(params_general[:sensitivity_save_fullpath]; do_split_phase = true) + b0_maps = load_map(params_general[:b0_map_save_fullpath]) - nSlices = size(b0Maps, 3); - sliceIndexArray = getSliceOrder(nSlices, isSliceInterleaved = true) - - b0Maps = b0Maps[:,:,invperm(sliceIndexArray)] - senseCartesian = loadMap(paramsGeneral[:fullPathSaveSense]; doSplitPhase = true)[:,:,invperm(sliceIndexArray),:] + num_slices = size(b0_maps, 3) else - @info "Running CartesianRecon to retrieve maps (senseCartesian and b0Maps)" - include("../../../recon/CartesianRecon.jl") - nSlices = size(b0Maps, 3); + @info "Running cartesian_recon to retrieve maps (cartesian_sensitivity and b0_maps)" + include("../../../recon/cartesian_recon.jl") + num_slices = size(b0_maps, 3) end #= @@ -119,16 +123,16 @@ and averages that we want. First we sort the slice index that we selected to reconstruct. =# -if isempty(sliceChoice) || !(@isdefined sliceChoice) - sliceChoice = collect(1:nSlices) +if isempty(slice_choice) || !(@isdefined slice_choice) + slice_choice = collect(1:num_slices) end -isMultiSlice = length(sliceChoice) > 1 +is_multislice = length(slice_choice) > 1 -if !isMultiSlice - selectedSlice = sliceChoice +if !is_multislice + selected_slice = slice_choice else - selectedSlice = sort(vec(sliceChoice)) + selected_slice = sort(vec(slice_choice)) end #= @@ -143,10 +147,10 @@ Slice 1, Slice 2 ... Slice N Slice 1, Slice 2 ... Slice N Slice 1, Slice 2 |_________________________________ Average 1 ___________________________________| ... |___ Average N___| Here we chose the set corresponding to the b-value = 0 images under the first average as the example. -There is a constant shift due to pre-scan data that we want to skip, which is why the data starts from `nSlices*2`. +There is a constant shift due to pre-scan data that we want to skip, which is why the data starts from `num_slices*2`. =# -excitationList = collect(nSlices*2 + 2 : 2 : nSlices*4) .+ diffusionDirection * nSlices * 2 .+ (idxAverage - 1) * nSlices * (nTotalDiffDir + 1) * 2 -sliceSelection = excitationList[selectedSlice] +excitation_list = collect(num_slices*2+2:2:num_slices*4) .+ diffusion_direction * num_slices * 2 .+ (idx_average - 1) * num_slices * (num_total_diffusion_directions + 1) * 2 +slice_selection = excitation_list[selected_slice] #= #### 3.2.2 Synchronization and Merging of k-space Data and Trajectory @@ -155,47 +159,43 @@ Since the k-space data and spiral k-space trajectories are sampled under differe and stored in separate files, they need to be first synchronized into the frequency of k-space data and then merged into a single object before final spiral image reconstruction. -Here we use a dictionary `paramsSpiral` to hold the parameters for this k-space data/trajectory synchronization and merging. +Here we use a dictionary `params_spiral` to hold the parameters for this k-space data/trajectory synchronization and merging. =# -paramsSpiral = Dict{Symbol,Any}() -paramsSpiral[:reconSize] = Tuple(paramsGeneral[:reconSize]) -paramsSpiral[:interleave] = startIndexIntlv -paramsSpiral[:numSamples] = paramsGeneral[:numADCSamples] -paramsSpiral[:delay] = 0.00000 # naive delay correction - -paramsSpiral[:interleaveDataFileNames] = paramsGeneral[:fullPathScan] - -paramsSpiral[:trajFilename] = paramsGeneral[:fullPathGradient] -paramsSpiral[:excitations] = sliceSelection - -paramsSpiral[:doMultiInterleave] = !isDataSingleIntlv -paramsSpiral[:doOddInterleave] = false -paramsSpiral[:numInterleaves] = isDataSingleIntlv ? 1 : length(paramsSpiral[:interleaveDataFileNames]) # one interleaf per file, count files, if filenames are array of strings (not only one string) - -paramsSpiral[:singleSlice] = !isMultiSlice - +params_spiral = Dict{Symbol,Any}() +params_spiral[:recon_size] = Tuple(params_general[:recon_size]) +params_spiral[:interleave] = start_idx_interleave +params_spiral[:num_samples] = params_general[:num_adc_samples] +params_spiral[:delay] = 0.00000 # naive delay correction +params_spiral[:interleave_data_filenames] = params_general[:scan_fullpath] +params_spiral[:traj_filename] = params_general[:gradient_fullpath] +params_spiral[:excitations] = slice_selection +params_spiral[:do_multi_interleave] = !is_single_interleave +params_spiral[:do_odd_interleave] = false +params_spiral[:num_interleaves] = is_single_interleave ? 1 : length(params_spiral[:interleave_data_filenames]) # one interleaf per file, count files, if filenames are array of strings (not only one string) +params_spiral[:single_slice] = !is_multislice #= Here we synchronize the spiral k-space data with trajectory by upsampling the trajectory. Subsequently, data of all the selected spiral interleaves and the corresponding trajectories -are merged into `acqDataImaging`. -This step is done through the function `mergeRawInterleaves`, which can be viewed in -[Utils.jl](@__REPO_ROOT_URL__/utils/Utils.jl). +are merged into `imaging_acq_data`. +This step is done through the function `merge_raw_interleaves`, which can be viewed in +[utils.jl](@__REPO_ROOT_URL__/utils/utils.jl). Note that we only do these steps when they have not been done yet or it's specifically required. =# -if reloadSpiralData || !(@isdefined acqDataImaging) +if reload_spiral_data || !(@isdefined imaging_acq_data) || !(@isdefined slice_idx_array_spiral) @info "Reading spiral data and merging interleaves" - acqDataImaging = mergeRawInterleaves(paramsSpiral) + imaging_acq_data = merge_raw_interleaves(params_spiral, false) + raw_temp = RawAcquisitionData(ISMRMRDFile(params_general[:scan_fullpath][1])) + slice_idx_array_spiral = get_slice_order(raw_temp, num_slices, (num_slices+1)*2, 2) + + # The loaded/calculated sens maps and B0 maps are in ascending slice order + # need to reorder them according to spiral RawAcqData + b0_maps = b0_maps[:, :, invperm(slice_idx_array_spiral)] + cartesian_sensitivity = cartesian_sensitivity[:, :, invperm(slice_idx_array_spiral), :] end -# for i = 1:20 - -# acqDataImaging.kdata[1][:,i] .= vcat(acqDataImaging.kdata[1][4:end,i],zeros(ComplexF32,(3,1))) - -# end - #= #### 3.2.3 Correction of k-space Trajectory Using Gradient Impulse Response Function @@ -206,24 +206,24 @@ Finally we check if the k-space trajectory is normalized to the range [-0.5, 0.5 =# #Load GIRFs (K1) -gK1 = readGIRFFile(paramsGeneral[:fullPathGIRF][1], paramsGeneral[:fullPathGIRF][2], paramsGeneral[:fullPathGIRF][3], "GIRF_FT", false) -gAk1 = GirfApplier(gK1, paramsGeneral[:gamma]) +girf_k1 = readGIRFFile(params_general[:girf_fullpath][1], params_general[:girf_fullpath][2], params_general[:girf_fullpath][3], "GIRF_FT", false) +girf_applier_k1 = GirfApplier(girf_k1, params_general[:gamma]) #Load K0 GIRF -gK0 = readGIRFFile(paramsGeneral[:fullPathGIRF][1], paramsGeneral[:fullPathGIRF][2], paramsGeneral[:fullPathGIRF][3], "b0ec_FT", true) -gAk0 = GirfApplier(gK0, paramsGeneral[:gamma]) +girf_k0 = readGIRFFile(params_general[:girf_fullpath][1], params_general[:girf_fullpath][2], params_general[:girf_fullpath][3], "b0ec_FT", true) +girf_applier_k0 = GirfApplier(girf_k0, params_general[:gamma]) -if paramsGeneral[:doCorrectWithGIRFkxyz] +if params_general[:do_correct_with_girf_k1] @info "Correcting For GIRF" - applyGIRF!(acqDataImaging, gAk1) + apply_girf!(imaging_acq_data, girf_applier_k1) end -if paramsGeneral[:doCorrectWithGIRFk0] +if params_general[:do_correct_with_girf_k0] @info "Correcting For k₀" - applyK0!(acqDataImaging, gAk0) + apply_k0!(imaging_acq_data, girf_applier_k0) end -#Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) -checkAcquisitionNodes!(acqDataImaging) +# Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) +check_acquisition_nodes!(imaging_acq_data) #= #### 3.2.4 Center the Object to the Field-of-View (FOV) @@ -232,7 +232,7 @@ If the scanned object is not in the center of the FOV, we need to shift FOV to place the object in the center. This is achieved through adding linear phases on all dimensions. =# -shiftksp!(acqDataImaging,paramsGeneral[:fovShift]) +shift_kspace!(imaging_acq_data, params_general[:fov_shift]) #= #### 3.2.5 Processing Coil Sensitivity Maps @@ -241,19 +241,17 @@ We need to preprocess the coil sensitivity maps before reconstruction. This includes resizing the coil maps to the size of output encoding matrix size; compress the channels according to user's setting to achieve a faster reconstruction. =# -low_freq_mask = hanning((30,30),padding=170,zerophase=true) - -sensitivity = mapslices(x ->imresize(x, paramsSpiral[:reconSize][1],paramsSpiral[:reconSize][2]), senseCartesian, dims=[1,2]) +sensitivity = mapslices(x -> imresize(x, params_spiral[:recon_size][1], params_spiral[:recon_size][2]), cartesian_sensitivity, dims = [1, 2]) -#Optional: Plot the sensitivity maps of each coil on a given slice. -if paramsGeneral[:doPlotRecon] +# Optional: Plot the sensitivity maps of each coil on a given slice. +if params_general[:do_plot_recon] plotlyjs() - plotSenseMaps(sensitivity,size(sensitivity, 4),sliceIndex = 2) + plot_sense_maps(sensitivity, size(sensitivity, 4), slice_index = 2) end -#Do coil compression to make recon faster -if paramsGeneral[:doCoilCompression] - acqDataImaging, sensitivity = geometricCC_2d(acqDataImaging,sensitivity, paramsGeneral[:nVirtualCoils]) +# Do coil compression to make recon faster +if params_general[:do_coil_compression] + imaging_acq_data, sensitivity = geometricCC_2d(imaging_acq_data, sensitivity, params_general[:num_virtual_coils]) end #= @@ -261,7 +259,7 @@ end We need to resize the B0 maps to the size of output encoding matrix size. =# -resizedB0 = mapslices(x->imresize(x,paramsSpiral[:reconSize][1],paramsSpiral[:reconSize][2]), b0Maps, dims=[1,2]) +resized_b0_maps = mapslices(x -> imresize(x, params_spiral[:recon_size][1], params_spiral[:recon_size][2]), b0_maps, dims = [1, 2]) #= #### 3.2.7 Alignment of Off-Resonance, Sensitivity, and Spiral Data @@ -269,7 +267,7 @@ resizedB0 = mapslices(x->imresize(x,paramsSpiral[:reconSize][1],paramsSpiral[:re We need to make sure that the axes line up so we rotate the sensitivities and the off-resonance maps Depending on your geometry, this might not be necessary but it is here =# -# resizedB0 = mapslices(x->rotl90(x),resizedB0,dims=[1,2]) +# resized_b0_maps = mapslices(x->rotl90(x),resized_b0_maps,dims=[1,2]) # sensitivity = mapslices(x->rotl90(x),sensitivity,dims=[1,2]) #= @@ -279,24 +277,24 @@ Here we start the spiral image reconstruction. First we need to set necessary parameters for reconstruction, including iterative solver's setting, coil maps, B0 maps, etc. -These parameters are held under the dictionary `paramsRecon`. +These parameters are held under the dictionary `params_recon`. Note that it is safer to cast B0 maps to ComplexF32 if the current version of MRIReco.jl is used. =# @info "Setting Reconstruction Parameters" -paramsRecon = Dict{Symbol,Any}() -paramsRecon[:reco] = "multiCoil" -paramsRecon[:reconSize] = paramsSpiral[:reconSize][1:2] -paramsRecon[:regularization] = "L2" -paramsRecon[:λ] = 1e-3 -paramsRecon[:iterations] = paramsGeneral[:nReconIterations] -paramsRecon[:solver] = "cgnr" -paramsRecon[:solverInfo] = SolverInfo(ComplexF32,store_solutions=false) -paramsRecon[:senseMaps] = ComplexF32.(sensitivity[:,:,selectedSlice,:]) - -if paramsGeneral[:doCorrectWithB0map] - paramsRecon[:correctionMap] = ComplexF32.(-1im.*resizedB0[:,:,selectedSlice]) +params_recon = Dict{Symbol,Any}() +params_recon[:reco] = "multiCoil" +params_recon[:reconSize] = params_spiral[:recon_size][1:2] # cannot avoid camel-case here since it is defined by MRIReco.jl and RegularizedLeastSquares.jl +params_recon[:regularization] = "L2" +params_recon[:λ] = 1e-3 +params_recon[:iterations] = params_general[:num_recon_iterations] +params_recon[:solver] = "cgnr" +params_recon[:solverInfo] = SolverInfo(ComplexF32, store_solutions = false) +params_recon[:senseMaps] = ComplexF32.(sensitivity[:, :, selected_slice, :]) # cannot avoid camel-case here since it is defined by MRIReco.jl and RegularizedLeastSquares.jl + +if params_general[:do_correct_with_b0_map] + params_recon[:correctionMap] = ComplexF32.(-1im .* resized_b0_maps[:, :, selected_slice]) # cannot avoid camel-case here since it is defined by MRIReco.jl and RegularizedLeastSquares.jl end #= @@ -304,32 +302,48 @@ Finally we can call reconstruction function of the package `MRIReco.jl` to perform final spiral image reconstruction. =# @info "Performing Spiral Reconstruction" -@time reco = reconstruction(acqDataImaging, paramsRecon) +@time reco = reconstruction(imaging_acq_data, params_recon) GC.gc() +# Reorder slices to an ascending order +reco = reco[:,:,slice_idx_array_spiral[selected_slice]] +resized_b0_maps = resized_b0_maps[:, :, slice_idx_array_spiral[selected_slice]] + #= ## 4. Save and Plot the Results (Optional) -All results could be saved into NIfTI files using the `saveMap` function -and be plotted using the `plotReconstruction` function, both located in -the file [Utils.jl](@__REPO_ROOT_URL__/utils/Utils.jl). +All results could be saved into NIfTI files using the `save_map` function +and be plotted using the `plot_reconstruction` function, both located in +the file [utils.jl](@__REPO_ROOT_URL__/utils/utils.jl). =# -if paramsGeneral[:doSaveRecon] #TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load - resolution_tmp = fieldOfView(acqDataImaging)[1:2]./encodingSize(acqDataImaging) - resolution_mm = (resolution_tmp[1],resolution_tmp[2],fieldOfView(acqDataImaging)[3] *(1 + paramsGeneral[:sliceDistanceFactor_percent]/100.0)) #for 2D only, since FOV[3] is slice thickness then, but gap has to be observed - - #TODO: use slice ordering from cartesian scan directly! - nSlices = numSlices(acqDataImaging) - sliceIndexArray = getSliceOrder(nSlices, isSliceInterleaved = true) - saveMap(paramsGeneral[:fullPathSaveRecon], paramsGeneral[:scalingFactorSaveRecon]*reco.data[:,:,sliceIndexArray], resolution_mm; doSplitPhase=true, doNormalize = paramsGeneral[:doNormalizeRecon]) +if params_general[:do_save_recon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load + resolution_tmp = fieldOfView(imaging_acq_data)[1:2] ./ encodingSize(imaging_acq_data) + resolution_mm = (resolution_tmp[1], resolution_tmp[2], fieldOfView(imaging_acq_data)[3] * (1 + params_general[:slice_distance_factor_percent] / 100.0)) #for 2D only, since FOV[3] is slice thickness then, but gap has to be observed + + # TODO: use slice ordering from cartesian scan directly! + num_slices = numSlices(imaging_acq_data) + save_map( + params_general[:recon_save_fullpath], + params_general[:saving_scalefactor] * reco.data[:, :, slice_idx_array_spiral], + resolution_mm; + do_split_phase = true, + do_normalize = params_general[:do_normalize_recon], + ) end -if paramsGeneral[:doPlotRecon] +if params_general[:do_plot_recon] @info "Plotting Reconstruction" plotlyjs() - plotReconstruction(reco, 1:length(selectedSlice), resizedB0[:, :, selectedSlice], figHandles=["Original Magnitude", "Original Phase", "B0"], isSliceInterleaved=false, rotateAngle=90) + plot_reconstruction( + reco, + 1:length(selected_slice), + resized_b0_maps, + fig_handles = ["Original Magnitude", "Original Phase", "B0"], + is_slice_interleaved = false, + rotation = 90, + ) end -@info "Successfully Completed SpiralRecon" \ No newline at end of file +@info "Successfully Completed Spiral Recon" diff --git a/docs/lit/examples/recon_config_joss_demo.jl b/docs/lit/examples/recon_config_joss_demo.jl new file mode 100644 index 0000000..9d43cd9 --- /dev/null +++ b/docs/lit/examples/recon_config_joss_demo.jl @@ -0,0 +1,159 @@ +#----------------------------------------------------------------------------------- +# # [GIRFReco.jl Example Configuration File](@id example_config) +#----------------------------------------------------------------------------------- + +#= +## Introduction + +This recon_config.jl file describes all general reconstruction parameters, +as well as data locations and selections for an iterative non-Cartesian reconstruction that relies +on an external reference scan (Cartesian) to estimate calibration maps (coil sensitivities, B0 maps). + +All parameters are stored in a dictionary named `params_general`. + +=# +params_general = Dict{Symbol,Any}(); + +# Gyromagnetic ratio, in unit of Hz +params_general[:gamma] = 42577478; + +# General options for reconstruction script: +params_general[:do_load_maps] = true # if true, reloads B0/SENSE maps instead of recalculating +params_general[:do_save_recon] = true # if true, saves reconstruction and all auxiliary image data (maps) as NIfTI files +params_general[:do_plot_recon] = true # if true, plots intermediate debugging and output recon figures (needs graphics, not recommended in multi-thread mode due to PyPlot) +params_general[:do_process_map_scan] = true # if true, compute sensitivity and B0 maps from reconstructed Cartesian scan +params_general[:do_save_processed_map_scan] = false # save ISMRMD file of preprocessed Cartesian data (before recon) +params_general[:recon_id] = "v7" # unique identifier for the saved result files +params_general[:do_correct_with_b0_map] = true # whether perform off-resonance correction +params_general[:do_correct_with_girf_k1] = true # whether perform 1st order GIRF correction +params_general[:do_correct_with_girf_k0] = true # whether perform 1st order GIRF correction +params_general[:do_coil_compression] = false # whether perform coil compression +params_general[:do_normalize_recon] = false # if true, set the range of magnitude image as [0 1] + +# General parameters for reconstruction: +params_general[:num_adc_samples] = 15650 # total number of ADC points BEFORE the rewinder at the end of the spiral readout. Need to check with data. # 15504 for 523, 15655 for gradient 508 +params_general[:recon_size] = [200, 200, 1] # the matrix size of the reconstructed images. Needs to specify 1 on Z dimension for 2D images +params_general[:num_recon_iterations] = 40 # number of recon iterations (for both Cartesian and Spiral recon) +params_general[:b0_map_beta] = 0.1 # for estimate_b0_maps, * `β` - Regularization parameter controlling roughness penalty (larger = smoother, default 5e-4) +params_general[:saving_scalefactor] = 1.0e9 # typical range of recon intensities is 1e-7, rescale when saving, e.g., to 0...1000 roughly for fMRI analysis +params_general[:num_virtual_coils] = 8 # if perform coil compression, the number of coils to be compressed to +params_general[:fov_shift] = [-2, -5] # amount of FOV shift; in unit of number of voxels in [x,y] direction (for our in-vivo dataset this is [0, -15], change as necessary) +params_general[:slice_distance_factor_percent] = 400 # Scan parameters, Additional acquisition information, e.g., slice distance etc. +params_general[:num_total_diffusion_directions] = 6 # Need to specify total diffusion directions included in the raw data +#= + +## Data selector + +See details in the page Advanced Usage. + +Data selector is designed for calling the script repetitively through [`RunReconLoop.jl`](@__REPO_ROOT_URL__/recon/RunReconLoop.jl) +for e.g. different diffusion directions and/or different averages. +Note that the index of diffusion direction starts from 0 (b=0) to the total number in MDDW protocol, +e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs. +`boolean is_called_from_global_recon` should be set as true if this `RunReconLoop.jl` is active. +If is_called_from_global_recon is false or not defined, the data selector needs to be defined in the following code block. +=# +if !(@isdefined is_called_from_global_recon) || !is_called_from_global_recon + global selector = Dict{Symbol,Any}() + selector[:avg] = 1 + selector[:seg] = 1 + selector[:dif] = 0 +end + + +#= +## Directories and File Names + +We set directories for data reading in and results writing in this section. + +### Specifying Directories +=# + +params_general[:project_path] = root_project_path # Root path for the project + +#src # Paths (user-dependent) +#src # params_general[:data_path] = joinpath(params_general[:project_path], "data", "joss_demo", "Human", "dat") +#src # params_general[:gradients_path] = joinpath(params_general[:project_path], "data", "joss_demo", "gradients") +#src # params_general[:results_path] = joinpath(params_general[:project_path], "results", "joss_demo", "Human") +#src # params_general[:girf_path] = joinpath(params_general[:project_path], "code", "GIRFReco", "data", "GIRF", "GIRF_ISMRM2022") +#src # params_general[:recon_save_path] = joinpath(params_general[:results_path], "recon", params_general[:recon_id]) + +#Path to ISMRMRD files (raw k-space data) [Input] +params_general[:data_path] = params_general[:project_path] +#Path to spiral readout gradient files [Input] +params_general[:gradients_path] = joinpath(params_general[:project_path], "Gradients") +#Path to GIRF files [Input] +params_general[:girf_path] = joinpath(params_general[:project_path], "GIRF", "GIRF_ISMRM2022") +#Path to middle results (coil and B0 maps) files [Output] +params_general[:results_path] = joinpath(params_general[:project_path], "results", "phantom") +#Path to final reconstructed spiral images [Output] +params_general[:recon_save_path] = joinpath(params_general[:results_path], "recon", params_general[:recon_id]); + +#= +### Specifying File Names +=# +params_general[:map_scan_filename] = "Fieldmaps/meas_MID00083_FID06181_GRE_FieldMap_DualEcho_2mm.mrd" # Cartesian dual-echo file, for coil and B0 maps calculation [Input] +params_general[:map_scan_filename_stem] = "meas_MID00083_FID06181_GRE_FieldMap_DualEcho_2mm.mrd" +# params_general[:mapTEs_ms] = [4.92, 7.38] # Two echo times, in ms +params_general[:girf_filename] = ["2021Nov_PosNeg_Gx.mat", "2021Nov_PosNeg_Gy.mat", "2021Nov_PosNeg_Gz.mat"] # Calculated GIRF for each gradient axis [Input] +params_general[:gradient_filename] = joinpath("gradients508.txt") # File name for the spiral gradient [Input] +params_general[:scan_filename] = ["Spirals/meas_MID00072_FID06170_diffSpiral_508_Intl0_b2k_4Avg.mrd"]# ISMRMRD Raw k-space data for spiral acquisition [Input] +#Remove the comment mark of the next line if you want a multi-interleave spiral reconstruction +#params_general[:scan_filename] = ["Spirals/meas_MID00072_FID06170_diffSpiral_508_Intl0_b2k_4Avg.mrd","Spirals/meas_MID00074_FID06172_diffSpiral_508_Intl1_b2k_4Avg.mrd","Spirals/meas_MID00076_FID06174_diffSpiral_508_Intl2_b2k_4Avg.mrd","Spirals/meas_MID00078_FID06176_diffSpiral_508_Intl3_b2k_4Avg.mrd"] +params_general[:scan_filename_stem] = "meas_MID00072_FID06170_diffSpiral_508_Intl0_b2k_4Avg.mrd" +params_general[:processed_map_scan_filename] = "processed_cartesian_data.h5" # file name for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) [Output] +params_general[:map_save_filename] = splitext(params_general[:map_scan_filename_stem])[1] * "_reconmap.nii" # File name for reconstructed dual-echo Cartesian images [Output] +params_general[:sensitivity_save_filename] = splitext(params_general[:map_scan_filename_stem])[1] * "_sensemap.nii" # File name for calculated coil sensitivity maps [Output] +params_general[:b0_map_save_filename] = splitext(params_general[:map_scan_filename_stem])[1] * "_b0map.nii"; # File name for calculated off-resonance (B0) maps [Output] + +#= +File name for the final reconstructed spiral image. +If we reconstructing multiple spiral data files (e.g. multiple interleaves) through `RunReconLoop.jl`, +the file name for the final reconstructed image is concatenated from multiple scan file names. +Otherwise, just append `_recon.nii` as suffix to file name. +=# +if isa(params_general[:scan_filename], AbstractVector) + params_general[:recon_save_filename] = + join([(x[1] * "_") for x in splitext.(params_general[:scan_filename_stem])]) * + "dif$(selector[:dif])_" * + "itl$(selector[:seg])_" * + "avg$(selector[:avg])_" * + "recon.nii" +else + params_general[:recon_save_filename] = splitext(params_general[:scan_filename_stem])[1] * "_recon.nii" +end + +#= +### Assembling Full Paths + +Assembling directories and file names for final full pathes. +These are automated operations. +=# +params_general[:gradient_fullpath] = joinpath(params_general[:gradients_path], params_general[:gradient_filename]) # Full paths of spiral readout gradients +#src # params_general[:pathload_maps] = +#src # joinpath(params_general[:results_path], "recon", params_general[:recon_id]) # NOTE: If loaded from other recon_id, this path might differ +params_general[:girf_fullpath] = joinpath.(params_general[:girf_path], params_general[:girf_filename]) # Full paths of GIRF files +params_general[:map_scan_fullpath] = joinpath(params_general[:data_path], params_general[:map_scan_filename]) # Full path of dual-echo Cartesian data +params_general[:scan_fullpath] = joinpath.(params_general[:data_path], params_general[:scan_filename]) # Full paths of raw k-space data files of spiral acquisition +params_general[:processed_map_scan_fullpath] = joinpath(params_general[:recon_save_path], params_general[:processed_map_scan_filename]) # Full paths of pre-processed Cartesian dual-echo data [Output] +params_general[:recon_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:recon_save_filename]) # Full paths of the reconstructed spiral image [Output] +params_general[:map_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:map_save_filename]) # Full paths of reconstructed dual-echo Cartesian images [Output] +params_general[:sensitivity_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:sensitivity_save_filename]) # Full paths of calculated coil sensitivity maps [Output] +params_general[:b0_map_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:b0_map_save_filename]); # Full paths of calculated off-resonance (B0) maps [Output] + +#= +## Final Steps + +If the path for results writing is not existing, create it. + +As the last step of configuration, copy this config file +to the recon path for further checking and debugging purposes. +=# +if ~ispath(params_general[:recon_save_path]) + mkpath(params_general[:recon_save_path]) +end + +cp(@__FILE__, joinpath(params_general[:recon_save_path], "recon_config.jl"); force = true) + + + diff --git a/docs/make.jl b/docs/make.jl index 709c38e..8b5a8a3 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -1,6 +1,6 @@ -push!(LOAD_PATH,"../src") -push!(LOAD_PATH,"../recon/") -push!(LOAD_PATH,"../utils/") +push!(LOAD_PATH, "../src/") +push!(LOAD_PATH, "../src/io/") +push!(LOAD_PATH, "../src/utils/") using Documenter, Literate, GIRFReco @@ -9,22 +9,23 @@ lit = joinpath(@__DIR__, "lit", "examples") gen = joinpath(@__DIR__, "src", "generated") ipath_script = joinpath(lit, "joss_demo.jl") -ipath_config = joinpath(lit, "ReconConfig_joss_demo.jl") +ipath_config = joinpath(lit, "recon_config_joss_demo.jl") opath = gen Literate.markdown(ipath_script, opath; documenter = true) Literate.markdown(ipath_config, opath; documenter = true) -makedocs(sitename="GIRFReco Documentation", +makedocs( + sitename = "GIRFReco Documentation", modules = [GIRFReco], pages = [ "Home" => "index.md", "Utilities" => "Utilities.md", - "Examples" => [joinpath("generated/", "joss_demo.md"), joinpath("generated/", "ReconConfig_joss_demo.md")] + "Examples" => [joinpath("generated/", "joss_demo.md"), joinpath("generated/", "recon_config_joss_demo.md")], ], ) deploydocs( - repo="github.com/BRAIN-TO/GIRFReco.git", + repo = "github.com/BRAIN-TO/GIRFReco.jl.git", push_preview = true, # deploy_config = Documenter.GitHubActions(), devbranch = "main", diff --git a/docs/src/Utilities.md b/docs/src/Utilities.md index dbea250..7b3df35 100644 --- a/docs/src/Utilities.md +++ b/docs/src/Utilities.md @@ -1,4 +1,4 @@ ```@autodocs Modules = [GIRFReco] -Pages = ["Utils.jl", "GradientReader.jl"] +Pages = ["utils.jl", "gradient_reader.jl", "fieldmap_estimator.jl"] ``` \ No newline at end of file diff --git a/io/GradientReader.jl b/io/GradientReader.jl deleted file mode 100644 index 374d8a7..0000000 --- a/io/GradientReader.jl +++ /dev/null @@ -1,108 +0,0 @@ -export read_gradient_txt_file - -"Reads in text file containing gradient waveform information" -function read_gradient_txt_file(fileName, reconSize, delay) - - gradientData = readdlm(fileName,'\n') - - ## Read in the header data of the gradient text file (lines 1 to 21) - dataDict = Dict{Symbol,Any}() - dataDict[:versionNr] = gradientData[1] - dataDict[:numSamples] = gradientData[2] - dataDict[:dwellTime] = gradientData[3] # [seconds] - dataDict[:samplesPerInterleave] = gradientData[4] - dataDict[:numInterleaves] = gradientData[5] - dataDict[:numDims] = gradientData[6] - dataDict[:timeToCenterKSpace] = gradientData[7] # [seconds] - dataDict[:acqDuration] = gradientData[8] - dataDict[:samplesPerAcq] = gradientData[9] - dataDict[:numAcquisitions] = gradientData[10] - dataDict[:acqTR] = gradientData[11] - dataDict[:gradientAcqStartDelay] = gradientData[12] - dataDict[:echoTimeShiftSamples] = gradientData[13] - dataDict[:FOV] = gradientData[14:16] # [m] - dataDict[:voxelDims] = gradientData[17:19] # [m] - dataDict[:gradientStrengthFactor] = gradientData[20] # [mT/m] - dataDict[:isBinary] = gradientData[21] - dataDict[:gamma] = 42577.478 # [Hz/mT] CAN CHANGE - dataDict[:fieldStrength] = 3 # [T] CAN CHANGE - - #print(dataDict) - - ## reading and data scaling of gradient data - dataDict[:gradData] = gradientData[22:end] - interleaveGradArray = dataDict[:gradientStrengthFactor]*reshape(dataDict[:gradData],dataDict[:samplesPerInterleave],dataDict[:numInterleaves],dataDict[:numDims]) #[mT/m] - - plannedTimes = dataDict[:dwellTime].*(0:(dataDict[:samplesPerInterleave]-1)) - delayedTimes = plannedTimes .- delay .- dataDict[:dwellTime]./2 # seconds (dwellTime/2 compensates for integration) - - interleaveGradArrayFlexible = Array{Float64,3}(undef,size(interleaveGradArray)) - - #print(size(interleaveGradArrayFlexible)) - - ## Loop over all of the unique excitation trajectories and create an interpolant of the gradient - for dim in 1:dataDict[:numDims] - - for l in 1:dataDict[:numInterleaves] - - #print((dim,l),"\n") - - sp = Spline1D(plannedTimes,interleaveGradArray[:,l,dim],w=ones(length(plannedTimes)), k=1, bc="zero", s=0.0) - - # evaluate the interpolant at the sampling times of the kspace data - interleaveGradArrayFlexible[:,l,dim] = sp(delayedTimes) - - #print(interleaveGradArrayFlexible[:,l,dim][end],"\n") - - end - - end - - ## cumulative summation and numerical integration of the gradient data, resulting in the kspace trajectory - kSpaceTrajArrayFlexible = dataDict[:gamma]*dataDict[:dwellTime]*cumsum(interleaveGradArrayFlexible,dims=1) # [rad/m] - - ## Conversion to the trajectory scaling convention in MRIReco.jl - # Currently only 2d Trajectories - convertedKSpaceArrayFlexible = kSpaceTrajArrayFlexible - convertedKSpaceArrayFlexible[:,:,1] *= dataDict[:FOV][1] ./ reconSize[1] - convertedKSpaceArrayFlexible[:,:,2] *= dataDict[:FOV][2] ./ reconSize[2] - - ## Construction of the trajectory object ## - - ## Reshaping of the array to the format expected by the Trajectory constructor in MRIReco.jl - # - dim 1 = kspace dimension - # - dim 2 = kspace position (with interleaves/profiles arranged consecutively) - permutedTrajectory = permutedims(reshape(convertedKSpaceArrayFlexible,dataDict[:samplesPerInterleave]*dataDict[:numInterleaves],dataDict[:numDims]),[2,1]) - - ## Construction of the trajectory - # - Note: timing vectors are automatically generated - seems to be consistent with the dwell time - trajectoryObject = Trajectory(permutedTrajectory,dataDict[:numInterleaves],dataDict[:samplesPerInterleave],TE=dataDict[:echoTimeShiftSamples],AQ=dataDict[:acqDuration], numSlices=9, cartesian=false,circular=false) - - return trajectoryObject - -end - -function testGradReader() - - ## Testing - gradFile = "data/Gradients/gradients523.txt" - - ## - kSpaceTrajectory_2 = read_gradient_txt_file(gradFile,(200,200),0.00000) - - ## - pulledTrajectory21 = kspaceNodes(kSpaceTrajectory_2)[1,:] - pulledTrajectory22 = kspaceNodes(kSpaceTrajectory_2)[2,:] - - # - fig = figure(234, figsize=(10,10)) - ax = fig.gca() - ax.scatter(pulledTrajectory21,pulledTrajectory22, label="Nominal") - xlabel("kx") - ylabel("ky") - title("K-space Center") - xlim((-0.05,0.05)) - ylim((-0.05,0.05)) - legend() - -end \ No newline at end of file diff --git a/legacy/cartesian_recon_Mar2022_Human.jl b/legacy/cartesian_recon_Mar2022_Human.jl new file mode 100644 index 0000000..072a24e --- /dev/null +++ b/legacy/cartesian_recon_Mar2022_Human.jl @@ -0,0 +1,140 @@ +using HDF5, MRIReco, LinearAlgebra, DSP, FourierTools, ROMEO, MRIGradients + +include("../utils/utils.jl") +include("../utils/fieldmap_estimator.jl") + +## Dictionary of frequently changed parameters +include("recon_config.jl") + +## Load data files + +# Echo times for field map raw data, in ms +TE1 = params_general[:mapTEs_ms][1] +TE2 = params_general[:mapTEs_ms][2] + +@info "Loading Data Files" + +b0_filename = params_general[:map_scan_fullpath]; + +# filename for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) +processed_filename = params_general[:processed_map_scan_fullpath] + +if params_general[:do_process_map_scan] + + # Set the data file name (Change this for your own system) + cartesian_data_file = ISMRMRDFile(b0_filename) + + # read in the raw data from the ISMRMRD file into a RawAcquisitionData object + r = RawAcquisitionData(cartesian_data_file) + + # does not change anything... + # r.params["reconFOV"] = [230, 230, 2] + + # Preprocess Data and save! + preprocess_cartesian_data(r::RawAcquisitionData, true; fname = processed_filename) + +end + +# Load preprocessed data! +new_data_file = ISMRMRDFile(processed_filename) + + +new_raw_data = RawAcquisitionData(new_data_file) +cartesian_acq_data = AcquisitionData(new_raw_data, estimateProfileCenter = true) + +# Define coils and slices +num_coils = size(cartesian_acq_data.kdata[1], 2) +num_slices = numSlices(cartesian_acq_data) + + +slice_index_array = get_slice_order(num_slices, isSliceInterleaved = true) +# shift FOV to middle :) +#TODO: in MRIReco v0.7, try: correctOffset(cartesian_acq_data, [0 -20 0]) +shift_kspace!(cartesian_acq_data, params_general[:fov_shift]) +#changeFOV!(cartesian_acq_data,[1.5,1.5]) + +## Don't have to recalculate sense maps for both scans but possibly it could make a +# difference in Diffusion scans + +@info "Calculating Sense Maps" + +# from reading docstring, min thresholding +cartesian_sensitivity = espirit(cartesian_acq_data, (6, 6), 30, eigThresh_1 = 0.01, eigThresh_2 = 0.9) + +# from Lars (7T spirals) +#cartesian_sensitivity = espirit(cartesian_acq_data,(6,6),30,eigThresh_1=0.02, eigThresh_2=0.98) +# from Alexander (Phantom?) +#cartesian_sensitivity = espirit(cartesian_acq_data,(4,4),12,eigThresh_1=0.01, eigThresh_2=0.98) + +# normalize for consistency with saving/loading and better ranges of reconstruction values +cartesian_sensitivity /= maximum(abs.(cartesian_sensitivity)) +sensitivity = cartesian_sensitivity + +resolution_mm = fieldOfView(cartesian_acq_data) ./ size(sensitivity)[1:3] +resolution_mm[3] = fieldOfView(cartesian_acq_data)[3] * (1 + params_general[:slice_distance_factor_percent] / 100.0); # for 2D only, since FOV[3] is slice thickness then, but gap has to be observed + + +# save SENSE maps +if params_general[:do_save_recon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load + # TODO: use correct slice order everywhere, e.g., when saving/loading maps for spiral recon + save_map(params_general[:sensitivity_save_fullpath], sensitivity[:, :, slice_index_array, :], resolution_mm; doSplitPhase = true) +end + +plot_sense_maps(sensitivity, num_coils) + +#cartesian_acq_data.traj[1].cartesian = false +#cartesian_acq_data.traj[2].cartesian = false +## Parameter dictionary definition for reconstruction + +@info "Setting Parameters" +params_cartesian = Dict{Symbol,Any}() # instantiate dictionary +params_cartesian[:reco] = "multiCoil" # choose multicoil reconstruction + +# TODO: make recon size and FOV variable! +params_cartesian[:reconSize] = (cartesian_acq_data.encodingSize[1], cartesian_acq_data.encodingSize[2]) # set recon size to be the same as encoded size +params_cartesian[:regularization] = "L2" # choose regularization for the recon algorithm +params_cartesian[:λ] = 1.e-2 # recon parameter (there may be more of these, need to dig into code to identify them for solvers other than cgnr) +params_cartesian[:iterations] = params_general[:num_recon_iterations] # number of CG iterations +params_cartesian[:solver] = "cgnr" # inverse problem solver method +params_cartesian[:solverInfo] = SolverInfo(ComplexF32, store_solutions = false) # turn on store solutions if you want to see the reconstruction convergence (uses more memory) +params_cartesian[:senseMaps] = ComplexF32.(sensitivity) # set sensitivity map array + + +## Call the reconstruction function + +@info "Performing Reconstruction" +@time cartesian_reco = reconstruction(cartesian_acq_data, params_cartesian) + +# save Map recon (multi-echo etc.) +if params_general[:do_save_recon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load + save_map(params_general[:map_save_fullpath], cartesian_reco.data[:, :, slice_index_array, :, :, :], resolution_mm; doSplitPhase = true) +end + +## Calculate B0 maps from the acquired images (if two TEs) + +slices = 1:length(slice_index_array) + +@info "Calculating B0 Maps" +# b0_maps = calculate_b0_maps(cartesian_reco.data,slices, TE1, TE2) +b0_maps = estimate_b0_maps(cartesian_reco.data, slices, TE1, TE2, true; β = params_general[:b0_map_beta], reltol = 1e-4) + +# save B0 map +if params_general[:do_save_recon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load + save_map(params_general[:b0_map_save_fullpath], b0_maps[:, :, slice_index_array], resolution_mm; doNormalize = false) # no normalization, we want absolute values for offres maps +end + + +if params_general[:do_plot_recon] + @info "Plotting Cartesian Results (Sensitivity Maps and B0 Maps)" + pygui(true) # Leave this code till we need plotting. + # plot_sense_maps(sensitivity,num_coils) + plot_reconstruction(cartesian_reco[:, :, :, 1], 1:size(cartesian_reco, 3), b0_maps, isSliceInterleaved = true, rotateAngle = 270) +end + +# cleanup unused file +if !params_general[:do_save_processed_map_scan] && params_general[:do_process_map_scan] + rm(processed_filename) +end + +@info "Successfully Completed cartesian_reconstruction" + diff --git a/legacy/cartesian_recon_Mar2022_Phantom.jl b/legacy/cartesian_recon_Mar2022_Phantom.jl new file mode 100644 index 0000000..fda0394 --- /dev/null +++ b/legacy/cartesian_recon_Mar2022_Phantom.jl @@ -0,0 +1,100 @@ +using HDF5, MRIReco, LinearAlgebra, DSP, FourierTools, ROMEO, MRIGradients + +include("../utils/utils.jl") + +## function to calculate the B0 maps from the two images with different echo times +# TODO have the b0 map calculation be capable of handling variable echo times +function calculate_b0_maps(im_data, slices, echo_time_1, echo_time_2) + + # b0_maps = mapslices(x -> rotl90(x),ROMEO.unwrap(angle.(im_data[:,:,slices,2,1].*conj(im_data[:,:,slices,1,1]))),dims=(1,2))./((7.38-4.92)/1000) + b0_maps = + mapslices(x -> x, ROMEO.unwrap(angle.(im_data[:, :, slices, 2, 1] .* conj(im_data[:, :, slices, 1, 1]))), dims = (1, 2)) ./ + ((echo_time_2 - echo_time_1) / 1000) + +end + +## Load data files + +make_maps = true +save_maps = true + +# Echo times for field map raw data, in ms +TE1 = 4.92 +TE2 = 7.38 + +@info "Loading Data Files" + +b0_filename = "D:\\OneDrive - UHN\\MRP-SPIDI\\SPIDI\\data\\SPIDI_0007\\Phantom\\dat\\field_map_83_2.h5" +processed_filename = "D:\\OneDrive - UHN\\MRP-SPIDI\\SPIDI\\data\\SPIDI_0007\\Phantom\\dat\\processedCartesianData.h5" # filename for preprocessed data + +if make_maps + + # Set the data file name (Change this for your own system) + cartesian_data_file = ISMRMRDFile(b0_filename) + + # read in the raw data from the ISMRMRD file into a RawAcquisitionData object + r = RawAcquisitionData(cartesian_data_file) + + # Preprocess Data and save! + preprocess_cartesian_data(r::RawAcquisitionData, save_maps; fname = processed_filename) + +end + +# remove_oversampling!(r) + +# Load preprocessed data! +new_data_file = ISMRMRDFile(processed_filename) +new_raw_data = RawAcquisitionData(new_data_file) +cartesian_acq_data = AcquisitionData(new_raw_data, estimateProfileCenter = true) + +# Define coils and slices +num_coils = size(cartesian_acq_data.kdata[1], 2) +num_slices = numSlices(cartesian_acq_data) + +## Don't have to recalculate sense maps for both scans but possibly it could make a +# difference in Diffusion scans + +@info "Calculating Sense Maps" +cartesian_sensitivity = espirit(cartesian_acq_data, (4, 4), 10, eigThresh_1 = 0.01, eigThresh_2 = 0.98) +sensitivity = cartesian_sensitivity + +plot_sense_maps(sensitivity, num_coils) + +## Parameter dictionary definition for reconstruction + +@info "Setting Parameters" +params_cartesian = Dict{Symbol,Any}() # instantiate dictionary +params_cartesian[:reco] = "multiCoil" # choose multicoil reconstruction +params_cartesian[:reconSize] = (cartesian_acq_data.encodingSize[1], cartesian_acq_data.encodingSize[2]) # set recon size to be the same as encoded size +params_cartesian[:regularization] = "L2" # choose regularization for the recon algorithm +params_cartesian[:λ] = 1.e-2 # recon parameter (there may be more of these, need to dig into code to identify them for solvers other than cgnr) +params_cartesian[:iterations] = 20 # number of CG iterations +params_cartesian[:solver] = "cgnr" # inverse problem solver method +params_cartesian[:solverInfo] = SolverInfo(ComplexF32, store_solutions = false) # turn on store solutions if you want to see the reconstruction convergence (uses more memory) +params_cartesian[:senseMaps] = ComplexF32.(sensitivity) # set sensitivity map array +# params_cartesian[:correctionMap] = ComplexF32.(-1im.*b0_maps) +## Defining array mapping from acquisition number to slice number (index_array[slice = 1:9] = [acquisitionNumbers]) + +# index_array = [5,1,6,2,7,3,8,4,9] # for 9 slice phantom +index_array = [8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15] # for 15 slice phantom +#index_array = 1 # for 1 slice phantom + +## Call the reconstruction function + +@info "Performing Reconstruction" +cartesian_reco = reconstruction(cartesian_acq_data, params_cartesian) + +## Calculate B0 maps from the acquired images (if two TEs) + +slices = 1:length(index_array) + +@info "Calculating B0 Maps" +# b0_maps = calculate_b0_maps(cartesian_reco.data,slices, TE1, TE2) +b0_maps = estimate_b0_maps(cartesian_reco.data, slices, TE1, TE2, 0.00001, true) + +@info "Plotting Cartesian Results (Sensitivity Maps and B0 Maps) \n" +pygui(true) # Leave this code till we need plotting. +# plot_sense_maps(sensitivity,num_coils) +plot_reconstruction(cartesian_reco[:, :, :, 1], 1:size(cartesian_reco, 3), b0_maps, isSliceInterleaved = true, rotateAngle = 270) + +@info "Successfully Completed cartesian_reconstruction" diff --git a/legacy/recon_config_SPIDI_0007.jl b/legacy/recon_config_SPIDI_0007.jl new file mode 100644 index 0000000..b15e2d0 --- /dev/null +++ b/legacy/recon_config_SPIDI_0007.jl @@ -0,0 +1,167 @@ +## This recon_config.jl file describes all reconstruction parameters, as well as data locations and selections for an iterative non-Cartesian reconstruction that relies +# on an external reference scan (Cartesian) to estimate calibration maps (coil sensitivities, B0 maps) + +using Dates + +params_general = Dict{Symbol,Any}() + +## General options for recon script +params_general[:do_load_maps] = false # if true, reloads B0/SENSE maps instead of recalculating +params_general[:do_save_recon] = true # if true, saves reconstruction and all auxiliary image data (maps) as NIfTI files +params_general[:do_plot_recon] = true # if true, plots intermediate debugging and output recon figures (needs graphics, not recommended in multi-thread mode due to PyPlot) +params_general[:do_process_map_scan] = true # if true, compute sensitivity and B0 maps from reconstructed Cartesian scan +params_general[:do_save_processed_map_scan] = false; # save ISMRMD file of preprocessed Cartesian data (before recon) + +## Reconstruction Parameters +# update time stamp for new recon, otherwise keep fixed, will create a new recon/ directory +#params_general[:recon_id] = Dates.format(Dates.now(), "yyyy-mm-dd_HH_MM_SS") # recon ID is recon_id +# params_general[:recon_id] = "2022-10-20_09_07_07" +params_general[:recon_id] = "v6"; +params_general[:do_correct_with_b0_map] = true +params_general[:do_correct_with_girf_k1] = true +params_general[:do_correct_with_girf_k0] = true + +params_general[:num_virtual_coils] = 8; +params_general[:do_coil_compression] = false; +params_general[:fov_shift] = [0, -20]; # Unit: number of voxels + +## Scan parameters, Additional acquisition information, e.g., slice distance etc. +params_general[:slice_distance_factor_percent] = 400 # 000 + +#Total number of ADC points BEFORE the rewinder at the end of the spiral readout. For gradient 508, use 15655 (out of 16084); for gradient 511, use 15445 (out of 15624). +params_general[:num_adc_samples] = 15655 # 15504 +# Matrix size of the reconstructed image. For gradient 508 with all 4 interleaves, use 200 for high resolution image; otherwise consider using 112 or 84 for a lower resolution. The FOV is 220 mm for both gradients 508 and 511. +params_general[:recon_size] = [200, 200, 1] #(112, 112) #(200, 200) +params_general[:num_recon_iterations] = 20; # number of recon iterations (for both Cartesian and Spiral recon) +params_general[:b0_map_beta] = 0.1 # for estimate_b0_maps, * `β` - Regularization parameter controlling roughness penalty (larger = smoother, default 5e-4) +params_general[:do_normalize_recon] = false # set max abs to 1 +params_general[:saving_scalefactor] = 1.0e9 # 1 # typical range of recon intensities is 1e-7, rescale when saving, e.g., to 0...1000 roughly for fMRI analysis + +# Data selector +# Choose diffusion direction; starting from 0 (b=0) to the total number in MDDW protocol, e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs) +# boolean is_called_from_global_recon is true, if this RunReconLoop is active +# If is_called_from_global_recon is false or not defined, the data selector needs to be defined here. +if !(@isdefined is_called_from_global_recon) || !is_called_from_global_recon + global selector = Dict{Symbol,Any}() + selector[:avg] = 1 + selector[:seg] = 1 + selector[:dif] = 0 +end + + +## Data parameters (Path handling, data/results locations etc.) +# UHN work +# params_general[:project_path] = "C:\\Users\\Lars Kasper\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" +# Laptop home, one drive sync +# params_general[:project_path] = "C:\\Users\\kasperla\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" +# Gadgetron Server +# laptop home, external drive +# params_general[:data_path] = "e:\\SPIDI\\data\\SPIDI_0007\\Phantom\\rawdata" +#params_general[:project_path] = "/home/kasperl/SPIDI" +params_general[:project_path] = "/srv/data/ajaffray/TORONTO_COLLAB" + +# SPIDI_0011 + +## Paths (user-dependent) +params_general[:data_path] = joinpath(params_general[:project_path], "data", "SPIDI_0007", "Human", "dat") +params_general[:gradients_path] = joinpath(params_general[:project_path], "data", "SPIDI_0007", "gradients") +params_general[:results_path] = joinpath(params_general[:project_path], "results", "SPIDI_0007", "Human") +params_general[:girf_path] = joinpath(params_general[:project_path], "code", "GIRFReco", "data", "GIRF", "GIRF_ISMRM2022") +params_general[:recon_save_path] = joinpath(params_general[:results_path], "recon", params_general[:recon_id]) + +## Files (user-dependent) + +# Map scan file (Cartesian multi-echo file) +params_general[:map_scan_filename] = "field_map_132_2.h5" +params_general[:mapTEs_ms] = [4.92, 7.38] + +params_general[:girf_filename] = ["2021Nov_PosNeg_Gx.mat", "2021Nov_PosNeg_Gy.mat", "2021Nov_PosNeg_Gz.mat"] + +# File name for the spiral gradient +# multi-il (high-res 1.1mm) gradient file 508, single interleaf (low-res 2.6mm) gradient file 511 +params_general[:gradient_filename] = joinpath("508", "gradients.txt") + +# non-Cartesian (Spiral) scan file: MDDW 6 +# params_general[:scan_filename]=["meas_MID00083_FID14976_diffSpiral_508_Intl0_b2k_4Avg.mrd"] +# params_general[:num_total_diffusion_directions] = 6 + +# non-Cartesian (Spiral) scan file: MDDW30 +# For single interleave data, use this section +# startIndexIntlv = 1 # Should always be 1 for single-interleave data. +# fname_spiralIntlv = "511_134_2.h5" # Gradient 511, b = 300, 10 diff directions +# fname_spiralIntlv = "511_136_2.h5" # Gradient 511, b = 700, 30 diff directions +# fname_spiralIntlv = "511_138_2.h5" # Gradient 511, b = 2500, 64 diff directions +# fname_spiralIntlv = "508_140_2.h5" # Gradient 508, interleave 0, b = 300, 10 diff directions +# fname_spiralIntlv = "508_142_2.h5" # Gradient 508, interleave 0, b = 700, 30 diff directions +# fname_spiralIntlv = "508_144_2.h5" # Gradient 508, interleave 0, b = 2500, 64 diff directions + +# Multi-interleave data, needs all 4 file names, but will only read the corresponding one. +#fname_spiralIntlv0 = "508_124_2.h5" # Gradient 508, interleave 0, b = 2000, 6 diff directions, 4 averages +#fname_spiralIntlv1 = "508_126_2.h5" # Gradient 508, interleave 1, b = 2000, 6 diff directions, 4 averages +#fname_spiralIntlv2 = "508_128_2.h5" # Gradient 508, interleave 2, b = 2000, 6 diff directions, 4 averages +#fname_spiralIntlv3 = "508_130_2.h5" # Gradient 508, interleave 3, b = 2000, 6 diff directions, 4 averages +# params_general[:scan_filename]=["508_124_2.h5", "508_126_2.h5", "508_128_2.h5", "508_130_2.h5"] +# params_general[:num_total_diffusion_directions] = 6 +# SPIDI_0007 MDDW 6 +params_general[:scan_filename] = ["508_124_2.h5"] +params_general[:num_total_diffusion_directions] = 6 + +# NODDI +# params_general[:scan_filename]=["508_140_2.h5"] +# params_general[:num_total_diffusion_directions] = 10 +# params_general[:scan_filename]=["508_142_2.h5"] +# params_general[:num_total_diffusion_directions] = 30 +# params_general[:scan_filename]=["508_144_2.h5"] +# params_general[:num_total_diffusion_directions] = 64 +# params_general[:scan_filename]=["508_124_2.h5"] + + + + +## Final, Automatic operations (dependent on previous sections, usually no need to change) + +params_general[:gradient_fullpath] = joinpath(params_general[:gradients_path], params_general[:gradient_filename]) + +# NOTE: If loaded from other recon_id, this path might differ +params_general[:pathload_maps] = joinpath(params_general[:results_path], "recon", params_general[:recon_id]) + +# . makes join elementwise, i.e,. every file name (in array) with the same path +params_general[:girf_fullpath] = joinpath.(params_general[:girf_path], params_general[:girf_filename]) + +params_general[:map_scan_fullpath] = joinpath(params_general[:data_path], params_general[:map_scan_filename]) +# . makes join elementwise, i.e,. every file name (in array) with the same path +params_general[:scan_fullpath] = joinpath.(params_general[:data_path], params_general[:scan_filename]) + +# filename for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) +params_general[:processed_map_scan_filename] = "processedCartesianData.h5" +params_general[:processed_map_scan_fullpath] = joinpath(params_general[:recon_save_path], params_general[:processed_map_scan_filename]) + +params_general[:map_save_filename] = splitext(params_general[:map_scan_filename])[1] * "_reconmap.nii" +params_general[:sensitivity_save_filename] = splitext(params_general[:map_scan_filename])[1] * "_sensemap.nii" +params_general[:b0_map_save_filename] = splitext(params_general[:map_scan_filename])[1] * "_b0map.nii" + +if isa(params_general[:scan_filename], AbstractVector) + # for multiple files, concatenate recon name from scan file names, e.g., 508_124_2_508_126_2_508_128_2_508_130_2_recon.nii + params_general[:recon_save_filename] = + join([(x[1] * "_") for x in splitext.(params_general[:scan_filename])]) * + "dif$(selector[:dif])_" * + "itl$(selector[:seg])_" * + "avg$(selector[:avg])_" * + "recon.nii" +else + # otherwise, just concat _recon.nii to file name + params_general[:recon_save_filename] = splitext(params_general[:scan_filename])[1] * "_recon.nii" +end + +params_general[:recon_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:recon_save_filename]) +params_general[:map_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:map_save_filename]) +params_general[:sensitivity_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:sensitivity_save_filename]) +params_general[:b0_map_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:b0_map_save_filename]) + +if ~ispath(params_general[:recon_save_path]) + mkpath(params_general[:recon_save_path]) +end + +# copies this config file to the recon path for later checks of parameter functions +cp("recon/recon_config.jl", joinpath(params_general[:recon_save_path], "recon_config.jl"); force = true) + diff --git a/legacy/recon_config_SPIDI_0009.jl b/legacy/recon_config_SPIDI_0009.jl new file mode 100644 index 0000000..196388d --- /dev/null +++ b/legacy/recon_config_SPIDI_0009.jl @@ -0,0 +1,140 @@ +## This recon_config.jl file describes all reconstruction parameters, as well as data locations and selections for an iterative non-Cartesian reconstruction that relies +# on an external reference scan (Cartesian) to estimate calibration maps (coil sensitivities, B0 maps) + +using Dates + +params_general = Dict{Symbol,Any}() + +## General options for recon script +params_general[:do_load_maps] = true # if true, reloads B0/SENSE maps instead of recalculating +params_general[:do_save_recon] = true # if true, saves reconstruction and all auxiliary image data (maps) as NIfTI files +params_general[:do_plot_recon] = false # if true, plots intermediate debugging and output recon figures (needs graphics, not recommended in multi-thread mode due to PyPlot) +params_general[:do_process_map_scan] = true # if true, compute sensitivity and B0 maps from reconstructed Cartesian scan +params_general[:do_save_processed_map_scan] = false; # save ISMRMD file of preprocessed Cartesian data (before recon) + +## Reconstruction Parameters +# update time stamp for new recon, otherwise keep fixed, will create a new recon/ directory +#params_general[:recon_id] = Dates.format(Dates.now(), "yyyy-mm-dd_HH_MM_SS") # recon ID is recon_id +# params_general[:recon_id] = "2022-10-20_09_07_07" +params_general[:recon_id] = "v2"; +params_general[:do_correct_with_b0_map] = true +params_general[:do_correct_with_girf_k1] = true +params_general[:do_correct_with_girf_k0] = true + +params_general[:num_virtual_coils] = 8; +params_general[:do_coil_compression] = false; +params_general[:fov_shift] = [0, 0];# [0, -20]; # Unit: number of voxels + +## Scan parameters, Additional acquisition information, e.g., slice distance etc. +params_general[:slice_distance_factor_percent] = 000 # 400 + +#Total number of ADC points BEFORE the rewinder at the end of the spiral readout. For gradient 508, use 15655 (out of 16084); for gradient 511, use 15445 (out of 15624). +params_general[:num_adc_samples] = 15445 # 15655 +# Matrix size of the reconstructed image. For gradient 508 with all 4 interleaves, use 200 for high resolution image; otherwise consider using 112 or 84 for a lower resolution. The FOV is 220 mm for both gradients 508 and 511. +params_general[:recon_size] = (112, 112) #(112, 112) #(200, 200) +params_general[:num_recon_iterations] = 20; # number of recon iterations (for both Cartesian and Spiral recon) +params_general[:b0_map_beta] = 0.1 # for estimate_b0_maps, * `β` - Regularization parameter controlling roughness penalty (larger = smoother, default 5e-4) +params_general[:do_normalize_recon] = false # set max abs to 1 +params_general[:saving_scalefactor] = 1.0e9 # 1 # typical range of recon intensities is 1e-7, rescale when saving, e.g., to 0...1000 roughly for fMRI analysis + +# Data selector +# Choose diffusion direction; starting from 0 (b=0) to the total number in MDDW protocol, e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs) +# boolean is_called_from_global_recon is true, if this RunReconLoop is active +# If is_called_from_global_recon is false or not defined, the data selector needs to be defined here. +if !(@isdefined is_called_from_global_recon) || !is_called_from_global_recon + global selector = Dict{Symbol,Any}() + selector[:avg] = 1 + selector[:seg] = 1 + selector[:dif] = 0 +end + + +## Data parameters (Path handling, data/results locations etc.) +# UHN work +# params_general[:project_path] = "C:\\Users\\Lars Kasper\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" +# Laptop home, one drive sync +# params_general[:project_path] = "C:\\Users\\kasperla\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" +# Gadgetron Server +# laptop home, external drive +# params_general[:data_path] = "e:\\SPIDI\\data\\SPIDI_0007\\Phantom\\rawdata" +params_general[:project_path] = "/home/kasperl/SPIDI" + +# SPIDI_0009 + +## Paths (user-dependent) +params_general[:data_path] = joinpath(params_general[:project_path], "data", "SPIDI_0009", "Phantom2", "dat") +params_general[:gradients_path] = joinpath(params_general[:project_path], "data", "SPIDI_0009", "Phantom2", "gradients") +params_general[:results_path] = joinpath(params_general[:project_path], "results", "SPIDI_0009", "Phantom2") +params_general[:girf_path] = joinpath(params_general[:project_path], "code", "GIRFReco", "data", "GIRF", "GIRF_ISMRM2022") +params_general[:recon_save_path] = joinpath(params_general[:results_path], "recon", params_general[:recon_id]) + +## Files (user-dependent) + +# Map scan file (Cartesian multi-echo file) +params_general[:map_scan_filename] = "meas_MID00189_FID14253_GRE_FieldMap_DualEcho_2mm.mrd" +params_general[:mapTEs_ms] = [4.92, 7.38] + +params_general[:girf_filename] = ["2021Nov_PosNeg_Gx.mat", "2021Nov_PosNeg_Gy.mat", "2021Nov_PosNeg_Gz.mat"] + +# File name for the spiral gradient +# multi-il (high-res 1.1mm) gradient file 508, single interleaf (low-res 2.6mm) gradient file 511 +params_general[:gradient_filename] = joinpath("511", "gradients.txt") + +# non-Cartesian (Spiral) scan file: MDDW 6 +# params_general[:scan_filename]=["meas_MID00083_FID14976_diffSpiral_508_Intl0_b2k_4Avg.mrd"] +# params_general[:num_total_diffusion_directions] = 6 + +# non-Cartesian (Spiral) scan file: MDDW30 +params_general[:scan_filename] = ["meas_MID00193_FID14255_diffSpiral_511_b700_1Avg.mrd"] +params_general[:num_total_diffusion_directions] = 6 + + + + +## Final, Automatic operations (dependent on previous sections, usually no need to change) + +params_general[:gradient_fullpath] = joinpath(params_general[:gradients_path], params_general[:gradient_filename]) + +# NOTE: If loaded from other recon_id, this path might differ +params_general[:pathload_maps] = joinpath(params_general[:results_path], "recon", params_general[:recon_id]) + +# . makes join elementwise, i.e,. every file name (in array) with the same path +params_general[:girf_fullpath] = joinpath.(params_general[:girf_path], params_general[:girf_filename]) + +params_general[:map_scan_fullpath] = joinpath(params_general[:data_path], params_general[:map_scan_filename]) +# . makes join elementwise, i.e,. every file name (in array) with the same path +params_general[:scan_fullpath] = joinpath.(params_general[:data_path], params_general[:scan_filename]) + +# filename for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) +params_general[:processed_map_scan_filename] = "processedCartesianData.h5" +params_general[:processed_map_scan_fullpath] = joinpath(params_general[:recon_save_path], params_general[:processed_map_scan_filename]) + +params_general[:map_save_filename] = splitext(params_general[:map_scan_filename])[1] * "_reconmap.nii" +params_general[:sensitivity_save_filename] = splitext(params_general[:map_scan_filename])[1] * "_sensemap.nii" +params_general[:b0_map_save_filename] = splitext(params_general[:map_scan_filename])[1] * "_b0map.nii" + +if isa(params_general[:scan_filename], AbstractVector) + # for multiple files, concatenate recon name from scan file names, e.g., 508_124_2_508_126_2_508_128_2_508_130_2_recon.nii + params_general[:recon_save_filename] = + join([(x[1] * "_") for x in splitext.(params_general[:scan_filename])]) * + "dif$(selector[:dif])_" * + "itl$(selector[:seg])_" * + "avg$(selector[:avg])_" * + "recon.nii" +else + # otherwise, just concat _recon.nii to file name + params_general[:recon_save_filename] = splitext(params_general[:scan_filename])[1] * "_recon.nii" +end + +params_general[:recon_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:recon_save_filename]) +params_general[:map_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:map_save_filename]) +params_general[:sensitivity_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:sensitivity_save_filename]) +params_general[:b0_map_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:b0_map_save_filename]) + +if ~ispath(params_general[:recon_save_path]) + mkpath(params_general[:recon_save_path]) +end + +# copies this config file to the recon path for later checks of parameter functions +cp("recon/recon_config.jl", joinpath(params_general[:recon_save_path], "recon_config.jl"); force = true) + diff --git a/legacy/recon_config_SPIDI_0011.jl b/legacy/recon_config_SPIDI_0011.jl new file mode 100644 index 0000000..0192b9e --- /dev/null +++ b/legacy/recon_config_SPIDI_0011.jl @@ -0,0 +1,140 @@ +## This recon_config.jl file describes all reconstruction parameters, as well as data locations and selections for an iterative non-Cartesian reconstruction that relies +# on an external reference scan (Cartesian) to estimate calibration maps (coil sensitivities, B0 maps) + +using Dates + +params_general = Dict{Symbol,Any}() + +## General options for recon script +params_general[:do_load_maps] = true # if true, reloads B0/SENSE maps instead of recalculating +params_general[:do_save_recon] = true # if true, saves reconstruction and all auxiliary image data (maps) as NIfTI files +params_general[:do_plot_recon] = false # if true, plots intermediate debugging and output recon figures (needs graphics, not recommended in multi-thread mode due to PyPlot) +params_general[:do_process_map_scan] = true # if true, compute sensitivity and B0 maps from reconstructed Cartesian scan +params_general[:do_save_processed_map_scan] = false; # save ISMRMD file of preprocessed Cartesian data (before recon) + +## Reconstruction Parameters +# update time stamp for new recon, otherwise keep fixed, will create a new recon/ directory +#params_general[:recon_id] = Dates.format(Dates.now(), "yyyy-mm-dd_HH_MM_SS") # recon ID is recon_id +# params_general[:recon_id] = "2022-10-20_09_07_07" +params_general[:recon_id] = "v999"; +params_general[:do_correct_with_b0_map] = true +params_general[:do_correct_with_girf_k1] = true +params_general[:do_correct_with_girf_k0] = true + +params_general[:num_virtual_coils] = 8; +params_general[:do_coil_compression] = false; +params_general[:fov_shift] = [0, -10]; # Unit: number of voxels + +## Scan parameters, Additional acquisition information, e.g., slice distance etc. +params_general[:slice_distance_factor_percent] = 000 # 400 + +#Total number of ADC points BEFORE the rewinder at the end of the spiral readout. For gradient 508, use 15655 (out of 16084); for gradient 511, use 15445 (out of 15624). +params_general[:num_adc_samples] = 15655 # 15504 +# Matrix size of the reconstructed image. For gradient 508 with all 4 interleaves, use 200 for high resolution image; otherwise consider using 112 or 84 for a lower resolution. The FOV is 220 mm for both gradients 508 and 511. +params_general[:recon_size] = (200, 200) #(112, 112) #(200, 200) +params_general[:num_recon_iterations] = 20; # number of recon iterations (for both Cartesian and Spiral recon) +params_general[:b0_map_beta] = 0.1 # for estimate_b0_maps, * `β` - Regularization parameter controlling roughness penalty (larger = smoother, default 5e-4) +params_general[:do_normalize_recon] = false # set max abs to 1 +params_general[:saving_scalefactor] = 1.0e9 # 1 # typical range of recon intensities is 1e-7, rescale when saving, e.g., to 0...1000 roughly for fMRI analysis + +# Data selector +# Choose diffusion direction; starting from 0 (b=0) to the total number in MDDW protocol, e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs) +# boolean is_called_from_global_recon is true, if this RunReconLoop is active +# If is_called_from_global_recon is false or not defined, the data selector needs to be defined here. +if !(@isdefined is_called_from_global_recon) || !is_called_from_global_recon + global selector = Dict{Symbol,Any}() + selector[:avg] = 1 + selector[:seg] = 1 + selector[:dif] = 0 +end + + +## Data parameters (Path handling, data/results locations etc.) +# UHN work +# params_general[:project_path] = "C:\\Users\\Lars Kasper\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" +# Laptop home, one drive sync +# params_general[:project_path] = "C:\\Users\\kasperla\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" +# Gadgetron Server +# laptop home, external drive +# params_general[:data_path] = "e:\\SPIDI\\data\\SPIDI_0007\\Phantom\\rawdata" +params_general[:project_path] = "/home/kasperl/SPIDI" + +# SPIDI_0011 + +## Paths (user-dependent) +params_general[:data_path] = joinpath("/home/wuz/spiralDiffusion/", "SPIDI_0011") +params_general[:gradients_path] = joinpath(params_general[:project_path], "data", "SPIDI_0007", "gradients") +params_general[:results_path] = joinpath(params_general[:project_path], "results", "SPIDI_0011") +params_general[:girf_path] = joinpath(params_general[:project_path], "code", "GIRFReco", "data", "GIRF", "GIRF_ISMRM2022") +params_general[:recon_save_path] = joinpath(params_general[:results_path], "recon", params_general[:recon_id]) + +## Files (user-dependent) + +# Map scan file (Cartesian multi-echo file) +params_general[:map_scan_filename] = "meas_MID00075_FID14968_GRE_FieldMap_DualEcho_2mm.mrd" +params_general[:mapTEs_ms] = [4.92, 7.38] + +params_general[:girf_filename] = ["2021Nov_PosNeg_Gx.mat", "2021Nov_PosNeg_Gy.mat", "2021Nov_PosNeg_Gz.mat"] + +# File name for the spiral gradient +# multi-il (high-res 1.1mm) gradient file 508, single interleaf (low-res 2.6mm) gradient file 511 +params_general[:gradient_filename] = joinpath("508", "gradients.txt") + +# non-Cartesian (Spiral) scan file: MDDW 6 +# params_general[:scan_filename]=["meas_MID00083_FID14976_diffSpiral_508_Intl0_b2k_4Avg.mrd"] +# params_general[:num_total_diffusion_directions] = 6 + +# non-Cartesian (Spiral) scan file: MDDW30 +params_general[:scan_filename] = ["meas_MID00085_FID14978_diffSpiral_508_Intl0_b1000_30d.mrd"] +params_general[:num_total_diffusion_directions] = 30 + + + + +## Final, Automatic operations (dependent on previous sections, usually no need to change) + +params_general[:gradient_fullpath] = joinpath(params_general[:gradients_path], params_general[:gradient_filename]) + +# NOTE: If loaded from other recon_id, this path might differ +params_general[:pathload_maps] = joinpath(params_general[:results_path], "recon", params_general[:recon_id]) + +# . makes join elementwise, i.e,. every file name (in array) with the same path +params_general[:girf_fullpath] = joinpath.(params_general[:girf_path], params_general[:girf_filename]) + +params_general[:map_scan_fullpath] = joinpath(params_general[:data_path], params_general[:map_scan_filename]) +# . makes join elementwise, i.e,. every file name (in array) with the same path +params_general[:scan_fullpath] = joinpath.(params_general[:data_path], params_general[:scan_filename]) + +# filename for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) +params_general[:processed_map_scan_filename] = "processedCartesianData.h5" +params_general[:processed_map_scan_fullpath] = joinpath(params_general[:recon_save_path], params_general[:processed_map_scan_filename]) + +params_general[:map_save_filename] = splitext(params_general[:map_scan_filename])[1] * "_reconmap.nii" +params_general[:sensitivity_save_filename] = splitext(params_general[:map_scan_filename])[1] * "_sensemap.nii" +params_general[:b0_map_save_filename] = splitext(params_general[:map_scan_filename])[1] * "_b0map.nii" + +if isa(params_general[:scan_filename], AbstractVector) + # for multiple files, concatenate recon name from scan file names, e.g., 508_124_2_508_126_2_508_128_2_508_130_2_recon.nii + params_general[:recon_save_filename] = + join([(x[1] * "_") for x in splitext.(params_general[:scan_filename])]) * + "dif$(selector[:dif])_" * + "itl$(selector[:seg])_" * + "avg$(selector[:avg])_" * + "recon.nii" +else + # otherwise, just concat _recon.nii to file name + params_general[:recon_save_filename] = splitext(params_general[:scan_filename])[1] * "_recon.nii" +end + +params_general[:recon_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:recon_save_filename]) +params_general[:map_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:map_save_filename]) +params_general[:sensitivity_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:sensitivity_save_filename]) +params_general[:b0_map_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:b0_map_save_filename]) + +if ~ispath(params_general[:recon_save_path]) + mkpath(params_general[:recon_save_path]) +end + +# copies this config file to the recon path for later checks of parameter functions +cp("recon/recon_config.jl", joinpath(params_general[:recon_save_path], "recon_config.jl"); force = true) + diff --git a/legacy/spiral_recon_Cleaned_Mar2022_Human.jl b/legacy/spiral_recon_Cleaned_Mar2022_Human.jl new file mode 100644 index 0000000..e5689ef --- /dev/null +++ b/legacy/spiral_recon_Cleaned_Mar2022_Human.jl @@ -0,0 +1,180 @@ +using HDF5, MRIReco, LinearAlgebra, Dierckx, DSP, FourierTools, ImageBinarization, ImageEdgeDetection, MRIGradients + +# %% +# Include tools and reader functions for running the spiral reconstruction recipe +# Note: the files are found relative of the location of the folder, not the +# environment current folder +include("../io/gradient_reader.jl") +include("../utils/utils.jl") + +## Set true if we need to reload Cartesian and/or spiral data compulsively. +reload_cartesian_data = true +reload_spiral_data = true +do_coil_compression = true + +## Gyromagnetic ratio, in unit of Hz +gamma = 42577478 + +## Only calculate sensitivity and B0 maps when they have not been done yet, or it's specifically required. +if reload_cartesian_data || !((@isdefined cartesian_sensitivity) && (@isdefined b0_maps)) + ## Executing Cartesian recon from which B0/sensitivity maps have been computed + @info "Running cartesian_recon to retrieve maps (cartesian_sensitivity and b0_maps)" + include("cartesian_recon_Mar2022_Human.jl") +end + +## Set figures to be unlocked from the win9ow (i.e use matplotlib backend with controls) +#pygui(true) + +## Choose Slice (can be [single number] OR [1,2,3,4,5,6,7,8,9] +slice_choice = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] # UNCOMMENT FOR MULTISLICE +# slice_choice = [6] # UNCOMMENT FOR SINGLESLICE (SLICES 3, 7 and 8 are good examples) +diffusion_direction = 0 # CAN BE FROM 0 (b=0) to 6 (e.g. for 6 direction MDDW, 1-6 are 6 directions) + +## Spiral Reconstruction Recipe Starts Here +@info "Starting Spiral Reconstruction Pipeline" + +## Default to single slice selection. Choose multi-slice only if computer is capable. +multi_slice = false + +if length(slice_choice) > 1 + multi_slice = true +end + +if !multi_slice + selected_slice = slice_choice +else + selected_slice = sort(vec(slice_choice)) +end + +## The ISMRMRD File contains more than one excitation, so we choose the set corresponding to the b-value 0 images +# excitation_list = vec(20:2:36) .+ diffusion_direction * 9 * 2 # DATASET SPECIFIC INDEXING +excitation_list = vec(32:2:62) .+ diffusion_direction * 15 * 2 # DATASET SPECIFIC INDEXING: 15 slices, starting from profile 32 +slice_selection = excitation_list[selected_slice] + +@info "Slice Chosen = $selected_slice: \n \nExcitations Chosen = $excitation_list " + +fname_spiralIntlv1 = "data/Spirals/508_124_2.h5" +fname_spiralIntlv2 = "data/Spirals/508_126_2.h5" +fname_spiralIntlv3 = "data/Spirals/508_128_2.h5" +fname_spiralIntlv4 = "data/Spirals/508_130_2.h5" +fname_gradient = "data/Gradients/gradients508.txt" +fname_girfGx = "data/GIRF/GIRF_ISMRM2022/2021Nov_PosNeg_Gx.mat" +fname_girfGy = "data/GIRF/GIRF_ISMRM2022/2021Nov_PosNeg_Gy.mat" +fname_girfGz = "data/GIRF/GIRF_ISMRM2022/2021Nov_PosNeg_Gz.mat" + +# params_general is the dictionary that sets the information for correct data loading and trajectory and data synchronization +params_general = Dict{Symbol,Any}() +params_general[:recon_size] = (200, 200) +params_general[:interleave] = 1 +params_general[:slices] = 1 +params_general[:coils] = 20 +# params_general[:num_samples] = 16084 # Total Number of ADC event, including the period of gradient rewinder +params_general[:num_samples] = 15504 # Total Number of readout before gradient rewinder +params_general[:delay] = 0.00000 # naive delay correction + +params_general[:interleave_data_filenames] = [fname_spiralIntlv1, fname_spiralIntlv2, fname_spiralIntlv3, fname_spiralIntlv4] +params_general[:traj_filename] = fname_gradient +params_general[:excitations] = slice_selection + +params_general[:do_multi_interleave] = true +params_general[:do_odd_interleave] = true +params_general[:num_interleaves] = 4 + +params_general[:single_slice] = !multi_slice + +# Defined recon size and parameters for data loading +@info "Using Parameters:\n\nreconSize = $(params_general[:recon_size]) \n interleave = $(params_general[:interleave]) \n slices = $(params_general[:slices]) \n coils = $(params_general[:coils]) \n numSamples = $(params_general[:num_samples])\n\n" + +## Only load data when it has not been done yet, or it's specifically required. +if reload_spiral_data || !(@isdefined acq_data_imaging) + ## Convert raw to AcquisitionData + + @info "Merging interleaves and reading data \n" + acq_data_imaging = merge_raw_interleaves(params_general) + + @info "Loading Gradient Impulse Response Functions \n" + ## Load GIRFs! + # Tim Wu, use new read GIRF function + #girf_k1 = loadGirf(1,1) + girf_k1 = readGIRFFile(fname_girfGx, fname_girfGy, fname_girfGz, "GIRF_FT", false) + girf_applier_k1 = GirfApplier(girf_k1, gamma) + + @info "Correcting For GIRF \n" + apply_girf!(acq_data_imaging, girf_applier_k1) + + # Load K₀ GIRF + # Tim Wu, use new read GIRF function + #girf_k0 = loadGirf(0,1) + girf_k0 = readGIRFFile(fname_girfGx, fname_girfGy, fname_girfGz, "b0ec_FT", true) + girf_applier_k0 = GirfApplier(girf_k0, gamma) + + @info "Correcting For k₀ \n" + apply_k0!(acq_data_imaging, girf_applier_k0) + + ## Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) + check_acquisition_nodes!(acq_data_imaging) + +end + +## Sense Map loading +@info "Recalculating Sense Maps \n" +sensitivity = espirit(cartesian_acq_data, (4, 4), 12, params_general[:recon_size], eigThresh_1 = 0.01, eigThresh_2 = 0.98) + +# shift FOV to middle :) +shift_kspace!(acq_data_imaging, [0, -20]) +#changeFOV!(acq_data_imaging,[1.5,1.5]) + +num_virtual_coils = size(sensitivity, 4) + +do_coil_compression = false + +## Do coil compression to make recon faster +if do_coil_compression + num_virtual_coils = 4 + acq_data_imaging, sensitivity = geometricCC_2d(acq_data_imaging, sensitivity, num_virtual_coils) +end + +# ## Plot the sensitivity maps of each coil +if params_general[:do_plot_recon] + @info "Plotting SENSE Maps" + plot_sense_maps(sensitivity, num_virtual_coils, sliceIndex = 10) +end + +## B0 Maps (Assumes we have a B0 map from gradient echo scan named b0) +@info "Resizing B0 Maps" +resized_b0_maps = mapslices(x -> imresize(x, params_general[:recon_size]), b0_maps, dims = [1, 2]) + +## Define Parameter Dictionary for use with reconstruction +# CAST TO ComplexF32 if you're using current MRIReco.jl + +@info "Setting Parameters \n" +params = Dict{Symbol,Any}() +params[:reco] = "multiCoil" +params[:reconSize] = params_general[:recon_size] +params[:regularization] = "L2" +params[:λ] = 1e-2 # CHANGE THIS TO GET BETTER OR WORSE RECONSTRUCTION RESULTS +params[:iterations] = 20 +params[:solver] = "cgnr" +params[:solverInfo] = SolverInfo(ComplexF32, store_solutions = false) +params[:senseMaps] = ComplexF32.(sensitivity[:, :, selected_slice, :]) +params[:correctionMap] = ComplexF32.(-1im .* resized_b0_maps[:, :, selected_slice]) + +## Call to reconstruction +@info "Performing Reconstruction \n" +@time reco = reconstruction(acq_data_imaging, params) + +#totalRecon = sum(abs2,reco.data,dims=5) +@info "Plotting Reconstruction \n" +plot_reconstruction(cartesian_reco, 1:length(selected_slice), resized_b0_maps[:, :, selected_slice], isSliceInterleaved = true, rotateAngle = 270) + +## Plot the image edges (feature comparison) + +# img_edges₁ = detect_edges(slice1,Canny(spatial_scale = 2.6)) +# img_edges₂ = detect_edges(slice2,Canny(spatial_scale = 2.7)) + +# imEdges = cat(img_edges₁,img_edges₂,zeros(size(img_edges₁)),dims=3) + +# figure("Edge Differences") +# imshow(imEdges) + +@info "Successfully Completed Spiral Reconstruction \n" diff --git a/legacy/spiral_recon_Cleaned_Mar2022_Human_SingleIntlv.jl b/legacy/spiral_recon_Cleaned_Mar2022_Human_SingleIntlv.jl new file mode 100644 index 0000000..f14b699 --- /dev/null +++ b/legacy/spiral_recon_Cleaned_Mar2022_Human_SingleIntlv.jl @@ -0,0 +1,227 @@ +using HDF5, MRIReco, LinearAlgebra, Dierckx, DSP, FourierTools, ImageBinarization, ImageEdgeDetection, MRIGradients + +# All data-specific recon parameters +include("recon_config.jl") + +## +# Include tools and reader functions for running the spiral reconstruction recipe +# Note: the files are found relative of the location of the folder, not the +# environment current folder +include("../io/gradient_reader.jl") +include("../utils/utils.jl") + +## ----------------------------- User-defined Variables -------------------------- ## + +## Set true if we need to reload raw data compulsively. +reload_spiral_data = true +reloadGIRFData = true + +# Choose Slice (can be [single number] OR [1,2,3,...]) +# Leave empty ([]) to later select all slices +slice_choice = []; # TODO: read from ISMRMRD itself +#[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] # For multi-slice +# slice_choice = [6] # For single-slice + + +## Gyromagnetic ratio, in unit of Hz +gamma = 42577478 + + + +## Choose diffusion direction; starting from 0 (b=0) to the total number in MDDW protocol, e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs) +diffusion_direction = selector[:dif] +idxAverage = selector[:avg] +num_total_diffusion_directions = params_general[:num_total_diffusion_directions] # TODO: Read from ISMRMRD itself + +# Which interleave to be reconstructed. For single-interleave data, it will always be set as 1; for multi-interleave data, the value set here will be used. +# For multi-interleaved data, this value is ranging from [1:TotNumIntlv] (total number of interleaves), indicating which interleave to be reconstructed +startIndexIntlv = selector[:seg] + + +## Determine to reconstruct single-interleave data, or one interleave out of multi-interleave data. +isDataSingleIntlv = isa(params_general[:scan_fullpath], String) + + +## ------------------------------------------------ Calculation Starts Here ---------------------------------------------------------- ## + +if params_general[:do_load_maps] && isfile(params_general[:b0_map_save_fullpath]) # # TODO ask for sense map (but split in magn/phase) + @info "Loading SENSE and B0 maps from $(params_general[:sensitivity_save_fullpath]) and $(params_general[:b0_map_save_fullpath])" + # load maps, permute slice, sice files have geometric slice order + b0_maps = load_map(params_general[:b0_map_save_fullpath]) + + num_slices = size(b0_maps, 3) + slice_index_array = get_slice_order(num_slices, isSliceInterleaved = true) + + b0_maps = b0_maps[:, :, invperm(slice_index_array)] + cartesian_sensitivity = load_map(params_general[:sensitivity_save_fullpath]; doSplitPhase = true)[:, :, invperm(slice_index_array), :] +else + ## Only calculate sensitivity and B0 maps when they have not been done yet, or it's specifically required. + ## Executing Cartesian recon from which B0/sensitivity maps have been computed + @info "Running cartesian_recon to retrieve maps (cartesian_sensitivity and b0_maps)" + include("cartesian_recon_Mar2022_Human.jl") + num_slices = size(b0_maps, 3) +end + +## Set figures to be unlocked from the win9ow (i.e use matplotlib backend with controls) + +## Spiral Reconstruction Recipe Starts Here +@info "Starting Spiral Reconstruction Pipeline" + + +if isempty(slice_choice) + slice_choice = collect(1:num_slices) +end + +isMultiSlice = length(slice_choice) > 1 + +if !isMultiSlice + selected_slice = slice_choice +else + selected_slice = sort(vec(slice_choice)) +end + +## The ISMRMRD File contains more than one excitation, so we choose the set corresponding to the b-value 0 images +excitation_list = collect(num_slices*2+2:2:num_slices*4) .+ diffusion_direction * num_slices * 2 .+ (idxAverage - 1) * num_slices * (num_total_diffusion_directions + 1) * 2 # DATASET SPECIFIC INDEXING: 15 slices, starting from profile 32 +slice_selection = excitation_list[selected_slice] + +@info "Slice Chosen = $selected_slice: \n \nExcitations Chosen = $excitation_list " + +# params_general is the dictionary that sets the information for correct data loading and trajectory and data synchronization +params_general = Dict{Symbol,Any}() +params_general[:recon_size] = params_general[:recon_size] +params_general[:interleave] = startIndexIntlv +params_general[:slices] = 1 +params_general[:num_samples] = params_general[:num_adc_samples] +params_general[:delay] = 0.00000 # naive delay correction + +params_general[:interleave_data_filenames] = params_general[:scan_fullpath] + +params_general[:traj_filename] = params_general[:gradient_fullpath] +params_general[:excitations] = slice_selection + +params_general[:do_multi_interleave] = !isDataSingleIntlv +params_general[:do_odd_interleave] = false +params_general[:num_interleaves] = isDataSingleIntlv ? 1 : length(params_general[:interleave_data_filenames]) # one interleaf per file, count files, if filenames are array of strings (not only one string) + +params_general[:single_slice] = !isMultiSlice + +# Defined recon size and parameters for data loading +@info "Using Parameters:\n\nreconSize = $(params_general[:recon_size]) \n interleave = $(params_general[:interleave]) \n slices = $(params_general[:slices]) \n coils = $(size(cartesian_sensitivity, 4)) \n numSamples = $(params_general[:num_samples])\n\n" + +if reloadGIRFData || !(@isdefined girf_k1) || !(@isdefined gAK1) || !(@isdefined girf_k0) || !(@isdefined gAK0) + @info "Loading Gradient Impulse Response Functions" + + ## Load GIRFs (K1) + girf_k1 = readGIRFFile(params_general[:girf_fullpath][1], params_general[:girf_fullpath][2], params_general[:girf_fullpath][3], "GIRF_FT", false) + girf_applier_k1 = GirfApplier(girf_k1, gamma) + + ## Load K₀ GIRF + girf_k0 = readGIRFFile(params_general[:girf_fullpath][1], params_general[:girf_fullpath][2], params_general[:girf_fullpath][3], "b0ec_FT", true) + girf_applier_k0 = GirfApplier(girf_k0, gamma) +end + +## Only load data when it has not been done yet, or it's specifically required. +if reload_spiral_data || !(@isdefined acq_data_imaging) + ## Convert raw to AcquisitionData + + @info "Reading spiral data and merging interleaves" + acq_data_imaging = merge_raw_interleaves(params_general) + + if params_general[:do_correct_with_girf_k1] + @info "Correcting For GIRF" + apply_girf!(acq_data_imaging, girf_applier_k1) + end + + if params_general[:do_correct_with_girf_k0] + @info "Correcting For k₀" + apply_k0!(acq_data_imaging, girf_applier_k0) + end + + ## Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) + check_acquisition_nodes!(acq_data_imaging) + +end + +## Sense Map loading +@info "Resizing Sense Maps" + +# Resize sense maps to match encoding size of data matrix +sensitivity = mapslices(x -> imresize(x, params_general[:recon_size]), cartesian_sensitivity, dims = [1, 2]) + +# Plot the sensitivity maps of each coil +@info "Plotting SENSE Maps" + +if params_general[:do_plot_recon] + plot_sense_maps(sensitivity, size(sensitivity, 4), sliceIndex = 10) +end + + +# shift FOV to middle :) +shift_kspace!(acq_data_imaging, params_general[:fov_shift]) +#changeFOV!(acq_data_imaging,[1.5,1.5]) + + +## Do coil compression to make recon faster +if params_general[:do_coil_compression] + acq_data_imaging, sensitivity = geometricCC_2d(acq_data_imaging, sensitivity, params_general[:num_virtual_coils]) +end + + +## B0 Maps (Assumes we have a B0 map from gradient echo scan named b0) +@info "Resizing B0 Maps" +resized_b0_maps = mapslices(x -> imresize(x, params_general[:recon_size]), b0_maps, dims = [1, 2]) + +## Define Parameter Dictionary for use with reconstruction +# CAST TO ComplexF32 if you're using current MRIReco.jl + +@info "Setting Parameters" +params = Dict{Symbol,Any}() +params[:reco] = "multiCoil" +params[:reconSize] = params_general[:recon_size] +params[:regularization] = "L2" +params[:λ] = 1e-2 # CHANGE THIS TO GET BETTER OR WORSE RECONSTRUCTION RESULTS +params[:iterations] = params_general[:num_recon_iterations] +params[:solver] = "cgnr" +params[:solverInfo] = SolverInfo(ComplexF32, store_solutions = false) +params[:senseMaps] = ComplexF32.(sensitivity[:, :, selected_slice, :]) + +if params_general[:do_correct_with_b0_map] + params[:correctionMap] = ComplexF32.(-1im .* resized_b0_maps[:, :, selected_slice]) +end + +## Call to reconstruction +@info "Performing Reconstruction" +@time reco = reconstruction(acq_data_imaging, params) +#totalRecon = sum(abs2,reco.data,dims=5) + +# save Map recon (multi-echo etc.) +if params_general[:do_save_recon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load + resolution_mm = fieldOfView(acq_data_imaging) ./ encodingSize(acq_data_imaging) + resolution_mm[3] = fieldOfView(acq_data_imaging)[3] * (1 + params_general[:slice_distance_factor_percent] / 100.0) # for 2D only, since FOV[3] is slice thickness then, but gap has to be observed + + # TODO: use slice ordering from cartesian scan directly! + num_slices = numSlices(acq_data_imaging) + slice_index_array = get_slice_order(num_slices, isSliceInterleaved = true) + save_map( + params_general[:recon_save_fullpath], + params_general[:saving_scalefactor] * reco.data[:, :, slice_index_array], + resolution_mm; + doSplitPhase = true, + doNormalize = params_general[:do_normalize_recon], + ) +end + +if params_general[:do_plot_recon] + @info "Plotting Reconstruction" + pygui(true) + plot_reconstruction( + reco, + 1:length(selected_slice), + resized_b0_maps[:, :, selected_slice], + figHandles = ["Original Magnitude", "Original Phase", "B0"], + isSliceInterleaved = true, + rotateAngle = 270, + ) +end + +@info "Successfully Completed Spiral Reconstruction" diff --git a/legacy/spiral_recon_Cleaned_Mar2022_Phantom.jl b/legacy/spiral_recon_Cleaned_Mar2022_Phantom.jl new file mode 100644 index 0000000..f6e8f9a --- /dev/null +++ b/legacy/spiral_recon_Cleaned_Mar2022_Phantom.jl @@ -0,0 +1,156 @@ +using HDF5, MRIReco, LinearAlgebra, Dierckx, DSP, FourierTools, ImageBinarization, ImageEdgeDetection, MRIGradients + +# %% +# Include tools and reader functions for running the spiral reconstruction recipe +# Note: the files are found relative of the location of the folder, not the +# environment current folder +include("../io/gradient_reader.jl") +include("../utils/utils.jl") + +## Set true if we need to reload Cartesian and/or spiral data compulsively. +reload_cartesian_data = false +reload_spiral_data = true + +## Gyromagnetic ratio, in unit of Hz +gamma = 42577478 + +## Only calculate sensitivity and B0 maps when they have not been done yet, or it's specifically required. +if reload_cartesian_data || !((@isdefined cartesian_sensitivity) && (@isdefined b0_maps)) + ## Executing Cartesian recon from which B0/sensitivity maps have been computed + @info "Running cartesian_recon to retrieve maps (cartesian_sensitivity and b0_maps)" + include("cartesian_recon_Mar2022_Phantom.jl") +end + +## Choose Slice (can be [single number] OR [1,2,3,4,5,6,7,8,9] +slice_choice = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] # UNCOMMENT FOR MULTISLICE +# slice_choice = [6] # UNCOMMENT FOR SINGLESLICE (SLICES 3, 7 and 8 are good examples) +diffusion_direction = 0 # CAN BE FROM 0 (b=0) to 6 (e.g. for 6 direction MDDW, 1-6 are 6 directions) + +reconSize = (112, 112) #(200,200) + +## Spiral Reconstruction Recipe Starts Here +@info "Starting Spiral Reconstruction Pipeline" + +## Default to single slice selection. Choose multi-slice only if computer is capable. +multi_slice = true + +if length(slice_choice) > 1 + multi_slice = true +end + +if !multi_slice + selected_slice = slice_choice +else + selected_slice = sort(vec(slice_choice)) +end + +## The ISMRMRD File contains more than one excitation, so we choose the set corresponding to the b-value 0 images +# excitation_list = vec(20:2:36) .+ diffusion_direction * 9 * 2 # DATASET SPECIFIC INDEXING +excitation_list = vec(32:2:62) .+ diffusion_direction * 15 * 2 # DATASET SPECIFIC INDEXING: 15 slices, starting from profile 32 +slice_selection = excitation_list[selected_slice] + +@info "Slice Chosen = $selected_slice: \n \nExcitations Chosen = $excitation_list " + +fname_spiralIntlv1 = "data/Spirals/508_72_2.h5" +fname_spiralIntlv2 = "data/Spirals/508_74_2.h5" +fname_spiralIntlv3 = "data/Spirals/508_76_2.h5" +fname_spiralIntlv4 = "data/Spirals/508_78_2.h5" +fname_gradient = "data/Gradients/gradients508.txt" +fname_girfGx = "data/GIRF/GIRF_ISMRM2022/2021Nov_PosNeg_Gx.mat" +fname_girfGy = "data/GIRF/GIRF_ISMRM2022/2021Nov_PosNeg_Gy.mat" +fname_girfGz = "data/GIRF/GIRF_ISMRM2022/2021Nov_PosNeg_Gz.mat" + +# params_general is the dictionary that sets the information for correct data loading and trajectory and data synchronization +params_general = Dict{Symbol,Any}() +params_general[:recon_size] = reconSize +params_general[:interleave] = 1 +params_general[:slices] = 1 +params_general[:coils] = 20 +# params_general[:num_samples] = 16084 # Total Number of ADC event, including the period of gradient rewinder +params_general[:num_samples] = 15655 # Total Number of readout before gradient rewinder +params_general[:delay] = 0.00000 # naive delay correction + +params_general[:interleave_data_filenames] = [fname_spiralIntlv1, fname_spiralIntlv2, fname_spiralIntlv3, fname_spiralIntlv4] +params_general[:traj_filename] = fname_gradient +params_general[:excitations] = slice_selection + +params_general[:do_multi_interleave] = true +params_general[:do_odd_interleave] = true +params_general[:num_interleaves] = 4 + +params_general[:single_slice] = !multi_slice + +# Defined recon size and parameters for data loading +@info "Using Parameters:\n\nreconSize = $(params_general[:recon_size]) \n interleave = $(params_general[:interleave]) \n slices = $(params_general[:slices]) \n coils = $(params_general[:coils]) \n numSamples = $(params_general[:num_samples])\n\n" + +## Only load data when it has not been done yet, or it's specifically required. +if reload_spiral_data || !(@isdefined acq_data_imaging) + ## Convert raw to AcquisitionData + + @info "Merging interleaves and reading data \n" + acq_data_imaging = merge_raw_interleaves(params_general) + + @info "Loading Gradient Impulse Response Functions \n" + ## Load GIRFs! + # Tim Wu, use new read GIRF function + #girf_k1 = loadGirf(1,1) + girf_k1 = readGIRFFile(fname_girfGx, fname_girfGy, fname_girfGz, "GIRF_FT", false) + girf_applier_k1 = GirfApplier(girf_k1, gamma) + + @info "Correcting For GIRF \n" + apply_girf!(acq_data_imaging, girf_applier_k1) + + # Load K₀ GIRF + # Tim Wu, use new read GIRF function + #girf_k0 = loadGirf(0,1) + girf_k0 = readGIRFFile(fname_girfGx, fname_girfGy, fname_girfGz, "b0ec_FT", true) + girf_applier_k0 = GirfApplier(girf_k0, gamma) + + @info "Correcting For k₀ \n" + apply_k0!(acq_data_imaging, girf_applier_k0) + + ## Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) + check_acquisition_nodes!(acq_data_imaging) + +end + +## Sense Map loading +@info "Validating Sense Maps \n" + +# Resize sense maps to match encoding size of data matrix +sensitivity = mapslices(x -> imresize(x, (acq_data_imaging.encodingSize[1], acq_data_imaging.encodingSize[2])), cartesian_sensitivity, dims = [1, 2]) +# sensitivity = mapslices(rotl90,sensitivity,dims=[1,2]) + +# ## Plot the sensitivity maps of each coil +@info "Plotting SENSE Maps \n" +plot_sense_maps(sensitivity, params_general[:coils]) + +## B0 Maps (Assumes we have a B0 map from gradient echo scan named b0) +@info "Resizing B0 Maps \n" +resized_b0_maps = mapslices(x -> imresize(x, (acq_data_imaging.encodingSize[1], acq_data_imaging.encodingSize[2])), b0_maps, dims = [1, 2]) + +## Define Parameter Dictionary for use with reconstruction +# CAST TO ComplexF32 if you're using current MRIReco.jl + +@info "Setting Parameters \n" +params = Dict{Symbol,Any}() +params[:reco] = "multiCoil" +params[:reconSize] = params_general[:recon_size] +params[:regularization] = "L2" +params[:λ] = 1e-2 # CHANGE THIS TO GET BETTER OR WORSE RECONSTRUCTION RESULTS +params[:iterations] = 20 +params[:solver] = "cgnr" +params[:solverInfo] = SolverInfo(ComplexF32, store_solutions = false) +params[:senseMaps] = ComplexF32.(sensitivity[:, :, selected_slice, :]) +params[:correctionMap] = ComplexF32.(-1im .* resized_b0_maps[:, :, selected_slice]) + +## Call to reconstruction +@info "Performing Reconstruction \n" +@time reco = reconstruction(acq_data_imaging, params) + +@info "Plotting Reconstruction \n" +## Set figures to be unlocked from the win9ow (i.e use matplotlib backend with controls) +pygui(true) +plot_reconstruction(reco, 1:length(selected_slice), resized_b0_maps[:, :, selected_slice]) + +@info "Successfully Completed Spiral Reconstruction \n" diff --git a/legacy/spiral_recon_Cleaned_wavelet.jl b/legacy/spiral_recon_Cleaned_wavelet.jl new file mode 100644 index 0000000..e969630 --- /dev/null +++ b/legacy/spiral_recon_Cleaned_wavelet.jl @@ -0,0 +1,151 @@ +using PyPlot, HDF5, MRIReco, LinearAlgebra, Dierckx, DSP, FourierTools, ImageBinarization, ImageEdgeDetection, MRIGradients + +# %% +# Include tools and reader functions for running the spiral reconstruction recipe +# Note: the files are found relative of the location of the folder, not the +# environment current folder +include("../io/gradient_reader.jl") +include("../utils/utils.jl") + +## Executing Cartesian recon from which B0/sensitivity maps have been computed +@info "Running julia_recon_cartesian to retrieve maps (cartesian_sensitivity and b0_maps)" +include("../recon/cartesian_recon.jl") + +## Set figures to be unlocked from the window (i.e use matplotlib backend with controls) +pygui(true) + +## Choose Slice (can be [single number] OR [1,2,3,4,5,6,7,8,9] +# slice_choice = [1,2,3,4,5,6,7,8,9] # UNCOMMENT FOR MULTISLICE +slice_choice = [3] # UNCOMMENT FOR SINGLESLICE (SLICES 3, 7 and 8 are good examples) +diffusion_direction = 0 # CAN BE FROM 0 (b=0) to 7 (1-7 are 6 directions of b=1000) + +## Spiral Reconstruction Recipe Starts Here +@info "Starting Spiral Reconstruction Pipeline" + +## Default to single slice selection. Choose multi-slice only if computer is capable. +multi_slice = false + +if length(slice_choice) > 1 + multi_slice = true +end + +if !multi_slice + selected_slice = slice_choice +else + selected_slice = sort(vec(slice_choice)) +end + +## The ISMRMRD File contains more than one excitation, so we choose the set corresponding to the b-value 0 images +excitation_list = vec(20:2:36) .+ diffusion_direction * 18 # DATASET SPECIFIC INDEXING +slice_selection = excitation_list[selected_slice] + +@info "Slice Chosen = $selected_slice: \n \nExcitations Chosen = $excitation_list " + +# params_general is the dictionary that sets the information for correct data loading and trajectory and data synchronization +params_general = Dict{Symbol,Any}() +params_general[:recon_size] = (200, 200) +params_general[:interleave] = 1 +params_general[:slices] = 1 +params_general[:coils] = 20 +params_general[:num_samples] = 15475 +params_general[:delay] = 0.00000 # naive delay correction + +params_general[:interleave_data_filenames] = ["data/Spirals/523_96_2.h5", "data/Spirals/523_98_2.h5", "data/Spirals/523_100_2.h5", "data/Spirals/523_102_2.h5"] +params_general[:traj_filename] = "data/Gradients/gradients523.txt" +params_general[:excitations] = slice_selection + +params_general[:do_multi_interleave] = false +params_general[:do_odd_interleave] = false +params_general[:num_interleaves] = 1 + +params_general[:single_slice] = !multi_slice + +@info "Using Parameters:\n\nreconSize = $(params_general[:recon_size]) \n interleave = $(params_general[:interleave]) \n slices = $(params_general[:slices]) \n coils = $(params_general[:coils]) \n numSamples = $(params_general[:num_samples])\n\n" +# define recon size and parameters for data loading + +## Convert raw to AcquisitionData + +@info "Merging interleaves and reading data \n" +acq_data_imaging = merge_raw_interleaves(params_general) + +@info "Loading Gradient Impulse Response Functions \n" +## Load GIRFs! +girf_k1 = loadGirf(1, 1) +girf_applier_k1 = GirfApplier(girf_k1, 42577478) + +@info "Correcting For GIRF \n" +apply_girf!(acq_data_imaging, girf_applier_k1) + +# # Load K₀ GIRF +# girf_k0 = loadGirf(0,1) +# girf_applier_k0 = GirfApplier(girf_k0, 42577478) + +# @info "Correcting For k₀ \n" +# apply_k0!(acq_data_imaging, girf_applier_k0) + +## Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) +check_acquisition_nodes!(acq_data_imaging) + +## Sense Map loading +@info "Validating Sense Maps \n" + +# Resize sense maps to match encoding size of data matrix +sensitivity = mapslices(x -> imresize(x, (acq_data_imaging.encodingSize[1], acq_data_imaging.encodingSize[2])), cartesian_sensitivity, dims = [1, 2]) +sensitivity = mapslices(rotl90, sensitivity, dims = [1, 2]) + +# ## Plot the sensitivity maps of each coil +@info "Plotting SENSE Maps \n" +plot_sense_maps(sensitivity, params_general[:coils]) + +## B0 Maps (Assumes we have a B0 map from gradient echo scan named b0) +@info "Validating B0 Maps \n" +resized_b0_maps = mapslices(x -> imresize(x, (acq_data_imaging.encodingSize[1], acq_data_imaging.encodingSize[2])), b0_maps, dims = [1, 2]) + +## Define Parameter Dictionary for use with reconstruction +# CAST TO ComplexF32 if you're using current MRIReco.jl + +@info "Setting Parameters \n" +params = Dict{Symbol,Any}() +params[:reco] = "multiCoil" +params[:reconSize] = params_general[:recon_size] +params[:λ] = 0.01 # CHANGE THIS TO GET BETTER OR WORSE RECONSTRUCTION RESULTS +params[:solver] = "fista" +params[:solverInfo] = SolverInfo(ComplexF32, store_solutions = false) +params[:senseMaps] = ComplexF32.(sensitivity[:, :, selected_slice, :]) +params[:correctionMap] = ComplexF32.(-1im .* resized_b0_maps[:, :, selected_slice]) + + +# CS reconstruction using Wavelets +params[:iterations] = 100 +params[:regularization] = "TV" +# params[:sparseTrafo] = dictOp(D,(nx,ny),(px,py),2.e-2) +params[:ρ] = 2.0 +params[:absTol] = 1.e-6 +params[:relTol] = 1.e-4 + + +# img_d = reconstruction(acqData,params) +# @info "relative error: $(norm(img-img_d)/norm(img))" + + +# For comparison, let us perform the same reconstruction as above but with a Wavelet transform + +# delete!(params, :sparseTrafo) +params[:sparseTrafo] = "Wavelet" + +## Call to reconstruction +@info "Performing Reconstruction \n" +@time reco = reconstruction(acq_data_imaging, params) + +#totalRecon = sum(abs2,reco.data,dims=5) +plot_reconstruction(reco, 1:length(selected_slice), resized_b0_maps[:, :, selected_slice]) + +## Plot the image edges (feature comparison) + +# img_edges₁ = detect_edges(slice1,Canny(spatial_scale = 2.6)) +# img_edges₂ = detect_edges(slice2,Canny(spatial_scale = 2.7)) + +# imEdges = cat(img_edges₁,img_edges₂,zeros(size(img_edges₁)),dims=3) + +# figure("Edge Differences") +# PyPlot.imshow(imEdges) diff --git a/legacy/spiral_recon_cleaned.jl b/legacy/spiral_recon_cleaned.jl new file mode 100644 index 0000000..50e4da1 --- /dev/null +++ b/legacy/spiral_recon_cleaned.jl @@ -0,0 +1,152 @@ +using HDF5, MRIReco, LinearAlgebra, Dierckx, DSP, FourierTools, ImageBinarization, ImageEdgeDetection, MRIGradients + +# %% +# Include tools and reader functions for running the spiral reconstruction recipe +# Note: the files are found relative of the location of the folder, not the +# environment current folder +include("../io/gradient_reader.jl") +include("../utils/utils.jl") + +## Executing Cartesian recon from which B0/sensitivity maps have been computed +@info "Running cartesian_recon to retrieve maps (cartesian_sensitivity and b0_maps)" +include("../recon/cartesian_recon.jl") + +## Set figures to be unlocked from the window (i.e use matplotlib backend with controls) + +## Choose Slice (can be [single number] OR [1,2,3,4,5,6,7,8,9] +slice_choice = [1, 2, 3, 4, 5, 6, 7, 8, 9] # UNCOMMENT FOR MULTISLICE +# slice_choice = [7] # UNCOMMENT FOR SINGLESLICE (SLICES 3, 7 and 8 are good examples) +diffusion_direction = 0 # CAN BE FROM 0 (b=0) to 6 (1-6 are 6 directions of b=1000) + +## Spiral Reconstruction Recipe Starts Here +@info "Starting Spiral Reconstruction Pipeline" + +## Default to single slice selection. Choose multi-slice only if computer is capable. +multi_slice = false + +if length(slice_choice) > 1 + multi_slice = true +end + +if !multi_slice + selected_slice = slice_choice +else + selected_slice = sort(vec(slice_choice)) +end + +## The ISMRMRD File contains more than one excitation, so we choose the set corresponding to the b-value 0 images +excitation_list = vec(20:2:36) .+ diffusion_direction * 18 # DATASET SPECIFIC INDEXING +slice_selection = excitation_list[selected_slice] + +@info "Slice Chosen = $selected_slice: \n \nExcitations Chosen = $excitation_list " + +# params_general is the dictionary that sets the information for correct data loading and trajectory and data synchronization +params_general = Dict{Symbol,Any}() +params_general[:recon_size] = (200, 200) +params_general[:interleave] = 1 +params_general[:slices] = 1 +params_general[:coils] = 40 +params_general[:num_samples] = 15475 +params_general[:delay] = 0.00000 # naive delay correction + +params_general[:interleave_data_filenames] = ["data/Spirals/523_96_2.h5", "data/Spirals/523_98_2.h5", "data/Spirals/523_100_2.h5", "data/Spirals/523_102_2.h5"] +params_general[:traj_filename] = "data/Gradients/gradients523.txt" +params_general[:excitations] = slice_selection + +params_general[:do_multi_interleave] = true +params_general[:do_odd_interleave] = true +params_general[:num_interleaves] = 4 + +params_general[:single_slice] = !multi_slice + +@info "Using Parameters:\n\nrecon size = $(params_general[:recon_size]) \n interleave = $(params_general[:interleave]) \n slices = $(params_general[:slices]) \n coils = $(params_general[:coils]) \n numSamples = $(params_general[:num_samples])\n\n" +# define recon size and parameters for data loading + +## Convert raw to AcquisitionData + +@info "Merging interleaves and reading data \n" +acq_data_imaging = merge_raw_interleaves(params_general) + +@info "Loading Gradient Impulse Response Functions \n" +## Load GIRFs! +girf_k1 = loadGirf(1, 1) +girf_applier_k1 = GirfApplier(girf_k1, 42577478) + +@info "Correcting For GIRF \n" +apply_girf!(acq_data_imaging, girf_applier_k1) + +# Load K₀ GIRF +girf_k0 = loadGirf(0, 1) +girf_applier_k0 = GirfApplier(girf_k0, 42577478) + +@info "Correcting For k₀ \n" +apply_k0!(acq_data_imaging, girf_applier_k0) + +## Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) +check_acquisition_nodes!(acq_data_imaging) + +do_coil_compression = false + +num_virtual_coils = size(sensitivity, 4) + +## Do coil compression to make recon faster +if do_coil_compression + num_virtual_coils = 8 + acq_data_imaging, cartesian_sensitivity = geometricCC_2d(acq_data_imaging, cartesian_sensitivity, num_virtual_coils) +end + +## Sense Map loading +@info "Recalculating Sense Maps \n" +cartesian_sensitivity = espirit( + cartesian_acq_data, + (4, 4), + 12, + (acq_data_imaging.encodingSize[1], acq_data_imaging.encodingSize[2]), + eigThresh_1 = 0.01, + eigThresh_2 = 0.98, + match_acq_size = false, +) +sensitivity = mapslices(rotl90, cartesian_sensitivity, dims = [1, 2]) + +# ## Plot the sensitivity maps of each coil +@info "Plotting SENSE Maps \n" +plot_sense_maps(sensitivity, num_virtual_coils, sliceIndex = 6) + +## B0 Maps (Assumes we have a B0 map from gradient echo scan named b0) +@info "Validating B0 Maps \n" +resized_b0_maps = mapslices(x -> imresize(x, (acq_data_imaging.encodingSize[1], acq_data_imaging.encodingSize[2])), b0_maps, dims = [1, 2]) + +## Define Parameter Dictionary for use with reconstruction +# CAST TO ComplexF32 if you're using current MRIReco.jl + +@info "Setting Parameters \n" +params = Dict{Symbol,Any}() +params[:reco] = "multiCoil" +params[:reconSize] = params_general[:recon_size] +params[:regularization] = "L2" +params[:λ] = 1e-2 # CHANGE THIS TO GET BETTER OR WORSE RECONSTRUCTION RESULTS +params[:iterations] = 20 +params[:solver] = "cgnr" +params[:solverInfo] = SolverInfo(ComplexF32, store_solutions = false) +params[:senseMaps] = ComplexF32.(sensitivity[:, :, selected_slice, :]) +params[:correctionMap] = ComplexF32.(-1im .* resized_b0_maps[:, :, selected_slice]) + +## Call to reconstruction +@info "Performing Reconstruction \n" +@time reco = reconstruction(acq_data_imaging, params) + +#totalRecon = sum(abs2,reco.data,dims=5) +@info "Plotting Reconstruction \n" +plot_reconstruction(reco, 1:length(selected_slice), resized_b0_maps[:, :, selected_slice]) + +## Plot the image edges (feature comparison) + +# img_edges₁ = detect_edges(slice1,Canny(spatial_scale = 2.6)) +# img_edges₂ = detect_edges(slice2,Canny(spatial_scale = 2.7)) + +# imEdges = cat(img_edges₁,img_edges₂,zeros(size(img_edges₁)),dims=3) + +# figure("Edge Differences") +# PyPlot.imshow(imEdges) + +@info "Successfully Completed Spiral Reconstruction \n" diff --git a/legacy/spiral_recon_single_interleave.jl b/legacy/spiral_recon_single_interleave.jl new file mode 100644 index 0000000..973bbed --- /dev/null +++ b/legacy/spiral_recon_single_interleave.jl @@ -0,0 +1,226 @@ +using HDF5, + MRIReco, + LinearAlgebra, + Dierckx, + DSP, + FourierTools, + ImageBinarization, + ImageEdgeDetection, + MRIGradients, + FileIO, + MRIFiles, + MRICoilSensitivities, + RegularizedLeastSquares, + GIRFReco, + MosaicViews, + Plots, + Images + +# All data-specific recon parameters +include("recon_config_SPIDI_0007.jl") + +## ----------------------------- User-defined Variables -------------------------- ## + +## Set true if we need to reload raw data compulsively. +reload_spiral_data = true +reloadGIRFData = true + +# Choose Slice (can be [single number] OR [1,2,3,...]) +# Leave empty ([]) or remove this line to later select all slices +slice_choice = []; # TODO: read from ISMRMRD itself + +## Gyromagnetic ratio, in unit of Hz +gamma = 42577478 + +## Choose diffusion direction; starting from 0 (b=0) to the total number in MDDW protocol, e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs) +diffusion_direction = selector[:dif] +idxAverage = selector[:avg] +num_total_diffusion_directions = params_general[:num_total_diffusion_directions] # TODO: Read from ISMRMRD itself + +# Which interleave to be reconstructed. For single-interleave data, it will always be set as 1; for multi-interleave data, the value set here will be used. +# For multi-interleaved data, this value is ranging from [1:TotNumIntlv] (total number of interleaves), indicating which interleave to be reconstructed +startIndexIntlv = selector[:seg] + +## Determine to reconstruct single-interleave data, or one interleave out of multi-interleave data. +isDataSingleIntlv = isa(params_general[:scan_fullpath], String) + + +## ------------------------------------------------ Calculation Starts Here ---------------------------------------------------------- ## + +if params_general[:do_load_maps] && isfile(params_general[:b0_map_save_fullpath]) # # TODO ask for sense map (but split in magn/phase) + @info "Loading SENSE and B0 maps from $(params_general[:sensitivity_save_fullpath]) and $(params_general[:b0_map_save_fullpath])" + # load maps, permute slice, sice files have geometric slice order + b0_maps = load_map(params_general[:b0_map_save_fullpath]) + + num_slices = size(b0_maps, 3) + slice_index_array = get_slice_order(num_slices, isSliceInterleaved = true) + + b0_maps = b0_maps[:, :, invperm(slice_index_array)] + cartesian_sensitivity = load_map(params_general[:sensitivity_save_fullpath]; doSplitPhase = true)[:, :, invperm(slice_index_array), :] +else + ## Only calculate sensitivity and B0 maps when they have not been done yet, or it's specifically required. + ## Executing Cartesian recon from which B0/sensitivity maps have been computed + @info "Running cartesian_recon to retrieve maps (cartesian_sensitivity and b0_maps)" + include("cartesian_recon.jl") + num_slices = size(b0_maps, 3) +end + +## Spiral Reconstruction Recipe Starts Here +@info "Starting Spiral Reconstruction Pipeline" + +if isempty(slice_choice) || !(@isdefined slice_choice) + slice_choice = collect(1:num_slices) +end + +isMultiSlice = length(slice_choice) > 1 + +if !isMultiSlice + selected_slice = slice_choice +else + selected_slice = sort(vec(slice_choice)) +end + +## The ISMRMRD File contains more than one excitation, so we choose the set corresponding to the b-value 0 images +excitation_list = collect(num_slices*2+2:2:num_slices*4) .+ diffusion_direction * num_slices * 2 .+ (idxAverage - 1) * num_slices * (num_total_diffusion_directions + 1) * 2 # DATASET SPECIFIC INDEXING: 15 slices, starting from profile 32 +slice_selection = excitation_list[selected_slice] + +@info "Slice Chosen = $selected_slice: \n \nExcitations Chosen = $excitation_list " + +# params_general is the dictionary that sets the information for correct data loading and trajectory and data synchronization +params_general = Dict{Symbol,Any}() +params_general[:recon_size] = Tuple(params_general[:recon_size]) +params_general[:interleave] = startIndexIntlv +params_general[:num_samples] = params_general[:num_adc_samples] +params_general[:delay] = 0.00000 # naive delay correction + +params_general[:interleave_data_filenames] = params_general[:scan_fullpath] + +params_general[:traj_filename] = params_general[:gradient_fullpath] +params_general[:excitations] = slice_selection + +params_general[:do_multi_interleave] = !isDataSingleIntlv +params_general[:do_odd_interleave] = false +params_general[:num_interleaves] = isDataSingleIntlv ? 1 : length(params_general[:interleave_data_filenames]) # one interleaf per file, count files, if filenames are array of strings (not only one string) + +params_general[:single_slice] = !isMultiSlice + +# Defined recon size and parameters for data loading +@info "Using Parameters:\n\nreconSize = $(params_general[:recon_size]) \n interleave = $(params_general[:interleave]) \n slices = $(slice_choice) \n coils = $(size(cartesian_sensitivity, 4)) \n numSamples = $(params_general[:num_samples])\n\n" + +if reloadGIRFData || !(@isdefined girf_k1) || !(@isdefined gAK1) || !(@isdefined girf_k0) || !(@isdefined gAK0) + @info "Loading Gradient Impulse Response Functions" + + ## Load GIRFs (K1) + girf_k1 = readGIRFFile(params_general[:girf_fullpath][1], params_general[:girf_fullpath][2], params_general[:girf_fullpath][3], "GIRF_FT", false) + girf_applier_k1 = GirfApplier(girf_k1, gamma) + + ## Load K₀ GIRF + girf_k0 = readGIRFFile(params_general[:girf_fullpath][1], params_general[:girf_fullpath][2], params_general[:girf_fullpath][3], "b0ec_FT", true) + girf_applier_k0 = GirfApplier(girf_k0, gamma) +end + +## Only load data when it has not been done yet, or it's specifically required. +if reload_spiral_data || !(@isdefined acq_data_imaging) + ## Convert raw to AcquisitionData + + @info "Reading spiral data and merging interleaves" + acq_data_imaging = merge_raw_interleaves(params_general) + + if params_general[:do_correct_with_girf_k1] + @info "Correcting For GIRF" + apply_girf!(acq_data_imaging, girf_applier_k1) + end + + if params_general[:do_correct_with_girf_k0] + @info "Correcting For k₀" + apply_k0!(acq_data_imaging, girf_applier_k0) + end + + ## Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) + check_acquisition_nodes!(acq_data_imaging) + +end + +## Sense Map loading +@info "Resizing Sense Maps" + +# Resize sense maps to match encoding size of data matrix +sensitivity = mapslices(x -> imresize(x, params_general[:recon_size][1], params_general[:recon_size][2]), cartesian_sensitivity, dims = [1, 2]) + +# Plot the sensitivity maps of each coil +@info "Plotting SENSE Maps" + +if params_general[:do_plot_recon] + plot_sense_maps(sensitivity, size(sensitivity, 4), sliceIndex = 10) +end + + +# shift FOV to middle :) +shift_kspace!(acq_data_imaging, params_general[:fov_shift]) +# changeFOV!(acq_data_imaging,[0.99, 0.99]) + + +## Do coil compression to make recon faster +if params_general[:do_coil_compression] + acq_data_imaging, sensitivity = geometricCC_2d(acq_data_imaging, sensitivity, params_general[:num_virtual_coils]) +end + + +## B0 Maps (Assumes we have a B0 map from gradient echo scan named b0) +@info "Resizing B0 Maps" +resized_b0_maps = mapslices(x -> imresize(x, params_general[:recon_size][1], params_general[:recon_size][2]), b0_maps, dims = [1, 2]) + +## Define Parameter Dictionary for use with reconstruction +# CAST TO ComplexF32 if you're using current MRIReco.jl + +@info "Setting Parameters" +params = Dict{Symbol,Any}() +params[:reco] = "multiCoil" +params[:reconSize] = params_general[:recon_size][1:2] +params[:regularization] = "L2" +params[:λ] = 1e-2 # CHANGE THIS TO GET BETTER OR WORSE RECONSTRUCTION RESULTS +params[:iterations] = params_general[:num_recon_iterations] +params[:solver] = "cgnr" +params[:solverInfo] = SolverInfo(ComplexF32, store_solutions = false) +params[:senseMaps] = ComplexF32.(sensitivity[:, :, selected_slice, :]) + +if params_general[:do_correct_with_b0_map] + params[:correctionMap] = ComplexF32.(-1im .* resized_b0_maps[:, :, selected_slice]) +end + +## Call to reconstruction +@info "Performing Reconstruction" +@time reco = reconstruction(acq_data_imaging, params) +#totalRecon = sum(abs2,reco.data,dims=5) + +# save Map recon (multi-echo etc.) +if params_general[:do_save_recon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load + resolution_tmp = fieldOfView(acq_data_imaging)[1:2] ./ encodingSize(acq_data_imaging) + resolution_mm = (resolution_tmp[1], resolution_tmp[2], fieldOfView(acq_data_imaging)[3] * (1 + params_general[:slice_distance_factor_percent] / 100.0)) # for 2D only, since FOV[3] is slice thickness then, but gap has to be observed + + # TODO: use slice ordering from cartesian scan directly! + num_slices = numSlices(acq_data_imaging) + slice_index_array = get_slice_order(num_slices, isSliceInterleaved = true) + save_map( + params_general[:recon_save_fullpath], + params_general[:saving_scalefactor] * reco.data[:, :, slice_index_array], + resolution_mm; + doSplitPhase = true, + doNormalize = params_general[:do_normalize_recon], + ) +end + +if params_general[:do_plot_recon] + @info "Plotting Reconstruction" + #pygui(true) + plot_reconstruction( + reco, + 1:length(selected_slice), + resized_b0_maps[:, :, selected_slice], + figHandles = ["Original Magnitude", "Original Phase", "B0"], + isSliceInterleaved = true, + rotateAngle = 270, + ) +end + +@info "Successfully Completed Spiral Reconstruction" diff --git a/testThings.jl b/legacy/test_things.jl similarity index 63% rename from testThings.jl rename to legacy/test_things.jl index 1e598d2..8207032 100644 --- a/testThings.jl +++ b/legacy/test_things.jl @@ -2,32 +2,32 @@ imsize = 64 #normal image -N=imsize÷2 +N = imsize ÷ 2 img = shepp_logan(N) -msk = zeros(N,N) -msk[findall(x->x!=0,img)] .= 1 +msk = zeros(N, N) +msk[findall(x -> x != 0, img)] .= 1 #larger image img2 = shepp_logan(imsize) -msk2 = zeros(imsize,imsize) -msk2[findall(x->x!=0,img2)] .= 1 +msk2 = zeros(imsize, imsize) +msk2[findall(x -> x != 0, img2)] .= 1 # coil sensitivites for normal image size smaps = birdcageSensitivity(N, 8, 1.5) -snorm = sqrt.(sum(abs.(smaps).^2,dims=4)) -for i=1:8 -smaps[:,:,1,i] .= msk .* smaps[:,:,1,i] ./ snorm[:,:,1,1] +snorm = sqrt.(sum(abs.(smaps) .^ 2, dims = 4)) +for i = 1:8 + smaps[:, :, 1, i] .= msk .* smaps[:, :, 1, i] ./ snorm[:, :, 1, 1] end # coil sensitivites for larger image size smaps2 = birdcageSensitivity(imsize, 8, 1.5) -snorm2 = sqrt.(sum(abs.(smaps2).^2,dims=4)) -for i=1:8 -smaps2[:,:,1,i] .= msk2 .* smaps2[:,:,1,i] ./ snorm2[:,:,1,1] +snorm2 = sqrt.(sum(abs.(smaps2) .^ 2, dims = 4)) +for i = 1:8 + smaps2[:, :, 1, i] .= msk2 .* smaps2[:, :, 1, i] ./ snorm2[:, :, 1, 1] end # simulation for normal image size -params = Dict{Symbol, Any}() +params = Dict{Symbol,Any}() params[:simulation] = "fast" params[:trajName] = "Cartesian" params[:numProfiles] = floor(Int64, N) @@ -35,17 +35,17 @@ params[:numSamplingPerProfile] = N params[:senseMaps] = smaps acqData = simulation(img, params) -acqData = MRIReco.sample_kspace(acqData, 2.0, "poisson", calsize=15) +acqData = MRIReco.sample_kspace(acqData, 2.0, "poisson", calsize = 15) -ksize=(6,6) # kernel size +ksize = (6, 6) # kernel size ncalib = 15 # number of calibration lines eigThresh_1 = 0.02 # threshold for picking singular vectors of calibration matrix eigThresh_2 = 0.95 # threshold for eigen vector decomposition in image space -emaps = espirit(acqData,ksize,ncalib,(imsize,imsize),eigThresh_1=eigThresh_1,eigThresh_2=eigThresh_2) +emaps = espirit(acqData, ksize, ncalib, (imsize, imsize), eigThresh_1 = eigThresh_1, eigThresh_2 = eigThresh_2) # simulation for larger image size -params = Dict{Symbol, Any}() +params = Dict{Symbol,Any}() params[:simulation] = "fast" params[:trajName] = "Cartesian" params[:numProfiles] = floor(Int64, imsize) @@ -53,18 +53,18 @@ params[:numSamplingPerProfile] = imsize params[:senseMaps] = smaps2 acqData2 = simulation(img2, params) -acqData2 = MRIReco.sample_kspace(acqData2, 2.0, "poisson", calsize=15) -emaps2 = espirit(acqData2,ksize,ncalib,(imsize,imsize),eigThresh_1=eigThresh_1,eigThresh_2=eigThresh_2) +acqData2 = MRIReco.sample_kspace(acqData2, 2.0, "poisson", calsize = 15) +emaps2 = espirit(acqData2, ksize, ncalib, (imsize, imsize), eigThresh_1 = eigThresh_1, eigThresh_2 = eigThresh_2) # evaluate error only on the support of smaps -for i=1:8 -emaps2[:,:,1,i] = msk2 .* emaps2[:,:,1,i] -emaps[:,:,1,i] = msk2 .* emaps[:,:,1,i] +for i = 1:8 + emaps2[:, :, 1, i] = msk2 .* emaps2[:, :, 1, i] + emaps[:, :, 1, i] = msk2 .* emaps[:, :, 1, i] end -err = norm(vec(emaps2).-vec(emaps))/norm(vec(emaps)) +err = norm(vec(emaps2) .- vec(emaps)) / norm(vec(emaps)) -function getCalib(acqData,imsize) +function getCalib(acqData, imsize) T = Float64 @@ -75,12 +75,12 @@ function getCalib(acqData,imsize) # Force maps to be at least same size as acqData.encodingSize. if (nxAcq >= nx || nyAcq >= ny) nx, ny = acqData.encodingSize[1:2] - end + end numChan, numSl = numChannels(acqData), numSlices(acqData) - calib = zeros(Complex{T},ncalib,ncalib,numChan) + calib = zeros(Complex{T}, ncalib, ncalib, numChan) - idx = match_acq_size ? acqData.subsampleIndices[1] : findIndices((nx,ny),(nxAcq,nyAcq))[acqData.subsampleIndices[1]] + idx = match_acq_size ? acqData.subsampleIndices[1] : findIndices((nx, ny), (nxAcq, nyAcq))[acqData.subsampleIndices[1]] # form zeropadded array with kspace data kdata = zeros(Complex{T}, nx * ny, numChan) @@ -95,4 +95,3 @@ function getCalib(acqData,imsize) end - \ No newline at end of file diff --git a/utils/variationalSmoother.jl b/legacy/variational_smoother.jl similarity index 64% rename from utils/variationalSmoother.jl rename to legacy/variational_smoother.jl index bd06bed..92b88c6 100644 --- a/utils/variationalSmoother.jl +++ b/legacy/variational_smoother.jl @@ -8,9 +8,9 @@ Calculates the cost between an estimated sensitivity map and the unsmoothed map * `y::Matrix{Complex{T}}` - unsmoothed map * `β` - Regularization parameter controlling roughness penalty """ -function cost_smooth(x::Matrix{T},y::Matrix{T}, β) where T +function cost_smooth(x::Matrix{T}, y::Matrix{T}, β) where {T} - (0.5 .* sum(abs2, x - y, dims=[1,2]) .+ β*R(x))[1] + (0.5 .* sum(abs2, x - y, dims = [1, 2]).+β*R(x))[1] end @@ -20,9 +20,9 @@ Regularization function which penalizes roughness # Arguments * `x::Matrix{Complex{T}}` - fieldmap estimate (in radians) """ -function R(x::Matrix{T}) where T +function R(x::Matrix{T}) where {T} - 0.5 * sum(abs2,diff(x,dims=1),dims=[1,2]) + 0.5 * sum(abs2,diff(x,dims=2),dims=[1,2]) + 0.5 * sum(abs2, diff(x, dims = 1), dims = [1, 2]) + 0.5 * sum(abs2, diff(x, dims = 2), dims = [1, 2]) end @@ -37,7 +37,7 @@ Estimates smooth sensitivity maps using gradient descent and a roughness penalty * `β` - Regularization parameter controlling roughness penalty * `reltol` - early stopping criteria (exit if subsequent cost function change < reltol) """ -function sens_smooth(x_c::AbstractMatrix{Complex{T}},y_c::AbstractMatrix{Complex{T}},β = 1e-1, reltol = 5e-5) where T +function sens_smooth(x_c::AbstractMatrix{Complex{T}}, y_c::AbstractMatrix{Complex{T}}, β = 1e-1, reltol = 5e-5) where {T} c_r = 0 c_i = 0 @@ -52,33 +52,33 @@ function sens_smooth(x_c::AbstractMatrix{Complex{T}},y_c::AbstractMatrix{Complex while Δ > reltol && itcount < 1000 gs_r = gradient(Flux.params(x_r)) do - c_r = cost_smooth(x_r, y_r,β) + c_r = cost_smooth(x_r, y_r, β) end gs_i = gradient(Flux.params(x_i)) do - c_i = cost_smooth(x_i, y_i,β) + c_i = cost_smooth(x_i, y_i, β) end x̄_r = gs_r[x_r] - x_r .-= 0.01 .* x̄_r + x_r .-= 0.01 .* x̄_r x̄_i = gs_i[x_i] - x_i .-= 0.01 .* x̄_i + x_i .-= 0.01 .* x̄_i - Δ_r = abs.(cost_smooth(x_r,y_r,β) - c_r)/(c_r + eps()) - Δ_i = abs.(cost_smooth(x_i,y_i,β) - c_i)/(c_i + eps()) + Δ_r = abs.(cost_smooth(x_r, y_r, β) - c_r) / (c_r + eps()) + Δ_i = abs.(cost_smooth(x_i, y_i, β) - c_i) / (c_i + eps()) Δ = sqrt.(abs2.(Δ_r) + abs2.(Δ_i)) @info Δ - itcount +=1 + itcount += 1 end print("Required $itcount iterations to converge below tolerance $reltol ") - return complex.(x_r,x_i) + return complex.(x_r, x_i) end @@ -94,15 +94,15 @@ Processes 3D volume data as output from MRIReco.reconstruction to estimate field """ function smooth_sensitivity_maps(smaps; β = 5e-4, reltol = 0.001) - nx,ny,slices,coils = size(smaps) + nx, ny, slices, coils = size(smaps) smaps_ref = smaps - smaps_out = Complex.(zeros(nx,ny,slices,coils)) + smaps_out = Complex.(zeros(nx, ny, slices, coils)) - for coil in 1:coils - @sync for slice in 1:slices + for coil = 1:coils + @sync for slice = 1:slices Threads.@spawn begin - smaps_out[:,:,slice,coil] = sens_smooth(smaps[:,:,slice,coil],smaps_ref[:,:,slice,coil],β,reltol) - println("for slice $slice") + smaps_out[:, :, slice, coil] = sens_smooth(smaps[:, :, slice, coil], smaps_ref[:, :, slice, coil], β, reltol) + println("for slice $slice") end end println("for coil $coil") @@ -119,7 +119,7 @@ function process_sens_maps(smap) psize = 4 thres = 0.005 - mask = collect(padarray(abs.(smap) .> thres, Fill(0, (psize,psize)))) + mask = collect(padarray(abs.(smap) .> thres, Fill(0, (psize, psize)))) for i = 1:8 @@ -127,11 +127,11 @@ function process_sens_maps(smap) end - mask = mask[(psize+1):(psize+d[1]),(psize+1):(psize+d[2])] + mask = mask[(psize+1):(psize+d[1]), (psize+1):(psize+d[2])] mask = get_conv_hull_mask(mask) - return 1im .* (mask) .* abs.(smap) .* exp.(1im .* angle.(smap)).^mask + return 1im .* (mask) .* abs.(smap) .* exp.(1im .* angle.(smap)) .^ mask end @@ -139,21 +139,21 @@ function get_conv_hull_mask(mask) cord = convexhull(mask) nedge = length(cord) - edges = hcat(1:nedge,2:(nedge+1)) + edges = hcat(1:nedge, 2:(nedge+1)) edges[end] = 1 tol = 1e-1 - stat = inpoly2(vec(CartesianIndices((1:size(mask,1),1:size(mask,2)))),cord,edges,atol=tol) + stat = inpoly2(vec(CartesianIndices((1:size(mask, 1), 1:size(mask, 2)))), cord, edges, atol = tol) - return reshape(stat[:,1],size(mask)) + return reshape(stat[:, 1], size(mask)) end function standardize_sens_phase(sens) - for i = 1:size(sens,4) + for i = 1:size(sens, 4) - sens[:,:,:,i] = sens[:,:,:,i] .* exp.(-1im .*mean(angle.(sensitivity[:,:,:,i]))) + sens[:, :, :, i] = sens[:, :, :, i] .* exp.(-1im .* mean(angle.(sensitivity[:, :, :, i]))) end diff --git a/io/IsmrmrdParameterMap_Siemens_NX_ReadinSpiral.xsl b/mrd_conversion_tools/IsmrmrdParameterMap_Siemens_NX_ReadinSpiral.xsl similarity index 100% rename from io/IsmrmrdParameterMap_Siemens_NX_ReadinSpiral.xsl rename to mrd_conversion_tools/IsmrmrdParameterMap_Siemens_NX_ReadinSpiral.xsl diff --git a/io/convert_to_mrd.sh b/mrd_conversion_tools/convert_to_mrd.sh similarity index 92% rename from io/convert_to_mrd.sh rename to mrd_conversion_tools/convert_to_mrd.sh index 7848921..dc6421a 100644 --- a/io/convert_to_mrd.sh +++ b/mrd_conversion_tools/convert_to_mrd.sh @@ -18,7 +18,7 @@ while getopts p:c:s:h flag do case "${flag}" in p) - pathData="$OPTARG" + data_path="$OPTARG" ;; c) set -f # disable globbing temporarily @@ -45,7 +45,7 @@ set +f # Turn globbing on for id in ${idsCartesian[@]}; do printf -v filepattern "meas_MID%05d" "${id}" echo $filepattern - foundFiles=$(ls "${pathData}"/${filepattern}*.dat) + foundFiles=$(ls "${data_path}"/${filepattern}*.dat) echo "Converting $foundFiles to mrd using IsmrmrdParameterMap_Siemens_NX.xsl" siemens_to_ismrmrd -f "$foundFiles" -z 2 -x IsmrmrdParameterMap_Siemens_NX.xsl --skipSyncData done @@ -53,7 +53,7 @@ done for id in ${idsSpiral[@]}; do printf -v filepattern "meas_MID%05d" "${id}" echo $filepattern - foundFiles=$(ls "${pathData}"/${filepattern}*.dat) + foundFiles=$(ls "${data_path}"/${filepattern}*.dat) echo "Converting $foundFiles to mrd using IsmrmrdParameterMap_Siemens_NX_ReadinSpiral.xsl" siemens_to_ismrmrd -f "$foundFiles" -z 2 -x IsmrmrdParameterMap_Siemens_NX_ReadinSpiral.xsl --skipSyncData done \ No newline at end of file diff --git a/paper/generate_fig_2.jl b/paper/generate_fig_2.jl index 316c143..1bbd15b 100644 --- a/paper/generate_fig_2.jl +++ b/paper/generate_fig_2.jl @@ -1,10 +1,10 @@ #----------------------------------------------------------------------------------- -# # [Figure 3 Generation](@id generate_fig_3) +# # [Figure 2 Generation](@id generate_fig_2) #----------------------------------------------------------------------------------- #= -This page provides the ability to generate figure 3 as a result of the reconstructions with successive corrections -This page was generated from the following Julia file: [`generate_fig_3.jl`](@__REPO_ROOT_URL__/docs/lit/examples/generate_fig_3.jl) +This page provides the ability to generate figure 2 as a result of the reconstructions with successive corrections +This page was generated from the following Julia file: [`generate_fig_2.jl`](@__REPO_ROOT_URL__/docs/lit/examples/generate_fig_2.jl) =# #= @@ -22,11 +22,8 @@ using NIfTI We need to provide a location for the NIfTI files with each successive correction. Start by making sure we have the same file structure as in recon =# -# rootProjPath = "/home/kasperl/SPIDI" # Root path of the project needs to be defined -rootProjPath = "/home/wuz/spiralDiffusion/data/demo_data" -# rootProjPath = "/Users/ajaffray/Documents/PhD/Data/SPIDI/" -rootProjPath = "/srv/data/ajaffray/TORONTO_COLLAB/data/SPIDI_0007/Phantom/" -include("/srv/data/ajaffray/TORONTO_COLLAB/GIRFReco/docs/lit/examples/ReconConfig_joss_demo.jl") +root_project_path = "/Your/Project/Path/Here" +include("Your/Project/Path/docs/lit/examples/recon_config_joss_demo.jl") #= @@ -34,10 +31,10 @@ include("/srv/data/ajaffray/TORONTO_COLLAB/GIRFReco/docs/lit/examples/ReconConfi =# -tags = ["vNoCorr_Sing","vB0Corr_Sing","vB0_GIRF_Sing","vB0_GIRF_k0_Sing"] -paths = joinpath.(paramsGeneral[:pathResults], "recon",tags) -filename_magn = splitext(paramsGeneral[:fileNameSaveRecon])[1] * "_magn.nii" -files = joinpath.(paths,filename_magn) +tags = ["vNoCorr_Sing", "vB0Corr_Sing", "vB0_GIRF_Sing", "vB0_GIRF_k0_Sing"] +paths = joinpath.(params_general[:results_path], "recon", tags) +filename_magnitude = splitext(params_general[:recon_save_filename])[1] * "_magn.nii" +files = joinpath.(paths, filename_magnitude) #= @@ -45,10 +42,10 @@ files = joinpath.(paths,filename_magn) =# -noCorr = niread(files[1]).raw[:,:,8,1,1,1] -b0Corr = niread(files[2]).raw[:,:,8,1,1,1] -b0GirfCorr = niread(files[3]).raw[:,:,8,1,1,1] -b0GirfK0Corr = niread(files[4]).raw[:,:,8,1,1,1] +uncorrected = niread(files[1]).raw[:, :, 8, 1, 1, 1] +b0_corrected = niread(files[2]).raw[:, :, 8, 1, 1, 1] +b0_girf_k1_corrected = niread(files[3]).raw[:, :, 8, 1, 1, 1] +b0_girf_k0_corrected = niread(files[4]).raw[:, :, 8, 1, 1, 1] #= ## 5. Plot! @@ -57,17 +54,123 @@ b0GirfK0Corr = niread(files[4]).raw[:,:,8,1,1,1] gr() -p1 = heatmap(noCorr,color=:grays,aspectratio = 1,xlims=(0,200),ylims=(0,200),xshowaxis=false,yshowaxis=false,colorbar=:none,title="No Correction",titlefontsize=10,top_margin=0mm) -p2 = heatmap(b0Corr,color=:grays,aspectratio = 1,xlims=(0,200),ylims=(0,200),xshowaxis=false,yshowaxis=false,colorbar=:none,title="B₀ Correction",titlefontsize=10,top_margin=0mm) -p3 = heatmap(b0GirfCorr,color=:grays,aspectratio = 1,xlims=(0,200),ylims=(0,200),xshowaxis=false,yshowaxis=false,colorbar=:none,title="B₀ + GIRF",titlefontsize=10,top_margin=0mm) -p4 = heatmap(b0GirfK0Corr,color=:grays,aspectratio = 1,xlims=(0,200),ylims=(0,200),xshowaxis=false,yshowaxis=false,colorbar=:none,title = "B₀ + GIRF + k₀",titlefontsize=10,top_margin=0mm) - -pc1 = heatmap(abs.((b0Corr - noCorr)./maximum(b0Corr)),color=:viridis,aspectratio = 1,xlims=(0,200),ylims=(0,200),xshowaxis=false,yshowaxis=false,colorbar=:none,title = "Δ: +B₀",titlefontsize=10,top_margin=0mm) -pc2 = heatmap(abs.((b0GirfCorr - b0Corr)./maximum(b0GirfCorr)),color=:viridis,aspectratio = 1,xlims=(0,200),ylims=(0,200),xshowaxis=false,yshowaxis=false,colorbar=:none,title = "Δ: +GIRF",titlefontsize=10,top_margin=0mm) -pc3 = heatmap(abs.((b0GirfK0Corr - b0GirfCorr)./maximum(b0GirfK0Corr)),color=:viridis,aspectratio = 1,xlims=(0,200),ylims=(0,200),xshowaxis=false,yshowaxis=false,colorbar=:none,title = "Δ: +k₀",titlefontsize=10,top_margin=0mm) - -p_tot = plot(p1,p2,p3,p4,heatmap(ones(200,200);xgrid=false,ygrid=false,aspectratio = 1,xlims=(0,200),ylims=(0,200),xshowaxis=false,yshowaxis=false,colorbar=:none,color=:grays),pc1,pc2,pc3;layout=(2,4),aspectratio=1,top_margin=0mm,bottom_margin=0mm) - -savefig(p_tot,"./paper/figure2_take2_Sing.pdf") - -# TODO keep working on the plots to generate something useable for the figure 3 \ No newline at end of file +p1 = heatmap( + uncorrected, + color = :grays, + aspectratio = 1, + xlims = (0, 200), + ylims = (0, 200), + xshowaxis = false, + yshowaxis = false, + colorbar = :none, + title = "No Correction", + titlefontsize = 10, + top_margin = 0mm, +) +p2 = heatmap( + b0_corrected, + color = :grays, + aspectratio = 1, + xlims = (0, 200), + ylims = (0, 200), + xshowaxis = false, + yshowaxis = false, + colorbar = :none, + title = "B₀ Correction", + titlefontsize = 10, + top_margin = 0mm, +) +p3 = heatmap( + b0_girf_k1_corrected, + color = :grays, + aspectratio = 1, + xlims = (0, 200), + ylims = (0, 200), + xshowaxis = false, + yshowaxis = false, + colorbar = :none, + title = "B₀ + GIRF", + titlefontsize = 10, + top_margin = 0mm, +) +p4 = heatmap( + b0_girf_k0_corrected, + color = :grays, + aspectratio = 1, + xlims = (0, 200), + ylims = (0, 200), + xshowaxis = false, + yshowaxis = false, + colorbar = :none, + title = "B₀ + GIRF + k₀", + titlefontsize = 10, + top_margin = 0mm, +) + +pc1 = heatmap( + abs.((b0_corrected - uncorrected) ./ maximum(b0_corrected)), + color = :viridis, + aspectratio = 1, + xlims = (0, 200), + ylims = (0, 200), + xshowaxis = false, + yshowaxis = false, + colorbar = :none, + title = "Δ: +B₀", + titlefontsize = 10, + top_margin = 0mm, +) +pc2 = heatmap( + abs.((b0_girf_k1_corrected - b0_corrected) ./ maximum(b0_girf_corrected)), + color = :viridis, + aspectratio = 1, + xlims = (0, 200), + ylims = (0, 200), + xshowaxis = false, + yshowaxis = false, + colorbar = :none, + title = "Δ: +GIRF", + titlefontsize = 10, + top_margin = 0mm, +) +pc3 = heatmap( + abs.((b0GirfK0k1_Corr - b0_girf_corrected) ./ maximum(b0_girf_k0_corrected)), + color = :viridis, + aspectratio = 1, + xlims = (0, 200), + ylims = (0, 200), + xshowaxis = false, + yshowaxis = false, + colorbar = :none, + title = "Δ: +k₀", + titlefontsize = 10, + top_margin = 0mm, +) + +p_tot = plot( + p1, + p2, + p3, + p4, + heatmap( + ones(200, 200); + xgrid = false, + ygrid = false, + aspectratio = 1, + xlims = (0, 200), + ylims = (0, 200), + xshowaxis = false, + yshowaxis = false, + colorbar = :none, + color = :grays, + ), + pc1, + pc2, + pc3; + layout = (2, 4), + aspectratio = 1, + top_margin = 0mm, + bottom_margin = 0mm, +) + +savefig(p_tot, "./paper/fig2.pdf") diff --git a/paper/paper.bib b/paper/paper.bib index cf63471..f1d9a49 100644 --- a/paper/paper.bib +++ b/paper/paper.bib @@ -237,7 +237,7 @@ @misc{blumenthal_mrireconbart_2022 copyright = {BSD 3-Clause "New" or "Revised" License, Open Access}, shorttitle = {mrirecon/bart}, url = {https://zenodo.org/record/592960}, - abstract = {Changes: new tools: epg ictv sim reconet onehotenc measure mnist multicfl morphop fovshift epg: EPG simulations ictv: infimal convolution TV (experimental) sim: Bloch simulations reconet: deep learning reconstruction (MoDL, VarNET) onehotenc: transform onehotencoded data to integer encoded measure: compute MSE, SSIM, PSNR mnist: simple mnist network for demonstration multicfl: combine/split cfl files morphop: morphological operations fovshift: retrospectively shift the FOV pics: tensorflow loss pics: select wavelet type pics: TGV/ICTV regularization (experimental) moba: scaling parameters via command-line parameters moba: various numerical fixes moba: time timensions moba: support for ADMM moba: Bloch model recon with tests moba: multi-gpu option moba: scaling of TV derivatives phantom: NIST phantom and others phantom: rotation for TUBE and NIST phantom geometries phantom: rectangle geometry traj: flag for oversampled trajectory traj: 3D uniform (half-sphere) trajectory sim: output partial derivatives twixread: updates for VD/VE versions ismrmd: support for reading XML metadata estdelay: more generic regarding un-/centered trajectories tgv: for rof / tgv denoising rmfreq: support for contrast changes and coilwise contrast mobafit: T2 and diffusion fit ecalib: make number of iterations for orthiter configurable nufft: warn about incorrectly scaled trajectories nlinv: fix noncart ENLIVE pics: fix basis pursuit pics when using a sampling pattern (\#285) fakeksp: fix output argument python interface: allow multiple files with the correct option string python interface: faster write\_cfl library: New md functions: zacos, zsinh, zcosh, pdf\_gauss, zmaxnorm, zcorr, tenmul library: framework for neural networks library: optimization algorithms: SGD, Adam, Adadelta, iPALM library: linear operators: scale, zconj, zreal, permute, padding, repmat, scaled\_sum library: many new non-linear operators library: support for using different wavelet type library: nlop\_attach, for attaching a random data pointer library: nlop reshape function library: allow forward nufft with toeplitz library: tgv/ictv + multiple penalties + 3D generic: radial DCF examples generic: Add support for multi cfl generic: POSIX shared memory files generic: improve determinism generic: improved parallelization and multi-gpu support generic: add better support for use as shared libray generic: bart for centos 7 generic: Fix Fedora Packages generic: Windows support by MSYS2 generic: support for linking with cudann generic: support for linking with tensorlfow generic: add pythontest to github action generic: LTO test builts many other bug fixes and improvements}, + abstract = {Changes: new tools: epg ictv sim reconet onehotenc measure mnist multicfl morphop fov_shift epg: EPG simulations ictv: infimal convolution TV (experimental) sim: Bloch simulations reconet: deep learning reconstruction (MoDL, VarNET) onehotenc: transform onehotencoded data to integer encoded measure: compute MSE, SSIM, PSNR mnist: simple mnist network for demonstration multicfl: combine/split cfl files morphop: morphological operations fov_shift: retrospectively shift the FOV pics: tensorflow loss pics: select wavelet type pics: TGV/ICTV regularization (experimental) moba: scaling parameters via command-line parameters moba: various numerical fixes moba: time timensions moba: support for ADMM moba: Bloch model recon with tests moba: multi-gpu option moba: scaling of TV derivatives phantom: NIST phantom and others phantom: rotation for TUBE and NIST phantom geometries phantom: rectangle geometry traj: flag for oversampled trajectory traj: 3D uniform (half-sphere) trajectory sim: output partial derivatives twixread: updates for VD/VE versions ismrmd: support for reading XML metadata estdelay: more generic regarding un-/centered trajectories tgv: for rof / tgv denoising rmfreq: support for contrast changes and coilwise contrast mobafit: T2 and diffusion fit ecalib: make number of iterations for orthiter configurable nufft: warn about incorrectly scaled trajectories nlinv: fix noncart ENLIVE pics: fix basis pursuit pics when using a sampling pattern (\#285) fakeksp: fix output argument python interface: allow multiple files with the correct option string python interface: faster write\_cfl library: New md functions: zacos, zsinh, zcosh, pdf\_gauss, zmaxnorm, zcorr, tenmul library: framework for neural networks library: optimization algorithms: SGD, Adam, Adadelta, iPALM library: linear operators: scale, zconj, zreal, permute, padding, repmat, scaled\_sum library: many new non-linear operators library: support for using different wavelet type library: nlop\_attach, for attaching a random data pointer library: nlop reshape function library: allow forward nufft with toeplitz library: tgv/ictv + multiple penalties + 3D generic: radial DCF examples generic: Add support for multi cfl generic: POSIX shared memory files generic: improve determinism generic: improved parallelization and multi-gpu support generic: add better support for use as shared libray generic: bart for centos 7 generic: Fix Fedora Packages generic: Windows support by MSYS2 generic: support for linking with cudann generic: support for linking with tensorlfow generic: add pythontest to github action generic: LTO test builts many other bug fixes and improvements}, urldate = {2023-01-24}, publisher = {Zenodo}, author = {Blumenthal, Moritz and Holme, Christian and Roeloffs, Volkert and Rosenzweig, Sebastian and Schaten, Philip and Scholand, Nick and Tamir, Jon and Xiaoqing Wang and Uecker, Martin}, diff --git a/recon/CartesianRecon.jl b/recon/CartesianRecon.jl deleted file mode 100644 index cca8ed6..0000000 --- a/recon/CartesianRecon.jl +++ /dev/null @@ -1,151 +0,0 @@ -using HDF5, MRIReco, LinearAlgebra, DSP, FourierTools, ROMEO, MRIGradients, MRIFiles, MRIFieldmaps - -include("../utils/fieldMapEstimator.jl") - -## Dictionary of frequently changed parameters -# include("ReconConfig.jl") - -## Load data files - -# Echo times for field map raw data, in ms -TE1 = paramsGeneral[:mapTEs_ms][1] -TE2 = paramsGeneral[:mapTEs_ms][2] - -@info "Loading Data Files" - -b0FileName = paramsGeneral[:fullPathMapScan]; - -# filename for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) -processedFileName = paramsGeneral[:fullPathProcessedMapScan] - -if paramsGeneral[:doProcessMapScan] - - # Set the data file name (Change this for your own system) - dataFileCartesian = ISMRMRDFile(b0FileName) - - # read in the raw data from the ISMRMRD file into a RawAcquisitionData object - r = RawAcquisitionData(dataFileCartesian) - - # does not change anything... - # r.params["reconFOV"] = [230, 230, 2] - - # Preprocess Data and save! - preprocessCartesianData(r::RawAcquisitionData, true; fname = processedFileName) - -end - -# Load preprocessed data! -dataFileNew = ISMRMRDFile(processedFileName) - - -rawDataNew = RawAcquisitionData(dataFileNew) -acqDataCartesian= AcquisitionData(rawDataNew, estimateProfileCenter=true) - -# Define coils and slices -nCoils = size(acqDataCartesian.kdata[1],2) -nSlices = numSlices(acqDataCartesian) - - -sliceIndexArray = getSliceOrder(nSlices, isSliceInterleaved = true) -# shift FOV to middle :) -#TODO: in MRIReco v0.7, try: correctOffset(acqDataCartesian, [0 -20 0]) -shiftksp!(acqDataCartesian, paramsGeneral[:fovShift]) # amount of FOV shift; in unit of number of voxels in [x,y] direction - -#changeFOV!(acqDataCartesian,[1.5,1.5]) - -## Don't have to recalculate sense maps for both scans but possibly it could make a -# difference in Diffusion scans - -@info "Calculating Sense Maps" - -# from reading docstring, min thresholding -senseCartesian = espirit(acqDataCartesian,(6,6),30,eigThresh_1=0.01, eigThresh_2=0.9) - -# from Lars (7T spirals) -#senseCartesian = espirit(acqDataCartesian,(6,6),30,eigThresh_1=0.02, eigThresh_2=0.98) -# from Alexander (Phantom?) -#senseCartesian = espirit(acqDataCartesian,(4,4),12,eigThresh_1=0.01, eigThresh_2=0.98) - -# normalize for consistency with saving/loading and better ranges of reconstruction values -senseCartesian /= maximum(abs.(senseCartesian)) -sensitivity = senseCartesian - -res_x = fieldOfView(acqDataCartesian)[1]./ size(sensitivity)[1] -res_y = fieldOfView(acqDataCartesian)[2]./ size(sensitivity)[2] -res_z = fieldOfView(acqDataCartesian)[3] .*(1 + paramsGeneral[:sliceDistanceFactor_percent]./100.0) # for 2D only, since FOV[3] is slice thickness then, but gap has to be observed -resolution_mm = (res_x, res_y, res_z) - -# save SENSE maps -if paramsGeneral[:doSaveRecon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load - # TODO: use correct slice order everywhere, e.g., when saving/loading maps for spiral recon - saveMap(paramsGeneral[:fullPathSaveSense], sensitivity[:,:,sliceIndexArray,:], resolution_mm; doSplitPhase=true) -end - -## Parameter dictionary definition for reconstruction - -@info "Setting Parameters" -paramsCartesian = Dict{Symbol,Any}() # instantiate dictionary -paramsCartesian[:reco] = "multiCoil" # choose multicoil reconstruction -paramsCartesian[:reconSize] = (acqDataCartesian.encodingSize[1],acqDataCartesian.encodingSize[2]) # set recon size to be the same as encoded size -paramsCartesian[:regularization] = "L2" # choose regularization for the recon algorithm -paramsCartesian[:λ] = 1.e-2 # recon parameter (there may be more of these, need to dig into code to identify them for solvers other than cgnr) -paramsCartesian[:iterations] = paramsGeneral[:nReconIterations] # number of CG iterations -paramsCartesian[:solver] = "cgnr" # inverse problem solver method -paramsCartesian[:solverInfo] = SolverInfo(ComplexF32,store_solutions=false) # turn on store solutions if you want to see the reconstruction convergence (uses more memory) -paramsCartesian[:senseMaps] = ComplexF32.(sensitivity) # set sensitivity map array - - -## Call the reconstruction function - -@info "Performing Reconstruction" -@time cartesianReco = reconstruction(acqDataCartesian,paramsCartesian) - -# save Map recon (multi-echo etc.) -if paramsGeneral[:doSaveRecon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load - saveMap(paramsGeneral[:fullPathSaveMapRecon], cartesianReco.data[:,:,sliceIndexArray,:,:,:], resolution_mm; doSplitPhase=true) -end - -## Calculate B0 maps from the acquired images (if two TEs) -@info "Calculating B0 Maps" -slices = 1:length(sliceIndexArray) -b0Maps = zeros(200,200,15) -b0Method = "2D_2008" # Can be "Simple","2D_2008" or "3D_2020" (How do we incorporate this into the recon demo?) - -if b0Method == "2D_2008" - - b0Maps = estimateB0Maps(cartesianReco.data,slices,TE1,TE2,true; β = paramsGeneral[:b0mapSmoothBeta], reltol = 1e-4) - -elseif b0Method == "3D_2020" - - niter = 100 # usually good enough - - for i = 1:15 - - (b0Maps[:,:,i],times,out) = b0map(reshape(cartesianReco.data[:,:,i,:,1,1],(200,200,1,2))./maximum(abs.(cartesianReco.data)), [TE1/1000,TE2/1000]; order=2, l2b=-6, gamma_type=:PR, niter=niter, precon=:diag, track=false) - - end - - b0Maps = 2*pi*b0Maps - -end - -# save B0 map -if paramsGeneral[:doSaveRecon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load - saveMap(paramsGeneral[:fullPathSaveB0], b0Maps[:,:,sliceIndexArray], resolution_mm; doNormalize = false) # no normalization, we want absolute values for offres maps -end - - -if paramsGeneral[:doPlotRecon] - @info "Plotting Cartesian Results (Sensitivity Maps and B0 Maps)" - # plotSenseMaps(sensitivity,nCoils) - plotlyjs() - plotReconstruction(cartesianReco[:,:,:,1], 1:size(cartesianReco,3), b0Maps, isSliceInterleaved = false, rotateAngle = 180) -end - -# cleanup unused file -if !paramsGeneral[:doSaveProcessedMapScan] && paramsGeneral[:doProcessMapScan] - rm(processedFileName) -end - -@info "Successfully Completed CartesianReconstruction" - diff --git a/recon/CartesianRecon_Mar2022_Human.jl b/recon/CartesianRecon_Mar2022_Human.jl deleted file mode 100644 index 8cfa4fc..0000000 --- a/recon/CartesianRecon_Mar2022_Human.jl +++ /dev/null @@ -1,140 +0,0 @@ -using HDF5, MRIReco, LinearAlgebra, DSP, FourierTools, ROMEO, MRIGradients - -include("../utils/Utils.jl") -include("../utils/fieldMapEstimator.jl") - -## Dictionary of frequently changed parameters -include("ReconConfig.jl") - -## Load data files - -# Echo times for field map raw data, in ms -TE1 = paramsGeneral[:mapTEs_ms][1] -TE2 = paramsGeneral[:mapTEs_ms][2] - -@info "Loading Data Files" - -b0FileName = paramsGeneral[:fullPathMapScan]; - -# filename for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) -processedFileName = paramsGeneral[:fullPathProcessedMapScan] - -if paramsGeneral[:doProcessMapScan] - - # Set the data file name (Change this for your own system) - dataFileCartesian = ISMRMRDFile(b0FileName) - - # read in the raw data from the ISMRMRD file into a RawAcquisitionData object - r = RawAcquisitionData(dataFileCartesian) - - # does not change anything... - # r.params["reconFOV"] = [230, 230, 2] - - # Preprocess Data and save! - preprocessCartesianData(r::RawAcquisitionData, true; fname = processedFileName) - -end - -# Load preprocessed data! -dataFileNew = ISMRMRDFile(processedFileName) - - -rawDataNew = RawAcquisitionData(dataFileNew) -acqDataCartesian= AcquisitionData(rawDataNew, estimateProfileCenter=true) - -# Define coils and slices -nCoils = size(acqDataCartesian.kdata[1],2) -nSlices = numSlices(acqDataCartesian) - - -sliceIndexArray = getSliceOrder(nSlices, isSliceInterleaved = true) -# shift FOV to middle :) -#TODO: in MRIReco v0.7, try: correctOffset(acqDataCartesian, [0 -20 0]) -shiftksp!(acqDataCartesian, paramsGeneral[:fovShift]) -#changeFOV!(acqDataCartesian,[1.5,1.5]) - -## Don't have to recalculate sense maps for both scans but possibly it could make a -# difference in Diffusion scans - -@info "Calculating Sense Maps" - -# from reading docstring, min thresholding -senseCartesian = espirit(acqDataCartesian,(6,6),30,eigThresh_1=0.01, eigThresh_2=0.9) - -# from Lars (7T spirals) -#senseCartesian = espirit(acqDataCartesian,(6,6),30,eigThresh_1=0.02, eigThresh_2=0.98) -# from Alexander (Phantom?) -#senseCartesian = espirit(acqDataCartesian,(4,4),12,eigThresh_1=0.01, eigThresh_2=0.98) - -# normalize for consistency with saving/loading and better ranges of reconstruction values -senseCartesian /= maximum(abs.(senseCartesian)) -sensitivity = senseCartesian - -resolution_mm = fieldOfView(acqDataCartesian)./size(sensitivity)[1:3] -resolution_mm[3] = fieldOfView(acqDataCartesian)[3] *(1 + paramsGeneral[:sliceDistanceFactor_percent]/100.0); # for 2D only, since FOV[3] is slice thickness then, but gap has to be observed - - -# save SENSE maps -if paramsGeneral[:doSaveRecon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load - # TODO: use correct slice order everywhere, e.g., when saving/loading maps for spiral recon - saveMap(paramsGeneral[:fullPathSaveSense], sensitivity[:,:,sliceIndexArray,:], resolution_mm; doSplitPhase=true) -end - -plotSenseMaps(sensitivity,nCoils) - -#acqDataCartesian.traj[1].cartesian = false -#acqDataCartesian.traj[2].cartesian = false -## Parameter dictionary definition for reconstruction - -@info "Setting Parameters" -paramsCartesian = Dict{Symbol,Any}() # instantiate dictionary -paramsCartesian[:reco] = "multiCoil" # choose multicoil reconstruction - -# TODO: make recon size and FOV variable! -paramsCartesian[:reconSize] = (acqDataCartesian.encodingSize[1],acqDataCartesian.encodingSize[2]) # set recon size to be the same as encoded size -paramsCartesian[:regularization] = "L2" # choose regularization for the recon algorithm -paramsCartesian[:λ] = 1.e-2 # recon parameter (there may be more of these, need to dig into code to identify them for solvers other than cgnr) -paramsCartesian[:iterations] = paramsGeneral[:nReconIterations] # number of CG iterations -paramsCartesian[:solver] = "cgnr" # inverse problem solver method -paramsCartesian[:solverInfo] = SolverInfo(ComplexF32,store_solutions=false) # turn on store solutions if you want to see the reconstruction convergence (uses more memory) -paramsCartesian[:senseMaps] = ComplexF32.(sensitivity) # set sensitivity map array - - -## Call the reconstruction function - -@info "Performing Reconstruction" -@time cartesianReco = reconstruction(acqDataCartesian,paramsCartesian) - -# save Map recon (multi-echo etc.) -if paramsGeneral[:doSaveRecon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load - saveMap(paramsGeneral[:fullPathSaveMapRecon], cartesianReco.data[:,:,sliceIndexArray,:,:,:], resolution_mm; doSplitPhase=true) -end - -## Calculate B0 maps from the acquired images (if two TEs) - -slices = 1:length(sliceIndexArray) - -@info "Calculating B0 Maps" -# b0Maps = calculateB0Maps(cartesianReco.data,slices, TE1, TE2) -b0Maps = estimateB0Maps(cartesianReco.data,slices,TE1,TE2,true; β = paramsGeneral[:b0mapSmoothBeta], reltol = 1e-4) - -# save B0 map -if paramsGeneral[:doSaveRecon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load - saveMap(paramsGeneral[:fullPathSaveB0], b0Maps[:,:,sliceIndexArray], resolution_mm; doNormalize = false) # no normalization, we want absolute values for offres maps -end - - -if paramsGeneral[:doPlotRecon] - @info "Plotting Cartesian Results (Sensitivity Maps and B0 Maps)" - pygui(true) # Leave this code till we need plotting. - # plotSenseMaps(sensitivity,nCoils) - plotReconstruction(cartesianReco[:,:,:,1], 1:size(cartesianReco,3), b0Maps, isSliceInterleaved = true, rotateAngle = 270) -end - -# cleanup unused file -if !paramsGeneral[:doSaveProcessedMapScan] && paramsGeneral[:doProcessMapScan] - rm(processedFileName) -end - -@info "Successfully Completed CartesianReconstruction" - diff --git a/recon/CartesianRecon_Mar2022_Phantom.jl b/recon/CartesianRecon_Mar2022_Phantom.jl deleted file mode 100644 index d73ba39..0000000 --- a/recon/CartesianRecon_Mar2022_Phantom.jl +++ /dev/null @@ -1,98 +0,0 @@ -using HDF5, MRIReco, LinearAlgebra, DSP, FourierTools, ROMEO, MRIGradients - -include("../utils/Utils.jl") - -## function to calculate the B0 maps from the two images with different echo times -# TODO have the b0 map calculation be capable of handling variable echo times -function calculateB0Maps(imData,slices,echoTime1,echoTime2) - - # b0Maps = mapslices(x -> rotl90(x),ROMEO.unwrap(angle.(imData[:,:,slices,2,1].*conj(imData[:,:,slices,1,1]))),dims=(1,2))./((7.38-4.92)/1000) - b0Maps = mapslices(x -> x, ROMEO.unwrap(angle.(imData[:,:,slices,2,1].*conj(imData[:,:,slices,1,1]))),dims=(1,2))./((echoTime2-echoTime1)/1000) - -end - -## Load data files - -makeMaps = true -saveMaps = true - -# Echo times for field map raw data, in ms -TE1 = 4.92 -TE2 = 7.38 - -@info "Loading Data Files" - -b0FileName = "D:\\OneDrive - UHN\\MRP-SPIDI\\SPIDI\\data\\SPIDI_0007\\Phantom\\dat\\field_map_83_2.h5" -processedFileName = "D:\\OneDrive - UHN\\MRP-SPIDI\\SPIDI\\data\\SPIDI_0007\\Phantom\\dat\\processedCartesianData.h5" # filename for preprocessed data - -if makeMaps - - # Set the data file name (Change this for your own system) - dataFileCartesian = ISMRMRDFile(b0FileName) - - # read in the raw data from the ISMRMRD file into a RawAcquisitionData object - r = RawAcquisitionData(dataFileCartesian) - - # Preprocess Data and save! - preprocessCartesianData(r::RawAcquisitionData, saveMaps; fname = processedFileName) - -end - -# removeOversampling!(r) - -# Load preprocessed data! -dataFileNew = ISMRMRDFile(processedFileName) -rawDataNew = RawAcquisitionData(dataFileNew) -acqDataCartesian= AcquisitionData(rawDataNew, estimateProfileCenter=true) - -# Define coils and slices -nCoils = size(acqDataCartesian.kdata[1],2) -nSlices = numSlices(acqDataCartesian) - -## Don't have to recalculate sense maps for both scans but possibly it could make a -# difference in Diffusion scans - -@info "Calculating Sense Maps" -senseCartesian = espirit(acqDataCartesian,(4,4),10,eigThresh_1=0.01, eigThresh_2=0.98) -sensitivity = senseCartesian - -plotSenseMaps(sensitivity,nCoils) - -## Parameter dictionary definition for reconstruction - -@info "Setting Parameters" -paramsCartesian = Dict{Symbol,Any}() # instantiate dictionary -paramsCartesian[:reco] = "multiCoil" # choose multicoil reconstruction -paramsCartesian[:reconSize] = (acqDataCartesian.encodingSize[1],acqDataCartesian.encodingSize[2]) # set recon size to be the same as encoded size -paramsCartesian[:regularization] = "L2" # choose regularization for the recon algorithm -paramsCartesian[:λ] = 1.e-2 # recon parameter (there may be more of these, need to dig into code to identify them for solvers other than cgnr) -paramsCartesian[:iterations] = 20 # number of CG iterations -paramsCartesian[:solver] = "cgnr" # inverse problem solver method -paramsCartesian[:solverInfo] = SolverInfo(ComplexF32,store_solutions=false) # turn on store solutions if you want to see the reconstruction convergence (uses more memory) -paramsCartesian[:senseMaps] = ComplexF32.(sensitivity) # set sensitivity map array -# paramsCartesian[:correctionMap] = ComplexF32.(-1im.*b0Maps) -## Defining array mapping from acquisition number to slice number (indexArray[slice = 1:9] = [acquisitionNumbers]) - -# indexArray = [5,1,6,2,7,3,8,4,9] # for 9 slice phantom -indexArray = [8,1,9,2,10,3,11,4,12,5,13,6,14,7,15] # for 15 slice phantom -#indexArray = 1 # for 1 slice phantom - -## Call the reconstruction function - -@info "Performing Reconstruction" -cartesianReco = reconstruction(acqDataCartesian,paramsCartesian) - -## Calculate B0 maps from the acquired images (if two TEs) - -slices = 1:length(indexArray) - -@info "Calculating B0 Maps" -# b0Maps = calculateB0Maps(cartesianReco.data,slices, TE1, TE2) -b0Maps = estimateB0Maps(cartesianReco.data,slices,TE1,TE2,0.00001,true) - -@info "Plotting Cartesian Results (Sensitivity Maps and B0 Maps) \n" -pygui(true) # Leave this code till we need plotting. -# plotSenseMaps(sensitivity,nCoils) -plotReconstruction(cartesianReco[:,:,:,1], 1:size(cartesianReco,3), b0Maps, isSliceInterleaved = true, rotateAngle = 270) - -@info "Successfully Completed CartesianReconstruction" diff --git a/recon/ReconConfig.jl b/recon/ReconConfig.jl deleted file mode 100644 index 423fbba..0000000 --- a/recon/ReconConfig.jl +++ /dev/null @@ -1,135 +0,0 @@ -## This ReconConfig.jl file describes all reconstruction parameters, as well as data locations and selections for an iterative non-Cartesian reconstruction that relies -# on an external reference scan (Cartesian) to estimate calibration maps (coil sensitivities, B0 maps) - -using Dates - -paramsGeneral = Dict{Symbol,Any}() - -## General options for recon script -paramsGeneral[:doLoadMaps] = true # if true, reloads B0/SENSE maps instead of recalculating -paramsGeneral[:doSaveRecon] = true # if true, saves reconstruction and all auxiliary image data (maps) as NIfTI files -paramsGeneral[:doPlotRecon] = false # if true, plots intermediate debugging and output recon figures (needs graphics, not recommended in multi-thread mode due to PyPlot) -paramsGeneral[:doProcessMapScan] = true # if true, compute sensitivity and B0 maps from reconstructed Cartesian scan -paramsGeneral[:doSaveProcessedMapScan] = false; # save ISMRMD file of preprocessed Cartesian data (before recon) - -## Reconstruction Parameters -# update time stamp for new recon, otherwise keep fixed, will create a new recon/ directory -#paramsGeneral[:reconId] = Dates.format(Dates.now(), "yyyy-mm-dd_HH_MM_SS") # recon ID is reconId -# paramsGeneral[:reconId] = "2022-10-20_09_07_07" -paramsGeneral[:reconId] = "v999"; -paramsGeneral[:doCorrectWithB0map] = true -paramsGeneral[:doCorrectWithGIRFkxyz] = true -paramsGeneral[:doCorrectWithGIRFk0] = true - -paramsGeneral[:nVirtualCoils] = 8; -paramsGeneral[:doCoilCompression] = false; -paramsGeneral[:fovShift] = [0, -10]; # Unit: number of voxels - -## Scan parameters, Additional acquisition information, e.g., slice distance etc. -paramsGeneral[:sliceDistanceFactor_percent] = 000 # 400 - -#Total number of ADC points BEFORE the rewinder at the end of the spiral readout. For gradient 508, use 15655 (out of 16084); for gradient 511, use 15445 (out of 15624). -paramsGeneral[:numADCSamples] = 15655 # 15504 -# Matrix size of the reconstructed image. For gradient 508 with all 4 interleaves, use 200 for high resolution image; otherwise consider using 112 or 84 for a lower resolution. The FOV is 220 mm for both gradients 508 and 511. -paramsGeneral[:reconSize] = (200, 200) #(112, 112) #(200, 200) -paramsGeneral[:nReconIterations] = 20; # number of recon iterations (for both Cartesian and Spiral recon) -paramsGeneral[:b0mapSmoothBeta] = 0.1 # for estimateB0Maps, * `β` - Regularization parameter controlling roughness penalty (larger = smoother, default 5e-4) -paramsGeneral[:doNormalizeRecon] = false # set max abs to 1 -paramsGeneral[:scalingFactorSaveRecon] = 1.0e9 # 1 # typical range of recon intensities is 1e-7, rescale when saving, e.g., to 0...1000 roughly for fMRI analysis - -# Data selector -# Choose diffusion direction; starting from 0 (b=0) to the total number in MDDW protocol, e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs) -# boolean isCalledFromReconLoopGlobal is true, if this RunReconLoop is active -# If isCalledFromReconLoopGlobal is false or not defined, the data selector needs to be defined here. -if !(@isdefined isCalledFromReconLoopGlobal) || !isCalledFromReconLoopGlobal - global selector = Dict{Symbol,Any}() - selector[:avg] = 1 - selector[:seg] = 1 - selector[:dif] = 0 -end - - -## Data parameters (Path handling, data/results locations etc.) -# UHN work -# paramsGeneral[:pathProject] = "C:\\Users\\Lars Kasper\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" -# Laptop home, one drive sync -# paramsGeneral[:pathProject] = "C:\\Users\\kasperla\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" -# Gadgetron Server -# laptop home, external drive -# paramsGeneral[:pathData] = "e:\\SPIDI\\data\\SPIDI_0007\\Phantom\\rawdata" -paramsGeneral[:pathProject] = "/home/kasperl/SPIDI" - -# SPIDI_0011 - -## Paths (user-dependent) -paramsGeneral[:pathData] = joinpath("/home/wuz/spiralDiffusion/", "SPIDI_0011") -paramsGeneral[:pathGradients] = joinpath(paramsGeneral[:pathProject], "data", "SPIDI_0007", "gradients") -paramsGeneral[:pathResults] = joinpath(paramsGeneral[:pathProject], "results", "SPIDI_0011") -paramsGeneral[:pathGIRF] = joinpath(paramsGeneral[:pathProject], "code", "GIRFReco", "data", "GIRF", "GIRF_ISMRM2022") -paramsGeneral[:pathSaveRecon] = joinpath(paramsGeneral[:pathResults], "recon", paramsGeneral[:reconId]) - -## Files (user-dependent) - -# Map scan file (Cartesian multi-echo file) -paramsGeneral[:fileNameMapScan] = "meas_MID00075_FID14968_GRE_FieldMap_DualEcho_2mm.mrd" -paramsGeneral[:mapTEs_ms] = [4.92, 7.38] - -paramsGeneral[:fileNameGIRF] = ["2021Nov_PosNeg_Gx.mat", "2021Nov_PosNeg_Gy.mat", "2021Nov_PosNeg_Gz.mat"] - - # File name for the spiral gradient - # multi-il (high-res 1.1mm) gradient file 508, single interleaf (low-res 2.6mm) gradient file 511 - paramsGeneral[:fileNameGradient] = joinpath("508", "gradients.txt") - -# non-Cartesian (Spiral) scan file: MDDW 6 -# paramsGeneral[:fileNameScan]=["meas_MID00083_FID14976_diffSpiral_508_Intl0_b2k_4Avg.mrd"] -# paramsGeneral[:nDiffusionDirections] = 6 - -# non-Cartesian (Spiral) scan file: MDDW30 -paramsGeneral[:fileNameScan]=["meas_MID00085_FID14978_diffSpiral_508_Intl0_b1000_30d.mrd"] -paramsGeneral[:nDiffusionDirections] = 30 - - - - -## Final, Automatic operations (dependent on previous sections, usually no need to change) - -paramsGeneral[:fullPathGradient] = joinpath(paramsGeneral[:pathGradients], paramsGeneral[:fileNameGradient]) - -# NOTE: If loaded from other reconId, this path might differ -paramsGeneral[:pathLoadMaps] = joinpath(paramsGeneral[:pathResults], "recon", paramsGeneral[:reconId]) - -# . makes join elementwise, i.e,. every file name (in array) with the same path -paramsGeneral[:fullPathGIRF] = joinpath.(paramsGeneral[:pathGIRF], paramsGeneral[:fileNameGIRF]) - -paramsGeneral[:fullPathMapScan] = joinpath(paramsGeneral[:pathData], paramsGeneral[:fileNameMapScan]) -# . makes join elementwise, i.e,. every file name (in array) with the same path -paramsGeneral[:fullPathScan] = joinpath.(paramsGeneral[:pathData], paramsGeneral[:fileNameScan]) - -# filename for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) -paramsGeneral[:fileNameProcessedMapScan] = "processedCartesianData.h5" -paramsGeneral[:fullPathProcessedMapScan] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameProcessedMapScan]) - -paramsGeneral[:fileNameSaveMapRecon] = splitext(paramsGeneral[:fileNameMapScan])[1] * "_reconmap.nii" -paramsGeneral[:fileNameSaveSense] = splitext(paramsGeneral[:fileNameMapScan])[1] * "_sensemap.nii" -paramsGeneral[:fileNameSaveB0] = splitext(paramsGeneral[:fileNameMapScan])[1] * "_b0map.nii" - -if isa(paramsGeneral[:fileNameScan], AbstractVector) - # for multiple files, concatenate recon name from scan file names, e.g., 508_124_2_508_126_2_508_128_2_508_130_2_recon.nii - paramsGeneral[:fileNameSaveRecon] = join([(x[1] * "_") for x in splitext.(paramsGeneral[:fileNameScan])]) * "dif$(selector[:dif])_" * "itl$(selector[:seg])_" * "avg$(selector[:avg])_" * "recon.nii" -else - # otherwise, just concat _recon.nii to file name - paramsGeneral[:fileNameSaveRecon] = splitext(paramsGeneral[:fileNameScan])[1] * "_recon.nii" -end - -paramsGeneral[:fullPathSaveRecon] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveRecon] ) -paramsGeneral[:fullPathSaveMapRecon] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveMapRecon] ) -paramsGeneral[:fullPathSaveSense] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveSense] ) -paramsGeneral[:fullPathSaveB0] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveB0] ) - -if ~ispath(paramsGeneral[:pathSaveRecon]) - mkpath(paramsGeneral[:pathSaveRecon]) -end - -# copies this config file to the recon path for later checks of parameter functions -cp("recon/ReconConfig.jl", joinpath(paramsGeneral[:pathSaveRecon], "ReconConfig.jl"); force = true) - diff --git a/recon/ReconConfig_SPIDI_0007.jl b/recon/ReconConfig_SPIDI_0007.jl deleted file mode 100644 index 8738345..0000000 --- a/recon/ReconConfig_SPIDI_0007.jl +++ /dev/null @@ -1,162 +0,0 @@ -## This ReconConfig.jl file describes all reconstruction parameters, as well as data locations and selections for an iterative non-Cartesian reconstruction that relies -# on an external reference scan (Cartesian) to estimate calibration maps (coil sensitivities, B0 maps) - -using Dates - -paramsGeneral = Dict{Symbol,Any}() - -## General options for recon script -paramsGeneral[:doLoadMaps] = false # if true, reloads B0/SENSE maps instead of recalculating -paramsGeneral[:doSaveRecon] = true # if true, saves reconstruction and all auxiliary image data (maps) as NIfTI files -paramsGeneral[:doPlotRecon] = true # if true, plots intermediate debugging and output recon figures (needs graphics, not recommended in multi-thread mode due to PyPlot) -paramsGeneral[:doProcessMapScan] = true # if true, compute sensitivity and B0 maps from reconstructed Cartesian scan -paramsGeneral[:doSaveProcessedMapScan] = false; # save ISMRMD file of preprocessed Cartesian data (before recon) - -## Reconstruction Parameters -# update time stamp for new recon, otherwise keep fixed, will create a new recon/ directory -#paramsGeneral[:reconId] = Dates.format(Dates.now(), "yyyy-mm-dd_HH_MM_SS") # recon ID is reconId -# paramsGeneral[:reconId] = "2022-10-20_09_07_07" -paramsGeneral[:reconId] = "v6"; -paramsGeneral[:doCorrectWithB0map] = true -paramsGeneral[:doCorrectWithGIRFkxyz] = true -paramsGeneral[:doCorrectWithGIRFk0] = true - -paramsGeneral[:nVirtualCoils] = 8; -paramsGeneral[:doCoilCompression] = false; -paramsGeneral[:fovShift] = [0, -20]; # Unit: number of voxels - -## Scan parameters, Additional acquisition information, e.g., slice distance etc. -paramsGeneral[:sliceDistanceFactor_percent] = 400 # 000 - -#Total number of ADC points BEFORE the rewinder at the end of the spiral readout. For gradient 508, use 15655 (out of 16084); for gradient 511, use 15445 (out of 15624). -paramsGeneral[:numADCSamples] = 15655 # 15504 -# Matrix size of the reconstructed image. For gradient 508 with all 4 interleaves, use 200 for high resolution image; otherwise consider using 112 or 84 for a lower resolution. The FOV is 220 mm for both gradients 508 and 511. -paramsGeneral[:reconSize] = [200, 200,1] #(112, 112) #(200, 200) -paramsGeneral[:nReconIterations] = 20; # number of recon iterations (for both Cartesian and Spiral recon) -paramsGeneral[:b0mapSmoothBeta] = 0.1 # for estimateB0Maps, * `β` - Regularization parameter controlling roughness penalty (larger = smoother, default 5e-4) -paramsGeneral[:doNormalizeRecon] = false # set max abs to 1 -paramsGeneral[:scalingFactorSaveRecon] = 1.0e9 # 1 # typical range of recon intensities is 1e-7, rescale when saving, e.g., to 0...1000 roughly for fMRI analysis - -# Data selector -# Choose diffusion direction; starting from 0 (b=0) to the total number in MDDW protocol, e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs) -# boolean isCalledFromReconLoopGlobal is true, if this RunReconLoop is active -# If isCalledFromReconLoopGlobal is false or not defined, the data selector needs to be defined here. -if !(@isdefined isCalledFromReconLoopGlobal) || !isCalledFromReconLoopGlobal - global selector = Dict{Symbol,Any}() - selector[:avg] = 1 - selector[:seg] = 1 - selector[:dif] = 0 -end - - -## Data parameters (Path handling, data/results locations etc.) -# UHN work -# paramsGeneral[:pathProject] = "C:\\Users\\Lars Kasper\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" -# Laptop home, one drive sync -# paramsGeneral[:pathProject] = "C:\\Users\\kasperla\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" -# Gadgetron Server -# laptop home, external drive -# paramsGeneral[:pathData] = "e:\\SPIDI\\data\\SPIDI_0007\\Phantom\\rawdata" -#paramsGeneral[:pathProject] = "/home/kasperl/SPIDI" -paramsGeneral[:pathProject] = "/srv/data/ajaffray/TORONTO_COLLAB" - -# SPIDI_0011 - -## Paths (user-dependent) -paramsGeneral[:pathData] = joinpath(paramsGeneral[:pathProject], "data", "SPIDI_0007", "Human", "dat") -paramsGeneral[:pathGradients] = joinpath(paramsGeneral[:pathProject], "data", "SPIDI_0007", "gradients") -paramsGeneral[:pathResults] = joinpath(paramsGeneral[:pathProject], "results", "SPIDI_0007", "Human") -paramsGeneral[:pathGIRF] = joinpath(paramsGeneral[:pathProject], "code", "GIRFReco", "data", "GIRF", "GIRF_ISMRM2022") -paramsGeneral[:pathSaveRecon] = joinpath(paramsGeneral[:pathResults], "recon", paramsGeneral[:reconId]) - -## Files (user-dependent) - -# Map scan file (Cartesian multi-echo file) -paramsGeneral[:fileNameMapScan] = "field_map_132_2.h5" -paramsGeneral[:mapTEs_ms] = [4.92, 7.38] - -paramsGeneral[:fileNameGIRF] = ["2021Nov_PosNeg_Gx.mat", "2021Nov_PosNeg_Gy.mat", "2021Nov_PosNeg_Gz.mat"] - - # File name for the spiral gradient - # multi-il (high-res 1.1mm) gradient file 508, single interleaf (low-res 2.6mm) gradient file 511 - paramsGeneral[:fileNameGradient] = joinpath("508", "gradients.txt") - -# non-Cartesian (Spiral) scan file: MDDW 6 -# paramsGeneral[:fileNameScan]=["meas_MID00083_FID14976_diffSpiral_508_Intl0_b2k_4Avg.mrd"] -# paramsGeneral[:nDiffusionDirections] = 6 - -# non-Cartesian (Spiral) scan file: MDDW30 -# For single interleave data, use this section - # startIndexIntlv = 1 # Should always be 1 for single-interleave data. - # fname_spiralIntlv = "511_134_2.h5" # Gradient 511, b = 300, 10 diff directions - # fname_spiralIntlv = "511_136_2.h5" # Gradient 511, b = 700, 30 diff directions - # fname_spiralIntlv = "511_138_2.h5" # Gradient 511, b = 2500, 64 diff directions - # fname_spiralIntlv = "508_140_2.h5" # Gradient 508, interleave 0, b = 300, 10 diff directions - # fname_spiralIntlv = "508_142_2.h5" # Gradient 508, interleave 0, b = 700, 30 diff directions - # fname_spiralIntlv = "508_144_2.h5" # Gradient 508, interleave 0, b = 2500, 64 diff directions - -# Multi-interleave data, needs all 4 file names, but will only read the corresponding one. - #fname_spiralIntlv0 = "508_124_2.h5" # Gradient 508, interleave 0, b = 2000, 6 diff directions, 4 averages - #fname_spiralIntlv1 = "508_126_2.h5" # Gradient 508, interleave 1, b = 2000, 6 diff directions, 4 averages - #fname_spiralIntlv2 = "508_128_2.h5" # Gradient 508, interleave 2, b = 2000, 6 diff directions, 4 averages - #fname_spiralIntlv3 = "508_130_2.h5" # Gradient 508, interleave 3, b = 2000, 6 diff directions, 4 averages -# paramsGeneral[:fileNameScan]=["508_124_2.h5", "508_126_2.h5", "508_128_2.h5", "508_130_2.h5"] -# paramsGeneral[:nDiffusionDirections] = 6 -# SPIDI_0007 MDDW 6 -paramsGeneral[:fileNameScan]=["508_124_2.h5"] -paramsGeneral[:nDiffusionDirections] = 6 - -# NODDI -# paramsGeneral[:fileNameScan]=["508_140_2.h5"] -# paramsGeneral[:nDiffusionDirections] = 10 -# paramsGeneral[:fileNameScan]=["508_142_2.h5"] -# paramsGeneral[:nDiffusionDirections] = 30 -# paramsGeneral[:fileNameScan]=["508_144_2.h5"] -# paramsGeneral[:nDiffusionDirections] = 64 -# paramsGeneral[:fileNameScan]=["508_124_2.h5"] - - - - -## Final, Automatic operations (dependent on previous sections, usually no need to change) - -paramsGeneral[:fullPathGradient] = joinpath(paramsGeneral[:pathGradients], paramsGeneral[:fileNameGradient]) - -# NOTE: If loaded from other reconId, this path might differ -paramsGeneral[:pathLoadMaps] = joinpath(paramsGeneral[:pathResults], "recon", paramsGeneral[:reconId]) - -# . makes join elementwise, i.e,. every file name (in array) with the same path -paramsGeneral[:fullPathGIRF] = joinpath.(paramsGeneral[:pathGIRF], paramsGeneral[:fileNameGIRF]) - -paramsGeneral[:fullPathMapScan] = joinpath(paramsGeneral[:pathData], paramsGeneral[:fileNameMapScan]) -# . makes join elementwise, i.e,. every file name (in array) with the same path -paramsGeneral[:fullPathScan] = joinpath.(paramsGeneral[:pathData], paramsGeneral[:fileNameScan]) - -# filename for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) -paramsGeneral[:fileNameProcessedMapScan] = "processedCartesianData.h5" -paramsGeneral[:fullPathProcessedMapScan] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameProcessedMapScan]) - -paramsGeneral[:fileNameSaveMapRecon] = splitext(paramsGeneral[:fileNameMapScan])[1] * "_reconmap.nii" -paramsGeneral[:fileNameSaveSense] = splitext(paramsGeneral[:fileNameMapScan])[1] * "_sensemap.nii" -paramsGeneral[:fileNameSaveB0] = splitext(paramsGeneral[:fileNameMapScan])[1] * "_b0map.nii" - -if isa(paramsGeneral[:fileNameScan], AbstractVector) - # for multiple files, concatenate recon name from scan file names, e.g., 508_124_2_508_126_2_508_128_2_508_130_2_recon.nii - paramsGeneral[:fileNameSaveRecon] = join([(x[1] * "_") for x in splitext.(paramsGeneral[:fileNameScan])]) * "dif$(selector[:dif])_" * "itl$(selector[:seg])_" * "avg$(selector[:avg])_" * "recon.nii" -else - # otherwise, just concat _recon.nii to file name - paramsGeneral[:fileNameSaveRecon] = splitext(paramsGeneral[:fileNameScan])[1] * "_recon.nii" -end - -paramsGeneral[:fullPathSaveRecon] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveRecon] ) -paramsGeneral[:fullPathSaveMapRecon] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveMapRecon] ) -paramsGeneral[:fullPathSaveSense] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveSense] ) -paramsGeneral[:fullPathSaveB0] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveB0] ) - -if ~ispath(paramsGeneral[:pathSaveRecon]) - mkpath(paramsGeneral[:pathSaveRecon]) -end - -# copies this config file to the recon path for later checks of parameter functions -cp("recon/ReconConfig.jl", joinpath(paramsGeneral[:pathSaveRecon], "ReconConfig.jl"); force = true) - diff --git a/recon/ReconConfig_SPIDI_0009.jl b/recon/ReconConfig_SPIDI_0009.jl deleted file mode 100644 index ed025be..0000000 --- a/recon/ReconConfig_SPIDI_0009.jl +++ /dev/null @@ -1,135 +0,0 @@ -## This ReconConfig.jl file describes all reconstruction parameters, as well as data locations and selections for an iterative non-Cartesian reconstruction that relies -# on an external reference scan (Cartesian) to estimate calibration maps (coil sensitivities, B0 maps) - -using Dates - -paramsGeneral = Dict{Symbol,Any}() - -## General options for recon script -paramsGeneral[:doLoadMaps] = true # if true, reloads B0/SENSE maps instead of recalculating -paramsGeneral[:doSaveRecon] = true # if true, saves reconstruction and all auxiliary image data (maps) as NIfTI files -paramsGeneral[:doPlotRecon] = false # if true, plots intermediate debugging and output recon figures (needs graphics, not recommended in multi-thread mode due to PyPlot) -paramsGeneral[:doProcessMapScan] = true # if true, compute sensitivity and B0 maps from reconstructed Cartesian scan -paramsGeneral[:doSaveProcessedMapScan] = false; # save ISMRMD file of preprocessed Cartesian data (before recon) - -## Reconstruction Parameters -# update time stamp for new recon, otherwise keep fixed, will create a new recon/ directory -#paramsGeneral[:reconId] = Dates.format(Dates.now(), "yyyy-mm-dd_HH_MM_SS") # recon ID is reconId -# paramsGeneral[:reconId] = "2022-10-20_09_07_07" -paramsGeneral[:reconId] = "v2"; -paramsGeneral[:doCorrectWithB0map] = true -paramsGeneral[:doCorrectWithGIRFkxyz] = true -paramsGeneral[:doCorrectWithGIRFk0] = true - -paramsGeneral[:nVirtualCoils] = 8; -paramsGeneral[:doCoilCompression] = false; -paramsGeneral[:fovShift] = [0, 0];# [0, -20]; # Unit: number of voxels - -## Scan parameters, Additional acquisition information, e.g., slice distance etc. -paramsGeneral[:sliceDistanceFactor_percent] = 000 # 400 - -#Total number of ADC points BEFORE the rewinder at the end of the spiral readout. For gradient 508, use 15655 (out of 16084); for gradient 511, use 15445 (out of 15624). -paramsGeneral[:numADCSamples] = 15445 # 15655 -# Matrix size of the reconstructed image. For gradient 508 with all 4 interleaves, use 200 for high resolution image; otherwise consider using 112 or 84 for a lower resolution. The FOV is 220 mm for both gradients 508 and 511. -paramsGeneral[:reconSize] = (112, 112) #(112, 112) #(200, 200) -paramsGeneral[:nReconIterations] = 20; # number of recon iterations (for both Cartesian and Spiral recon) -paramsGeneral[:b0mapSmoothBeta] = 0.1 # for estimateB0Maps, * `β` - Regularization parameter controlling roughness penalty (larger = smoother, default 5e-4) -paramsGeneral[:doNormalizeRecon] = false # set max abs to 1 -paramsGeneral[:scalingFactorSaveRecon] = 1.0e9 # 1 # typical range of recon intensities is 1e-7, rescale when saving, e.g., to 0...1000 roughly for fMRI analysis - -# Data selector -# Choose diffusion direction; starting from 0 (b=0) to the total number in MDDW protocol, e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs) -# boolean isCalledFromReconLoopGlobal is true, if this RunReconLoop is active -# If isCalledFromReconLoopGlobal is false or not defined, the data selector needs to be defined here. -if !(@isdefined isCalledFromReconLoopGlobal) || !isCalledFromReconLoopGlobal - global selector = Dict{Symbol,Any}() - selector[:avg] = 1 - selector[:seg] = 1 - selector[:dif] = 0 -end - - -## Data parameters (Path handling, data/results locations etc.) -# UHN work -# paramsGeneral[:pathProject] = "C:\\Users\\Lars Kasper\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" -# Laptop home, one drive sync -# paramsGeneral[:pathProject] = "C:\\Users\\kasperla\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" -# Gadgetron Server -# laptop home, external drive -# paramsGeneral[:pathData] = "e:\\SPIDI\\data\\SPIDI_0007\\Phantom\\rawdata" -paramsGeneral[:pathProject] = "/home/kasperl/SPIDI" - -# SPIDI_0009 - -## Paths (user-dependent) -paramsGeneral[:pathData] = joinpath(paramsGeneral[:pathProject], "data", "SPIDI_0009", "Phantom2", "dat") -paramsGeneral[:pathGradients] = joinpath(paramsGeneral[:pathProject], "data", "SPIDI_0009", "Phantom2", "gradients") -paramsGeneral[:pathResults] = joinpath(paramsGeneral[:pathProject], "results", "SPIDI_0009", "Phantom2") -paramsGeneral[:pathGIRF] = joinpath(paramsGeneral[:pathProject], "code", "GIRFReco", "data", "GIRF", "GIRF_ISMRM2022") -paramsGeneral[:pathSaveRecon] = joinpath(paramsGeneral[:pathResults], "recon", paramsGeneral[:reconId]) - -## Files (user-dependent) - -# Map scan file (Cartesian multi-echo file) -paramsGeneral[:fileNameMapScan] = "meas_MID00189_FID14253_GRE_FieldMap_DualEcho_2mm.mrd" -paramsGeneral[:mapTEs_ms] = [4.92, 7.38] - -paramsGeneral[:fileNameGIRF] = ["2021Nov_PosNeg_Gx.mat", "2021Nov_PosNeg_Gy.mat", "2021Nov_PosNeg_Gz.mat"] - - # File name for the spiral gradient - # multi-il (high-res 1.1mm) gradient file 508, single interleaf (low-res 2.6mm) gradient file 511 - paramsGeneral[:fileNameGradient] = joinpath("511", "gradients.txt") - -# non-Cartesian (Spiral) scan file: MDDW 6 -# paramsGeneral[:fileNameScan]=["meas_MID00083_FID14976_diffSpiral_508_Intl0_b2k_4Avg.mrd"] -# paramsGeneral[:nDiffusionDirections] = 6 - -# non-Cartesian (Spiral) scan file: MDDW30 -paramsGeneral[:fileNameScan]=["meas_MID00193_FID14255_diffSpiral_511_b700_1Avg.mrd"] -paramsGeneral[:nDiffusionDirections] = 6 - - - - -## Final, Automatic operations (dependent on previous sections, usually no need to change) - -paramsGeneral[:fullPathGradient] = joinpath(paramsGeneral[:pathGradients], paramsGeneral[:fileNameGradient]) - -# NOTE: If loaded from other reconId, this path might differ -paramsGeneral[:pathLoadMaps] = joinpath(paramsGeneral[:pathResults], "recon", paramsGeneral[:reconId]) - -# . makes join elementwise, i.e,. every file name (in array) with the same path -paramsGeneral[:fullPathGIRF] = joinpath.(paramsGeneral[:pathGIRF], paramsGeneral[:fileNameGIRF]) - -paramsGeneral[:fullPathMapScan] = joinpath(paramsGeneral[:pathData], paramsGeneral[:fileNameMapScan]) -# . makes join elementwise, i.e,. every file name (in array) with the same path -paramsGeneral[:fullPathScan] = joinpath.(paramsGeneral[:pathData], paramsGeneral[:fileNameScan]) - -# filename for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) -paramsGeneral[:fileNameProcessedMapScan] = "processedCartesianData.h5" -paramsGeneral[:fullPathProcessedMapScan] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameProcessedMapScan]) - -paramsGeneral[:fileNameSaveMapRecon] = splitext(paramsGeneral[:fileNameMapScan])[1] * "_reconmap.nii" -paramsGeneral[:fileNameSaveSense] = splitext(paramsGeneral[:fileNameMapScan])[1] * "_sensemap.nii" -paramsGeneral[:fileNameSaveB0] = splitext(paramsGeneral[:fileNameMapScan])[1] * "_b0map.nii" - -if isa(paramsGeneral[:fileNameScan], AbstractVector) - # for multiple files, concatenate recon name from scan file names, e.g., 508_124_2_508_126_2_508_128_2_508_130_2_recon.nii - paramsGeneral[:fileNameSaveRecon] = join([(x[1] * "_") for x in splitext.(paramsGeneral[:fileNameScan])]) * "dif$(selector[:dif])_" * "itl$(selector[:seg])_" * "avg$(selector[:avg])_" * "recon.nii" -else - # otherwise, just concat _recon.nii to file name - paramsGeneral[:fileNameSaveRecon] = splitext(paramsGeneral[:fileNameScan])[1] * "_recon.nii" -end - -paramsGeneral[:fullPathSaveRecon] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveRecon] ) -paramsGeneral[:fullPathSaveMapRecon] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveMapRecon] ) -paramsGeneral[:fullPathSaveSense] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveSense] ) -paramsGeneral[:fullPathSaveB0] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveB0] ) - -if ~ispath(paramsGeneral[:pathSaveRecon]) - mkpath(paramsGeneral[:pathSaveRecon]) -end - -# copies this config file to the recon path for later checks of parameter functions -cp("recon/ReconConfig.jl", joinpath(paramsGeneral[:pathSaveRecon], "ReconConfig.jl"); force = true) - diff --git a/recon/ReconConfig_SPIDI_0011.jl b/recon/ReconConfig_SPIDI_0011.jl deleted file mode 100644 index 423fbba..0000000 --- a/recon/ReconConfig_SPIDI_0011.jl +++ /dev/null @@ -1,135 +0,0 @@ -## This ReconConfig.jl file describes all reconstruction parameters, as well as data locations and selections for an iterative non-Cartesian reconstruction that relies -# on an external reference scan (Cartesian) to estimate calibration maps (coil sensitivities, B0 maps) - -using Dates - -paramsGeneral = Dict{Symbol,Any}() - -## General options for recon script -paramsGeneral[:doLoadMaps] = true # if true, reloads B0/SENSE maps instead of recalculating -paramsGeneral[:doSaveRecon] = true # if true, saves reconstruction and all auxiliary image data (maps) as NIfTI files -paramsGeneral[:doPlotRecon] = false # if true, plots intermediate debugging and output recon figures (needs graphics, not recommended in multi-thread mode due to PyPlot) -paramsGeneral[:doProcessMapScan] = true # if true, compute sensitivity and B0 maps from reconstructed Cartesian scan -paramsGeneral[:doSaveProcessedMapScan] = false; # save ISMRMD file of preprocessed Cartesian data (before recon) - -## Reconstruction Parameters -# update time stamp for new recon, otherwise keep fixed, will create a new recon/ directory -#paramsGeneral[:reconId] = Dates.format(Dates.now(), "yyyy-mm-dd_HH_MM_SS") # recon ID is reconId -# paramsGeneral[:reconId] = "2022-10-20_09_07_07" -paramsGeneral[:reconId] = "v999"; -paramsGeneral[:doCorrectWithB0map] = true -paramsGeneral[:doCorrectWithGIRFkxyz] = true -paramsGeneral[:doCorrectWithGIRFk0] = true - -paramsGeneral[:nVirtualCoils] = 8; -paramsGeneral[:doCoilCompression] = false; -paramsGeneral[:fovShift] = [0, -10]; # Unit: number of voxels - -## Scan parameters, Additional acquisition information, e.g., slice distance etc. -paramsGeneral[:sliceDistanceFactor_percent] = 000 # 400 - -#Total number of ADC points BEFORE the rewinder at the end of the spiral readout. For gradient 508, use 15655 (out of 16084); for gradient 511, use 15445 (out of 15624). -paramsGeneral[:numADCSamples] = 15655 # 15504 -# Matrix size of the reconstructed image. For gradient 508 with all 4 interleaves, use 200 for high resolution image; otherwise consider using 112 or 84 for a lower resolution. The FOV is 220 mm for both gradients 508 and 511. -paramsGeneral[:reconSize] = (200, 200) #(112, 112) #(200, 200) -paramsGeneral[:nReconIterations] = 20; # number of recon iterations (for both Cartesian and Spiral recon) -paramsGeneral[:b0mapSmoothBeta] = 0.1 # for estimateB0Maps, * `β` - Regularization parameter controlling roughness penalty (larger = smoother, default 5e-4) -paramsGeneral[:doNormalizeRecon] = false # set max abs to 1 -paramsGeneral[:scalingFactorSaveRecon] = 1.0e9 # 1 # typical range of recon intensities is 1e-7, rescale when saving, e.g., to 0...1000 roughly for fMRI analysis - -# Data selector -# Choose diffusion direction; starting from 0 (b=0) to the total number in MDDW protocol, e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs) -# boolean isCalledFromReconLoopGlobal is true, if this RunReconLoop is active -# If isCalledFromReconLoopGlobal is false or not defined, the data selector needs to be defined here. -if !(@isdefined isCalledFromReconLoopGlobal) || !isCalledFromReconLoopGlobal - global selector = Dict{Symbol,Any}() - selector[:avg] = 1 - selector[:seg] = 1 - selector[:dif] = 0 -end - - -## Data parameters (Path handling, data/results locations etc.) -# UHN work -# paramsGeneral[:pathProject] = "C:\\Users\\Lars Kasper\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" -# Laptop home, one drive sync -# paramsGeneral[:pathProject] = "C:\\Users\\kasperla\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" -# Gadgetron Server -# laptop home, external drive -# paramsGeneral[:pathData] = "e:\\SPIDI\\data\\SPIDI_0007\\Phantom\\rawdata" -paramsGeneral[:pathProject] = "/home/kasperl/SPIDI" - -# SPIDI_0011 - -## Paths (user-dependent) -paramsGeneral[:pathData] = joinpath("/home/wuz/spiralDiffusion/", "SPIDI_0011") -paramsGeneral[:pathGradients] = joinpath(paramsGeneral[:pathProject], "data", "SPIDI_0007", "gradients") -paramsGeneral[:pathResults] = joinpath(paramsGeneral[:pathProject], "results", "SPIDI_0011") -paramsGeneral[:pathGIRF] = joinpath(paramsGeneral[:pathProject], "code", "GIRFReco", "data", "GIRF", "GIRF_ISMRM2022") -paramsGeneral[:pathSaveRecon] = joinpath(paramsGeneral[:pathResults], "recon", paramsGeneral[:reconId]) - -## Files (user-dependent) - -# Map scan file (Cartesian multi-echo file) -paramsGeneral[:fileNameMapScan] = "meas_MID00075_FID14968_GRE_FieldMap_DualEcho_2mm.mrd" -paramsGeneral[:mapTEs_ms] = [4.92, 7.38] - -paramsGeneral[:fileNameGIRF] = ["2021Nov_PosNeg_Gx.mat", "2021Nov_PosNeg_Gy.mat", "2021Nov_PosNeg_Gz.mat"] - - # File name for the spiral gradient - # multi-il (high-res 1.1mm) gradient file 508, single interleaf (low-res 2.6mm) gradient file 511 - paramsGeneral[:fileNameGradient] = joinpath("508", "gradients.txt") - -# non-Cartesian (Spiral) scan file: MDDW 6 -# paramsGeneral[:fileNameScan]=["meas_MID00083_FID14976_diffSpiral_508_Intl0_b2k_4Avg.mrd"] -# paramsGeneral[:nDiffusionDirections] = 6 - -# non-Cartesian (Spiral) scan file: MDDW30 -paramsGeneral[:fileNameScan]=["meas_MID00085_FID14978_diffSpiral_508_Intl0_b1000_30d.mrd"] -paramsGeneral[:nDiffusionDirections] = 30 - - - - -## Final, Automatic operations (dependent on previous sections, usually no need to change) - -paramsGeneral[:fullPathGradient] = joinpath(paramsGeneral[:pathGradients], paramsGeneral[:fileNameGradient]) - -# NOTE: If loaded from other reconId, this path might differ -paramsGeneral[:pathLoadMaps] = joinpath(paramsGeneral[:pathResults], "recon", paramsGeneral[:reconId]) - -# . makes join elementwise, i.e,. every file name (in array) with the same path -paramsGeneral[:fullPathGIRF] = joinpath.(paramsGeneral[:pathGIRF], paramsGeneral[:fileNameGIRF]) - -paramsGeneral[:fullPathMapScan] = joinpath(paramsGeneral[:pathData], paramsGeneral[:fileNameMapScan]) -# . makes join elementwise, i.e,. every file name (in array) with the same path -paramsGeneral[:fullPathScan] = joinpath.(paramsGeneral[:pathData], paramsGeneral[:fileNameScan]) - -# filename for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) -paramsGeneral[:fileNameProcessedMapScan] = "processedCartesianData.h5" -paramsGeneral[:fullPathProcessedMapScan] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameProcessedMapScan]) - -paramsGeneral[:fileNameSaveMapRecon] = splitext(paramsGeneral[:fileNameMapScan])[1] * "_reconmap.nii" -paramsGeneral[:fileNameSaveSense] = splitext(paramsGeneral[:fileNameMapScan])[1] * "_sensemap.nii" -paramsGeneral[:fileNameSaveB0] = splitext(paramsGeneral[:fileNameMapScan])[1] * "_b0map.nii" - -if isa(paramsGeneral[:fileNameScan], AbstractVector) - # for multiple files, concatenate recon name from scan file names, e.g., 508_124_2_508_126_2_508_128_2_508_130_2_recon.nii - paramsGeneral[:fileNameSaveRecon] = join([(x[1] * "_") for x in splitext.(paramsGeneral[:fileNameScan])]) * "dif$(selector[:dif])_" * "itl$(selector[:seg])_" * "avg$(selector[:avg])_" * "recon.nii" -else - # otherwise, just concat _recon.nii to file name - paramsGeneral[:fileNameSaveRecon] = splitext(paramsGeneral[:fileNameScan])[1] * "_recon.nii" -end - -paramsGeneral[:fullPathSaveRecon] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveRecon] ) -paramsGeneral[:fullPathSaveMapRecon] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveMapRecon] ) -paramsGeneral[:fullPathSaveSense] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveSense] ) -paramsGeneral[:fullPathSaveB0] = joinpath(paramsGeneral[:pathSaveRecon], paramsGeneral[:fileNameSaveB0] ) - -if ~ispath(paramsGeneral[:pathSaveRecon]) - mkpath(paramsGeneral[:pathSaveRecon]) -end - -# copies this config file to the recon path for later checks of parameter functions -cp("recon/ReconConfig.jl", joinpath(paramsGeneral[:pathSaveRecon], "ReconConfig.jl"); force = true) - diff --git a/recon/SpiralRecon_Cleaned.jl b/recon/SpiralRecon_Cleaned.jl deleted file mode 100644 index f66c8cf..0000000 --- a/recon/SpiralRecon_Cleaned.jl +++ /dev/null @@ -1,144 +0,0 @@ -using HDF5, MRIReco, LinearAlgebra, Dierckx, DSP, FourierTools, ImageBinarization, ImageEdgeDetection, MRIGradients - -# %% -# Include tools and reader functions for running the spiral reconstruction recipe -# Note: the files are found relative of the location of the folder, not the -# environment current folder -include("../io/GradientReader.jl") -include("../utils/Utils.jl") - -## Executing Cartesian recon from which B0/sensitivity maps have been computed -@info "Running CartesianRecon to retrieve maps (senseCartesian and b0Maps)" -include("../recon/CartesianRecon.jl") - -## Set figures to be unlocked from the window (i.e use matplotlib backend with controls) - -## Choose Slice (can be [single number] OR [1,2,3,4,5,6,7,8,9] -sliceChoice = [1,2,3,4,5,6,7,8,9] # UNCOMMENT FOR MULTISLICE -# sliceChoice = [7] # UNCOMMENT FOR SINGLESLICE (SLICES 3, 7 and 8 are good examples) -diffusionDirection = 0 # CAN BE FROM 0 (b=0) to 6 (1-6 are 6 directions of b=1000) - -## Spiral Reconstruction Recipe Starts Here -@info "Starting Spiral Reconstruction Pipeline" - -## Default to single slice selection. Choose multi-slice only if computer is capable. -multiSlice = false - -if length(sliceChoice) > 1 - multiSlice = true -end - -if !multiSlice - selectedSlice = sliceChoice -else - selectedSlice = sort(vec(sliceChoice)) -end - -## The ISMRMRD File contains more than one excitation, so we choose the set corresponding to the b-value 0 images -excitationList = vec(20:2:36) .+ diffusionDirection * 18 # DATASET SPECIFIC INDEXING -sliceSelection = excitationList[selectedSlice] - -@info "Slice Chosen = $selectedSlice: \n \nExcitations Chosen = $excitationList " - -# adjustmentDict is the dictionary that sets the information for correct data loading and trajectory and data synchronization -adjustmentDict = Dict{Symbol,Any}() -adjustmentDict[:reconSize] = (200,200) -adjustmentDict[:interleave] = 1 -adjustmentDict[:slices] = 1 -adjustmentDict[:coils] = 40 -adjustmentDict[:numSamples] = 15475 -adjustmentDict[:delay] = 0.00000 # naive delay correction - -adjustmentDict[:interleaveDataFileNames] = ["data/Spirals/523_96_2.h5","data/Spirals/523_98_2.h5", "data/Spirals/523_100_2.h5", "data/Spirals/523_102_2.h5"] -adjustmentDict[:trajFilename] = "data/Gradients/gradients523.txt" -adjustmentDict[:excitations] = sliceSelection - -adjustmentDict[:doMultiInterleave] = true -adjustmentDict[:doOddInterleave] = true -adjustmentDict[:numInterleaves] = 4 - -adjustmentDict[:singleSlice] = !multiSlice - -@info "Using Parameters:\n\nreconSize = $(adjustmentDict[:reconSize]) \n interleave = $(adjustmentDict[:interleave]) \n slices = $(adjustmentDict[:slices]) \n coils = $(adjustmentDict[:coils]) \n numSamples = $(adjustmentDict[:numSamples])\n\n" -# define recon size and parameters for data loading - -## Convert raw to AcquisitionData - -@info "Merging interleaves and reading data \n" -acqDataImaging = mergeRawInterleaves(adjustmentDict) - -@info "Loading Gradient Impulse Response Functions \n" -## Load GIRFs! -gK1 = loadGirf(1,1) -gAk1 = GirfApplier(gK1, 42577478) - -@info "Correcting For GIRF \n" -applyGIRF!(acqDataImaging, gAk1) - -# Load K₀ GIRF -gK0 = loadGirf(0,1) -gAk0 = GirfApplier(gK0, 42577478) - -@info "Correcting For k₀ \n" -applyK0!(acqDataImaging, gAk0) - -## Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) -checkAcquisitionNodes!(acqDataImaging) - -doCoilCompression = false - -nvcoils = size(sensitivity,4) - -## Do coil compression to make recon faster -if doCoilCompression - nvcoils = 8 - acqDataImaging, senseCartesian = geometricCC_2d(acqDataImaging,senseCartesian,nvcoils) -end - -## Sense Map loading -@info "Recalculating Sense Maps \n" -senseCartesian = espirit(acqDataCartesian,(4,4),12,(acqDataImaging.encodingSize[1],acqDataImaging.encodingSize[2]),eigThresh_1=0.01, eigThresh_2=0.98, match_acq_size = false) -sensitivity = mapslices(rotl90,senseCartesian,dims=[1,2]) - -# ## Plot the sensitivity maps of each coil -@info "Plotting SENSE Maps \n" -plotSenseMaps(sensitivity,nvcoils,sliceIndex=6) - -## B0 Maps (Assumes we have a B0 map from gradient echo scan named b0) -@info "Validating B0 Maps \n" -resizedB0 = mapslices(x->imresize(x,(acqDataImaging.encodingSize[1], acqDataImaging.encodingSize[2])), b0Maps, dims=[1,2]) - -## Define Parameter Dictionary for use with reconstruction -# CAST TO ComplexF32 if you're using current MRIReco.jl - -@info "Setting Parameters \n" -params = Dict{Symbol,Any}() -params[:reco] = "multiCoil" -params[:reconSize] = adjustmentDict[:reconSize] -params[:regularization] = "L2" -params[:λ] = 1e-2 # CHANGE THIS TO GET BETTER OR WORSE RECONSTRUCTION RESULTS -params[:iterations] = 20 -params[:solver] = "cgnr" -params[:solverInfo] = SolverInfo(ComplexF32,store_solutions=false) -params[:senseMaps] = ComplexF32.(sensitivity[:,:,selectedSlice,:]) -params[:correctionMap] = ComplexF32.(-1im.*resizedB0[:,:,selectedSlice]) - -## Call to reconstruction -@info "Performing Reconstruction \n" -@time reco = reconstruction(acqDataImaging,params) - -#totalRecon = sum(abs2,reco.data,dims=5) -@info "Plotting Reconstruction \n" -plotReconstruction(reco, 1:length(selectedSlice), resizedB0[:,:,selectedSlice]) - -## Plot the image edges (feature comparison) - -# img_edges₁ = detect_edges(slice1,Canny(spatial_scale = 2.6)) -# img_edges₂ = detect_edges(slice2,Canny(spatial_scale = 2.7)) - -# imEdges = cat(img_edges₁,img_edges₂,zeros(size(img_edges₁)),dims=3) - -# figure("Edge Differences") -# PyPlot.imshow(imEdges) - -@info "Successfully Completed SpiralRecon \n" diff --git a/recon/SpiralRecon_Cleaned_Mar2022_Human.jl b/recon/SpiralRecon_Cleaned_Mar2022_Human.jl deleted file mode 100644 index a0e1a25..0000000 --- a/recon/SpiralRecon_Cleaned_Mar2022_Human.jl +++ /dev/null @@ -1,181 +0,0 @@ -using HDF5, MRIReco, LinearAlgebra, Dierckx, DSP, FourierTools, ImageBinarization, ImageEdgeDetection, MRIGradients - -# %% -# Include tools and reader functions for running the spiral reconstruction recipe -# Note: the files are found relative of the location of the folder, not the -# environment current folder -include("../io/GradientReader.jl") -include("../utils/Utils.jl") -include("../utils/shiftksp.jl") - -## Set true if we need to reload Cartesian and/or spiral data compulsively. -reloadCartesianData = true -reloadSpiralData = true -doCoilCompression = true - -## Gyromagnetic ratio, in unit of Hz -gamma = 42577478 - -## Only calculate sensitivity and B0 maps when they have not been done yet, or it's specifically required. -if reloadCartesianData || !((@isdefined senseCartesian) && (@isdefined b0Maps)) - ## Executing Cartesian recon from which B0/sensitivity maps have been computed - @info "Running CartesianRecon to retrieve maps (senseCartesian and b0Maps)" - include("CartesianRecon_Mar2022_Human.jl") -end - -## Set figures to be unlocked from the win9ow (i.e use matplotlib backend with controls) -#pygui(true) - -## Choose Slice (can be [single number] OR [1,2,3,4,5,6,7,8,9] -sliceChoice = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] # UNCOMMENT FOR MULTISLICE -# sliceChoice = [6] # UNCOMMENT FOR SINGLESLICE (SLICES 3, 7 and 8 are good examples) -diffusionDirection = 0 # CAN BE FROM 0 (b=0) to 6 (e.g. for 6 direction MDDW, 1-6 are 6 directions) - -## Spiral Reconstruction Recipe Starts Here -@info "Starting Spiral Reconstruction Pipeline" - -## Default to single slice selection. Choose multi-slice only if computer is capable. -multiSlice = false - -if length(sliceChoice) > 1 - multiSlice = true -end - -if !multiSlice - selectedSlice = sliceChoice -else - selectedSlice = sort(vec(sliceChoice)) -end - -## The ISMRMRD File contains more than one excitation, so we choose the set corresponding to the b-value 0 images -# excitationList = vec(20:2:36) .+ diffusionDirection * 9 * 2 # DATASET SPECIFIC INDEXING -excitationList = vec(32:2:62) .+ diffusionDirection * 15 * 2 # DATASET SPECIFIC INDEXING: 15 slices, starting from profile 32 -sliceSelection = excitationList[selectedSlice] - -@info "Slice Chosen = $selectedSlice: \n \nExcitations Chosen = $excitationList " - -fname_spiralIntlv1 = "data/Spirals/508_124_2.h5" -fname_spiralIntlv2 = "data/Spirals/508_126_2.h5" -fname_spiralIntlv3 = "data/Spirals/508_128_2.h5" -fname_spiralIntlv4 = "data/Spirals/508_130_2.h5" -fname_gradient = "data/Gradients/gradients508.txt" -fname_girfGx = "data/GIRF/GIRF_ISMRM2022/2021Nov_PosNeg_Gx.mat" -fname_girfGy = "data/GIRF/GIRF_ISMRM2022/2021Nov_PosNeg_Gy.mat" -fname_girfGz = "data/GIRF/GIRF_ISMRM2022/2021Nov_PosNeg_Gz.mat" - -# adjustmentDict is the dictionary that sets the information for correct data loading and trajectory and data synchronization -adjustmentDict = Dict{Symbol,Any}() -adjustmentDict[:reconSize] = (200,200) -adjustmentDict[:interleave] = 1 -adjustmentDict[:slices] = 1 -adjustmentDict[:coils] = 20 -# adjustmentDict[:numSamples] = 16084 # Total Number of ADC event, including the period of gradient rewinder -adjustmentDict[:numSamples] = 15504 # Total Number of readout before gradient rewinder -adjustmentDict[:delay] = 0.00000 # naive delay correction - -adjustmentDict[:interleaveDataFileNames] = [fname_spiralIntlv1, fname_spiralIntlv2, fname_spiralIntlv3, fname_spiralIntlv4] -adjustmentDict[:trajFilename] = fname_gradient -adjustmentDict[:excitations] = sliceSelection - -adjustmentDict[:doMultiInterleave] = true -adjustmentDict[:doOddInterleave] = true -adjustmentDict[:numInterleaves] = 4 - -adjustmentDict[:singleSlice] = !multiSlice - -# Defined recon size and parameters for data loading -@info "Using Parameters:\n\nreconSize = $(adjustmentDict[:reconSize]) \n interleave = $(adjustmentDict[:interleave]) \n slices = $(adjustmentDict[:slices]) \n coils = $(adjustmentDict[:coils]) \n numSamples = $(adjustmentDict[:numSamples])\n\n" - -## Only load data when it has not been done yet, or it's specifically required. -if reloadSpiralData || !(@isdefined acqDataImaging) - ## Convert raw to AcquisitionData - - @info "Merging interleaves and reading data \n" - acqDataImaging = mergeRawInterleaves(adjustmentDict) - - @info "Loading Gradient Impulse Response Functions \n" - ## Load GIRFs! - # Tim Wu, use new read GIRF function - #gK1 = loadGirf(1,1) - gK1 = readGIRFFile(fname_girfGx, fname_girfGy, fname_girfGz, "GIRF_FT", false) - gAk1 = GirfApplier(gK1, gamma) - - @info "Correcting For GIRF \n" - applyGIRF!(acqDataImaging, gAk1) - - # Load K₀ GIRF - # Tim Wu, use new read GIRF function - #gK0 = loadGirf(0,1) - gK0 = readGIRFFile(fname_girfGx, fname_girfGy, fname_girfGz, "b0ec_FT", true) - gAk0 = GirfApplier(gK0, gamma) - - @info "Correcting For k₀ \n" - applyK0!(acqDataImaging, gAk0) - - ## Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) - checkAcquisitionNodes!(acqDataImaging) - -end - -## Sense Map loading -@info "Recalculating Sense Maps \n" -sensitivity = espirit(acqDataCartesian,(4,4),12,adjustmentDict[:reconSize],eigThresh_1=0.01, eigThresh_2=0.98) - -# shift FOV to middle :) -shiftksp!(acqDataImaging,[0,-20]) -#changeFOV!(acqDataImaging,[1.5,1.5]) - -nvcoils = size(sensitivity,4) - -doCoilCompression = false - -## Do coil compression to make recon faster -if doCoilCompression - nvcoils = 4 - acqDataImaging, sensitivity = geometricCC_2d(acqDataImaging,sensitivity,nvcoils) -end - -# ## Plot the sensitivity maps of each coil -if paramsGeneral[:doPlotRecon] - @info "Plotting SENSE Maps" - plotSenseMaps(sensitivity,nvcoils,sliceIndex = 10) -end - -## B0 Maps (Assumes we have a B0 map from gradient echo scan named b0) -@info "Resizing B0 Maps" -resizedB0 = mapslices(x->imresize(x,adjustmentDict[:reconSize]), b0Maps, dims=[1,2]) - -## Define Parameter Dictionary for use with reconstruction -# CAST TO ComplexF32 if you're using current MRIReco.jl - -@info "Setting Parameters \n" -params = Dict{Symbol,Any}() -params[:reco] = "multiCoil" -params[:reconSize] = adjustmentDict[:reconSize] -params[:regularization] = "L2" -params[:λ] = 1e-2 # CHANGE THIS TO GET BETTER OR WORSE RECONSTRUCTION RESULTS -params[:iterations] = 20 -params[:solver] = "cgnr" -params[:solverInfo] = SolverInfo(ComplexF32,store_solutions=false) -params[:senseMaps] = ComplexF32.(sensitivity[:,:,selectedSlice,:]) -params[:correctionMap] = ComplexF32.(-1im.*resizedB0[:,:,selectedSlice]) - -## Call to reconstruction -@info "Performing Reconstruction \n" -@time reco = reconstruction(acqDataImaging,params) - -#totalRecon = sum(abs2,reco.data,dims=5) -@info "Plotting Reconstruction \n" -plotReconstruction(cartesianReco, 1:length(selectedSlice), resizedB0[:,:,selectedSlice], isSliceInterleaved = true, rotateAngle = 270) - -## Plot the image edges (feature comparison) - -# img_edges₁ = detect_edges(slice1,Canny(spatial_scale = 2.6)) -# img_edges₂ = detect_edges(slice2,Canny(spatial_scale = 2.7)) - -# imEdges = cat(img_edges₁,img_edges₂,zeros(size(img_edges₁)),dims=3) - -# figure("Edge Differences") -# imshow(imEdges) - -@info "Successfully Completed SpiralRecon \n" diff --git a/recon/SpiralRecon_Cleaned_Mar2022_Human_SingleIntlv.jl b/recon/SpiralRecon_Cleaned_Mar2022_Human_SingleIntlv.jl deleted file mode 100644 index c93f2ec..0000000 --- a/recon/SpiralRecon_Cleaned_Mar2022_Human_SingleIntlv.jl +++ /dev/null @@ -1,214 +0,0 @@ -using HDF5, MRIReco, LinearAlgebra, Dierckx, DSP, FourierTools, ImageBinarization, ImageEdgeDetection, MRIGradients - -# All data-specific recon parameters -include("ReconConfig.jl") - -## -# Include tools and reader functions for running the spiral reconstruction recipe -# Note: the files are found relative of the location of the folder, not the -# environment current folder -include("../io/GradientReader.jl") -include("../utils/Utils.jl") - -## ----------------------------- User-defined Variables -------------------------- ## - -## Set true if we need to reload raw data compulsively. -reloadSpiralData = true -reloadGIRFData = true - -# Choose Slice (can be [single number] OR [1,2,3,...]) -# Leave empty ([]) to later select all slices -sliceChoice = []; # TODO: read from ISMRMRD itself -#[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] # For multi-slice -# sliceChoice = [6] # For single-slice - - -## Gyromagnetic ratio, in unit of Hz -gamma = 42577478 - - - -## Choose diffusion direction; starting from 0 (b=0) to the total number in MDDW protocol, e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs) -diffusionDirection = selector[:dif] -idxAverage = selector[:avg] -nDiffusionDirections = paramsGeneral[:nDiffusionDirections] # TODO: Read from ISMRMRD itself - -# Which interleave to be reconstructed. For single-interleave data, it will always be set as 1; for multi-interleave data, the value set here will be used. -# For multi-interleaved data, this value is ranging from [1:TotNumIntlv] (total number of interleaves), indicating which interleave to be reconstructed -startIndexIntlv = selector[:seg] - - -## Determine to reconstruct single-interleave data, or one interleave out of multi-interleave data. -isDataSingleIntlv = isa(paramsGeneral[:fullPathScan], String) - - -## ------------------------------------------------ Calculation Starts Here ---------------------------------------------------------- ## - -if paramsGeneral[:doLoadMaps] && isfile(paramsGeneral[:fullPathSaveB0]) # # TODO ask for sense map (but split in magn/phase) - @info "Loading SENSE and B0 maps from $(paramsGeneral[:fullPathSaveSense]) and $(paramsGeneral[:fullPathSaveB0])" - # load maps, permute slice, sice files have geometric slice order - b0Maps = loadMap(paramsGeneral[:fullPathSaveB0]) - - nSlices = size(b0Maps, 3); - sliceIndexArray = getSliceOrder(nSlices, isSliceInterleaved = true) - - b0Maps = b0Maps[:,:,invperm(sliceIndexArray)] - senseCartesian = loadMap(paramsGeneral[:fullPathSaveSense]; doSplitPhase = true)[:,:,invperm(sliceIndexArray),:] -else - ## Only calculate sensitivity and B0 maps when they have not been done yet, or it's specifically required. - ## Executing Cartesian recon from which B0/sensitivity maps have been computed - @info "Running CartesianRecon to retrieve maps (senseCartesian and b0Maps)" - include("CartesianRecon_Mar2022_Human.jl") - nSlices = size(b0Maps, 3); -end - -## Set figures to be unlocked from the win9ow (i.e use matplotlib backend with controls) - -## Spiral Reconstruction Recipe Starts Here -@info "Starting Spiral Reconstruction Pipeline" - - -if isempty(sliceChoice) - sliceChoice = collect(1:nSlices) -end - -isMultiSlice = length(sliceChoice) > 1 - -if !isMultiSlice - selectedSlice = sliceChoice -else - selectedSlice = sort(vec(sliceChoice)) -end - -## The ISMRMRD File contains more than one excitation, so we choose the set corresponding to the b-value 0 images -excitationList = collect(nSlices*2 + 2 : 2 : nSlices*4) .+ diffusionDirection * nSlices * 2 .+ (idxAverage - 1) * nSlices * (nDiffusionDirections + 1) * 2 # DATASET SPECIFIC INDEXING: 15 slices, starting from profile 32 -sliceSelection = excitationList[selectedSlice] - -@info "Slice Chosen = $selectedSlice: \n \nExcitations Chosen = $excitationList " - -# adjustmentDict is the dictionary that sets the information for correct data loading and trajectory and data synchronization -adjustmentDict = Dict{Symbol,Any}() -adjustmentDict[:reconSize] = paramsGeneral[:reconSize] -adjustmentDict[:interleave] = startIndexIntlv -adjustmentDict[:slices] = 1 -adjustmentDict[:numSamples] = paramsGeneral[:numADCSamples] -adjustmentDict[:delay] = 0.00000 # naive delay correction - -adjustmentDict[:interleaveDataFileNames] = paramsGeneral[:fullPathScan] - -adjustmentDict[:trajFilename] = paramsGeneral[:fullPathGradient] -adjustmentDict[:excitations] = sliceSelection - -adjustmentDict[:doMultiInterleave] = !isDataSingleIntlv -adjustmentDict[:doOddInterleave] = false -adjustmentDict[:numInterleaves] = isDataSingleIntlv ? 1 : length(adjustmentDict[:interleaveDataFileNames]) # one interleaf per file, count files, if filenames are array of strings (not only one string) - -adjustmentDict[:singleSlice] = !isMultiSlice - -# Defined recon size and parameters for data loading -@info "Using Parameters:\n\nreconSize = $(adjustmentDict[:reconSize]) \n interleave = $(adjustmentDict[:interleave]) \n slices = $(adjustmentDict[:slices]) \n coils = $(size(senseCartesian, 4)) \n numSamples = $(adjustmentDict[:numSamples])\n\n" - -if reloadGIRFData || !(@isdefined gK1) || !(@isdefined gAK1) || !(@isdefined gK0) || !(@isdefined gAK0) - @info "Loading Gradient Impulse Response Functions" - - ## Load GIRFs (K1) - gK1 = readGIRFFile(paramsGeneral[:fullPathGIRF][1], paramsGeneral[:fullPathGIRF][2], paramsGeneral[:fullPathGIRF][3], "GIRF_FT", false) - gAk1 = GirfApplier(gK1, gamma) - - ## Load K₀ GIRF - gK0 = readGIRFFile(paramsGeneral[:fullPathGIRF][1], paramsGeneral[:fullPathGIRF][2], paramsGeneral[:fullPathGIRF][3], "b0ec_FT", true) - gAk0 = GirfApplier(gK0, gamma) -end - -## Only load data when it has not been done yet, or it's specifically required. -if reloadSpiralData || !(@isdefined acqDataImaging) - ## Convert raw to AcquisitionData - - @info "Reading spiral data and merging interleaves" - acqDataImaging = mergeRawInterleaves(adjustmentDict) - - if paramsGeneral[:doCorrectWithGIRFkxyz] - @info "Correcting For GIRF" - applyGIRF!(acqDataImaging, gAk1) - end - - if paramsGeneral[:doCorrectWithGIRFk0] - @info "Correcting For k₀" - applyK0!(acqDataImaging, gAk0) - end - - ## Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) - checkAcquisitionNodes!(acqDataImaging) - -end - -## Sense Map loading -@info "Resizing Sense Maps" - -# Resize sense maps to match encoding size of data matrix -sensitivity = mapslices(x ->imresize(x, adjustmentDict[:reconSize]), senseCartesian, dims=[1,2]) - -# Plot the sensitivity maps of each coil -@info "Plotting SENSE Maps" - -if paramsGeneral[:doPlotRecon] - plotSenseMaps(sensitivity,size(sensitivity, 4),sliceIndex = 10) -end - - -# shift FOV to middle :) -shiftksp!(acqDataImaging,paramsGeneral[:fovShift]) -#changeFOV!(acqDataImaging,[1.5,1.5]) - - -## Do coil compression to make recon faster -if paramsGeneral[:doCoilCompression] - acqDataImaging, sensitivity = geometricCC_2d(acqDataImaging,sensitivity, paramsGeneral[:nVirtualCoils]) -end - - -## B0 Maps (Assumes we have a B0 map from gradient echo scan named b0) -@info "Resizing B0 Maps" -resizedB0 = mapslices(x->imresize(x,adjustmentDict[:reconSize]), b0Maps, dims=[1,2]) - -## Define Parameter Dictionary for use with reconstruction -# CAST TO ComplexF32 if you're using current MRIReco.jl - -@info "Setting Parameters" -params = Dict{Symbol,Any}() -params[:reco] = "multiCoil" -params[:reconSize] = adjustmentDict[:reconSize] -params[:regularization] = "L2" -params[:λ] = 1e-2 # CHANGE THIS TO GET BETTER OR WORSE RECONSTRUCTION RESULTS -params[:iterations] = paramsGeneral[:nReconIterations] -params[:solver] = "cgnr" -params[:solverInfo] = SolverInfo(ComplexF32,store_solutions=false) -params[:senseMaps] = ComplexF32.(sensitivity[:,:,selectedSlice,:]) - -if paramsGeneral[:doCorrectWithB0map] - params[:correctionMap] = ComplexF32.(-1im.*resizedB0[:,:,selectedSlice]) -end - -## Call to reconstruction -@info "Performing Reconstruction" -@time reco = reconstruction(acqDataImaging,params) -#totalRecon = sum(abs2,reco.data,dims=5) - -# save Map recon (multi-echo etc.) -if paramsGeneral[:doSaveRecon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load - resolution_mm = fieldOfView(acqDataImaging)./encodingSize(acqDataImaging) - resolution_mm[3] = fieldOfView(acqDataImaging)[3] *(1 + paramsGeneral[:sliceDistanceFactor_percent]/100.0); # for 2D only, since FOV[3] is slice thickness then, but gap has to be observed - - # TODO: use slice ordering from cartesian scan directly! - nSlices = numSlices(acqDataImaging) - sliceIndexArray = getSliceOrder(nSlices, isSliceInterleaved = true) - saveMap(paramsGeneral[:fullPathSaveRecon], paramsGeneral[:scalingFactorSaveRecon]*reco.data[:,:,sliceIndexArray], resolution_mm; doSplitPhase=true, doNormalize = paramsGeneral[:doNormalizeRecon]) -end - -if paramsGeneral[:doPlotRecon] - @info "Plotting Reconstruction" - pygui(true) - plotReconstruction(reco, 1:length(selectedSlice), resizedB0[:, :, selectedSlice], figHandles=["Original Magnitude", "Original Phase", "B0"], isSliceInterleaved=true, rotateAngle=270) -end - -@info "Successfully Completed SpiralRecon" \ No newline at end of file diff --git a/recon/SpiralRecon_Cleaned_Mar2022_Phantom.jl b/recon/SpiralRecon_Cleaned_Mar2022_Phantom.jl deleted file mode 100644 index de385eb..0000000 --- a/recon/SpiralRecon_Cleaned_Mar2022_Phantom.jl +++ /dev/null @@ -1,156 +0,0 @@ -using HDF5, MRIReco, LinearAlgebra, Dierckx, DSP, FourierTools, ImageBinarization, ImageEdgeDetection, MRIGradients - -# %% -# Include tools and reader functions for running the spiral reconstruction recipe -# Note: the files are found relative of the location of the folder, not the -# environment current folder -include("../io/GradientReader.jl") -include("../utils/Utils.jl") - -## Set true if we need to reload Cartesian and/or spiral data compulsively. -reloadCartesianData = false -reloadSpiralData = true - -## Gyromagnetic ratio, in unit of Hz -gamma = 42577478 - -## Only calculate sensitivity and B0 maps when they have not been done yet, or it's specifically required. -if reloadCartesianData || !((@isdefined senseCartesian) && (@isdefined b0Maps)) - ## Executing Cartesian recon from which B0/sensitivity maps have been computed - @info "Running CartesianRecon to retrieve maps (senseCartesian and b0Maps)" - include("CartesianRecon_Mar2022_Phantom.jl") -end - -## Choose Slice (can be [single number] OR [1,2,3,4,5,6,7,8,9] -sliceChoice = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] # UNCOMMENT FOR MULTISLICE -# sliceChoice = [6] # UNCOMMENT FOR SINGLESLICE (SLICES 3, 7 and 8 are good examples) -diffusionDirection = 0 # CAN BE FROM 0 (b=0) to 6 (e.g. for 6 direction MDDW, 1-6 are 6 directions) - -reconSize = (112,112) #(200,200) - -## Spiral Reconstruction Recipe Starts Here -@info "Starting Spiral Reconstruction Pipeline" - -## Default to single slice selection. Choose multi-slice only if computer is capable. -multiSlice = true - -if length(sliceChoice) > 1 - multiSlice = true -end - -if !multiSlice - selectedSlice = sliceChoice -else - selectedSlice = sort(vec(sliceChoice)) -end - -## The ISMRMRD File contains more than one excitation, so we choose the set corresponding to the b-value 0 images -# excitationList = vec(20:2:36) .+ diffusionDirection * 9 * 2 # DATASET SPECIFIC INDEXING -excitationList = vec(32:2:62) .+ diffusionDirection * 15 * 2 # DATASET SPECIFIC INDEXING: 15 slices, starting from profile 32 -sliceSelection = excitationList[selectedSlice] - -@info "Slice Chosen = $selectedSlice: \n \nExcitations Chosen = $excitationList " - -fname_spiralIntlv1 = "data/Spirals/508_72_2.h5" -fname_spiralIntlv2 = "data/Spirals/508_74_2.h5" -fname_spiralIntlv3 = "data/Spirals/508_76_2.h5" -fname_spiralIntlv4 = "data/Spirals/508_78_2.h5" -fname_gradient = "data/Gradients/gradients508.txt" -fname_girfGx = "data/GIRF/GIRF_ISMRM2022/2021Nov_PosNeg_Gx.mat" -fname_girfGy = "data/GIRF/GIRF_ISMRM2022/2021Nov_PosNeg_Gy.mat" -fname_girfGz = "data/GIRF/GIRF_ISMRM2022/2021Nov_PosNeg_Gz.mat" - -# adjustmentDict is the dictionary that sets the information for correct data loading and trajectory and data synchronization -adjustmentDict = Dict{Symbol,Any}() -adjustmentDict[:reconSize] = reconSize -adjustmentDict[:interleave] = 1 -adjustmentDict[:slices] = 1 -adjustmentDict[:coils] = 20 -# adjustmentDict[:numSamples] = 16084 # Total Number of ADC event, including the period of gradient rewinder -adjustmentDict[:numSamples] = 15655 # Total Number of readout before gradient rewinder -adjustmentDict[:delay] = 0.00000 # naive delay correction - -adjustmentDict[:interleaveDataFileNames] = [fname_spiralIntlv1, fname_spiralIntlv2, fname_spiralIntlv3, fname_spiralIntlv4] -adjustmentDict[:trajFilename] = fname_gradient -adjustmentDict[:excitations] = sliceSelection - -adjustmentDict[:doMultiInterleave] = true -adjustmentDict[:doOddInterleave] = true -adjustmentDict[:numInterleaves] = 4 - -adjustmentDict[:singleSlice] = !multiSlice - -# Defined recon size and parameters for data loading -@info "Using Parameters:\n\nreconSize = $(adjustmentDict[:reconSize]) \n interleave = $(adjustmentDict[:interleave]) \n slices = $(adjustmentDict[:slices]) \n coils = $(adjustmentDict[:coils]) \n numSamples = $(adjustmentDict[:numSamples])\n\n" - -## Only load data when it has not been done yet, or it's specifically required. -if reloadSpiralData || !(@isdefined acqDataImaging) - ## Convert raw to AcquisitionData - - @info "Merging interleaves and reading data \n" - acqDataImaging = mergeRawInterleaves(adjustmentDict) - - @info "Loading Gradient Impulse Response Functions \n" - ## Load GIRFs! - # Tim Wu, use new read GIRF function - #gK1 = loadGirf(1,1) - gK1 = readGIRFFile(fname_girfGx, fname_girfGy, fname_girfGz, "GIRF_FT", false) - gAk1 = GirfApplier(gK1, gamma) - - @info "Correcting For GIRF \n" - applyGIRF!(acqDataImaging, gAk1) - - # Load K₀ GIRF - # Tim Wu, use new read GIRF function - #gK0 = loadGirf(0,1) - gK0 = readGIRFFile(fname_girfGx, fname_girfGy, fname_girfGz, "b0ec_FT", true) - gAk0 = GirfApplier(gK0, gamma) - - @info "Correcting For k₀ \n" - applyK0!(acqDataImaging, gAk0) - - ## Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) - checkAcquisitionNodes!(acqDataImaging) - -end - -## Sense Map loading -@info "Validating Sense Maps \n" - -# Resize sense maps to match encoding size of data matrix -sensitivity = mapslices(x ->imresize(x, (acqDataImaging.encodingSize[1],acqDataImaging.encodingSize[2])), senseCartesian, dims=[1,2]) -# sensitivity = mapslices(rotl90,sensitivity,dims=[1,2]) - -# ## Plot the sensitivity maps of each coil -@info "Plotting SENSE Maps \n" -plotSenseMaps(sensitivity,adjustmentDict[:coils]) - -## B0 Maps (Assumes we have a B0 map from gradient echo scan named b0) -@info "Resizing B0 Maps \n" -resizedB0 = mapslices(x->imresize(x,(acqDataImaging.encodingSize[1], acqDataImaging.encodingSize[2])), b0Maps, dims=[1,2]) - -## Define Parameter Dictionary for use with reconstruction -# CAST TO ComplexF32 if you're using current MRIReco.jl - -@info "Setting Parameters \n" -params = Dict{Symbol,Any}() -params[:reco] = "multiCoil" -params[:reconSize] = adjustmentDict[:reconSize] -params[:regularization] = "L2" -params[:λ] = 1e-2 # CHANGE THIS TO GET BETTER OR WORSE RECONSTRUCTION RESULTS -params[:iterations] = 20 -params[:solver] = "cgnr" -params[:solverInfo] = SolverInfo(ComplexF32,store_solutions=false) -params[:senseMaps] = ComplexF32.(sensitivity[:,:,selectedSlice,:]) -params[:correctionMap] = ComplexF32.(-1im.*resizedB0[:,:,selectedSlice]) - -## Call to reconstruction -@info "Performing Reconstruction \n" -@time reco = reconstruction(acqDataImaging,params) - -@info "Plotting Reconstruction \n" -## Set figures to be unlocked from the win9ow (i.e use matplotlib backend with controls) -pygui(true) -plotReconstruction(reco, 1:length(selectedSlice), resizedB0[:,:,selectedSlice]) - -@info "Successfully Completed SpiralRecon \n" diff --git a/recon/SpiralRecon_Cleaned_wavelet.jl b/recon/SpiralRecon_Cleaned_wavelet.jl deleted file mode 100644 index a300cd9..0000000 --- a/recon/SpiralRecon_Cleaned_wavelet.jl +++ /dev/null @@ -1,151 +0,0 @@ -using PyPlot, HDF5, MRIReco, LinearAlgebra, Dierckx, DSP, FourierTools, ImageBinarization, ImageEdgeDetection, MRIGradients - -# %% -# Include tools and reader functions for running the spiral reconstruction recipe -# Note: the files are found relative of the location of the folder, not the -# environment current folder -include("../io/GradientReader.jl") -include("../utils/Utils.jl") - -## Executing Cartesian recon from which B0/sensitivity maps have been computed -@info "Running julia_recon_cartesian to retrieve maps (senseCartesian and b0Maps)" -include("../recon/CartesianRecon.jl") - -## Set figures to be unlocked from the window (i.e use matplotlib backend with controls) -pygui(true) - -## Choose Slice (can be [single number] OR [1,2,3,4,5,6,7,8,9] -# sliceChoice = [1,2,3,4,5,6,7,8,9] # UNCOMMENT FOR MULTISLICE -sliceChoice = [3] # UNCOMMENT FOR SINGLESLICE (SLICES 3, 7 and 8 are good examples) -diffusionDirection = 0 # CAN BE FROM 0 (b=0) to 7 (1-7 are 6 directions of b=1000) - -## Spiral Reconstruction Recipe Starts Here -@info "Starting Spiral Reconstruction Pipeline" - -## Default to single slice selection. Choose multi-slice only if computer is capable. -multiSlice = false - -if length(sliceChoice) > 1 - multiSlice = true -end - -if !multiSlice - selectedSlice = sliceChoice -else - selectedSlice = sort(vec(sliceChoice)) -end - -## The ISMRMRD File contains more than one excitation, so we choose the set corresponding to the b-value 0 images -excitationList = vec(20:2:36) .+ diffusionDirection * 18 # DATASET SPECIFIC INDEXING -sliceSelection = excitationList[selectedSlice] - -@info "Slice Chosen = $selectedSlice: \n \nExcitations Chosen = $excitationList " - -# adjustmentDict is the dictionary that sets the information for correct data loading and trajectory and data synchronization -adjustmentDict = Dict{Symbol,Any}() -adjustmentDict[:reconSize] = (200,200) -adjustmentDict[:interleave] = 1 -adjustmentDict[:slices] = 1 -adjustmentDict[:coils] = 20 -adjustmentDict[:numSamples] = 15475 -adjustmentDict[:delay] = 0.00000 # naive delay correction - -adjustmentDict[:interleaveDataFileNames] = ["data/Spirals/523_96_2.h5","data/Spirals/523_98_2.h5", "data/Spirals/523_100_2.h5", "data/Spirals/523_102_2.h5"] -adjustmentDict[:trajFilename] = "data/Gradients/gradients523.txt" -adjustmentDict[:excitations] = sliceSelection - -adjustmentDict[:doMultiInterleave] = false -adjustmentDict[:doOddInterleave] = false -adjustmentDict[:numInterleaves] = 1 - -adjustmentDict[:singleSlice] = !multiSlice - -@info "Using Parameters:\n\nreconSize = $(adjustmentDict[:reconSize]) \n interleave = $(adjustmentDict[:interleave]) \n slices = $(adjustmentDict[:slices]) \n coils = $(adjustmentDict[:coils]) \n numSamples = $(adjustmentDict[:numSamples])\n\n" -# define recon size and parameters for data loading - -## Convert raw to AcquisitionData - -@info "Merging interleaves and reading data \n" -acqDataImaging = mergeRawInterleaves(adjustmentDict) - -@info "Loading Gradient Impulse Response Functions \n" -## Load GIRFs! -gK1 = loadGirf(1,1) -gAk1 = GirfApplier(gK1, 42577478) - -@info "Correcting For GIRF \n" -applyGIRF!(acqDataImaging, gAk1) - -# # Load K₀ GIRF -# gK0 = loadGirf(0,1) -# gAk0 = GirfApplier(gK0, 42577478) - -# @info "Correcting For k₀ \n" -# applyK0!(acqDataImaging, gAk0) - -## Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) -checkAcquisitionNodes!(acqDataImaging) - -## Sense Map loading -@info "Validating Sense Maps \n" - -# Resize sense maps to match encoding size of data matrix -sensitivity = mapslices(x ->imresize(x, (acqDataImaging.encodingSize[1],acqDataImaging.encodingSize[2])), senseCartesian, dims=[1,2]) -sensitivity = mapslices(rotl90,sensitivity,dims=[1,2]) - -# ## Plot the sensitivity maps of each coil -@info "Plotting SENSE Maps \n" -plotSenseMaps(sensitivity,adjustmentDict[:coils]) - -## B0 Maps (Assumes we have a B0 map from gradient echo scan named b0) -@info "Validating B0 Maps \n" -resizedB0 = mapslices(x->imresize(x,(acqDataImaging.encodingSize[1], acqDataImaging.encodingSize[2])), b0Maps, dims=[1,2]) - -## Define Parameter Dictionary for use with reconstruction -# CAST TO ComplexF32 if you're using current MRIReco.jl - -@info "Setting Parameters \n" -params = Dict{Symbol,Any}() -params[:reco] = "multiCoil" -params[:reconSize] = adjustmentDict[:reconSize] -params[:λ] = 0.01 # CHANGE THIS TO GET BETTER OR WORSE RECONSTRUCTION RESULTS -params[:solver] = "fista" -params[:solverInfo] = SolverInfo(ComplexF32,store_solutions=false) -params[:senseMaps] = ComplexF32.(sensitivity[:,:,selectedSlice,:]) -params[:correctionMap] = ComplexF32.(-1im.*resizedB0[:,:,selectedSlice]) - - -# CS reconstruction using Wavelets -params[:iterations] = 100 -params[:regularization] = "TV" -# params[:sparseTrafo] = dictOp(D,(nx,ny),(px,py),2.e-2) -params[:ρ] = 2.0 -params[:absTol] = 1.e-6 -params[:relTol] = 1.e-4 - - -# img_d = reconstruction(acqData,params) -# @info "relative error: $(norm(img-img_d)/norm(img))" - - -# For comparison, let us perform the same reconstruction as above but with a Wavelet transform - -# delete!(params, :sparseTrafo) -params[:sparseTrafo] = "Wavelet" - -## Call to reconstruction -@info "Performing Reconstruction \n" -@time reco = reconstruction(acqDataImaging,params) - -#totalRecon = sum(abs2,reco.data,dims=5) -plotReconstruction(reco, 1:length(selectedSlice), resizedB0[:,:,selectedSlice]) - -## Plot the image edges (feature comparison) - -# img_edges₁ = detect_edges(slice1,Canny(spatial_scale = 2.6)) -# img_edges₂ = detect_edges(slice2,Canny(spatial_scale = 2.7)) - -# imEdges = cat(img_edges₁,img_edges₂,zeros(size(img_edges₁)),dims=3) - -# figure("Edge Differences") -# PyPlot.imshow(imEdges) diff --git a/recon/SpiralRecon_SingleIntlv.jl b/recon/SpiralRecon_SingleIntlv.jl deleted file mode 100644 index db6d268..0000000 --- a/recon/SpiralRecon_SingleIntlv.jl +++ /dev/null @@ -1,197 +0,0 @@ -using HDF5, MRIReco, LinearAlgebra, Dierckx, DSP, FourierTools, ImageBinarization, ImageEdgeDetection, MRIGradients, FileIO, MRIFiles, MRICoilSensitivities, RegularizedLeastSquares, GIRFReco, MosaicViews, Plots, Images - -# All data-specific recon parameters -include("ReconConfig_SPIDI_0007.jl") - -## ----------------------------- User-defined Variables -------------------------- ## - -## Set true if we need to reload raw data compulsively. -reloadSpiralData = true -reloadGIRFData = true - -# Choose Slice (can be [single number] OR [1,2,3,...]) -# Leave empty ([]) or remove this line to later select all slices -sliceChoice = []; # TODO: read from ISMRMRD itself - -## Gyromagnetic ratio, in unit of Hz -gamma = 42577478 - -## Choose diffusion direction; starting from 0 (b=0) to the total number in MDDW protocol, e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs) -diffusionDirection = selector[:dif] -idxAverage = selector[:avg] -nDiffusionDirections = paramsGeneral[:nDiffusionDirections] # TODO: Read from ISMRMRD itself - -# Which interleave to be reconstructed. For single-interleave data, it will always be set as 1; for multi-interleave data, the value set here will be used. -# For multi-interleaved data, this value is ranging from [1:TotNumIntlv] (total number of interleaves), indicating which interleave to be reconstructed -startIndexIntlv = selector[:seg] - -## Determine to reconstruct single-interleave data, or one interleave out of multi-interleave data. -isDataSingleIntlv = isa(paramsGeneral[:fullPathScan], String) - - -## ------------------------------------------------ Calculation Starts Here ---------------------------------------------------------- ## - -if paramsGeneral[:doLoadMaps] && isfile(paramsGeneral[:fullPathSaveB0]) # # TODO ask for sense map (but split in magn/phase) - @info "Loading SENSE and B0 maps from $(paramsGeneral[:fullPathSaveSense]) and $(paramsGeneral[:fullPathSaveB0])" - # load maps, permute slice, sice files have geometric slice order - b0Maps = loadMap(paramsGeneral[:fullPathSaveB0]) - - nSlices = size(b0Maps, 3); - sliceIndexArray = getSliceOrder(nSlices, isSliceInterleaved = true) - - b0Maps = b0Maps[:,:,invperm(sliceIndexArray)] - senseCartesian = loadMap(paramsGeneral[:fullPathSaveSense]; doSplitPhase = true)[:,:,invperm(sliceIndexArray),:] -else - ## Only calculate sensitivity and B0 maps when they have not been done yet, or it's specifically required. - ## Executing Cartesian recon from which B0/sensitivity maps have been computed - @info "Running CartesianRecon to retrieve maps (senseCartesian and b0Maps)" - include("CartesianRecon.jl") - nSlices = size(b0Maps, 3); -end - -## Spiral Reconstruction Recipe Starts Here -@info "Starting Spiral Reconstruction Pipeline" - -if isempty(sliceChoice) || !(@isdefined sliceChoice) - sliceChoice = collect(1:nSlices) -end - -isMultiSlice = length(sliceChoice) > 1 - -if !isMultiSlice - selectedSlice = sliceChoice -else - selectedSlice = sort(vec(sliceChoice)) -end - -## The ISMRMRD File contains more than one excitation, so we choose the set corresponding to the b-value 0 images -excitationList = collect(nSlices*2 + 2 : 2 : nSlices*4) .+ diffusionDirection * nSlices * 2 .+ (idxAverage - 1) * nSlices * (nDiffusionDirections + 1) * 2 # DATASET SPECIFIC INDEXING: 15 slices, starting from profile 32 -sliceSelection = excitationList[selectedSlice] - -@info "Slice Chosen = $selectedSlice: \n \nExcitations Chosen = $excitationList " - -# adjustmentDict is the dictionary that sets the information for correct data loading and trajectory and data synchronization -adjustmentDict = Dict{Symbol,Any}() -adjustmentDict[:reconSize] = Tuple(paramsGeneral[:reconSize]) -adjustmentDict[:interleave] = startIndexIntlv -adjustmentDict[:numSamples] = paramsGeneral[:numADCSamples] -adjustmentDict[:delay] = 0.00000 # naive delay correction - -adjustmentDict[:interleaveDataFileNames] = paramsGeneral[:fullPathScan] - -adjustmentDict[:trajFilename] = paramsGeneral[:fullPathGradient] -adjustmentDict[:excitations] = sliceSelection - -adjustmentDict[:doMultiInterleave] = !isDataSingleIntlv -adjustmentDict[:doOddInterleave] = false -adjustmentDict[:numInterleaves] = isDataSingleIntlv ? 1 : length(adjustmentDict[:interleaveDataFileNames]) # one interleaf per file, count files, if filenames are array of strings (not only one string) - -adjustmentDict[:singleSlice] = !isMultiSlice - -# Defined recon size and parameters for data loading -@info "Using Parameters:\n\nreconSize = $(adjustmentDict[:reconSize]) \n interleave = $(adjustmentDict[:interleave]) \n slices = $(sliceChoice) \n coils = $(size(senseCartesian, 4)) \n numSamples = $(adjustmentDict[:numSamples])\n\n" - -if reloadGIRFData || !(@isdefined gK1) || !(@isdefined gAK1) || !(@isdefined gK0) || !(@isdefined gAK0) - @info "Loading Gradient Impulse Response Functions" - - ## Load GIRFs (K1) - gK1 = readGIRFFile(paramsGeneral[:fullPathGIRF][1], paramsGeneral[:fullPathGIRF][2], paramsGeneral[:fullPathGIRF][3], "GIRF_FT", false) - gAk1 = GirfApplier(gK1, gamma) - - ## Load K₀ GIRF - gK0 = readGIRFFile(paramsGeneral[:fullPathGIRF][1], paramsGeneral[:fullPathGIRF][2], paramsGeneral[:fullPathGIRF][3], "b0ec_FT", true) - gAk0 = GirfApplier(gK0, gamma) -end - -## Only load data when it has not been done yet, or it's specifically required. -if reloadSpiralData || !(@isdefined acqDataImaging) - ## Convert raw to AcquisitionData - - @info "Reading spiral data and merging interleaves" - acqDataImaging = mergeRawInterleaves(adjustmentDict) - - if paramsGeneral[:doCorrectWithGIRFkxyz] - @info "Correcting For GIRF" - applyGIRF!(acqDataImaging, gAk1) - end - - if paramsGeneral[:doCorrectWithGIRFk0] - @info "Correcting For k₀" - applyK0!(acqDataImaging, gAk0) - end - - ## Check the k-space nodes so they don't exceed frequency limits [-0.5, 0.5] (inclusive) - checkAcquisitionNodes!(acqDataImaging) - -end - -## Sense Map loading -@info "Resizing Sense Maps" - -# Resize sense maps to match encoding size of data matrix -sensitivity = mapslices(x ->imresize(x, adjustmentDict[:reconSize][1],adjustmentDict[:reconSize][2]), senseCartesian, dims=[1,2]) - -# Plot the sensitivity maps of each coil -@info "Plotting SENSE Maps" - -if paramsGeneral[:doPlotRecon] - plotSenseMaps(sensitivity,size(sensitivity, 4),sliceIndex = 10) -end - - -# shift FOV to middle :) -shiftksp!(acqDataImaging,paramsGeneral[:fovShift]) -# changeFOV!(acqDataImaging,[0.99, 0.99]) - - -## Do coil compression to make recon faster -if paramsGeneral[:doCoilCompression] - acqDataImaging, sensitivity = geometricCC_2d(acqDataImaging,sensitivity, paramsGeneral[:nVirtualCoils]) -end - - -## B0 Maps (Assumes we have a B0 map from gradient echo scan named b0) -@info "Resizing B0 Maps" -resizedB0 = mapslices(x->imresize(x,adjustmentDict[:reconSize][1],adjustmentDict[:reconSize][2]), b0Maps, dims=[1,2]) - -## Define Parameter Dictionary for use with reconstruction -# CAST TO ComplexF32 if you're using current MRIReco.jl - -@info "Setting Parameters" -params = Dict{Symbol,Any}() -params[:reco] = "multiCoil" -params[:reconSize] = adjustmentDict[:reconSize][1:2] -params[:regularization] = "L2" -params[:λ] = 1e-2 # CHANGE THIS TO GET BETTER OR WORSE RECONSTRUCTION RESULTS -params[:iterations] = paramsGeneral[:nReconIterations] -params[:solver] = "cgnr" -params[:solverInfo] = SolverInfo(ComplexF32,store_solutions=false) -params[:senseMaps] = ComplexF32.(sensitivity[:,:,selectedSlice,:]) - -if paramsGeneral[:doCorrectWithB0map] - params[:correctionMap] = ComplexF32.(-1im.*resizedB0[:,:,selectedSlice]) -end - -## Call to reconstruction -@info "Performing Reconstruction" -@time reco = reconstruction(acqDataImaging,params) -#totalRecon = sum(abs2,reco.data,dims=5) - -# save Map recon (multi-echo etc.) -if paramsGeneral[:doSaveRecon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load - resolution_tmp = fieldOfView(acqDataImaging)[1:2]./encodingSize(acqDataImaging) - resolution_mm = (resolution_tmp[1],resolution_tmp[2],fieldOfView(acqDataImaging)[3] *(1 + paramsGeneral[:sliceDistanceFactor_percent]/100.0)) # for 2D only, since FOV[3] is slice thickness then, but gap has to be observed - - # TODO: use slice ordering from cartesian scan directly! - nSlices = numSlices(acqDataImaging) - sliceIndexArray = getSliceOrder(nSlices, isSliceInterleaved = true) - saveMap(paramsGeneral[:fullPathSaveRecon], paramsGeneral[:scalingFactorSaveRecon]*reco.data[:,:,sliceIndexArray], resolution_mm; doSplitPhase=true, doNormalize = paramsGeneral[:doNormalizeRecon]) -end - -if paramsGeneral[:doPlotRecon] - @info "Plotting Reconstruction" - #pygui(true) - plotReconstruction(reco, 1:length(selectedSlice), resizedB0[:, :, selectedSlice], figHandles=["Original Magnitude", "Original Phase", "B0"], isSliceInterleaved=true, rotateAngle=270) -end - -@info "Successfully Completed SpiralRecon" \ No newline at end of file diff --git a/recon/cartesian_recon.jl b/recon/cartesian_recon.jl new file mode 100644 index 0000000..073ba0e --- /dev/null +++ b/recon/cartesian_recon.jl @@ -0,0 +1,146 @@ +# using HDF5, MRIReco, LinearAlgebra, DSP, FourierTools, ROMEO, MRIGradients, MRIFiles, MRIFieldmaps + +include("../src/utils/fieldmap_estimator.jl") + +## Dictionary of frequently changed parameters +# include("recon_config.jl") + +## Load data files + +@info "Loading Data Files" + +b0_filename = params_general[:map_scan_fullpath]; + +# filename for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) +processed_filename = params_general[:processed_map_scan_fullpath] + +# Set the data file name (Change this for your own system) +cartesian_data_file = ISMRMRDFile(b0_filename) + +# read in the raw data from the ISMRMRD file into a RawAcquisitionData object +raw = RawAcquisitionData(cartesian_data_file) + +if params_general[:do_process_map_scan] + # Preprocess Data and save! + preprocess_cartesian_data(raw::RawAcquisitionData, true; filename = processed_filename) + +end + +# Load preprocessed data! +processed_cartesian_data_file = ISMRMRDFile(processed_filename) + +raw_new = RawAcquisitionData(processed_cartesian_data_file) +cartesian_acq_data = AcquisitionData(raw_new, estimateProfileCenter = true) + +# Define coils and slices +num_coils = size(cartesian_acq_data.kdata[1], 2) +num_slices = numSlices(cartesian_acq_data) + +# Get the order of slices from the RawAcqData header +slice_idx_array_cartesian = get_slice_order(raw, num_slices, 1, 1) + +# Define TEs +# Echo times for field map raw data, in ms +TE1 = raw_new.params["TE"][1] +TE2 = raw_new.params["TE"][2] + +# shift FOV to middle :) +#TODO: in MRIReco v0.7, try: correctOffset(cartesian_acq_data, [0 -20 0]) +shift_kspace!(cartesian_acq_data, params_general[:fov_shift]) # amount of FOV shift; in unit of number of voxels in [x,y] direction + +#changeFOV!(cartesian_acq_data,[1.5,1.5]) + +## Don't have to recalculate sense maps for both scans but possibly it could make a +# difference in Diffusion scans + +@info "Calculating Sense Maps" + +# from reading docstring, min thresholding +cartesian_sensitivity = espirit(cartesian_acq_data, (6, 6), 30, eigThresh_1 = 0.01, eigThresh_2 = 0.9) + +# from Lars (7T spirals) +#cartesian_sensitivity = espirit(cartesian_acq_data,(6,6),30,eigThresh_1=0.02, eigThresh_2=0.98) +# from Alexander (Phantom?) +#cartesian_sensitivity = espirit(cartesian_acq_data,(4,4),12,eigThresh_1=0.01, eigThresh_2=0.98) + +# normalize for consistency with saving/loading and better ranges of reconstruction values +cartesian_sensitivity /= maximum(abs.(cartesian_sensitivity)) + +res_x = fieldOfView(cartesian_acq_data)[1] ./ size(cartesian_sensitivity)[1] +res_y = fieldOfView(cartesian_acq_data)[2] ./ size(cartesian_sensitivity)[2] +res_z = fieldOfView(cartesian_acq_data)[3] .* (1 + params_general[:slice_distance_factor_percent] ./ 100.0) # for 2D only, since FOV[3] is slice thickness then, but gap has to be observed +resolution_mm = (res_x, res_y, res_z) + +# save SENSE maps +if params_general[:do_save_recon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load + # TODO: use correct slice order everywhere, e.g., when saving/loading maps for spiral recon + save_map(params_general[:sensitivity_save_fullpath], cartesian_sensitivity[:, :, slice_idx_array_cartesian, :], resolution_mm; do_split_phase = true) +end + +## Parameter dictionary definition for reconstruction + +@info "Setting Parameters" +params_cartesian = Dict{Symbol,Any}() # instantiate dictionary +params_cartesian[:reco] = "multiCoil" # choose multicoil reconstruction +params_cartesian[:reconSize] = (cartesian_acq_data.encodingSize[1], cartesian_acq_data.encodingSize[2]) # set recon size to be the same as encoded size +params_cartesian[:regularization] = "L2" # choose regularization for the recon algorithm +params_cartesian[:λ] = 1.e-2 # recon parameter (there may be more of these, need to dig into code to identify them for solvers other than cgnr) +params_cartesian[:iterations] = params_general[:num_recon_iterations] # number of CG iterations +params_cartesian[:solver] = "cgnr" # inverse problem solver method +params_cartesian[:solverInfo] = SolverInfo(ComplexF32, store_solutions = false) # turn on store solutions if you want to see the reconstruction convergence (uses more memory) +params_cartesian[:senseMaps] = ComplexF32.(cartesian_sensitivity) # set sensitivity map array + + +## Call the reconstruction function + +@info "Performing Reconstruction" +@time cartesian_reco = reconstruction(cartesian_acq_data, params_cartesian) + +# save Map recon (multi-echo etc.) +if params_general[:do_save_recon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load + save_map(params_general[:map_save_fullpath], cartesian_reco.data[:, :, slice_idx_array_cartesian, :, :, :], resolution_mm; do_split_phase = true) +end + +## Calculate B0 maps from the acquired images (if two TEs) +@info "Calculating B0 Maps" +slices = 1:length(slice_idx_array_cartesian) +b0_maps = zeros(200, 200, num_slices) +b0_method = "2D_2008" # Can be "Simple","2D_2008" or "3D_2020" (How do we incorporate this into the recon demo?) + +if b0_method == "2D_2008" + + b0_maps = estimate_b0_maps(cartesian_reco.data, slices, TE1, TE2, true; β = params_general[:b0_map_beta], reltol = 1e-4) + +elseif b0_method == "3D_2020" + + b0_maps, times, out = b0map( + reshape(cartesian_reco.data[:, :, :, :, 1, 1], (200, 200, num_slices,1, 2)), + (TE1 / 1000.0, TE2 / 1000.0); + track =true, + chat = true, + chat_iter = 2 + ) + + b0_maps = 2 * pi * b0_maps + +end + +# save B0 map +if params_general[:do_save_recon] # TODO: include elements to save as tuple, e.g., ["b0", "sense", "recon"], same for load + save_map(params_general[:b0_map_save_fullpath], b0_maps[:, :, slice_idx_array_cartesian], resolution_mm; do_normalize = false) # no normalization, we want absolute values for offres maps +end + + +if params_general[:do_plot_recon] + @info "Plotting Cartesian Results (Sensitivity Maps and B0 Maps)" + # plot_sense_maps(sensitivity,num_coils) + plot_reconstruction(cartesian_reco[:, :, slice_idx_array_cartesian, 1], 1:size(cartesian_reco, 3), b0_maps[:, :, slice_idx_array_cartesian], is_slice_interleaved = false, rotation = 180) +end + +# cleanup unused file +if !params_general[:do_save_processed_map_scan] && params_general[:do_process_map_scan] + rm(processed_filename) +end + +@info "Successfully Completed cartesian_reconstruction" + diff --git a/recon/recon_config.jl b/recon/recon_config.jl new file mode 100644 index 0000000..c6f3527 --- /dev/null +++ b/recon/recon_config.jl @@ -0,0 +1,140 @@ +## This recon_config.jl file describes all reconstruction parameters, as well as data locations and selections for an iterative non-Cartesian reconstruction that relies +# on an external reference scan (Cartesian) to estimate calibration maps (coil sensitivities, B0 maps) + +using Dates + +params_general = Dict{Symbol,Any}() + +## General options for recon script +params_general[:do_load_maps] = true # if true, reloads B0/SENSE maps instead of recalculating +params_general[:do_save_recon] = true # if true, saves reconstruction and all auxiliary image data (maps) as NIfTI files +params_general[:do_plot_recon] = false # if true, plots intermediate debugging and output recon figures (needs graphics, not recommended in multi-thread mode due to PyPlot) +params_general[:do_process_map_scan] = true # if true, compute sensitivity and B0 maps from reconstructed Cartesian scan +params_general[:do_save_processed_map_scan] = false; # save ISMRMD file of preprocessed Cartesian data (before recon) + +## Reconstruction Parameters +# update time stamp for new recon, otherwise keep fixed, will create a new recon/ directory +#params_general[:recon_id] = Dates.format(Dates.now(), "yyyy-mm-dd_HH_MM_SS") # recon ID is recon_id +# params_general[:recon_id] = "2022-10-20_09_07_07" +params_general[:recon_id] = "v999"; +params_general[:do_correct_with_b0_map] = true +params_general[:do_correct_with_girf_k1] = true +params_general[:do_correct_with_girf_k0] = true + +params_general[:num_virtual_coils] = 8; +params_general[:do_coil_compression] = false; +params_general[:fov_shift] = [0, -10]; # Unit: number of voxels + +## Scan parameters, Additional acquisition information, e.g., slice distance etc. +params_general[:slice_distance_factor_percent] = 000 # 400 + +#Total number of ADC points BEFORE the rewinder at the end of the spiral readout. For gradient 508, use 15655 (out of 16084); for gradient 511, use 15445 (out of 15624). +params_general[:num_adc_samples] = 15655 # 15504 +# Matrix size of the reconstructed image. For gradient 508 with all 4 interleaves, use 200 for high resolution image; otherwise consider using 112 or 84 for a lower resolution. The FOV is 220 mm for both gradients 508 and 511. +params_general[:recon_size] = (200, 200) #(112, 112) #(200, 200) +params_general[:num_recon_iterations] = 20; # number of recon iterations (for both Cartesian and Spiral recon) +params_general[:b0_map_beta] = 0.1 # for estimate_b0_maps, * `β` - Regularization parameter controlling roughness penalty (larger = smoother, default 5e-4) +params_general[:do_normalize_recon] = false # set max abs to 1 +params_general[:saving_scalefactor] = 1.0e9 # 1 # typical range of recon intensities is 1e-7, rescale when saving, e.g., to 0...1000 roughly for fMRI analysis + +# Data selector +# Choose diffusion direction; starting from 0 (b=0) to the total number in MDDW protocol, e.g. for 6 diffusion directions, 1-6 stands for 6 DWIs) +# boolean is_called_from_global_recon is true, if this RunReconLoop is active +# If is_called_from_global_recon is false or not defined, the data selector needs to be defined here. +if !(@isdefined is_called_from_global_recon) || !is_called_from_global_recon + global selector = Dict{Symbol,Any}() + selector[:avg] = 1 + selector[:seg] = 1 + selector[:dif] = 0 +end + + +## Data parameters (Path handling, data/results locations etc.) +# UHN work +# params_general[:project_path] = "C:\\Users\\Lars Kasper\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" +# Laptop home, one drive sync +# params_general[:project_path] = "C:\\Users\\kasperla\\UHN\\Brain-TO - MRP-SPIDI - MRP-SPIDI\\SPIDI" +# Gadgetron Server +# laptop home, external drive +# params_general[:data_path] = "e:\\SPIDI\\data\\SPIDI_0007\\Phantom\\rawdata" +params_general[:project_path] = "/home/kasperl/SPIDI" + +# SPIDI_0011 + +## Paths (user-dependent) +params_general[:data_path] = joinpath("/home/wuz/spiralDiffusion/", "SPIDI_0011") +params_general[:gradients_path] = joinpath(params_general[:project_path], "data", "SPIDI_0007", "gradients") +params_general[:results_path] = joinpath(params_general[:project_path], "results", "SPIDI_0011") +params_general[:girf_path] = joinpath(params_general[:project_path], "code", "GIRFReco", "data", "GIRF", "GIRF_ISMRM2022") +params_general[:recon_save_path] = joinpath(params_general[:results_path], "recon", params_general[:recon_id]) + +## Files (user-dependent) + +# Map scan file (Cartesian multi-echo file) +params_general[:map_scan_filename] = "meas_MID00075_FID14968_GRE_FieldMap_DualEcho_2mm.mrd" +params_general[:mapTEs_ms] = [4.92, 7.38] + +params_general[:girf_filename] = ["2021Nov_PosNeg_Gx.mat", "2021Nov_PosNeg_Gy.mat", "2021Nov_PosNeg_Gz.mat"] + +# File name for the spiral gradient +# multi-il (high-res 1.1mm) gradient file 508, single interleaf (low-res 2.6mm) gradient file 511 +params_general[:gradient_filename] = joinpath("508", "gradients.txt") + +# non-Cartesian (Spiral) scan file: MDDW 6 +# params_general[:scan_filename]=["meas_MID00083_FID14976_diffSpiral_508_Intl0_b2k_4Avg.mrd"] +# params_general[:num_total_diffusion_directions] = 6 + +# non-Cartesian (Spiral) scan file: MDDW30 +params_general[:scan_filename] = ["meas_MID00085_FID14978_diffSpiral_508_Intl0_b1000_30d.mrd"] +params_general[:num_total_diffusion_directions] = 30 + + + + +## Final, Automatic operations (dependent on previous sections, usually no need to change) + +params_general[:gradient_fullpath] = joinpath(params_general[:gradients_path], params_general[:gradient_filename]) + +# NOTE: If loaded from other recon_id, this path might differ +params_general[:pathload_maps] = joinpath(params_general[:results_path], "recon", params_general[:recon_id]) + +# . makes join elementwise, i.e,. every file name (in array) with the same path +params_general[:girf_fullpath] = joinpath.(params_general[:girf_path], params_general[:girf_filename]) + +params_general[:map_scan_fullpath] = joinpath(params_general[:data_path], params_general[:map_scan_filename]) +# . makes join elementwise, i.e,. every file name (in array) with the same path +params_general[:scan_fullpath] = joinpath.(params_general[:data_path], params_general[:scan_filename]) + +# filename for preprocessed data (remove oversampling, permute dimensions wrt MRIReco) +params_general[:processed_map_scan_filename] = "processedCartesianData.h5" +params_general[:processed_map_scan_fullpath] = joinpath(params_general[:recon_save_path], params_general[:processed_map_scan_filename]) + +params_general[:map_save_filename] = splitext(params_general[:map_scan_filename])[1] * "_reconmap.nii" +params_general[:sensitivity_save_filename] = splitext(params_general[:map_scan_filename])[1] * "_sensemap.nii" +params_general[:b0_map_save_filename] = splitext(params_general[:map_scan_filename])[1] * "_b0map.nii" + +if isa(params_general[:scan_filename], AbstractVector) + # for multiple files, concatenate recon name from scan file names, e.g., 508_124_2_508_126_2_508_128_2_508_130_2_recon.nii + params_general[:recon_save_filename] = + join([(x[1] * "_") for x in splitext.(params_general[:scan_filename])]) * + "dif$(selector[:dif])_" * + "itl$(selector[:seg])_" * + "avg$(selector[:avg])_" * + "recon.nii" +else + # otherwise, just concat _recon.nii to file name + params_general[:recon_save_filename] = splitext(params_general[:scan_filename])[1] * "_recon.nii" +end + +params_general[:recon_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:recon_save_filename]) +params_general[:map_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:map_save_filename]) +params_general[:sensitivity_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:sensitivity_save_filename]) +params_general[:b0_map_save_fullpath] = joinpath(params_general[:recon_save_path], params_general[:b0_map_save_filename]) + +if ~ispath(params_general[:recon_save_path]) + mkpath(params_general[:recon_save_path]) +end + +# copies this config file to the recon path for later checks of parameter functions +cp("/srv/data/ajaffray/TORONTO_COLLAB/revision/GIRFReco.jl/recon/recon_config.jl", joinpath(params_general[:recon_save_path], "recon_config.jl"); force = true) + diff --git a/recon/RunReconLoop.jl b/recon/run_recon_loop.jl similarity index 57% rename from recon/RunReconLoop.jl rename to recon/run_recon_loop.jl index e6b1cf8..fd269d4 100644 --- a/recon/RunReconLoop.jl +++ b/recon/run_recon_loop.jl @@ -1,17 +1,17 @@ ## Recon loop manipulator dimension selector of what has to be reconstructed -# Probably the SpiralRecon-Wrapper should be a function to take selector as Argument +# Probably the spiral_recon-Wrapper should be a function to take selector as Argument # but then running as a script for debugging might be less convenient @info "Starting in $(pwd())" global selector = Dict{Symbol,Any}() -global isCalledFromReconLoopGlobal::Bool = true +global is_called_from_global_recon::Bool = true for avg = 1:4 #1:4 for dif = 0:30 #1:10 # 0:30 # 0:6 # 0 is b=0 image - selector[:avg] = avg; - selector[:seg] = 1; - selector[:dif] = dif; + selector[:avg] = avg + selector[:seg] = 1 + selector[:dif] = dif @info "\n\n\n\tReconstructing avg=$(selector[:avg]), seg=$(selector[:seg]), dif=$(selector[:dif])\n\n" - include("SpiralRecon_SingleIntlv.jl") + include("spiral_recon_single_interleave.jl") end end -isCalledFromReconLoopGlobal = false; \ No newline at end of file +is_called_from_global_recon = false; \ No newline at end of file diff --git a/src/GIRFReco.jl b/src/GIRFReco.jl index 351abec..d8619f4 100644 --- a/src/GIRFReco.jl +++ b/src/GIRFReco.jl @@ -1,28 +1,48 @@ module GIRFReco -using HDF5 -using MRIReco -using LinearAlgebra +# using HDF5 +# using LinearAlgebra using Dierckx -using DSP +# using DSP using FourierTools -using ImageBinarization -using ImageEdgeDetection +# using ImageBinarization +# using ImageEdgeDetection using Printf using ROMEO -using NIfTI +using DelimitedFiles +# using NIfTI using Unitful using AxisArrays using ImageUtils using Plots using MRIGradients -using DelimitedFiles -using MAT using FileIO +using MRIBase using MRIFiles -using MosaicViews +# using MosaicViews + +export plot_reconstruction, + plot_sense_maps, + calculate_b0_maps, + get_slice_order, + sync_traj_and_data!, + do_k0_correction!, + adjust_header!, + check_acquisition_nodes!, + validate_siemens_mrd!, + validate_acq_data!, + preprocess_cartesian_data, + remove_oversampling!, + merge_raw_interleaves, + apply_girf!, + apply_k0!, + save_map, + load_map, + shift_kspace!, + estimate_b0_maps, + read_gradient_text_file -include("../utils/Utils.jl") -include("../io/GradientReader.jl") +include("utils/utils.jl") +include("io/gradient_reader.jl") end # module diff --git a/src/io/gradient_reader.jl b/src/io/gradient_reader.jl new file mode 100644 index 0000000..d07c145 --- /dev/null +++ b/src/io/gradient_reader.jl @@ -0,0 +1,106 @@ + + +""" + read_gradient_text_file(filename, reconsize, delay) +Reads in text file containing gradient waveform information + +# Arguments +* `filename` - filename (with full path) of text file with gradient waveform information +* `reconsize::Tuple{Int64,Int64,Int64}` - size of reconstructed image (trailing dimension 1 for 2D acquisitions) +* `delay` - delay in seconds from the nominal first sampling point to the actual first sampling point +""" +function read_gradient_text_file(filename, reconsize, delay) + + gradient_data = readdlm(filename, '\n') + + ## Read in the header data of the gradient text file (lines 1 to 21) + gradient_dict = Dict{Symbol,Any}() + gradient_dict[:version_number] = gradient_data[1] + gradient_dict[:num_samples] = gradient_data[2] + gradient_dict[:dwell_time] = gradient_data[3] # [seconds] + gradient_dict[:samples_per_interleave] = gradient_data[4] + gradient_dict[:num_interleaves] = gradient_data[5] + gradient_dict[:num_dims] = gradient_data[6] + gradient_dict[:time_to_center_kspace] = gradient_data[7] # [seconds] + gradient_dict[:acq_duration] = gradient_data[8] + gradient_dict[:samples_per_acq] = gradient_data[9] + gradient_dict[:num_acq] = gradient_data[10] + gradient_dict[:acq_TR] = gradient_data[11] + gradient_dict[:gradient_acq_start_delay] = gradient_data[12] + gradient_dict[:echo_time_shift_samples] = gradient_data[13] + gradient_dict[:fov] = gradient_data[14:16] # [m] + gradient_dict[:voxel_dims] = gradient_data[17:19] # [m] + gradient_dict[:gradient_strength_factor] = gradient_data[20] # [mT/m] + gradient_dict[:is_binary] = gradient_data[21] + gradient_dict[:gamma] = 42577.478 # [Hz/mT] CAN CHANGE + gradient_dict[:field_strength] = 3 # [T] CAN CHANGE + + #print(gradient_dict) + + ## reading and data scaling of gradient data + gradient_dict[:gradient_vector] = gradient_data[22:end] + interleave_gradient_array = + gradient_dict[:gradient_strength_factor] * reshape(gradient_dict[:gradient_vector], gradient_dict[:samples_per_interleave], gradient_dict[:num_interleaves], gradient_dict[:num_dims]) #[mT/m] + + planned_times = gradient_dict[:dwell_time] .* (0:(gradient_dict[:samples_per_interleave]-1)) + delayed_times = planned_times .- delay .- gradient_dict[:dwell_time] ./ 2 # seconds (dwell_time/2 compensates for integration) + + interleave_gradient_array_new = Array{Float64,3}(undef, size(interleave_gradient_array)) + + #print(size(interleave_gradient_array_new)) + + ## Loop over all of the unique excitation trajectories and create an interpolant of the gradient + for dim = 1:gradient_dict[:num_dims] + + for l = 1:gradient_dict[:num_interleaves] + + #print((dim,l),"\n") + + sp = Spline1D(planned_times, interleave_gradient_array[:, l, dim], w = ones(length(planned_times)), k = 1, bc = "zero", s = 0.0) + + # evaluate the interpolant at the sampling times of the kspace data + interleave_gradient_array_new[:, l, dim] = sp(delayed_times) + + #print(interleave_gradient_array_new[:,l,dim][end],"\n") + + end + + end + + ## cumulative summation and numerical integration of the gradient data, resulting in the kspace trajectory + kspace_trajectory_array_new = gradient_dict[:gamma] * gradient_dict[:dwell_time] * cumsum(interleave_gradient_array_new, dims = 1) # [rad/m] + + ## Conversion to the trajectory scaling convention in MRIReco.jl + # Currently only 2d Trajectories + converted_kspace_trajectory_array_new = kspace_trajectory_array_new + converted_kspace_trajectory_array_new[:, :, 1] *= gradient_dict[:fov][1] ./ reconsize[1] + converted_kspace_trajectory_array_new[:, :, 2] *= gradient_dict[:fov][2] ./ reconsize[2] + + if gradient_dict[:num_dims] == 3 + converted_kspace_trajectory_array_new[:,:,3] *= gradient_dict[:FOV][3] ./ reconsize[3] # Normalized to -0.5 to 0.5, no unit. + end + + ## Construction of the trajectory object ## + + ## Reshaping of the array to the format expected by the Trajectory constructor in MRIReco.jl + # - dim 1 = kspace dimension + # - dim 2 = kspace position (with interleaves/profiles arranged consecutively) + permuted_trajectory = + permutedims(reshape(converted_kspace_trajectory_array_new, gradient_dict[:samples_per_interleave] * gradient_dict[:num_interleaves], gradient_dict[:num_dims]), [2, 1]) + + ## Construction of the trajectory + # - Note: timing vectors are automatically generated - seems to be consistent with the dwell time + trajectory_object = Trajectory( + permuted_trajectory, + gradient_dict[:num_interleaves], + gradient_dict[:samples_per_interleave], + TE = gradient_dict[:echo_time_shift_samples], + AQ = gradient_dict[:acq_duration], + numSlices = 9, + cartesian = false, + circular = false, + ) + + return trajectory_object + +end \ No newline at end of file diff --git a/utils/fieldMapEstimator.jl b/src/utils/fieldmap_estimator.jl similarity index 63% rename from utils/fieldMapEstimator.jl rename to src/utils/fieldmap_estimator.jl index e9af641..0bbe4d4 100644 --- a/utils/fieldMapEstimator.jl +++ b/src/utils/fieldmap_estimator.jl @@ -1,4 +1,5 @@ -using Flux + +# using Flux """ ml_cost(x::Matrix{T},y::Matrix{Complex{T}},z::Matrix{Complex{T}}, β) @@ -10,9 +11,9 @@ Calculates the ML estimator cost between an estimated phase map and the underlyi * `m::Matrix{T}` - normalized weighting data (m ∈ [0,1]:= abs.(conj.(y).*z)./maximum(abs.(conj.(y).*z))), precomputed for speed * `β` - Regularization parameter controlling roughness penalty """ -function ml_cost(x::Matrix{T},y::Matrix{Complex{T}},z::Matrix{Complex{T}},m::Matrix{T}, β) where T +function ml_cost(x::Matrix{T}, y::Matrix{Complex{T}}, z::Matrix{Complex{T}}, m::Matrix{T}, β) where {T} - Ψ = (sum(m.* (1 .- cos.(angle.(z) .- angle.(y) .- x)),dims=[1,2]) + β * R(x))[1] + Ψ = (sum(m .* (1 .- cos.(angle.(z) .- angle.(y) .- x)), dims = [1, 2])+β*R(x))[1] end @@ -22,9 +23,9 @@ Regularization function which penalizes roughness # Arguments * `x::Matrix{T}` - fieldmap estimate (in radians) """ -function R(x::Matrix{T}) where T +function R(x::Matrix{T}) where {T} - return T.(0.5) * sum(abs2,diff(x,dims=1),dims=[1,2]) + T.(0.5) * sum(abs2,diff(x,dims=2),dims=[1,2]) + return T.(0.5) * sum(abs2, diff(x, dims = 1), dims = [1, 2]) + T.(0.5) * sum(abs2, diff(x, dims = 2), dims = [1, 2]) end @@ -39,7 +40,7 @@ Estimates the fieldmap using the method presented in https://doi.org/10.1109/tmi * `β` - Regularization parameter controlling roughness penalty * `reltol` - early stopping criteria (exit if subsequent cost function change < reltol) """ -function pcg_ml_est_fieldmap(y::AbstractMatrix{Complex{T}},z::AbstractMatrix{Complex{T}},β = 1e-3, reltol = 5e-3) where T +function pcg_ml_est_fieldmap(y::AbstractMatrix{Complex{T}}, z::AbstractMatrix{Complex{T}}, β = 1e-3, reltol = 5e-3) where {T} d = 1 κ = conj.(y) .* z @@ -50,20 +51,20 @@ function pcg_ml_est_fieldmap(y::AbstractMatrix{Complex{T}},z::AbstractMatrix{Com Δ = 1 itcount = 0 - trust_step = 1.0 ./ (m .+ 4*β) + trust_step = 1.0 ./ (m .+ 4 * β) while Δ > reltol gs = gradient(Flux.params(x)) do - c = ml_cost(x, y,z,m,β) # need to interpolate the y z and β to have better performance + c = ml_cost(x, y, z, m, β) # need to interpolate the y z and β to have better performance end x̄ = gs[x] - x .-= (trust_step) .* x̄ + x .-= (trust_step) .* x̄ - Δ = abs.(ml_cost(x,y,z,m,β) - c)/c + Δ = abs.(ml_cost(x, y, z, m, β) - c) / c - itcount +=1 + itcount += 1 end @@ -74,11 +75,11 @@ function pcg_ml_est_fieldmap(y::AbstractMatrix{Complex{T}},z::AbstractMatrix{Com end """ -estimateB0Maps(imData,slices, TE1,TE2,β,isrotated) +estimate_b0_maps(im_data,slices, TE1,TE2,β,isrotated) Processes 3D volume data as output from MRIReco.reconstruction to estimate fieldmaps using the method presented by Funai and Fessler # Required Arguments -* `imData` - 5-D array with complex image data -> first -* `slices` - vector of slices to process (must be within range of 3rd dimension of imData) +* `im_data` - 5-D array with complex image data -> first +* `slices` - vector of slices to process (must be within range of 3rd dimension of im_data) * `TE1` - Echo time 1 [ms] * `TE2` - Echo time 2 [ms] @@ -90,19 +91,19 @@ Processes 3D volume data as output from MRIReco.reconstruction to estimate field * `reltol` - early stopping criteria (exit if subsequent cost function change < reltol) """ -function estimateB0Maps(imData,slices, TE1,TE2,isrotated::Bool=false; β = 5e-4, reltol = 0.001) +function estimate_b0_maps(im_data, slices, TE1, TE2, isrotated::Bool = false; β = 5e-4, reltol = 0.001) - b0Maps = Complex.(zeros(size(imData)[1:3])) + b0_maps = Complex.(zeros(size(im_data)[1:3])) @sync for slice in slices Threads.@spawn begin - b0Maps[:,:,slice] = pcg_ml_est_fieldmap(imData[:,:,slice,1,1],imData[:,:,slice,2,1],β,reltol) ./ ((TE2 - TE1)/1000) + b0_maps[:, :, slice] = pcg_ml_est_fieldmap(im_data[:, :, slice, 1, 1], im_data[:, :, slice, 2, 1], β, reltol) ./ ((TE2 - TE1) / 1000) println("for slice $slice") end end - b0Maps = mapslices(isrotated ? x->x : x-> rotl90(x),b0Maps,dims=(1,2)) + b0_maps = mapslices(isrotated ? x -> x : x -> rotl90(x), b0_maps, dims = (1, 2)) - return real.(b0Maps) + return real.(b0_maps) -end \ No newline at end of file +end diff --git a/src/utils/utils.jl b/src/utils/utils.jl new file mode 100644 index 0000000..1f0bca3 --- /dev/null +++ b/src/utils/utils.jl @@ -0,0 +1,894 @@ + +## Choose plotting backend to be PlotlyJS! +# plotlyjs() + +## General Plotting function for the reconstruction + +# "Mosaic-plots reconstruction for selected slices and corresponding B0 map" +""" + plot_reconstruction(images, slices_index, b0; fig_handles = [], is_slice_interleaved = false) +Plots the magnitude and phase of the reconstructed images for a given slice or slices, along with a B₀ map if applicable + +# Arguments +* `images` - Complex-valued images reconstructed using MRIReco.jl +* `slices_index::Vector{Int}` - slices to plot +* `b0` - off-resonance map to plot along with images +* `fig_handles` - String vectors in size of [3,1] for titles of three figures (Magnitude & Phase of reconstructed images, and B0 maps) +* `is_slice_interleaved::Bool` - for 2D scanning, indicate this value as `true` to make sure the slice order on the displayed results is correct +* `rotation::Int` - Counterclock-wise rotation angle for each slice, should be a value from 0, 90, 180, 270 degrees +""" +function plot_reconstruction(images, slices_index, b0; fig_handles = [], is_slice_interleaved = false, rotation = 0) + # plot() + ## If we need to re-order all slices + num_slices = length(slices_index) + reordered_slice_indices = zeros(Int16, size(slices_index)) + + if is_slice_interleaved && num_slices > 1 + reordered_slice_indices[1:2:end] = slices_index[1:Int(ceil(num_slices / 2))] + reordered_slice_indices[2:2:end] = slices_index[Int(ceil(num_slices / 2) + 1):end] + else + reordered_slice_indices = slices_index + end + + ## If we need to rotate each slice + if mod(rotation, 90) != 0 || rotation < 0 || rotation > 270 + error("rotation must be 0, 90, 180 or 270 degrees.") + end + + # Plot magnitude images (normalize) + # if length(fig_handles) < 1 + # figure("Magnitude Images") + # else + # figure(fig_handles[1]) + # end + + # clf() + + magnitude_images = mapslices(x -> abs.(x) ./ maximum(abs.(x)), images[:, :, reordered_slice_indices], dims = [1, 2]) + if rotation == 90 + magnitude_images = mapslices(x -> rotr90(x), magnitude_images, dims = [1, 2]) + elseif rotation == 180 + magnitude_images = mapslices(x -> rot180(x), magnitude_images, dims = [1, 2]) + else + magnitude_images = mapslices(x -> rotl90(x), magnitude_images, dims = [1, 2]) + end + magnitude_mosaic = mosaicview(magnitude_images, nrow = Int(floor(sqrt(num_slices))), npad = 5, rowmajor = true, fillvalue = 0) + + Plots.heatmap(magnitude_mosaic, show = true, plot_title = "|Images|", plot_titlevspan = 0.1, color = :grays, aspectratio = :equal) + # display(plot!()) + + phase_images = angle.(images[:, :, reordered_slice_indices, 1, 1]) + if rotation == 90 + phase_images = mapslices(x -> rotr90(x), phase_images, dims = [1, 2]) + elseif rotation == 180 + phase_images = mapslices(x -> rot180(x), phase_images, dims = [1, 2]) + else + phase_images = mapslices(x -> rotl90(x), phase_images, dims = [1, 2]) + end + phase_mosaic = mosaicview(phase_images, nrow = Int(floor(sqrt(num_slices))), npad = 5, rowmajor = true, fillvalue = 0) + + Plots.heatmap(phase_mosaic, show = true, plot_title = "∠ Images", plot_titlevspan = 0.1, color = :plasma, aspectratio = :equal) + #colorbar() + # display(plot!()) + + #gcf().suptitle("∠Images") + + # # Plot B0 maps + # if length(fig_handles) < 3 + # figure("B₀ Map Images") + # else + # figure(fig_handles[3]) + # end + + # clf() + # plot() + b0_map_images = mapslices(x -> x, b0, dims = [1, 2]) + if rotation == 90 + b0_map_images = mapslices(x -> rotr90(x), b0, dims = [1, 2]) + elseif rotation == 180 + b0_map_images = mapslices(x -> rot180(x), b0, dims = [1, 2]) + else + b0_map_images = mapslices(x -> rotl90(x), b0, dims = [1, 2]) + end + b0_map_mosaic = mosaicview(b0_map_images[:, :, reordered_slice_indices], nrow = Int(floor(sqrt(num_slices))), npad = 5, rowmajor = true, fillvalue = 0) + + Plots.heatmap(b0_map_mosaic, show = true, plot_title = "B₀ Map Images", plot_titlevspan = 0.1, color = :plasma) + # colorbar() + # display(plot!()) + + # gcf().suptitle("B₀ Maps [rad/s]") + + 1 + +end + +"Function plots all profiles in the acquisition to check consistency with ISMRMRD file" +function check_profiles(raw_data) + + num_profiles = 128 # Set to the number of profiles that you would like to see + + for l = 1:num_profiles + p1 = plot(abs.(raw_data.profiles[l].data[:, 1])) + p2 = plot(angle.(raw_data.profiles[l].data[:, 1])) + end + +end + +""" + plot_sense_maps!(sensitivity, num_channels) +Plots coil sensitivity maps from the channels, for a total of num_channels plots + +# Arguments +* `sensitivity` - sensitivity maps +* `num_channels::Int` - number of coils (usually last dimension of sensitivity) +* `slice_index::Int` - The index of the slice to be displayed (if multislice) +""" +function plot_sense_maps(sensitivity, num_channels; slice_index = 1) + num_slices = size(sensitivity, 3) + if slice_index > num_slices + err_msg = @sprintf("The index of slice to be displayed is %d, but total slice number is %d.", slice_index, num_slices) + error(err_msg) + end + + # # Magnitude maps + # figure(@sprintf("Sensitivity Map Magnitude of Slice %d / %d", slice_index, num_slices)); clf(); for ch in 1:num_channels; subplot(8,4,ch); imshow((abs.(sensitivity[:,:,slice_index,ch])), cmap = "gray"); end; + # subplots_adjust(wspace=0.05,hspace=0.05,left=0.05,bottom=0.0,right=1.0,top=0.95) + # gcf() + + magnitude_mosaic = mosaicview((abs.(sensitivity[:, :, slice_index, :])), nrow = Int(floor(sqrt(num_channels))), npad = 5, rowmajor = true, fillvalue = 0) + Plots.heatmap(magnitude_mosaic, show = true, plot_title = "|Sensitivity|", plot_titlevspan = 0.1, color = :gnuplot2) + + # # Phase maps + # figure(@sprintf("Sensitivity Map Phase of Slice %d / %d", slice_index, num_slices)); clf(); for ch in 1:num_channels; subplot(8,4,ch); imshow(angle.(sensitivity[:,:,slice_index,ch]), cmap = "gray"); end; + # subplots_adjust(wspace=0.05,hspace=0.05,left=0.05,bottom=0.0,right=1.0,top=0.95) + # gcf() + + phase_mosaic = mosaicview((angle.(sensitivity[:, :, slice_index, :])), nrow = Int(floor(sqrt(num_channels))), npad = 5, rowmajor = true, fillvalue = 0) + Plots.heatmap(phase_mosaic, show = true, plot_title = "∠ Sensitivity", plot_titlevspan = 0.1, color = :plasma) + +end + +# "WIP: Plots trajectory and Data, doesn't work currently" +function plot_traj_and_data(acq) + + for l = 1:length(acq.traj) + + freq_encode[l, :] = acq.traj[l].nodes[1, :] + phase_encode[l, :] = acq.traj[l].nodes[2, :] + k_space_signal[l, :] = acq.kdata[l, :, 1] + + end + +end + +## PREPROCESSING + +""" + calculate_b0_maps(me_data,slices,echotime_1,echotime_2) + +Calculate B0 map from the two images with different echo times via their phase difference (obtained from imTE2.*conj(imTE1)) + +# Arguments +* `me_data` - [nX nY nZ 2 num_coils] 5D image array, 4th dim echo time +* `slices::NTuple{num_slices,Int}` - slice index vector (tuple?) for which map is computed +* `echotime_1::AbstractFloat` - TE1 [ms] +* `echotime_2::AbstractFloat` - TE2 [ms] +""" +function calculate_b0_maps(me_data, slices, echotime_1, echotime_2) + + # b0_maps = mapslices(x -> rotl90(x),ROMEO.unwrap(angle.(me_data[:,:,slices,2,1].*conj(me_data[:,:,slices,1,1]))),dims=(1,2))./((7.38-4.92)/1000) + b0_maps = + mapslices(x -> x, ROMEO.unwrap(angle.(me_data[:, :, slices, 2, 1] .* conj(me_data[:, :, slices, 1, 1]))), dims = (1, 2)) ./ + ((echotime_2 - echotime_1) / 1000) + +end + +""" + get_slice_order(r::RawAcquisitionData, sliceNum::Int, startProfile::Int, incProfile:Int) +Return a array of slice order index with ascending order of Z position. +e.g. For an interleaved pattern of slice position in RawAcquisitionData given below: +[-7, -3, 1, 5, 9, -9, -5, -1, 3, 7] (in mm) +The output will be [6, 1, 7, 2, 8, 3, 9, 4, 10, 5] + +# Arguments +* `r::RawAcquisitionData` - A RawAcquisitionData that directly reads from original MRD file +* `sliceNum::Int` - Total slice number that included in the RawAcquisitionData +* `startProfile::Int` - Starting index of the profile in the RawAcqData for the first valid slice to be processed +* `incProfile::Int` - Increment of profile index for the next valid slices + +# Output +* `orderedIndex` - array with slice index of RawAcquisitionData with ascending order of position in Z. +""" +function get_slice_order(r::RawAcquisitionData, sliceNum::Int, startProfile::Int, incProfile::Int) + origZPos = zeros(Float32, sliceNum) + for m = 1 : sliceNum + profileIndex = startProfile + (m - 1) * incProfile + origZPos[m] = r.profiles[profileIndex].head.position[3] + end + return sortperm(origZPos) +end + +""" + sync_traj_and_data!(a::AcquisitionData) +Synchronizes k-space trajectory and sampled data as they do not usually have a common sampling rate + +# Arguments +* `raw_data::RawAcquisitionData` - RawAcquisitionData object +* `traj::Trajectory` - Trajectory object to be synchronized with data contained in raw_data +* `idx_crop::Int` - Trajectory and Data may contain samples we don't want in the recon, usually at the end of acquisition. Ignore samples after idx_crop +* `interleave::Int` - index of interleave +""" +function sync_traj_and_data!(raw_data, traj, idx_crop, interleave) + + # get number of gradient samples + num_gradient_samples = traj.numSamplingPerProfile # cannot avoid camelcase as it is in MRIBase + + # get vector of gradient samples which pertain to one interleave of the trajectory + interleave_extraction_vector = num_gradient_samples * (interleave - 1) .+ (1:num_gradient_samples) + + # Read the trajectory nodes into the rawAcquisitionData type field (.traj) + for l = 1:length(raw_data.profiles) + raw_data.profiles[l].traj = traj.nodes[:, interleave_extraction_vector] + end + + # define dwell times for trajectory (dt_k) and signal sampling (dt_s) + dt_s = 2 * 10^(-6) # [s] + dt_k = 10 * 10^(-6) # [s] + + # Go through every profile (this means every slice in the MRIReco.jl convention for multislice, multiTE, and diffusion scans) + for l = 1:length(raw_data.profiles) + + # Get size of trajectory and signal vectors + num_data_samples = size(raw_data.profiles[l].data, 1) + num_kspace_samples = size(raw_data.profiles[l].traj, 2) + + # Define time vectors for signal and trajectory + t_s = (0:num_data_samples-1) * dt_s + t_k = (0:num_kspace_samples-1) * dt_k + + # Interpolate trajectory onto the same sample times as the sampled signal + trajectory_interpolated_x = Spline1D(t_k, raw_data.profiles[l].traj[1, :], w = ones(length(raw_data.profiles[l].traj[1, :])), k = 3, bc = "zero") + trajectory_interpolated_y = Spline1D(t_k, raw_data.profiles[l].traj[2, :], w = ones(length(raw_data.profiles[l].traj[2, :])), k = 3, bc = "zero") + + # Concatenate the trajectory node kx and ky positions + adjusted_trajectory = vcat(trajectory_interpolated_x(t_s)', trajectory_interpolated_y(t_s)') + + # Crop the data and trajectory to avoid return-to-center of traj, and also set trajectory as upsampled trajectory adjusted_trajectory + raw_data.profiles[l].traj = adjusted_trajectory[:, 1:idx_crop] + raw_data.profiles[l].data = raw_data.profiles[l].data[1:idx_crop, :] + + end + + # Return the vector of sampling times + return dt_s * (0:idx_crop-1) + +end + + +""" + do_k0_correction!(raw_data, k0_phase_modulation, interleave) +Applies phase modulation due to 0th-order field fluctuations during the acquisition + +# Arguments +* `raw_data::RawAcquisitionData` - RawAcquisitionData object +* `k0_phase_modulation::Matrix{Complex{T}}` - Vector containing phase modulation measurements +* `interleave::Int` - index of interleave +""" +function do_k0_correction!(raw_data, k0_phase_modulation, interleave) + + # Get number of samples for the k0 phase modulation (should be same size as the trajectory BEFORE resampling) + num_k0_samples = size(k0_phase_modulation, 1) + + # define dwell times for phase modulation (dt_k) and signal sampling (dt_s) + dt_s = 2 * 10^(-6) # [s] + dt_k = 10 * 10^(-6) # [s] + + # Go through every profile (this means every slice in the MRIReco.jl convention for multislice, multiTE, and diffusion scans) + for l = 1:length(raw_data.profiles) + + # Get size of data (signal samples) and size of k0 modulation + num_data_samples = size(raw_data.profiles[l].data, 1) + num_kspace_samples = num_k0_samples + + # Define time vectors for k0 and signal sampling times + t_s = (0:num_data_samples-1) * dt_s + t_k = (0:num_kspace_samples-1) * dt_k + + # interpolate k0 to the time basis of the signal + k0_interpolant = Spline1D(t_k, k0_phase_modulation[:, interleave], w = ones(num_k0_samples), k = 3, bc = "zero") + k0_interpolated = k0_interpolant(t_s) + + # modulate the data by the k0 modulation by multiplying with e^(i*k0) where k0 is in radians + raw_data.profiles[l].data = raw_data.profiles[l].data .* exp.(1im .* k0_interpolated) + + # # Visualization of Phase Modulation + # figure("Phase Modulation") + # plot(t_s, angle.(exp.(1im .* k0_interpolated))) + # xlabel("Time [s]") + # ylabel("k₀ [rad]") + # title("B₀ Eddy Current Fluctuation During Readout ") + + # plot(t_s, angle.(exp.(1im .* k0_interpolated)), show = true, title = "B₀ Eddy Current Fluctuation During Readout ") + + end + +end + + +""" + adjust_header!(raw::RawAcquisitionData, recon_size, num_samples, interleave_number, single_slice) +Adjusts the header data for each interleave and slice of spiral diffusion RawAcquisitionData + +# Arguments +* `raw::RawAcquisitionData` - RawAcquisitionData object +* `recon_size::Vector` - Reconstruction matrix size +* `num_samples::Int` - Number of samples per interleave +* `interleave_number::Int` - Index of interleave for multi-shot acquisitionNumbers +* `single_slice::Bool` - flag for single-slice reconstruction/acquisition +""" +function adjust_header!(raw, recon_size, num_samples, interleave_number, single_slice) + + # For every profile in the acquisition + for l = 1:length(raw.profiles) + + # Set the discard post to 0 (don't discard any samples from the end of the acquisition) + raw.profiles[l].head.discard_post = 0 + + # Set the discard pre to 0 (don't discard any samples from the beginning of the acqusition) + raw.profiles[l].head.discard_pre = 0 + + # Set the contrast to 0 or raw.profiles[l].head.idx.repetition for diffusion directions + # raw.profiles[l].head.idx.contrast = raw.profiles[l].head.idx.repetition + raw.profiles[l].head.idx.contrast = 0 + + # Set the repetition to 0 + raw.profiles[l].head.idx.repetition = 0 + + # Set the number of samples properly + raw.profiles[l].head.number_of_samples = num_samples + + # Set the non-standard encode step (interleave dimension) into the encode step 1 field + # raw.profiles[l].head.idx.kspace_encode_step_1 = 0 + raw.profiles[l].head.idx.kspace_encode_step_1 = interleave_number - 1 # IF MULTI-INTERLEAVE + + # Set slice to 0 for singleslice, if it is not 0 then there will be an error + if single_slice + raw.profiles[l].head.idx.slice = 0 + end + + # Set center sample to 0 (only for spiral scans) + raw.profiles[l].head.center_sample = 0 + + end + + # Set encoding size to the recon_size + raw.params["encodedSize"] = [recon_size[1], recon_size[2], 1] + +end + +""" + check_acquisition_nodes!(a::AcquisitionData) +Validates processed AcquisitionData object to make sure that |kᵢ| < 0.5 ∀ i ∈ [1, Nₛ] + +# Arguments +* `a::AcquisitionData` - AcquisitionData object +""" +function check_acquisition_nodes!(a::AcquisitionData) + + a.traj[1].nodes[abs.(a.traj[1].nodes[:]).>0.5] .= 0.5 + +end + + +""" + validate_siemens_mrd!(r::RawAcquisitionData) +Validates RawAcquisitionData object created from ISMRMRD format object + +# Arguments +* `r::RawAcquisitionData` - RawAcquisitionData object +""" +function validate_siemens_mrd!(r::RawAcquisitionData) + + @info "Validating Siemens converted data" + + ## FOV CHECK: + + if maximum(r.params["encodedFOV"]) > 0.8 # FOV should never be greater than the bore size in [m] + + @info "FOV was recorded in [mm]! Changing to [m]!" + r.params["encodedFOV"] = r.params["encodedFOV"] ./ 1000 + + end + +end + +""" + validate_acq_data!(a::AcquisitionData) +Validates processed AcquisitionData object after manipulation, etc... + +# Arguments +* `a::AcquisitionData` - AcquisitionData object +""" +function validate_acq_data!(a::AcquisitionData) + + ## Dimensions CHECK: + + # TODO add dimension check that the k-space encoding counters are set properly: + # kdata dimensions: dim1:=contrast/echo | dim2:=slices | dim3:=repetitions + # kdata element dimensions: dim1:=kspace nodes | dim2:=channels/coils + + # permutedims(a.kdata, [3, 2, 1]) + check_acquisition_nodes!(a) + +end + +""" + preprocess_cartesian_data(raw::RawAcquisitionData; dims = 1) +Prepares Cartesian for reconstruction + +# Arguments +* `r::RawAcquisitionData{T}` - RawAcquisitionData object +* `filename` - filename to save the preprocessed data to +""" +function preprocess_cartesian_data(r::RawAcquisitionData, do_save; filename = "data/testFile.h5") + + remove_oversampling!(r) + + # Convert rawAcquisitionData object to an AcquisitionData object (these can be reconstructed) + cartesian_acq_data = AcquisitionData(r, estimateProfileCenter = true) # cannot avoid camel case as defined by MRIBase + + ## Properly arrange data from the converted siemens file + validate_acq_data!(cartesian_acq_data) + + if do_save + + raw = RawAcquisitionData(cartesian_acq_data) + + # Since the data should generally have 3D information when saved, we make sure 2D data is appropriately stored as 3D data with a singleton dimension + if length(raw.params["encodedSize"]) == 2 + e_sz = raw.params["encodedSize"] + raw.params["encodedSize"] = [e_sz[1], e_sz[2], 1] + end + + raw.params["TE"] = r.params["TE"] + + # raw.params = headerCopy + fout = ISMRMRDFile(filename) + save(fout, raw) + + end + + return cartesian_acq_data + +end + +""" + remove_oversampling!(raw::RawAcquisitionData; dims = 1) +Removes 2x readout oversampling in specified raw data dimensions by iFFT, cropping FOV and FFT + +# Arguments +* `raw::RawAcquisitionData{T}` - RawAcquisitionData object +* `dims` - dimension alongside which oversampling is removed (default: 1) +""" +function remove_oversampling!(raw::RawAcquisitionData; dims = [1]) + + dimension_index = dims[1] + num_data_samples = raw.params["encodedSize"][dimension_index] + index_crop_fov = convert(Vector{Int32}, [1:floor(num_data_samples / 4); ceil(3 / 4 * num_data_samples + 1):num_data_samples]) + + # For every profile in the acquisition + for profile_index = 1:length(raw.profiles) + + # IFFT to image space, crop, FFT back to k-space + ifft!(raw.profiles[profile_index].data, dimension_index) + raw.profiles[profile_index].data = fft!(raw.profiles[profile_index].data[index_crop_fov, :], dimension_index) + + end + + # halve encoding size of first dimension + raw.params["encodedSize"][dimension_index] /= 2 + raw.params["encodedFOV"][dimension_index] /= 2 + +end + + +""" + merge_raw_interleaves(params, output_raw) +Merges multiple interleave data together from individually acquired interleave scans + +# Arguments +* `params` - Dictionary +* `output_raw` - Bool +""" +function merge_raw_interleaves(params, output_raw) + + # Get the other interleave indexes other than the one asked for + interleave_complement = [x for x ∈ 1:params[:num_interleaves] if x ∉ params[:interleave]] + + # @info "indices = $interleave_complement" #DEBUG + + # read in the data file from the ISMRMRD format + data_file = ISMRMRDFile(params[:interleave_data_filenames][params[:interleave]]) + + # Read in the gradient file + input_trajectory = read_gradient_text_file(params[:traj_filename], params[:recon_size], params[:delay]) + + # Read in raw data from the data_file + raw_data = RawAcquisitionData(data_file) + + # delete everything that is not a chosen excitation (for efficiency) + indices = 1:length(raw_data.profiles) + ic = [x for x ∈ indices if x ∉ params[:excitations]] + deleteat!(raw_data.profiles, ic) + + # @info "indices = $ic" #DEBUG + + # set up time vector for tracking all of the interleaves + time_track_vector = [] + + # synchronize trajectory data and the kspace data + times = sync_traj_and_data!(raw_data, input_trajectory, params[:num_samples], params[:interleave]) + + # adjust the header so that each diffusion direction is considered as a contrast instead of a repetition + # adjust_header!(raw_data, params[:recon_size], params[:num_samples], params[:interleave],params[:single_slice]) + adjust_header!(raw_data, params[:recon_size], params[:num_samples], 1, params[:single_slice]) + + # add the times to the time tracking vector + append!(time_track_vector, times) + + # Repeat the above steps for each interleave, adjusting the times and headers appropriately + if params[:do_multi_interleave] + + for l in interleave_complement + + # read in separate interleave data file + data_file_temp = ISMRMRDFile(params[:interleave_data_filenames][l]) + raw_data_temp = RawAcquisitionData(data_file_temp) + deleteat!(raw_data_temp.profiles, ic) # delete profiles which aren't needed + + # synchronize the trajectory from the gradient file and the data from the raw data file for the interleave + times_temp = sync_traj_and_data!(raw_data_temp, input_trajectory, params[:num_samples], l) + + # adjust the header to reflect the arrangement of data expected by MRIReco.jl's reconstruction function + adjust_header!(raw_data_temp, params[:recon_size], params[:num_samples], l, params[:single_slice]) + + # append the important data (the profile and the sampling times) to the raw Data file created out of this look + append!(raw_data.profiles, deepcopy(raw_data_temp.profiles)) + append!(time_track_vector, deepcopy(times_temp)) + + end + + # if there is the choice to do odd or opposing interleaves, add the 2nd interleave + elseif params[:do_odd_interleave] + + data_file_temp = ISMRMRDFile(params[:interleave_data_filenames][3]) + raw_data_temp = RawAcquisitionData(data_file_temp) + deleteat!(raw_data_temp.profiles, ic) + + times_temp = sync_traj_and_data!(raw_data_temp, input_trajectory, params[:num_samples], 3) + + adjust_header!(raw_data_temp, params[:recon_size], params[:num_samples], 2, params[:single_slice]) + + append!(raw_data.profiles, copy(raw_data_temp.profiles)) + append!(time_track_vector, times_temp) + + end + + if output_raw + + # return the RawAcquisition data object (missing some corrections but maybe better for some users) + return raw_data + + else + + # converting raw_data to AcquisitionData + @info "Converting RawAcquisitionData to AcquisitionData" + acq_data = AcquisitionData(raw_data, estimateProfileCenter = true) + + ## Assume all of the slices share a trajectory + for l = 1:length(acq_data.traj) + + acq_data.traj[l].times = time_track_vector # set times to the total time vector + acq_data.traj[l].TE = 0.00 # set the TE to 0 + acq_data.traj[l].AQ = times[end] # set the acquisition time to the last element of the time vector (should be the latest time) + acq_data.traj[l].circular = true # set whether to use a circular filter on the kspace data + + end + + for l = 1:length(acq_data.subsampleIndices) # Cannot avoid camelcase + + acq_data.subsampleIndices[l] = 1:size(acq_data.traj[l].nodes, 2) + + end + + # return the acquisition data object with everything corrected + return acq_data + + end + +end + +""" + apply_girf!(raw::RawAcquisitionData, g::GirfApplier) +Applies the GIRF to the trajectories inside of a::AcquisitionData + +# Arguments +* `a::AcquisitionData{T}` - AcquisitionData object +* `g::GirfApplier` - GirfApplier object containing GIRF definition +""" +function apply_girf!(a::AcquisitionData{T}, g::GirfApplier) where {T} + + # Read parameters for gradient and node conversion + S = a.encodingSize + F = a.fov + + # Check dimensions of the acquisition data and ensure encoding size and FOV are consistent + if length(S) == 2 + S = (S[1], S[2], 1) + end + + if length(F) == 2 + F = Float32.(F[1], F[2], 1.0) + end + + # loop over all contained trajectories + for l = 1:length(a.traj) + + num_profiles = a.traj[l].numProfiles + num_samples = a.traj[l].numSamplingPerProfile + nodes = a.traj[l].nodes + times = a.traj[l].times + old_nodes = a.traj[l].nodes + + # loop over all profiles in a trajectory + for profile = 1:num_profiles + + interleave_extractor = num_samples * (profile - 1) .+ (1:num_samples) + interleave_nodes = nodes[:, interleave_extractor] + interleave_times = times[interleave_extractor] + + dt = interleave_times[1] - interleave_times[2] + + interleave_gradients = nodes_to_gradients(interleave_nodes; dwellTime = dt, reconSize = S, FOV = F) + + # loop over trajectory dimensions + for dim = 1:size(interleave_gradients, 1) + + corrected_gradients = apply_girf(g, interleave_gradients[dim, :], interleave_times, interleave_times, dim) # THESE ARE ALL VECTORS SO INPUT orientation (column/row major ordering) doesn't matter + interleave_gradients[dim, :] = corrected_gradients' + + end + + interleave_nodes = gradients_to_nodes(interleave_gradients; dwellTime = dt, reconSize = S, FOV = F) + nodes[:, interleave_extractor] = interleave_nodes + + end + + a.traj[l].nodes = nodes + + end + +end + +""" + apply_k0!(raw::RawAcquisitionData, g::GirfApplier) +Applies the K0 modulation due to imaging gradients to the data inside of a::AcquisitionData + +# Arguments +* `a::AcquisitionData{T}` - AcquisitionData object +* `g::GirfApplier` - GirfApplier containing GIRF definition +""" +function apply_k0!(a::AcquisitionData{T}, g::GirfApplier) where {T} + + # Read parameters for gradient and node conversion + S = a.encodingSize + F = a.fov + + if length(S) == 2 + S = (S[1], S[2], 1) + end + if length(F) == 2 + F = (F[1], F[2], 1.0) + end + + # loop over all contained trajectories + for l = 1:length(a.traj) + + num_profiles = a.traj[l].numProfiles + num_samples = a.traj[l].numSamplingPerProfile + nodes = a.traj[l].nodes + times = a.traj[l].times + old_nodes = a.traj[l].nodes + + # loop over all profiles in a trajectory + for profile = 1:num_profiles + + interleave_extractor = num_samples * (profile - 1) .+ (1:num_samples) + interleave_nodes = nodes[:, interleave_extractor] + interleave_times = times[interleave_extractor] + + dt = interleave_times[1] - interleave_times[2] + + interleave_gradients = nodes_to_gradients(interleave_nodes; dwellTime = dt, reconSize = S, FOV = F) + + k0_correction = ones(size(interleave_gradients)) + + # loop over all trajectory dims + for dim = 1:size(interleave_gradients, 1) + + k0_correction[dim, :] = apply_girf(g, interleave_gradients[dim, :], interleave_times, interleave_times, dim) # THESE ARE ALL VECTORS SO INPUT orientation (column/row major ordering) doesn't matter + + end + + final_correction = sum(k0_correction, dims = 1) #back to radians! + + a.kdata[l][interleave_extractor, :] = a.kdata[l][interleave_extractor, :] .* exp.(-1im .* final_correction') + + # # Visualization of Phase Modulation + # figure("Phase Modulation 2") + # plot(vec(interleave_times), vec(angle.(exp.(1im .* final_correction)))) + # xlabel("Time [s]") + # ylabel("k₀ [rad]") + # title("B₀ Eddy Current Fluctuation During Readout ") + + # plot(interleave_times, angle.(exp.(1im .* final_correction')),show=true,title="B₀ Eddy Current Fluctuation During Readout ") #DEBUG + + end + + end + +end + +# ## Calibrate the phase from individual interleaves +# function calibrateAcquisitionPhase!(a::AcquisitionData) + +# for l = 1:length(a.traj) + +# num_profiles = a.traj[l].numProfiles +# num_samples = a.traj[l].numSamplingPerProfile +# nodes = a.traj[l].nodes +# times = a.traj[l].times +# old_nodes = a.traj[l].nodes + +# initialInterleavePhase = angle.(a.kdata[l][1,:])' + +# for profile = 2:num_profiles + +# interleave_extractor = num_samples*(profile-1) .+ (1:num_samples) + +# initialProfilePhase = angle.(a.kdata[l][interleave_extractor[1],:])' + +# @info size(initialInterleavePhase) +# @info size(a.kdata[l][interleave_extractor,:]) + +# a.kdata[l][interleave_extractor,:] .*= exp.(-1im * (initialInterleavePhase - initialProfilePhase)) + +# end +# end + +# end + +## Input/Output, File handling + +""" + save_map(filename, calib_map, resolution_mm; offset_mm = [0.0, 0.0, 0.0]) +Saves calibration maps (sensitivity or B0) as 4D NIfTI file(s) + +For complex-valued data, magnitude and phase can be split into separate files +# Arguments +* `filename::String` - string filename with extension .nii, example "sensemap.nii" +* `calib_map` - [nX nY nZ {nChannels}] 4-D sensitivity or 3D B0 map array +* `resolution_mm` - resolution in mm, 3 element vector, e.g., [1.0, 1.0, 2.0] +* `offset_mm` - isocenter offset in mm, default: [0.0, 0.0, 0.0] +* `do_split_phase::Bool=false` - if true, data is saved in two nifti files with suffix "_magn" and "_phase", respectively + to enable display in typical NIfTI viewers +""" +function save_map(filename, calib_map, resolution_mm; offset_mm = [0.0, 0.0, 0.0], do_split_phase::Bool = false, do_normalize::Bool = true) + + # multiplication with 1000 should no longer be necessary after MRIReco 0.7.1 + spacing = 1000.0 .* resolution_mm .* Unitful.mm + offset = 1000.0 .* offset_mm .* Unitful.mm + + if ndims(calib_map) >= 4 # multi-coil calib_map, e.g., sensitivity, or recon, but we can only store the first 4 dims in a Nifti + I = reshape(calib_map, size(calib_map, 1), size(calib_map, 2), size(calib_map, 3), size(calib_map, 4), 1, 1) + else + I = reshape(calib_map, size(calib_map, 1), size(calib_map, 2), size(calib_map, 3), 1, 1, 1) + end + + # scale to max 1 + if do_normalize + I /= maximum(abs.(I)) + end + + # AxisArray Constructor + im = AxisArray( + I, + Axis{:x}(range(offset[1], step = spacing[1], length = size(I, 1))), + Axis{:y}(range(offset[2], step = spacing[2], length = size(I, 2))), + Axis{:z}(range(offset[3], step = spacing[3], length = size(I, 3))), + Axis{:coils}(1:size(I, 4)), + Axis{:echos}(1:size(I, 5)), + Axis{:repetitions}(1:size(I, 6)), + ) + + # if separate mag and phase are desired, save them separately + if do_split_phase + + magnitude_filename = splitext(filename)[1] * "_magn.nii" + saveImage(magnitude_filename, map(abs, im)) # map is needed, because abs.(im) would convert AxisArray back into basic array + + phase_filename = splitext(filename)[1] * "_phase.nii" + saveImage(phase_filename, map(angle, im)) + + else + + saveImage(filename, im) + + end + +end + +""" + load_map(filename, calib_map, resolution_mm; offset_mm = [0.0, 0.0, 0.0]) +Saves calibration maps (sensitivity or B0) as 4D NIfTI file(s) + +For complex-valued data, magnitude and phase can be split into separate files +# Arguments +* `filename::String` - string filename with extension .nii, example "sensemap.nii" +* `do_split_phase::Bool=false` - if true, data is saved in two nifti files with suffix "_magn" and "_phase", respectively + to enable display in typical NIfTI viewers +# Output +* `calib_map` - [nX nY nZ {nChannels}] 4-D sensitivity or 3D B0 map array +""" +function load_map(filename; do_split_phase::Bool = false) + + # if separate mag and phase are saved, load and combine them + if do_split_phase + + magnitude_filename = splitext(filename)[1] * "_magn.nii" + magnitude_image = loadImage(magnitude_filename) # map is needed, because abs.(im) would convert AxisArray back into basic array + + phase_filename = splitext(filename)[1] * "_phase.nii" + phase_image = loadImage(phase_filename) + + calib_map = (magnitude_image.data) .* exp.(1im .* (phase_image.data)) + + else + + I = loadImage(filename) + calib_map = I.data + + end + + # squeeze singleton dimensions of 6-dim array + calib_map = dropdims(calib_map, dims = tuple(findall(size(calib_map) .== 1)...)) + + return calib_map + +end + +""" + shift_kspace!(acqdata, shift) +Shifts image to different location by applying phase ramp to image + +Perhaps this should be called shift_fov +# Arguments +* `acqdata::AcquisitionData{T}` - AcquisitionData object +* `shift::AbstractVector` - Vector containing shift +""" +function shift_kspace!(acqdata, shift) + + num_slices = numSlices(acqdata) + num_repetitions, num_contrasts = numRepetitions(acqdata), numContrasts(acqdata) + + smat = prod(exp.(1im .* acqdata.traj[1].nodes[:, acqdata.subsampleIndices[1]] .* shift .* 2 .* pi), dims = 1) + + for slice = 1:num_slices + for contr = 1:num_contrasts + for rep = 1:num_repetitions + acqdata.kdata[contr, slice, rep] = acqdata.kdata[contr, slice, rep] .* smat' + end + end + end + +end \ No newline at end of file diff --git a/test/Project.toml b/test/Project.toml new file mode 100644 index 0000000..b6afa09 --- /dev/null +++ b/test/Project.toml @@ -0,0 +1,11 @@ +[deps] +GIRFReco = "cf1bd817-9e2d-403d-b1e7-15ef5a867bae" +ImageUtils = "8ad4436d-4835-5a14-8bce-3ae014d2950b" +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +MRIFiles = "5a6f062f-bf45-497d-b654-ad17aae2a530" +MRIReco = "bdf86e05-2d2b-5731-a332-f3fe1f9e047f" +MRISampling = "9be66c26-f988-4649-80fc-f4721a4a33f2" +MRISimulation = "8988da37-ea20-4fa6-9af7-8a6f6f9a8970" +Scratch = "6c6a2e73-6563-6170-7368-637461726353" +Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/test/data/acq_data.jld2 b/test/data/acq_data.jld2 new file mode 100644 index 0000000..0128cba Binary files /dev/null and b/test/data/acq_data.jld2 differ diff --git a/test/data/girf_app_k0.jld2 b/test/data/girf_app_k0.jld2 new file mode 100644 index 0000000..a10d53a Binary files /dev/null and b/test/data/girf_app_k0.jld2 differ diff --git a/test/data/girf_app_k1.jld2 b/test/data/girf_app_k1.jld2 new file mode 100644 index 0000000..2d8cf2c Binary files /dev/null and b/test/data/girf_app_k1.jld2 differ diff --git a/test/data/gradients508.txt b/test/data/gradients508.txt new file mode 100644 index 0000000..9b75cc9 --- /dev/null +++ b/test/data/gradients508.txt @@ -0,0 +1,25757 @@ +#4 +25736 +1.000000e-05 +3217 +4 +2 +0.00000000e+00 +3.21700000e-02 +18681 +1 +0.00000000e+00 +0.00000000e+00 +0.00000000e+00 +2.20000000e-01 +2.20000000e-01 +0.00000000e+00 +1.10000000e-03 +1.10000000e-03 +0.00000000e+00 +3.09956298e+01 +0 +0.00000000e+00 +3.75894696e-02 +5.41560073e-02 +2.95835980e-02 +-8.70411943e-03 +-5.00911446e-02 +-8.73083514e-02 +-1.15036766e-01 +-1.30269729e-01 +-1.32053160e-01 +-1.20990646e-01 +-9.87467118e-02 +-6.76333901e-02 +-3.02898900e-02 +1.05583227e-02 +5.22773787e-02 +9.24531424e-02 +1.28979264e-01 +1.60113819e-01 +1.84508910e-01 +2.01219804e-01 +2.09696810e-01 +2.09763641e-01 +2.01585619e-01 +1.85630373e-01 +1.62623319e-01 +1.33500301e-01 +9.93589388e-02 +6.14104577e-02 +2.09331343e-02 +-2.07714714e-02 +-6.24187235e-02 +-1.02776896e-01 +-1.40698472e-01 +-1.75146527e-01 +-2.05215986e-01 +-2.30149830e-01 +-2.49350314e-01 +-2.62385426e-01 +-2.68990985e-01 +-2.69068324e-01 +-2.62678554e-01 +-2.50033875e-01 +-2.31485030e-01 +-2.07507710e-01 +-1.78686246e-01 +-1.45696380e-01 +-1.09286934e-01 +-7.02611030e-02 +-2.94576468e-02 +1.22676087e-02 +5.40596119e-02 +9.50809915e-02 +1.34527761e-01 +1.71643601e-01 +2.05732566e-01 +2.36170062e-01 +2.62411987e-01 +2.84002057e-01 +3.00577154e-01 +3.11870911e-01 +3.17715324e-01 +3.18040743e-01 +3.12874101e-01 +3.02335615e-01 +2.86634098e-01 +2.66060979e-01 +2.40983210e-01 +2.11835222e-01 +1.79110219e-01 +1.43350654e-01 +1.05138483e-01 +6.50851022e-02 +2.38211104e-02 +-1.80136981e-02 +-5.97803026e-02 +-1.00849969e-01 +-1.40613336e-01 +-1.78488910e-01 +-2.13930854e-01 +-2.46436109e-01 +-2.75550517e-01 +-3.00874285e-01 +-3.22066287e-01 +-3.38847639e-01 +-3.51004124e-01 +-3.58387871e-01 +-3.60917821e-01 +-3.58579610e-01 +-3.51424287e-01 +-3.39566323e-01 +-3.23180918e-01 +-3.02500479e-01 +-2.77810470e-01 +-2.49444762e-01 +-2.17780462e-01 +-1.83232319e-01 +-1.46246805e-01 +-1.07295983e-01 +-6.68711827e-02 +-2.54766276e-02 +1.63769532e-02 +5.81786332e-02 +9.94234227e-02 +1.39618246e-01 +1.78287538e-01 +2.14978579e-01 +2.49266463e-01 +2.80758507e-01 +3.09098300e-01 +3.33969201e-01 +3.55097333e-01 +3.72254011e-01 +3.85257608e-01 +3.93974752e-01 +3.98321236e-01 +3.98262138e-01 +3.93811339e-01 +3.85030774e-01 +3.72029074e-01 +3.54959465e-01 +3.34017806e-01 +3.09439576e-01 +2.81496989e-01 +2.50495535e-01 +2.16770269e-01 +1.80681983e-01 +1.42613005e-01 +1.02963025e-01 +6.21447308e-02 +2.05793883e-02 +-2.13074978e-02 +-6.30905927e-02 +-1.04348973e-01 +-1.44670310e-01 +-1.83654789e-01 +-2.20919008e-01 +-2.56099479e-01 +-2.88855895e-01 +-3.18874232e-01 +-3.45869477e-01 +-3.69587935e-01 +-3.89809263e-01 +-4.06348296e-01 +-4.19056316e-01 +-4.27821951e-01 +-4.32571840e-01 +-4.33270894e-01 +-4.29922087e-01 +-4.22566030e-01 +-4.11280202e-01 +-3.96177735e-01 +-3.77405983e-01 +-3.55144809e-01 +-3.29604567e-01 +-3.01023877e-01 +-2.69667134e-01 +-2.35821879e-01 +-1.99795962e-01 +-1.61914601e-01 +-1.22517307e-01 +-8.19547487e-02 +-4.05855556e-02 +1.22689239e-03 +4.31176730e-02 +8.47234958e-02 +1.25685814e-01 +1.65653855e-01 +2.04287531e-01 +2.41260222e-01 +2.76261404e-01 +3.08999101e-01 +3.39202169e-01 +3.66622370e-01 +3.91036174e-01 +4.12246366e-01 +4.30083417e-01 +4.44406678e-01 +4.55105238e-01 +4.62098443e-01 +4.65336272e-01 +4.64799611e-01 +4.60500042e-01 +4.52479260e-01 +4.40808664e-01 +4.25588631e-01 +4.06947078e-01 +3.85038355e-01 +3.60042093e-01 +3.32161009e-01 +3.01619434e-01 +2.68661467e-01 +2.33548453e-01 +1.96557349e-01 +1.57978033e-01 +1.18111090e-01 +7.72655131e-02 +3.57560444e-02 +-6.09905073e-03 +-4.79805945e-02 +-8.95708455e-02 +-1.30555886e-01 +-1.70628002e-01 +-2.09487853e-01 +-2.46846744e-01 +-2.82428549e-01 +-3.15971849e-01 +-3.47231449e-01 +-3.75980488e-01 +-4.02011341e-01 +-4.25137777e-01 +-4.45195210e-01 +-4.62042680e-01 +-4.75562879e-01 +-4.85663241e-01 +-4.92276512e-01 +-4.95360404e-01 +-4.94898622e-01 +-4.90899956e-01 +-4.83398333e-01 +-4.72452727e-01 +-4.58145815e-01 +-4.40583759e-01 +-4.19895326e-01 +-3.96230283e-01 +-3.69758665e-01 +-3.40669438e-01 +-3.09168678e-01 +-2.75478278e-01 +-2.39834384e-01 +-2.02485449e-01 +-1.63690475e-01 +-1.23717284e-01 +-8.28405618e-02 +-4.13398945e-02 +5.02122253e-04 +4.24017956e-02 +8.40762839e-02 +1.25245500e-01 +1.65633941e-01 +2.04972501e-01 +2.43000209e-01 +2.79465990e-01 +3.14130138e-01 +3.46765884e-01 +3.77160773e-01 +4.05117975e-01 +4.30457480e-01 +4.53017158e-01 +4.72653669e-01 +4.89243264e-01 +5.02682454e-01 +5.12888555e-01 +5.19800079e-01 +5.23376984e-01 +5.23600779e-01 +5.20474510e-01 +5.14022591e-01 +5.04290501e-01 +4.91344361e-01 +4.75270374e-01 +4.56174159e-01 +4.34179953e-01 +4.09429713e-01 +3.82082112e-01 +3.52311438e-01 +3.20306408e-01 +2.86268908e-01 +2.50412650e-01 +2.12961783e-01 +1.74149441e-01 +1.34216253e-01 +9.34088200e-02 +5.19781704e-02 +1.01781988e-02 +-3.17358982e-02 +-7.35091781e-02 +-1.14888497e-01 +-1.55624025e-01 +-1.95470737e-01 +-2.34189853e-01 +-2.71550234e-01 +-3.07329717e-01 +-3.41316405e-01 +-3.73309829e-01 +-4.03122097e-01 +-4.30578949e-01 +-4.55520662e-01 +-4.77802924e-01 +-4.97297598e-01 +-5.13893390e-01 +-5.27496417e-01 +-5.38030585e-01 +-5.45438013e-01 +-5.49679179e-01 +-5.50733094e-01 +-5.48597272e-01 +-5.43287733e-01 +-5.34838785e-01 +-5.23302636e-01 +-5.08749014e-01 +-4.91264680e-01 +-4.70952847e-01 +-4.47932604e-01 +-4.22338020e-01 +-3.94317269e-01 +-3.64031741e-01 +-3.31655124e-01 +-2.97372416e-01 +-2.61378654e-01 +-2.23877788e-01 +-1.85081548e-01 +-1.45208303e-01 +-1.04481672e-01 +-6.31292447e-02 +-2.13813784e-02 +2.05300884e-02 +6.23732104e-02 +1.03917148e-01 +1.44933406e-01 +1.85197207e-01 +2.24488580e-01 +2.62593467e-01 +2.99305108e-01 +3.34425014e-01 +3.67763755e-01 +3.99142295e-01 +4.28392947e-01 +4.55359686e-01 +4.79899413e-01 +5.01882846e-01 +5.21194311e-01 +5.37733028e-01 +5.51413680e-01 +5.62165806e-01 +5.69935231e-01 +5.74683884e-01 +5.76389196e-01 +5.75045542e-01 +5.70663050e-01 +5.63267538e-01 +5.52901411e-01 +5.39621635e-01 +5.23500876e-01 +5.04626394e-01 +4.83099041e-01 +4.59034084e-01 +4.32558732e-01 +4.03812956e-01 +3.72947863e-01 +3.40124880e-01 +3.05515571e-01 +2.69299533e-01 +2.31664779e-01 +1.92805478e-01 +1.52921933e-01 +1.12218849e-01 +7.09046404e-02 +2.91902196e-02 +-1.27120897e-02 +-5.45895963e-02 +-9.62303057e-02 +-1.37424120e-01 +-1.77963589e-01 +-2.17645436e-01 +-2.56270854e-01 +-2.93647397e-01 +-3.29588796e-01 +-3.63917166e-01 +-3.96462374e-01 +-4.27064486e-01 +-4.55572750e-01 +-4.81848153e-01 +-5.05762174e-01 +-5.27199201e-01 +-5.46055369e-01 +-5.62240408e-01 +-5.75677061e-01 +-5.86301800e-01 +-5.94065366e-01 +-5.98931900e-01 +-6.00880845e-01 +-5.99904591e-01 +-5.96011168e-01 +-5.89221470e-01 +-5.79571299e-01 +-5.67109783e-01 +-5.51899292e-01 +-5.34016050e-01 +-5.13547815e-01 +-4.90595689e-01 +-4.65271562e-01 +-4.37698691e-01 +-4.08011046e-01 +-3.76351639e-01 +-3.42873293e-01 +-3.07736519e-01 +-2.71109416e-01 +-2.33167004e-01 +-1.94089588e-01 +-1.54062765e-01 +-1.13276007e-01 +-7.19217746e-02 +-3.01949021e-02 +1.17086670e-02 +5.35925845e-02 +9.52611279e-02 +1.36520043e-01 +1.77177401e-01 +2.17044759e-01 +2.55937573e-01 +2.93676289e-01 +3.30087435e-01 +3.65003733e-01 +3.98265240e-01 +4.29720424e-01 +4.59226006e-01 +4.86647946e-01 +5.11862575e-01 +5.34756278e-01 +5.55226091e-01 +5.73180789e-01 +5.88540826e-01 +6.01238171e-01 +6.11217257e-01 +6.18435390e-01 +6.22861953e-01 +6.24478945e-01 +6.23281446e-01 +6.19277282e-01 +6.12486421e-01 +6.02941404e-01 +5.90687393e-01 +5.75781404e-01 +5.58291890e-01 +5.38298796e-01 +5.15893293e-01 +4.91176922e-01 +4.64261042e-01 +4.35266600e-01 +4.04323630e-01 +3.71570448e-01 +3.37152848e-01 +3.01223684e-01 +2.63942174e-01 +2.25473181e-01 +1.85986270e-01 +1.45655074e-01 +1.04656566e-01 +6.31702590e-02 +2.13773711e-02 +-2.05399918e-02 +-6.23995691e-02 +-1.04019739e-01 +-1.45220331e-01 +-1.85823427e-01 +-2.25654077e-01 +-2.64541016e-01 +-3.02317420e-01 +-3.38821613e-01 +-3.73897781e-01 +-4.07396608e-01 +-4.39175787e-01 +-4.69100666e-01 +-4.97044806e-01 +-5.22890488e-01 +-5.46529232e-01 +-5.67862210e-01 +-5.86800516e-01 +-6.03265589e-01 +-6.17189485e-01 +-6.28515167e-01 +-6.37196694e-01 +-6.43199363e-01 +-6.46499873e-01 +-6.47086289e-01 +-6.44958049e-01 +-6.40125977e-01 +-6.32612195e-01 +-6.22449985e-01 +-6.09683611e-01 +-5.94368094e-01 +-5.76568964e-01 +-5.56361933e-01 +-5.33832524e-01 +-5.09075692e-01 +-4.82195416e-01 +-4.53304232e-01 +-4.22522743e-01 +-3.89979091e-01 +-3.55808405e-01 +-3.20152217e-01 +-2.83157866e-01 +-2.44977870e-01 +-2.05769287e-01 +-1.65693051e-01 +-1.24913310e-01 +-8.35967396e-02 +-4.19118636e-02 +-2.83603840e-05 +4.18836291e-02 +8.36541927e-02 +1.25114333e-01 +1.66096650e-01 +2.06436008e-01 +2.45970194e-01 +2.84540562e-01 +3.21992661e-01 +3.58176836e-01 +3.92948814e-01 +4.26170265e-01 +4.57709337e-01 +4.87441155e-01 +5.15248297e-01 +5.41021246e-01 +5.64658797e-01 +5.86068404e-01 +6.05166583e-01 +6.21879127e-01 +6.36141449e-01 +6.47898771e-01 +6.57106284e-01 +6.63729334e-01 +6.67743514e-01 +6.69134718e-01 +6.67899168e-01 +6.64043392e-01 +6.57584167e-01 +6.48548421e-01 +6.36973114e-01 +6.22905034e-01 +6.06400570e-01 +5.87525532e-01 +5.66354775e-01 +5.42971960e-01 +5.17469137e-01 +4.89946411e-01 +4.60511505e-01 +4.29279319e-01 +3.96371477e-01 +3.61915828e-01 +3.26045939e-01 +2.88900563e-01 +2.50623088e-01 +2.11360979e-01 +1.71265194e-01 +1.30489604e-01 +8.91903904e-02 +4.75254421e-02 +5.65374831e-03 +-3.62652080e-02 +-7.80720575e-02 +-1.19608148e-01 +-1.60716145e-01 +-2.01240623e-01 +-2.41028643e-01 +-2.79930326e-01 +-3.17799406e-01 +-3.54493773e-01 +-3.89876011e-01 +-4.23813890e-01 +-4.56180834e-01 +-4.86856384e-01 +-5.15726632e-01 +-5.42684630e-01 +-5.67630757e-01 +-5.90473078e-01 +-6.11127650e-01 +-6.29518861e-01 +-6.45579694e-01 +-6.59251862e-01 +-6.70486035e-01 +-6.79242007e-01 +-6.85488805e-01 +-6.89204777e-01 +-6.90377639e-01 +-6.89004587e-01 +-6.85092236e-01 +-6.78656460e-01 +-6.69722381e-01 +-6.58324231e-01 +-6.44505201e-01 +-6.28317275e-01 +-6.09821093e-01 +-5.89085673e-01 +-5.66188000e-01 +-5.41212771e-01 +-5.14252118e-01 +-4.85405216e-01 +-4.54777970e-01 +-4.22482669e-01 +-3.88637348e-01 +-3.53365431e-01 +-3.16795286e-01 +-2.79059746e-01 +-2.40295687e-01 +-2.00643504e-01 +-1.60246466e-01 +-1.19250262e-01 +-7.78025092e-02 +-3.60522149e-02 +5.85075311e-03 +4.77562824e-02 +8.95145068e-02 +1.30976313e-01 +1.71993852e-01 +2.12421169e-01 +2.52114689e-01 +2.90933638e-01 +3.28740536e-01 +3.65401669e-01 +4.00787811e-01 +4.34774428e-01 +4.67242034e-01 +4.98076620e-01 +5.27170188e-01 +5.54421350e-01 +5.79735147e-01 +6.03023469e-01 +6.24205372e-01 +6.43207873e-01 +6.59965673e-01 +6.74421178e-01 +6.86524791e-01 +6.96235582e-01 +7.03521245e-01 +7.08357565e-01 +7.10728723e-01 +7.10627801e-01 +7.08056873e-01 +7.03026078e-01 +6.95553861e-01 +6.85667441e-01 +6.73402737e-01 +6.58803284e-01 +6.41920403e-01 +6.22813697e-01 +6.01550543e-01 +5.78205091e-01 +5.52858411e-01 +5.25598971e-01 +4.96521490e-01 +4.65726363e-01 +4.33319796e-01 +3.99413906e-01 +3.64125291e-01 +3.27574913e-01 +2.89888208e-01 +2.51194359e-01 +2.11625427e-01 +1.71316313e-01 +1.30404526e-01 +8.90291276e-02 +4.73305318e-02 +5.45018461e-03 +-3.64701732e-02 +-7.82888826e-02 +-1.19864753e-01 +-1.61057802e-01 +-2.01729446e-01 +-2.41742895e-01 +-2.80964173e-01 +-3.19261983e-01 +-3.56507986e-01 +-3.92578130e-01 +-4.27352381e-01 +-4.60714642e-01 +-4.92554359e-01 +-5.22766315e-01 +-5.51250034e-01 +-5.77911668e-01 +-6.02663828e-01 +-6.25424548e-01 +-6.46119373e-01 +-6.64681204e-01 +-6.81048838e-01 +-6.95169367e-01 +-7.06997766e-01 +-7.16495224e-01 +-7.23631896e-01 +-7.28385903e-01 +-7.30741797e-01 +-7.30693624e-01 +-7.28242997e-01 +-7.23398165e-01 +-7.16177116e-01 +-7.06604600e-01 +-6.94712310e-01 +-6.80541382e-01 +-6.64138724e-01 +-6.45558628e-01 +-6.24863726e-01 +-6.02121650e-01 +-5.77407696e-01 +-5.50803706e-01 +-5.22396172e-01 +-4.92278970e-01 +-4.60550446e-01 +-4.27313748e-01 +-3.92677962e-01 +-3.56755200e-01 +-3.19662342e-01 +-2.81519947e-01 +-2.42451048e-01 +-2.02582448e-01 +-1.62042632e-01 +-1.20962276e-01 +-7.94738050e-02 +-3.77103990e-02 +4.19374843e-03 +4.61043847e-02 +8.78872877e-02 +1.29409031e-01 +1.70536889e-01 +2.11139962e-01 +2.51088972e-01 +2.90256771e-01 +3.28519495e-01 +3.65755292e-01 +4.01846960e-01 +4.36680098e-01 +4.70144834e-01 +5.02136246e-01 +5.32552906e-01 +5.61300448e-01 +5.88287794e-01 +6.13431314e-01 +6.36652344e-01 +6.57878258e-01 +6.77044075e-01 +6.94089164e-01 +7.08962439e-01 +7.21616822e-01 +7.32014698e-01 +7.40124009e-01 +7.45920304e-01 +7.49387213e-01 +7.50513785e-01 +7.49299090e-01 +7.45746287e-01 +7.39869174e-01 +7.31685671e-01 +7.21223315e-01 +7.08515086e-01 +6.93601508e-01 +6.76530242e-01 +6.57354366e-01 +6.36135293e-01 +6.12938278e-01 +5.87837315e-01 +5.60909337e-01 +5.32239594e-01 +5.01916013e-01 +4.70033750e-01 +4.36690774e-01 +4.01990834e-01 +3.66040716e-01 +3.28951498e-01 +2.90837340e-01 +2.51815386e-01 +2.12005602e-01 +1.71529875e-01 +1.30512360e-01 +8.90782965e-02 +4.73543939e-02 +5.46779601e-03 +-3.64538621e-02 +-7.82830264e-02 +-1.19892735e-01 +-1.61156538e-01 +-2.01949707e-01 +-2.42148408e-01 +-2.81631653e-01 +-3.20279705e-01 +-3.57976764e-01 +-3.94608620e-01 +-4.30066022e-01 +-4.64241656e-01 +-4.97034090e-01 +-5.28344194e-01 +-5.58079495e-01 +-5.86150253e-01 +-6.12473970e-01 +-6.36971401e-01 +-6.59570882e-01 +-6.80204663e-01 +-6.98812614e-01 +-7.15339364e-01 +-7.29736851e-01 +-7.41962831e-01 +-7.51981695e-01 +-7.59764895e-01 +-7.65289539e-01 +-7.68541139e-01 +-7.69509704e-01 +-7.68194874e-01 +-7.64599765e-01 +-7.58737863e-01 +-7.50625576e-01 +-7.40289699e-01 +-7.27760065e-01 +-7.13075982e-01 +-6.96280675e-01 +-6.77425158e-01 +-6.56565721e-01 +-6.33764275e-01 +-6.09089481e-01 +-5.82613520e-01 +-5.54416246e-01 +-5.24579718e-01 +-4.93193405e-01 +-4.60348812e-01 +-4.26143437e-01 +-3.90677520e-01 +-3.54055198e-01 +-3.16384241e-01 +-2.77774399e-01 +-2.38339295e-01 +-1.98193490e-01 +-1.57454612e-01 +-1.16241058e-01 +-7.46729003e-02 +-3.28709624e-02 +9.04344693e-03 +5.09487765e-02 +9.27236112e-02 +1.34247246e-01 +1.75399595e-01 +2.16061945e-01 +2.56117285e-01 +2.95449906e-01 +3.33947369e-01 +3.71498479e-01 +4.07996085e-01 +4.43335524e-01 +4.77415382e-01 +5.10139185e-01 +5.41412524e-01 +5.71147384e-01 +5.99258644e-01 +6.25666384e-01 +6.50296663e-01 +6.73078487e-01 +6.93948925e-01 +7.12848369e-01 +7.29723665e-01 +7.44528560e-01 +7.57220222e-01 +7.67764875e-01 +7.76132638e-01 +7.82300284e-01 +7.86252489e-01 +7.87977283e-01 +7.87471909e-01 +7.84738383e-01 +7.79784445e-01 +7.72626556e-01 +7.63284335e-01 +7.51785544e-01 +7.38163987e-01 +7.22457527e-01 +7.04712572e-01 +6.84979133e-01 +6.63312991e-01 +6.39776969e-01 +6.14436592e-01 +5.87364081e-01 +5.58636375e-01 +5.28333510e-01 +4.96541776e-01 +4.63350293e-01 +4.28851800e-01 +3.93143926e-01 +3.56326077e-01 +3.18501226e-01 +2.79775581e-01 +2.40256649e-01 +2.00054790e-01 +1.59282084e-01 +1.18051593e-01 +7.64780411e-02 +3.46767256e-02 +-7.23658345e-03 +-4.91458214e-02 +-9.09351819e-02 +-1.32489137e-01 +-1.73693234e-01 +-2.14433913e-01 +-2.54598811e-01 +-2.94077922e-01 +-3.32762669e-01 +-3.70546661e-01 +-4.07327005e-01 +-4.43002761e-01 +-4.77476093e-01 +-5.10653714e-01 +-5.42444775e-01 +-5.72762341e-01 +-6.01524942e-01 +-6.28654058e-01 +-6.54075675e-01 +-6.77722053e-01 +-6.99528926e-01 +-7.19436900e-01 +-7.37393490e-01 +-7.53350284e-01 +-7.67263839e-01 +-7.79098024e-01 +-7.88821506e-01 +-7.96407753e-01 +-8.01837640e-01 +-8.05097711e-01 +-8.06178922e-01 +-8.05079403e-01 +-8.01803833e-01 +-7.96360873e-01 +-7.88765843e-01 +-7.79041149e-01 +-7.67213060e-01 +-7.53313706e-01 +-7.37382213e-01 +-7.19462001e-01 +-6.99601250e-01 +-6.77854465e-01 +-6.54281186e-01 +-6.28944531e-01 +-6.01912984e-01 +-5.73260360e-01 +-5.43063404e-01 +-5.11403080e-01 +-4.78365054e-01 +-4.44038093e-01 +-4.08513796e-01 +-3.71887393e-01 +-3.34257312e-01 +-2.95723744e-01 +-2.56389404e-01 +-2.16359436e-01 +-1.75740434e-01 +-1.34640253e-01 +-9.31681575e-02 +-5.14343463e-02 +-9.54935920e-03 +3.23758526e-02 +7.42303241e-02 +1.15903521e-01 +1.57285380e-01 +1.98266656e-01 +2.38739544e-01 +2.78597597e-01 +3.17735847e-01 +3.56051440e-01 +3.93444248e-01 +4.29816190e-01 +4.65071827e-01 +4.99119016e-01 +5.31869372e-01 +5.63237205e-01 +5.93140552e-01 +6.21501782e-01 +6.48247776e-01 +6.73308770e-01 +6.96619601e-01 +7.18120255e-01 +7.37755799e-01 +7.55475222e-01 +7.71232753e-01 +7.84988281e-01 +7.96707288e-01 +8.06359526e-01 +8.13920322e-01 +8.19370959e-01 +8.22698658e-01 +8.23895066e-01 +8.22957502e-01 +8.19889165e-01 +8.14699435e-01 +8.07402105e-01 +7.98016409e-01 +7.86567215e-01 +7.73085381e-01 +7.57606281e-01 +7.40170090e-01 +7.20822228e-01 +6.99613464e-01 +6.76599244e-01 +6.51838915e-01 +6.25396484e-01 +5.97340419e-01 +5.67743654e-01 +5.36682321e-01 +5.04236245e-01 +4.70488867e-01 +4.35527150e-01 +3.99440972e-01 +3.62322625e-01 +3.24267112e-01 +2.85371819e-01 +2.45736349e-01 +2.05461813e-01 +1.64650826e-01 +1.23407359e-01 +8.18364300e-02 +4.00437810e-02 +-1.86450583e-03 +-4.37820996e-02 +-8.56027091e-02 +-1.27220412e-01 +-1.68530008e-01 +-2.09427090e-01 +-2.49808357e-01 +-2.89571906e-01 +-3.28617572e-01 +-3.66847258e-01 +-4.04164772e-01 +-4.40476299e-01 +-4.75690671e-01 +-5.09719651e-01 +-5.42478335e-01 +-5.73884721e-01 +-6.03860258e-01 +-6.32330106e-01 +-6.59223317e-01 +-6.84473322e-01 +-7.08017416e-01 +-7.29797044e-01 +-7.49758207e-01 +-7.67851537e-01 +-7.84032600e-01 +-7.98261908e-01 +-8.10504365e-01 +-8.20729978e-01 +-8.28913857e-01 +-8.35036257e-01 +-8.39082934e-01 +-8.41044539e-01 +-8.40916667e-01 +-8.38700223e-01 +-8.34401330e-01 +-8.28031349e-01 +-8.19607071e-01 +-8.09149951e-01 +-7.96686370e-01 +-7.82247739e-01 +-7.65870356e-01 +-7.47595335e-01 +-7.27468694e-01 +-7.05540627e-01 +-6.81865642e-01 +-6.56502609e-01 +-6.29514503e-01 +-6.00968278e-01 +-5.70934822e-01 +-5.39488471e-01 +-5.06706805e-01 +-4.72670693e-01 +-4.37464022e-01 +-4.01173496e-01 +-3.63888432e-01 +-3.25700550e-01 +-2.86703527e-01 +-2.46992952e-01 +-2.06666102e-01 +-1.65821683e-01 +-1.24559580e-01 +-8.29806157e-02 +-4.11862686e-02 +7.21592729e-04 +4.26408936e-02 +8.44696137e-02 +1.26106042e-01 +1.67449027e-01 +2.08398241e-01 +2.48854459e-01 +2.88719695e-01 +3.27897467e-01 +3.66293054e-01 +4.03813711e-01 +4.40368898e-01 +4.75870503e-01 +5.10233120e-01 +5.43374163e-01 +5.75213966e-01 +6.05676094e-01 +6.34687513e-01 +6.62178758e-01 +6.88084087e-01 +7.12341640e-01 +7.34893688e-01 +7.55686615e-01 +7.74670952e-01 +7.91801651e-01 +8.07038162e-01 +8.20344523e-01 +8.31689431e-01 +8.41046311e-01 +8.48393409e-01 +8.53713891e-01 +8.56995627e-01 +8.58231349e-01 +8.57418706e-01 +8.54560241e-01 +8.49663385e-01 +8.42740425e-01 +8.33808452e-01 +8.22889352e-01 +8.10009796e-01 +7.95200983e-01 +7.78498642e-01 +7.59942962e-01 +7.39578536e-01 +7.17454184e-01 +6.93622867e-01 +6.68141555e-01 +6.41071052e-01 +6.12475884e-01 +5.82424174e-01 +5.50987367e-01 +5.18240078e-01 +4.84259967e-01 +4.49127540e-01 +4.12925955e-01 +3.75740810e-01 +3.37659949e-01 +2.98773243e-01 +2.59172380e-01 +2.18950644e-01 +1.78202704e-01 +1.37024360e-01 +9.55123305e-02 +5.37640371e-02 +1.18773698e-02 +-3.00495407e-02 +-7.19185565e-02 +-1.13631760e-01 +-1.55091687e-01 +-1.96201547e-01 +-2.36865457e-01 +-2.76988655e-01 +-3.16477733e-01 +-3.55240853e-01 +-3.93187939e-01 +-4.30230886e-01 +-4.66283774e-01 +-5.01263057e-01 +-5.35087758e-01 +-5.67679654e-01 +-5.98963451e-01 +-6.28866956e-01 +-6.57321240e-01 +-6.84260792e-01 +-7.09623666e-01 +-7.33351619e-01 +-7.55390242e-01 +-7.75689083e-01 +-7.94201765e-01 +-8.10886066e-01 +-8.25704005e-01 +-8.38621938e-01 +-8.49610639e-01 +-8.58645346e-01 +-8.65705818e-01 +-8.70776383e-01 +-8.73845944e-01 +-8.74908029e-01 +-8.73960769e-01 +-8.71006920e-01 +-8.66053833e-01 +-8.59113438e-01 +-8.50202215e-01 +-8.39341138e-01 +-8.26555624e-01 +-8.11875479e-01 +-7.95334810e-01 +-7.76971954e-01 +-7.56829373e-01 +-7.34953551e-01 +-7.11394883e-01 +-6.86207560e-01 +-6.59449439e-01 +-6.31181904e-01 +-6.01469725e-01 +-5.70380901e-01 +-5.37986503e-01 +-5.04360510e-01 +-4.69579634e-01 +-4.33723145e-01 +-3.96872682e-01 +-3.59112071e-01 +-3.20527131e-01 +-2.81205468e-01 +-2.41236293e-01 +-2.00710194e-01 +-1.59718952e-01 +-1.18355313e-01 +-7.67127923e-02 +-3.48854529e-02 +7.03230382e-03 +4.89459514e-02 +9.07610532e-02 +1.32383472e-01 +1.73719583e-01 +2.14676486e-01 +2.55162209e-01 +2.95085917e-01 +3.34358112e-01 +3.72890831e-01 +4.10597845e-01 +4.47394849e-01 +4.83199646e-01 +5.17932328e-01 +5.51515455e-01 +5.83874217e-01 +6.14936608e-01 +6.44633585e-01 +6.72899202e-01 +6.99670754e-01 +7.24888945e-01 +7.48497969e-01 +7.70445659e-01 +7.90683598e-01 +8.09167200e-01 +8.25855833e-01 +8.40712880e-01 +8.53705822e-01 +8.64806321e-01 +8.73990245e-01 +8.81237743e-01 +8.86533277e-01 +8.89865641e-01 +8.91227987e-01 +8.90617835e-01 +8.88037072e-01 +8.83491941e-01 +8.76993018e-01 +8.68555190e-01 +8.58197610e-01 +8.45943651e-01 +8.31820851e-01 +8.15860844e-01 +7.98099284e-01 +7.78575764e-01 +7.57333721e-01 +7.34420338e-01 +7.09886435e-01 +6.83786344e-01 +6.56177801e-01 +6.27121801e-01 +5.96682464e-01 +5.64926897e-01 +5.31925027e-01 +4.97749463e-01 +4.62475321e-01 +4.26180057e-01 +3.88943304e-01 +3.50846683e-01 +3.11973630e-01 +2.72409208e-01 +2.32239921e-01 +1.91553524e-01 +1.50438825e-01 +1.08985500e-01 +6.72838848e-02 +2.54247876e-02 +-1.65007148e-02 +-5.84014733e-02 +-1.00186465e-01 +-1.41764990e-01 +-1.83046870e-01 +-2.23942640e-01 +-2.64363741e-01 +-3.04222717e-01 +-3.43433395e-01 +-3.81911071e-01 +-4.19572696e-01 +-4.56337051e-01 +-4.92124917e-01 +-5.26859262e-01 +-5.60465367e-01 +-5.92871028e-01 +-6.24006665e-01 +-6.53805509e-01 +-6.82203711e-01 +-7.09140484e-01 +-7.34558254e-01 +-7.58402739e-01 +-7.80623083e-01 +-8.01171966e-01 +-8.20005697e-01 +-8.37084295e-01 +-8.52371575e-01 +-8.65835219e-01 +-8.77446844e-01 +-8.87182053e-01 +-8.95020485e-01 +-9.00945846e-01 +-9.04945959e-01 +-9.07012794e-01 +-9.07142442e-01 +-9.05335120e-01 +-9.01595180e-01 +-8.95931108e-01 +-8.88355478e-01 +-8.78884907e-01 +-8.67540064e-01 +-8.54345580e-01 +-8.39329988e-01 +-8.22525702e-01 +-8.03968876e-01 +-7.83699392e-01 +-7.61760705e-01 +-7.38199797e-01 +-7.13067055e-01 +-6.86416196e-01 +-6.58304090e-01 +-6.28790645e-01 +-5.97938687e-01 +-5.65813832e-01 +-5.32484333e-01 +-4.98020940e-01 +-4.62496739e-01 +-4.25987006e-01 +-3.88569036e-01 +-3.50321981e-01 +-3.11326682e-01 +-2.71665492e-01 +-2.31422129e-01 +-1.90681467e-01 +-1.49529346e-01 +-1.08052405e-01 +-6.63379010e-02 +-2.44735242e-02 +1.74527862e-02 +5.93530267e-02 +1.01139313e-01 +1.42724064e-01 +1.84020182e-01 +2.24941227e-01 +2.65401627e-01 +3.05316853e-01 +3.44603574e-01 +3.83179827e-01 +4.20965200e-01 +4.57880987e-01 +4.93850356e-01 +5.28798502e-01 +5.62652802e-01 +5.95342953e-01 +6.26801103e-01 +6.56962094e-01 +6.85763537e-01 +7.13145868e-01 +7.39052518e-01 +7.63430019e-01 +7.86228121e-01 +8.07399881e-01 +8.26901759e-01 +8.44693698e-01 +8.60739169e-01 +8.75005399e-01 +8.87463386e-01 +8.98087798e-01 +9.06857098e-01 +9.13753609e-01 +9.18763531e-01 +9.21876953e-01 +9.23087898e-01 +9.22394253e-01 +9.19797878e-01 +9.15304748e-01 +9.08924605e-01 +9.00671062e-01 +8.90561541e-01 +8.78617279e-01 +8.64863277e-01 +8.49328212e-01 +8.32044356e-01 +8.13047609e-01 +7.92377543e-01 +7.70076987e-01 +7.46192051e-01 +7.20772056e-01 +6.93869427e-01 +6.65539582e-01 +6.35840801e-01 +6.04834099e-01 +5.72583304e-01 +5.39154686e-01 +5.04616797e-01 +4.69040402e-01 +4.32498324e-01 +3.95065306e-01 +3.56817857e-01 +3.17834069e-01 +2.78193593e-01 +2.37977328e-01 +1.97267216e-01 +1.56146158e-01 +1.14697824e-01 +7.30064999e-02 +3.11569089e-02 +-1.07659383e-02 +-5.26769474e-02 +-9.44911437e-02 +-1.36123811e-01 +-1.77490657e-01 +-2.18507976e-01 +-2.59092813e-01 +-2.99163097e-01 +-3.38637935e-01 +-3.77437755e-01 +-4.15484347e-01 +-4.52701068e-01 +-4.89012993e-01 +-5.24347048e-01 +-5.58632100e-01 +-5.91799307e-01 +-6.23782283e-01 +-6.54516924e-01 +-6.83941664e-01 +-7.11997596e-01 +-7.38628569e-01 +-7.63781221e-01 +-7.87405448e-01 +-8.09454401e-01 +-8.29884193e-01 +-8.48654213e-01 +-8.65727160e-01 +-8.81069112e-01 +-8.94649521e-01 +-9.06441887e-01 +-9.16423185e-01 +-9.24573854e-01 +-9.30877976e-01 +-9.35323306e-01 +-9.37901182e-01 +-9.38606867e-01 +-9.37439778e-01 +-9.34402684e-01 +-9.29502031e-01 +-9.22747944e-01 +-9.14154146e-01 +-9.03737965e-01 +-8.91520967e-01 +-8.77527964e-01 +-8.61787140e-01 +-8.44330109e-01 +-8.25191814e-01 +-8.04410401e-01 +-7.82027826e-01 +-7.58089021e-01 +-7.32641753e-01 +-7.05736723e-01 +-6.77427457e-01 +-6.47770117e-01 +-6.16824002e-01 +-5.84650760e-01 +-5.51314233e-01 +-5.16880499e-01 +-4.81417736e-01 +-4.44996067e-01 +-4.07687860e-01 +-3.69566973e-01 +-3.30708695e-01 +-2.91189728e-01 +-2.51088006e-01 +-2.10482614e-01 +-1.69453746e-01 +-1.28082194e-01 +-8.64493434e-02 +-4.46370534e-02 +-2.72751445e-03 +3.91968958e-02 +8.10538944e-02 +1.22761415e-01 +1.64237719e-01 +2.05401523e-01 +2.46172126e-01 +2.86469877e-01 +3.26216076e-01 +3.65333090e-01 +4.03744514e-01 +4.41375218e-01 +4.78151898e-01 +5.14003157e-01 +5.48859216e-01 +5.82652243e-01 +6.15316344e-01 +6.46787937e-01 +6.77006390e-01 +7.05913181e-01 +7.33452252e-01 +7.59570119e-01 +7.84215940e-01 +8.07342656e-01 +8.28905816e-01 +8.48863798e-01 +8.67177997e-01 +8.83812772e-01 +8.98736765e-01 +9.11921689e-01 +9.23342275e-01 +9.32976566e-01 +9.40805772e-01 +9.46815689e-01 +9.50995437e-01 +9.53337221e-01 +9.53836666e-01 +9.52492664e-01 +9.49308832e-01 +9.44292055e-01 +9.37452275e-01 +9.28802798e-01 +9.18360172e-01 +9.06145647e-01 +8.92183360e-01 +8.76500420e-01 +8.59127040e-01 +8.40096629e-01 +8.19446932e-01 +7.97218060e-01 +7.73452880e-01 +7.48196965e-01 +7.21499025e-01 +6.93411282e-01 +6.63987835e-01 +6.33285172e-01 +6.01362001e-01 +5.68280003e-01 +5.34103142e-01 +4.98896915e-01 +4.62728673e-01 +4.25667524e-01 +3.87784947e-01 +3.49153527e-01 +3.09847051e-01 +2.69940497e-01 +2.29510180e-01 +1.88633554e-01 +1.47388536e-01 +1.05853695e-01 +6.41081579e-02 +2.22315702e-02 +-1.96963936e-02 +-6.15960420e-02 +-1.03387684e-01 +-1.44991840e-01 +-1.86329645e-01 +-2.27322729e-01 +-2.67893304e-01 +-3.07964250e-01 +-3.47459945e-01 +-3.86305791e-01 +-4.24428276e-01 +-4.61754987e-01 +-4.98215557e-01 +-5.33741596e-01 +-5.68266047e-01 +-6.01723490e-01 +-6.34050686e-01 +-6.65187531e-01 +-6.95075495e-01 +-7.23658116e-01 +-7.50881152e-01 +-7.76694413e-01 +-8.01049723e-01 +-8.23901218e-01 +-8.45205386e-01 +-8.64923172e-01 +-8.83018287e-01 +-8.99456762e-01 +-9.14207193e-01 +-9.27242621e-01 +-9.38539731e-01 +-9.48077421e-01 +-9.55837313e-01 +-9.61805310e-01 +-9.65971680e-01 +-9.68328733e-01 +-9.68871625e-01 +-9.67599587e-01 +-9.64516580e-01 +-9.59628559e-01 +-9.52944244e-01 +-9.44476243e-01 +-9.34242025e-01 +-9.22260883e-01 +-9.08554798e-01 +-8.93149396e-01 +-8.76075037e-01 +-8.57363717e-01 +-8.37049909e-01 +-8.15171558e-01 +-7.91770909e-01 +-7.66891626e-01 +-7.40579592e-01 +-7.12883961e-01 +-6.83857525e-01 +-6.53554252e-01 +-6.22030027e-01 +-5.89343759e-01 +-5.55557131e-01 +-5.20732778e-01 +-4.84934915e-01 +-4.48230418e-01 +-4.10687972e-01 +-3.72377007e-01 +-3.33368183e-01 +-2.93734264e-01 +-2.53548882e-01 +-2.12886223e-01 +-1.71821348e-01 +-1.30430566e-01 +-8.87903547e-02 +-4.69775039e-02 +-5.06925387e-03 +3.68569826e-02 +7.87239981e-02 +1.20454584e-01 +1.61971755e-01 +2.03199313e-01 +2.44061455e-01 +2.84482728e-01 +3.24388981e-01 +3.63707297e-01 +4.02365371e-01 +4.40291755e-01 +4.77417576e-01 +5.13675043e-01 +5.48997304e-01 +5.83319405e-01 +6.16579591e-01 +6.48716997e-01 +6.79672051e-01 +7.09388788e-01 +7.37813809e-01 +7.64894822e-01 +7.90581607e-01 +8.14828863e-01 +8.37592668e-01 +8.58830648e-01 +8.78504334e-01 +8.96579484e-01 +9.13022899e-01 +9.27803535e-01 +9.40896298e-01 +9.52278015e-01 +9.61927125e-01 +9.69826073e-01 +9.75962535e-01 +9.80325158e-01 +9.82904800e-01 +9.83698681e-01 +9.82706187e-01 +9.79928188e-01 +9.75369758e-01 +9.69041315e-01 +9.60954038e-01 +9.51121392e-01 +9.39563257e-01 +9.26301216e-01 +9.11358236e-01 +8.94761777e-01 +8.76543716e-01 +8.56736493e-01 +8.35375024e-01 +8.12499999e-01 +7.88152953e-01 +7.62376784e-01 +7.35219033e-01 +7.06729834e-01 +6.76959876e-01 +6.45962603e-01 +6.13795531e-01 +5.80516376e-01 +5.46184279e-01 +5.10862408e-01 +4.74614574e-01 +4.37505306e-01 +3.99601842e-01 +3.60973039e-01 +3.21687858e-01 +2.81816784e-01 +2.41432193e-01 +2.00606350e-01 +1.59412259e-01 +1.17924312e-01 +7.62168149e-02 +3.43643692e-02 +-7.55786596e-03 +-4.94748983e-02 +-9.13117225e-02 +-1.32993372e-01 +-1.74445597e-01 +-2.15594274e-01 +-2.56365577e-01 +-2.96687292e-01 +-3.36487490e-01 +-3.75694552e-01 +-4.14239363e-01 +-4.52053486e-01 +-4.89068713e-01 +-5.25219846e-01 +-5.60443209e-01 +-5.94675222e-01 +-6.27855327e-01 +-6.59925772e-01 +-6.90828696e-01 +-7.20508995e-01 +-7.48915744e-01 +-7.75997814e-01 +-8.01706382e-01 +-8.25998046e-01 +-8.48829304e-01 +-8.70158411e-01 +-8.89950025e-01 +-9.08168994e-01 +-9.24781417e-01 +-9.39760360e-01 +-9.53079625e-01 +-9.64713778e-01 +-9.74644548e-01 +-9.82855115e-01 +-9.89328983e-01 +-9.94056713e-01 +-9.97031102e-01 +-9.98244893e-01 +-9.97697576e-01 +-9.95391619e-01 +-9.91329107e-01 +-9.85518489e-01 +-9.77971772e-01 +-9.68700327e-01 +-9.57721480e-01 +-9.45056480e-01 +-9.30659921e-01 +-9.14519898e-01 +-8.96777961e-01 +-8.77469189e-01 +-8.56629252e-01 +-8.34296427e-01 +-8.10511526e-01 +-7.85317835e-01 +-7.58761016e-01 +-7.30889010e-01 +-7.01751986e-01 +-6.71402210e-01 +-6.39893953e-01 +-6.07283421e-01 +-5.73628618e-01 +-5.38989244e-01 +-5.03426621e-01 +-4.67003536e-01 +-4.29784149e-01 +-3.91833901e-01 +-3.53219348e-01 +-3.14008077e-01 +-2.74268599e-01 +-2.34070175e-01 +-1.93482748e-01 +-1.52576807e-01 +-1.11423228e-01 +-7.00932094e-02 +-2.86581113e-02 +1.28106815e-02 +5.42418250e-02 +9.55641975e-02 +1.36707005e-01 +1.77599862e-01 +2.18172978e-01 +2.58357229e-01 +2.98084268e-01 +3.37286695e-01 +3.75898099e-01 +4.13853212e-01 +4.51088029e-01 +4.87539855e-01 +5.23147475e-01 +5.57851222e-01 +5.91593057e-01 +6.24316715e-01 +6.55967743e-01 +6.86493610e-01 +7.15843813e-01 +7.43969904e-01 +7.70825622e-01 +7.96366938e-01 +8.20552109e-01 +8.43341789e-01 +8.64699039e-01 +8.84589412e-01 +9.02981007e-01 +9.19844489e-01 +9.35153167e-01 +9.48883005e-01 +9.61012665e-01 +9.71523546e-01 +9.80399785e-01 +9.87628300e-01 +9.93198792e-01 +9.97103755e-01 +9.99338489e-01 +9.99901093e-01 +9.98792464e-01 +9.96016288e-01 +9.91579030e-01 +9.85489908e-01 +9.77760882e-01 +9.68406616e-01 +9.57444449e-01 +9.44894373e-01 +9.30778966e-01 +9.15123379e-01 +8.97955263e-01 +8.79304725e-01 +8.59204287e-01 +8.37688788e-01 +8.14795373e-01 +7.90563374e-01 +7.65034274e-01 +7.38251626e-01 +7.10260952e-01 +6.81109715e-01 +6.50847170e-01 +6.19524337e-01 +5.87193878e-01 +5.53910008e-01 +5.19728437e-01 +4.84706206e-01 +4.48901680e-01 +4.12374360e-01 +3.75184848e-01 +3.37394719e-01 +2.99066399e-01 +2.60263121e-01 +2.21048731e-01 +1.81487679e-01 +1.41644831e-01 +1.01585410e-01 +6.13748838e-02 +2.10788202e-02 +-1.92371454e-02 +-5.95075167e-02 +-9.96669337e-02 +-1.39650377e-01 +-1.79393202e-01 +-2.18831272e-01 +-2.57901076e-01 +-2.96539776e-01 +-3.34685390e-01 +-3.72276787e-01 +-4.09253895e-01 +-4.45557691e-01 +-4.81130375e-01 +-5.15915413e-01 +-5.49857632e-01 +-5.82903337e-01 +-6.15000332e-01 +-6.46098079e-01 +-6.76147690e-01 +-7.05102086e-01 +-7.32915989e-01 +-7.59546058e-01 +-7.84950902e-01 +-8.09091171e-01 +-8.31929611e-01 +-8.53431097e-01 +-8.73562720e-01 +-8.92293792e-01 +-9.09595934e-01 +-9.25443070e-01 +-9.39811506e-01 +-9.52679925e-01 +-9.64029446e-01 +-9.73843620e-01 +-9.82108475e-01 +-9.88812516e-01 +-9.93946741e-01 +-9.97504654e-01 +-9.99482262e-01 +-9.99878083e-01 +-9.98693134e-01 +-9.95930930e-01 +-9.91597469e-01 +-9.85701216e-01 +-9.78253090e-01 +-9.69266427e-01 +-9.58756973e-01 +-9.46742832e-01 +-9.33244451e-01 +-9.18284567e-01 +-9.01888177e-01 +-8.84082486e-01 +-8.64896863e-01 +-8.44362788e-01 +-8.22513796e-01 +-7.99385429e-01 +-7.75015156e-01 +-7.49442339e-01 +-7.22708129e-01 +-6.94855445e-01 +-6.65928844e-01 +-6.35974519e-01 +-6.05040141e-01 +-5.73174871e-01 +-5.40429185e-01 +-5.06854893e-01 +-4.72504948e-01 +-4.37433474e-01 +-4.01695565e-01 +-3.65347310e-01 +-3.28445591e-01 +-2.91048110e-01 +-2.53213175e-01 +-2.14999736e-01 +-1.76467163e-01 +-1.37675281e-01 +-9.86841533e-02 +-5.95541089e-02 +-2.03455269e-02 +1.88811308e-02 +5.80655408e-02 +9.71474819e-02 +1.36067056e-01 +1.74764651e-01 +2.13181159e-01 +2.51257940e-01 +2.88937033e-01 +3.26161126e-01 +3.62873755e-01 +3.99019277e-01 +4.34543063e-01 +4.69391472e-01 +5.03512034e-01 +5.36853430e-01 +5.69365655e-01 +6.01000014e-01 +6.31709261e-01 +6.61447608e-01 +6.90170841e-01 +7.17836345e-01 +7.44403192e-01 +7.69832183e-01 +7.94085908e-01 +8.17128806e-01 +8.38927197e-01 +8.59449354e-01 +8.78665512e-01 +8.96547952e-01 +9.13070988e-01 +9.28211056e-01 +9.41946687e-01 +9.54258590e-01 +9.65129626e-01 +9.74544873e-01 +9.82491606e-01 +9.88959340e-01 +9.93939820e-01 +9.97427040e-01 +9.99417243e-01 +9.99908923e-01 +9.98902818e-01 +9.96401910e-01 +9.92411408e-01 +9.86938744e-01 +9.79993547e-01 +9.71587634e-01 +9.61734974e-01 +9.50451682e-01 +9.37755963e-01 +9.23668111e-01 +9.08210444e-01 +8.91407293e-01 +8.73284942e-01 +8.53871588e-01 +8.33197312e-01 +8.11293993e-01 +7.88195312e-01 +7.63936627e-01 +7.38554997e-01 +7.12089044e-01 +6.84578961e-01 +6.56066397e-01 +6.26594424e-01 +5.96207465e-01 +5.64951197e-01 +5.32872543e-01 +5.00019514e-01 +4.66441233e-01 +4.32187763e-01 +3.97310117e-01 +3.61860120e-01 +3.25890359e-01 +2.89454111e-01 +2.52605220e-01 +2.15398096e-01 +1.77887531e-01 +1.40128726e-01 +1.02177113e-01 +6.40883444e-02 +2.59181775e-02 +-1.22776179e-02 +-5.04432853e-02 +-8.85232544e-02 +-1.26462110e-01 +-1.64204784e-01 +-2.01696543e-01 +-2.38883122e-01 +-2.75710796e-01 +-3.12126412e-01 +-3.48077549e-01 +-3.83512490e-01 +-4.18380394e-01 +-4.52631294e-01 +-4.86216198e-01 +-5.19087177e-01 +-5.51197370e-01 +-5.82501138e-01 +-6.12954032e-01 +-6.42512934e-01 +-6.71136071e-01 +-6.98783074e-01 +-7.25415073e-01 +-7.50994680e-01 +-7.75486117e-01 +-7.98855202e-01 +-8.21069426e-01 +-8.42098001e-01 +-8.61911861e-01 +-8.80483760e-01 +-8.97788247e-01 +-9.13801740e-01 +-9.28502543e-01 +-9.41870857e-01 +-9.53888839e-01 +-9.64540582e-01 +-9.73812171e-01 +-9.81691672e-01 +-9.88169154e-01 +-9.93236707e-01 +-9.96888432e-01 +-9.99120459e-01 +-9.99930942e-01 +-9.99320057e-01 +-9.97289999e-01 +-9.93844977e-01 +-9.88991195e-01 +-9.82736848e-01 +-9.75092105e-01 +-9.66069080e-01 +-9.55681829e-01 +-9.43946308e-01 +-9.30880353e-01 +-9.16503661e-01 +-9.00837733e-01 +-8.83905874e-01 +-8.65733122e-01 +-8.46346229e-01 +-8.25773627e-01 +-8.04045350e-01 +-7.81193032e-01 +-7.57249830e-01 +-7.32250372e-01 +-7.06230741e-01 +-6.79228367e-01 +-6.51282016e-01 +-6.22431723e-01 +-5.92718702e-01 +-5.62185344e-01 +-5.30875100e-01 +-4.98832437e-01 +-4.66102807e-01 +-4.32732508e-01 +-3.98768697e-01 +-3.64259277e-01 +-3.29252815e-01 +-2.93798538e-01 +-2.57946186e-01 +-2.21745984e-01 +-1.85248589e-01 +-1.48504950e-01 +-1.11566319e-01 +-7.44841293e-02 +-3.73099117e-02 +-9.52898650e-05 +3.71081704e-02 +7.42489932e-02 +1.11275837e-01 +1.48137641e-01 +1.84783617e-01 +2.21163352e-01 +2.57226908e-01 +2.92924818e-01 +3.28208215e-01 +3.63028889e-01 +3.97339303e-01 +4.31092728e-01 +4.64243264e-01 +4.96745886e-01 +5.28556560e-01 +5.59632249e-01 +5.89930979e-01 +6.19411935e-01 +6.48035455e-01 +6.75763117e-01 +7.02557801e-01 +7.28383690e-01 +7.53206361e-01 +7.76992821e-01 +7.99711515e-01 +8.21332416e-01 +8.41827033e-01 +8.61168438e-01 +8.79331335e-01 +8.96292057e-01 +9.12028603e-01 +9.26520685e-01 +9.39749723e-01 +9.51698880e-01 +9.62353089e-01 +9.71699055e-01 +9.79725274e-01 +9.86422055e-01 +9.91781512e-01 +9.95797586e-01 +9.98466042e-01 +9.99784471e-01 +9.99752291e-01 +9.98370744e-01 +9.95642892e-01 +9.91573607e-01 +9.86169557e-01 +9.79439203e-01 +9.71392777e-01 +9.62042262e-01 +9.51401382e-01 +9.39485572e-01 +9.26311950e-01 +9.11899308e-01 +8.96268065e-01 +8.79440238e-01 +8.61439428e-01 +8.42290763e-01 +8.22020863e-01 +8.00657824e-01 +7.78231153e-01 +7.54771727e-01 +7.30311770e-01 +7.04884792e-01 +6.78525526e-01 +6.51269917e-01 +6.23155048e-01 +5.94219074e-01 +5.64501205e-01 +5.34041634e-01 +5.02881462e-01 +4.71062676e-01 +4.38628082e-01 +4.05621218e-01 +3.72086329e-01 +3.38068311e-01 +3.03612607e-01 +2.68765181e-01 +2.33572470e-01 +1.98081274e-01 +1.62338718e-01 +1.26392219e-01 +9.02893721e-02 +5.40779010e-02 +1.78056310e-02 +-1.84796138e-02 +-5.47300775e-02 +-9.08980969e-02 +-1.26936184e-01 +-1.62797114e-01 +-1.98433947e-01 +-2.33800093e-01 +-2.68849405e-01 +-3.03536219e-01 +-3.37815385e-01 +-3.71642374e-01 +-4.04973317e-01 +-4.37765038e-01 +-4.69975131e-01 +-5.01562030e-01 +-5.32485025e-01 +-5.62704322e-01 +-5.92181126e-01 +-6.20877655e-01 +-6.48757183e-01 +-6.75784117e-01 +-7.01924028e-01 +-7.27143672e-01 +-7.51411056e-01 +-7.74695478e-01 +-7.96967549e-01 +-8.18199227e-01 +-8.38363872e-01 +-8.57436265e-01 +-8.75392624e-01 +-8.92210655e-01 +-9.07869574e-01 +-9.22350114e-01 +-9.35634560e-01 +-9.47706774e-01 +-9.58552203e-01 +-9.68157891e-01 +-9.76512505e-01 +-9.83606341e-01 +-9.89431329e-01 +-9.93981044e-01 +-9.97250713e-01 +-9.99237215e-01 +-9.99939080e-01 +-9.99356493e-01 +-9.97491286e-01 +-9.94346934e-01 +-9.89928547e-01 +-9.84242861e-01 +-9.77298224e-01 +-9.69104587e-01 +-9.59673483e-01 +-9.49018009e-01 +-9.37152809e-01 +-9.24094057e-01 +-9.09859423e-01 +-8.94468048e-01 +-8.77940528e-01 +-8.60298882e-01 +-8.41566504e-01 +-8.21768150e-01 +-8.00929903e-01 +-7.79079129e-01 +-7.56244435e-01 +-7.32455642e-01 +-7.07743751e-01 +-6.82140879e-01 +-6.55680224e-01 +-6.28396036e-01 +-6.00323563e-01 +-5.71498990e-01 +-5.41959402e-01 +-5.11742751e-01 +-4.80887788e-01 +-4.49434007e-01 +-4.17421602e-01 +-3.84891436e-01 +-3.51884954e-01 +-3.18444140e-01 +-2.84611468e-01 +-2.50429863e-01 +-2.15942618e-01 +-1.81193341e-01 +-1.46225918e-01 +-1.11084463e-01 +-7.58132283e-02 +-4.04565682e-02 +-5.05888916e-03 +3.03354012e-02 +6.56819757e-02 +1.00936630e-01 +1.36055329e-01 +1.70994255e-01 +2.05709895e-01 +2.40159072e-01 +2.74298995e-01 +3.08087309e-01 +3.41482170e-01 +3.74442282e-01 +4.06926939e-01 +4.38896078e-01 +4.70310341e-01 +5.01131120e-01 +5.31320586e-01 +5.60841742e-01 +5.89658481e-01 +6.17735621e-01 +6.45038942e-01 +6.71535220e-01 +6.97192286e-01 +7.21979058e-01 +7.45865568e-01 +7.68822995e-01 +7.90823714e-01 +8.11841322e-01 +8.31850662e-01 +8.50827851e-01 +8.68750317e-01 +8.85596818e-01 +9.01347471e-01 +9.15983761e-01 +9.29488571e-01 +9.41846205e-01 +9.53042397e-01 +9.63064325e-01 +9.71900625e-01 +9.79541409e-01 +9.85978267e-01 +9.91204276e-01 +9.95214006e-01 +9.98003525e-01 +9.99570402e-01 +9.99913702e-01 +9.99033990e-01 +9.96933324e-01 +9.93615252e-01 +9.89084803e-01 +9.83348479e-01 +9.76414244e-01 +9.68291514e-01 +9.58991137e-01 +9.48525381e-01 +9.36907919e-01 +9.24153805e-01 +9.10279456e-01 +8.95302626e-01 +8.79242384e-01 +8.62119094e-01 +8.43954380e-01 +8.24771097e-01 +8.04593306e-01 +7.83446241e-01 +7.61356281e-01 +7.38350904e-01 +7.14458660e-01 +6.89709130e-01 +6.64132901e-01 +6.37761514e-01 +6.10627425e-01 +5.82763964e-01 +5.54205301e-01 +5.24986402e-01 +4.95142980e-01 +4.64711448e-01 +4.33728877e-01 +4.02232957e-01 +3.70261950e-01 +3.37854632e-01 +3.05050248e-01 +2.71888469e-01 +2.38409349e-01 +2.04653270e-01 +1.70660888e-01 +1.36473085e-01 +1.02130927e-01 +6.76756127e-02 +3.31484264e-02 +-1.40932364e-03 +-3.59563472e-02 +-7.04514209e-02 +-1.04853432e-01 +-1.39121429e-01 +-1.73214683e-01 +-2.07092725e-01 +-2.40715396e-01 +-2.74042887e-01 +-3.07035792e-01 +-3.39655157e-01 +-3.71862526e-01 +-4.03619981e-01 +-4.34890184e-01 +-4.65636420e-01 +-4.95822649e-01 +-5.25413542e-01 +-5.54374520e-01 +-5.82671794e-01 +-6.10272399e-01 +-6.37144240e-01 +-6.63256129e-01 +-6.88577813e-01 +-7.13080012e-01 +-7.36734447e-01 +-7.59513876e-01 +-7.81392128e-01 +-8.02344126e-01 +-8.22345917e-01 +-8.41374694e-01 +-8.59408822e-01 +-8.76427869e-01 +-8.92412621e-01 +-9.07345104e-01 +-9.21208599e-01 +-9.33987665e-01 +-9.45668151e-01 +-9.56237215e-01 +-9.65683330e-01 +-9.73996303e-01 +-9.81167276e-01 +-9.87188739e-01 +-9.92054536e-01 +-9.95759871e-01 +-9.98301307e-01 +-9.99676771e-01 +-9.99885553e-01 +-9.98928304e-01 +-9.96807034e-01 +-9.93525106e-01 +-9.89087230e-01 +-9.83499454e-01 +-9.76769159e-01 +-9.68905042e-01 +-9.59917107e-01 +-9.49816652e-01 +-9.38616248e-01 +-9.26329729e-01 +-9.12972173e-01 +-8.98559877e-01 +-8.83110340e-01 +-8.66642240e-01 +-8.49175407e-01 +-8.30730805e-01 +-8.11330501e-01 +-7.90997640e-01 +-7.69756411e-01 +-7.47632022e-01 +-7.24650668e-01 +-7.00839498e-01 +-6.76226587e-01 +-6.50840898e-01 +-6.24712244e-01 +-5.97871254e-01 +-5.70349341e-01 +-5.42178659e-01 +-5.13392070e-01 +-4.84023103e-01 +-4.54105909e-01 +-4.23675226e-01 +-3.92766337e-01 +-3.61415030e-01 +-3.29657553e-01 +-2.97530579e-01 +-2.65071154e-01 +-2.32316658e-01 +-1.99304758e-01 +-1.66073373e-01 +-1.32660621e-01 +-9.91047852e-02 +-6.54442617e-02 +-3.17175168e-02 +2.03695629e-03 +3.57806809e-02 +6.94752407e-02 +1.03082322e-01 +1.36563757e-01 +1.69881569e-01 +2.02998015e-01 +2.35875631e-01 +2.68477268e-01 +3.00766137e-01 +3.32705850e-01 +3.64260455e-01 +3.95394485e-01 +4.26072995e-01 +4.56261598e-01 +4.85926503e-01 +5.15034554e-01 +5.43553266e-01 +5.71450856e-01 +5.98696285e-01 +6.25259287e-01 +6.51110406e-01 +6.76221024e-01 +7.00563392e-01 +7.24110661e-01 +7.46836909e-01 +7.68717169e-01 +7.89727460e-01 +8.09844805e-01 +8.29047263e-01 +8.47313944e-01 +8.64625034e-01 +8.80961817e-01 +8.96306690e-01 +9.10643187e-01 +9.23955988e-01 +9.36230943e-01 +9.47455076e-01 +9.57616607e-01 +9.66704953e-01 +9.74710748e-01 +9.81625844e-01 +9.87443322e-01 +9.92157496e-01 +9.95763917e-01 +9.98259377e-01 +9.99641910e-01 +9.99910792e-01 +9.99066537e-01 +9.97110900e-01 +9.94046870e-01 +9.89878661e-01 +9.84611712e-01 +9.78252674e-01 +9.70809402e-01 +9.62290944e-01 +9.52707531e-01 +9.42070559e-01 +9.30392581e-01 +9.17687284e-01 +9.03969476e-01 +8.89255069e-01 +8.73561055e-01 +8.56905488e-01 +8.39307465e-01 +8.20787098e-01 +8.01365494e-01 +7.81064728e-01 +7.59907817e-01 +7.37918692e-01 +7.15122174e-01 +6.91543943e-01 +6.67210506e-01 +6.42149170e-01 +6.16388010e-01 +5.89955836e-01 +5.62882159e-01 +5.35197158e-01 +5.06931648e-01 +4.78117043e-01 +4.48785320e-01 +4.18968985e-01 +3.88701037e-01 +3.58014927e-01 +3.26944528e-01 +2.95524087e-01 +2.63788195e-01 +2.31771747e-01 +1.99509900e-01 +1.67038038e-01 +1.34391734e-01 +1.01606705e-01 +6.87187785e-02 +3.57638530e-02 +2.77785462e-03 +-3.02032990e-02 +-6.31437386e-02 +-9.60076818e-02 +-1.28759472e-01 +-1.61363617e-01 +-1.93784826e-01 +-2.25988051e-01 +-2.57938519e-01 +-2.89601774e-01 +-3.20943711e-01 +-3.51930616e-01 +-3.82529197e-01 +-4.12706623e-01 +-4.42430558e-01 +-4.71669192e-01 +-5.00391279e-01 +-5.28566168e-01 +-5.56163833e-01 +-5.83154909e-01 +-6.09510717e-01 +-6.35203298e-01 +-6.60205441e-01 +-6.84490711e-01 +-7.08033474e-01 +-7.30808927e-01 +-7.52793121e-01 +-7.73962986e-01 +-7.94296352e-01 +-8.13771975e-01 +-8.32369557e-01 +-8.50069764e-01 +-8.66854249e-01 +-8.82705668e-01 +-8.97607695e-01 +-9.11545042e-01 +-9.24503471e-01 +-9.36469807e-01 +-9.47431953e-01 +-9.57378897e-01 +-9.66300726e-01 +-9.74188634e-01 +-9.81034927e-01 +-9.86833032e-01 +-9.91577502e-01 +-9.95264019e-01 +-9.97889396e-01 +-9.99451582e-01 +-9.99949657e-01 +-9.99383837e-01 +-9.97755467e-01 +-9.95067021e-01 +-9.91322095e-01 +-9.86525405e-01 +-9.80682774e-01 +-9.73801131e-01 +-9.65888497e-01 +-9.56953979e-01 +-9.47007753e-01 +-9.36061055e-01 +-9.24126169e-01 +-9.11216407e-01 +-8.97346099e-01 +-8.82530573e-01 +-8.66786136e-01 +-8.50130060e-01 +-8.32580557e-01 +-8.14156760e-01 +-7.94878705e-01 +-7.74767303e-01 +-7.53844317e-01 +-7.32132344e-01 +-7.09654783e-01 +-6.86435809e-01 +-6.62500353e-01 +-6.37874068e-01 +-6.12583303e-01 +-5.86655077e-01 +-5.60117043e-01 +-5.32997465e-01 +-5.05325184e-01 +-4.77129586e-01 +-4.48440572e-01 +-4.19288526e-01 +-3.89704281e-01 +-3.59719089e-01 +-3.29364581e-01 +-2.98672743e-01 +-2.67675873e-01 +-2.36406553e-01 +-2.04897610e-01 +-1.73182085e-01 +-1.41293196e-01 +-1.09264304e-01 +-7.71288772e-02 +-4.49204576e-02 +-1.26726242e-02 +1.95810411e-02 +5.18069888e-02 +8.39717362e-02 +1.16041903e-01 +1.47984243e-01 +1.79765684e-01 +2.11353356e-01 +2.42714627e-01 +2.73817138e-01 +3.04628835e-01 +3.35118001e-01 +3.65253289e-01 +3.95003754e-01 +4.24338884e-01 +4.53228631e-01 +4.81643442e-01 +5.09554287e-01 +5.36932690e-01 +5.63750756e-01 +5.89981200e-01 +6.15597373e-01 +6.40573292e-01 +6.64883660e-01 +6.88503894e-01 +7.11410151e-01 +7.33579347e-01 +7.54989184e-01 +7.75618169e-01 +7.95445635e-01 +8.14451762e-01 +8.32617595e-01 +8.49925062e-01 +8.66356993e-01 +8.81897133e-01 +8.96530162e-01 +9.10241702e-01 +9.23018338e-01 +9.34847625e-01 +9.45718102e-01 +9.55619300e-01 +9.64541753e-01 +9.72477004e-01 +9.79417615e-01 +9.85357170e-01 +9.90290283e-01 +9.94212599e-01 +9.97120797e-01 +9.99012595e-01 +9.99886747e-01 +9.99743045e-01 +9.98582316e-01 +9.96406420e-01 +9.93218248e-01 +9.89021715e-01 +9.83821756e-01 +9.77624320e-01 +9.70436360e-01 +9.62265826e-01 +9.53121656e-01 +9.43013764e-01 +9.31953030e-01 +9.19951285e-01 +9.07021300e-01 +8.93176771e-01 +8.78432303e-01 +8.62803394e-01 +8.46306418e-01 +8.28958610e-01 +8.10778040e-01 +7.91783601e-01 +7.71994986e-01 +7.51432666e-01 +7.30117869e-01 +7.08072556e-01 +6.85319401e-01 +6.61881765e-01 +6.37783669e-01 +6.13049775e-01 +5.87705354e-01 +5.61776264e-01 +5.35288921e-01 +5.08270272e-01 +4.80747766e-01 +4.52749329e-01 +4.24303334e-01 +3.95438567e-01 +3.66184206e-01 +3.36569785e-01 +3.06625165e-01 +2.76380507e-01 +2.45866236e-01 +2.15113016e-01 +1.84151712e-01 +1.53013367e-01 +1.21729165e-01 +9.03304009e-02 +5.88484499e-02 +2.73147362e-02 +-4.23929893e-03 +-3.57822284e-02 +-6.72826704e-02 +-9.87093195e-02 +-1.30030978e-01 +-1.61216586e-01 +-1.92235254e-01 +-2.23056290e-01 +-2.53649232e-01 +-2.83983879e-01 +-3.14030317e-01 +-3.43758951e-01 +-3.73140534e-01 +-4.02146192e-01 +-4.30747456e-01 +-4.58916290e-01 +-4.86625112e-01 +-5.13846827e-01 +-5.40554852e-01 +-5.66723137e-01 +-5.92326196e-01 +-6.17339127e-01 +-6.41737636e-01 +-6.65498065e-01 +-6.88597406e-01 +-7.11013329e-01 +-7.32724203e-01 +-7.53709111e-01 +-7.73947876e-01 +-7.93421074e-01 +-8.12110056e-01 +-8.29996964e-01 +-8.47064746e-01 +-8.63297173e-01 +-8.78678854e-01 +-8.93195248e-01 +-9.06832679e-01 +-9.19578348e-01 +-9.31420340e-01 +-9.42347642e-01 +-9.52350145e-01 +-9.61418658e-01 +-9.69544912e-01 +-9.76721568e-01 +-9.82942224e-01 +-9.88201417e-01 +-9.92494631e-01 +-9.95818294e-01 +-9.98169788e-01 +-9.99547441e-01 +-9.99950537e-01 +-9.99379306e-01 +-9.97834930e-01 +-9.95319533e-01 +-9.91836187e-01 +-9.87388897e-01 +-9.81982603e-01 +-9.75623174e-01 +-9.68317394e-01 +-9.60072963e-01 +-9.50898480e-01 +-9.40803441e-01 +-9.29798221e-01 +-9.17894068e-01 +-9.05103090e-01 +-8.91438239e-01 +-8.76913301e-01 +-8.61542877e-01 +-8.45342374e-01 +-8.28327983e-01 +-8.10516664e-01 +-7.91926130e-01 +-7.72574827e-01 +-7.52481918e-01 +-7.31667257e-01 +-7.10151377e-01 +-6.87955463e-01 +-6.65101334e-01 +-6.41611419e-01 +-6.17508736e-01 +-5.92816870e-01 +-5.67559944e-01 +-5.41762603e-01 +-5.15449983e-01 +-4.88647689e-01 +-4.61381770e-01 +-4.33678692e-01 +-4.05565313e-01 +-3.77068856e-01 +-3.48216882e-01 +-3.19037266e-01 +-2.89558165e-01 +-2.59807994e-01 +-2.29815399e-01 +-1.99609227e-01 +-1.69218497e-01 +-1.38672377e-01 +-1.08000152e-01 +-7.72311960e-02 +-4.63949453e-02 +-1.55208694e-02 +1.53615568e-02 +4.62228815e-02 +7.70337035e-02 +1.07764701e-01 +1.38386657e-01 +1.68870492e-01 +1.99187285e-01 +2.29308306e-01 +2.59205040e-01 +2.88849217e-01 +3.18212833e-01 +3.47268182e-01 +3.75987879e-01 +4.04344884e-01 +4.32312533e-01 +4.59864555e-01 +4.86975102e-01 +5.13618770e-01 +5.39770626e-01 +5.65406224e-01 +5.90501635e-01 +6.15033465e-01 +6.38978877e-01 +6.62315610e-01 +6.85022004e-01 +7.07077013e-01 +7.28460229e-01 +7.49151901e-01 +7.69132947e-01 +7.88384976e-01 +8.06890303e-01 +8.24631963e-01 +8.41593730e-01 +8.57760126e-01 +8.73116438e-01 +8.87648731e-01 +9.01343855e-01 +9.14189464e-01 +9.26174021e-01 +9.37286809e-01 +9.47517939e-01 +9.56858361e-01 +9.65299866e-01 +9.72835100e-01 +9.79457563e-01 +9.85161616e-01 +9.89942486e-01 +9.93796268e-01 +9.96719930e-01 +9.98711310e-01 +9.99769119e-01 +9.99892945e-01 +9.99083244e-01 +9.97341346e-01 +9.94669446e-01 +9.91070607e-01 +9.86548752e-01 +9.81108660e-01 +9.74755958e-01 +9.67497120e-01 +9.59339455e-01 +9.50291102e-01 +9.40361017e-01 +9.29558970e-01 +9.17895527e-01 +9.05382048e-01 +8.92030667e-01 +8.77854284e-01 +8.62866551e-01 +8.47081858e-01 +8.30515321e-01 +8.13182763e-01 +7.95100701e-01 +7.76286329e-01 +7.56757501e-01 +7.36532713e-01 +7.15631087e-01 +6.94072350e-01 +6.71876817e-01 +6.49065369e-01 +6.25659437e-01 +6.01680975e-01 +5.77152447e-01 +5.52096798e-01 +5.26537438e-01 +5.00498215e-01 +4.74003396e-01 +4.47077645e-01 +4.19745994e-01 +3.92033826e-01 +3.63966845e-01 +3.35571059e-01 +3.06872748e-01 +2.77898446e-01 +2.48674912e-01 +2.19229109e-01 +1.89588174e-01 +1.59779396e-01 +1.29830193e-01 +9.97680816e-02 +6.96206542e-02 +3.94155551e-02 +9.18045308e-03 +-2.10569837e-02 +-5.12691127e-02 +-8.14283421e-02 +-1.11507156e-01 +-1.41478140e-01 +-1.71314005e-01 +-2.00987612e-01 +-2.30471999e-01 +-2.59740400e-01 +-2.88766277e-01 +-3.17523335e-01 +-3.45985553e-01 +-3.74127203e-01 +-4.01922874e-01 +-4.29347495e-01 +-4.56376360e-01 +-4.82985143e-01 +-5.09149927e-01 +-5.34847222e-01 +-5.60053982e-01 +-5.84747633e-01 +-6.08906087e-01 +-6.32507764e-01 +-6.55531608e-01 +-6.77957109e-01 +-6.99764317e-01 +-7.20933865e-01 +-7.41446980e-01 +-7.61285501e-01 +-7.80431895e-01 +-7.98869272e-01 +-8.16581401e-01 +-8.33552718e-01 +-8.49768347e-01 +-8.65214105e-01 +-8.79876520e-01 +-8.93742837e-01 +-9.06801033e-01 +-9.19039825e-01 +-9.30448678e-01 +-9.41017814e-01 +-9.50738222e-01 +-9.59601660e-01 +-9.67600669e-01 +-9.74728570e-01 +-9.80979474e-01 +-9.86348288e-01 +-9.90830712e-01 +-9.94423249e-01 +-9.97123200e-01 +-9.98928672e-01 +-9.99838574e-01 +-9.99852618e-01 +-9.98971321e-01 +-9.97195996e-01 +-9.94528760e-01 +-9.90972523e-01 +-9.86530986e-01 +-9.81208640e-01 +-9.75010757e-01 +-9.67943386e-01 +-9.60013347e-01 +-9.51228222e-01 +-9.41596349e-01 +-9.31126811e-01 +-9.19829432e-01 +-9.07714761e-01 +-8.94794066e-01 +-8.81079323e-01 +-8.66583199e-01 +-8.51319048e-01 +-8.35300891e-01 +-8.18543406e-01 +-8.01061913e-01 +-7.82872363e-01 +-7.63991317e-01 +-7.44435934e-01 +-7.24223956e-01 +-7.03373691e-01 +-6.81903992e-01 +-6.59834244e-01 +-6.37184344e-01 +-6.13974684e-01 +-5.90226131e-01 +-5.65960009e-01 +-5.41198079e-01 +-5.15962518e-01 +-4.90275905e-01 +-4.64161189e-01 +-4.37641679e-01 +-4.10741018e-01 +-3.83483159e-01 +-3.55892351e-01 +-3.27993112e-01 +-2.99810206e-01 +-2.71368626e-01 +-2.42693570e-01 +-2.13810412e-01 +-1.84744690e-01 +-1.55522074e-01 +-1.26168347e-01 +-9.67093852e-02 +-6.71711300e-02 +-3.75795681e-02 +-7.96070935e-03 +2.16594371e-02 +5.12548874e-02 +8.07997047e-02 +1.10268021e-01 +1.39634061e-01 +1.68872163e-01 +1.97956803e-01 +2.26862613e-01 +2.55564408e-01 +2.84037203e-01 +3.12256240e-01 +3.40197005e-01 +3.67835253e-01 +3.95147023e-01 +4.22108666e-01 +4.48696857e-01 +4.74888621e-01 +5.00661348e-01 +5.25992817e-01 +5.50861214e-01 +5.75245147e-01 +5.99123667e-01 +6.22476285e-01 +6.45282989e-01 +6.67524261e-01 +6.89181090e-01 +7.10234993e-01 +7.30668029e-01 +7.50462814e-01 +7.69602532e-01 +7.88070954e-01 +8.05852446e-01 +8.22931987e-01 +8.39295173e-01 +8.54928240e-01 +8.69818068e-01 +8.83952190e-01 +8.97318810e-01 +9.09906802e-01 +9.21705726e-01 +9.32705833e-01 +9.42898074e-01 +9.52274104e-01 +9.60826295e-01 +9.68547733e-01 +9.75432230e-01 +9.81474324e-01 +9.86669284e-01 +9.91013114e-01 +9.94502555e-01 +9.97135087e-01 +9.98908928e-01 +9.99823038e-01 +9.99877119e-01 +9.99071609e-01 +9.97407687e-01 +9.94887267e-01 +9.91512996e-01 +9.87288255e-01 +9.82217148e-01 +9.76304502e-01 +9.69555860e-01 +9.61977479e-01 +9.53576319e-01 +9.44360040e-01 +9.34336990e-01 +9.23516203e-01 +9.11907382e-01 +8.99520900e-01 +8.86367781e-01 +8.72459696e-01 +8.57808951e-01 +8.42428474e-01 +8.26331801e-01 +8.09533070e-01 +7.92047002e-01 +7.73888890e-01 +7.55074587e-01 +7.35620492e-01 +7.15543532e-01 +6.94861149e-01 +6.73591280e-01 +6.51752349e-01 +6.29363245e-01 +6.06443308e-01 +5.83012313e-01 +5.59090450e-01 +5.34698303e-01 +5.09856840e-01 +4.84587388e-01 +4.58911618e-01 +4.32851526e-01 +4.06429416e-01 +3.78298490e-01 +3.42189750e-01 +3.06283181e-01 +2.72263415e-01 +2.40277257e-01 +2.10432400e-01 +1.82799535e-01 +1.57415030e-01 +1.34283875e-01 +1.13382963e-01 +9.46644222e-02 +7.80588691e-02 +6.34786147e-02 +5.08206408e-02 +3.99693355e-02 +3.07989458e-02 +2.31757423e-02 +1.69598645e-02 +1.20068991e-02 +8.16915332e-03 +5.29668892e-03 +3.23792782e-03 +1.84037921e-03 +9.50725995e-04 +4.12370929e-04 +2.06185465e-04 +0.00000000e+00 +-0.00000000e+00 +-3.91914656e-02 +-8.28679559e-02 +-1.25094913e-01 +-1.67149012e-01 +-2.09150169e-01 +-2.51127726e-01 +-2.93092587e-01 +-3.35049794e-01 +-3.77002015e-01 +-4.18950800e-01 +-4.60897115e-01 +-5.02841591e-01 +-5.44784663e-01 +-5.86726637e-01 +-6.28667735e-01 +-6.70608124e-01 +-7.12547932e-01 +-7.54487255e-01 +-7.96426171e-01 +-8.38364741e-01 +-8.80303016e-01 +-9.22241036e-01 +-9.64178834e-01 +-9.97369514e-01 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-9.99968409e-01 +-9.77416184e-01 +-9.35478441e-01 +-8.93540494e-01 +-8.51602304e-01 +-8.09663831e-01 +-7.67725030e-01 +-7.25785843e-01 +-6.83846198e-01 +-6.41906005e-01 +-5.99965146e-01 +-5.58023470e-01 +-5.16080773e-01 +-4.74136780e-01 +-4.32191102e-01 +-3.90243182e-01 +-3.48292178e-01 +-3.06336765e-01 +-2.64374713e-01 +-2.22401949e-01 +-1.80410081e-01 +-1.38378309e-01 +-9.62348465e-02 +-5.34309759e-02 +-2.67154879e-02 +-0.00000000e+00 +0.00000000e+00 +-6.60950883e-03 +-3.98860155e-02 +-7.18446490e-02 +-8.75483750e-02 +-8.55736464e-02 +-6.72426990e-02 +-3.63143010e-02 +2.37996636e-03 +4.39658627e-02 +8.41267001e-02 +1.19378529e-01 +1.47150103e-01 +1.65758319e-01 +1.74330710e-01 +1.72702447e-01 +1.61302504e-01 +1.41037079e-01 +1.13177036e-01 +7.92500710e-02 +4.09427032e-02 +1.17695239e-05 +-4.17930314e-02 +-8.27950981e-02 +-1.21445430e-01 +-1.56365786e-01 +-1.86381060e-01 +-2.10541393e-01 +-2.28134963e-01 +-2.38692204e-01 +-2.41982557e-01 +-2.38004675e-01 +-2.26971159e-01 +-2.09288806e-01 +-1.85535421e-01 +-1.56434055e-01 +-1.22825629e-01 +-8.56407277e-02 +-4.58713195e-02 +-4.54306185e-03 +3.73112615e-02 +7.86765268e-02 +1.18578230e-01 +1.56102732e-01 +1.90415199e-01 +2.20774469e-01 +2.46545215e-01 +2.67207050e-01 +2.82360811e-01 +2.91732001e-01 +2.95171511e-01 +2.92653875e-01 +2.84273162e-01 +2.70236799e-01 +2.50857528e-01 +2.26543825e-01 +1.97788962e-01 +1.65159032e-01 +1.29280277e-01 +9.08258146e-02 +5.05022237e-02 +9.03605188e-03 +-3.28393885e-02 +-7.43968231e-02 +-1.14927176e-01 +-1.53750940e-01 +-1.90228615e-01 +-2.23770079e-01 +-2.53842787e-01 +-2.79978864e-01 +-3.01780709e-01 +-3.18925445e-01 +-3.31168131e-01 +-3.38343280e-01 +-3.40365791e-01 +-3.37229937e-01 +-3.29007687e-01 +-3.15845751e-01 +-2.97961645e-01 +-2.75638869e-01 +-2.49221400e-01 +-2.19107263e-01 +-1.85741835e-01 +-1.49610431e-01 +-1.11230761e-01 +-7.11450335e-02 +-2.99120603e-02 +1.19007217e-02 +5.37250318e-02 +9.49993804e-02 +1.35176351e-01 +1.73729531e-01 +2.10159974e-01 +2.44002097e-01 +2.74829034e-01 +3.02257349e-01 +3.25951074e-01 +3.45625028e-01 +3.61047473e-01 +3.72041967e-01 +3.78488586e-01 +3.80324346e-01 +3.77543021e-01 +3.70194091e-01 +3.58381445e-01 +3.42260927e-01 +3.22037802e-01 +2.97963539e-01 +2.70332000e-01 +2.39475423e-01 +2.05759976e-01 +1.69581038e-01 +1.31358245e-01 +9.15303636e-02 +5.05500664e-02 +8.87872642e-03 +-3.30188630e-02 +-7.46796459e-02 +-1.15647321e-01 +-1.55477244e-01 +-1.93740979e-01 +-2.30030777e-01 +-2.63963515e-01 +-2.95184485e-01 +-3.23370723e-01 +-3.48233895e-01 +-3.69522927e-01 +-3.87025971e-01 +-4.00572137e-01 +-4.10032704e-01 +-4.15321687e-01 +-4.16396480e-01 +-4.13257259e-01 +-4.05946816e-01 +-3.94549390e-01 +-3.79189165e-01 +-3.60028831e-01 +-3.37267257e-01 +-3.11137079e-01 +-2.81902131e-01 +-2.49854464e-01 +-2.15311087e-01 +-1.78610658e-01 +-1.40110047e-01 +-1.00180662e-01 +-5.92047402e-02 +-1.75716540e-02 +2.43258327e-02 +6.60952742e-02 +1.07348170e-01 +1.47703531e-01 +1.86791286e-01 +2.24255540e-01 +2.59757666e-01 +2.92979172e-01 +3.23624370e-01 +3.51422752e-01 +3.76131160e-01 +3.97535626e-01 +4.15452974e-01 +4.29732086e-01 +4.40254894e-01 +4.46937051e-01 +4.49728304e-01 +4.48612588e-01 +4.43607779e-01 +4.34765200e-01 +4.22168829e-01 +4.05934235e-01 +3.86207271e-01 +3.63162526e-01 +3.37001564e-01 +3.07950973e-01 +2.76260216e-01 +2.42199281e-01 +2.06056254e-01 +1.68134761e-01 +1.28751350e-01 +8.82327286e-02 +4.69129722e-02 +5.13076709e-03 +-3.67733693e-02 +-7.84599036e-02 +-1.19592975e-01 +-1.59843043e-01 +-1.98889550e-01 +-2.36423276e-01 +-2.72148672e-01 +-3.05786313e-01 +-3.37074614e-01 +-3.65771874e-01 +-3.91658186e-01 +-4.14536413e-01 +-4.34234197e-01 +-4.50604566e-01 +-4.63526917e-01 +-4.72908114e-01 +-4.78682168e-01 +-4.80811524e-01 +-4.79286035e-01 +-4.74123753e-01 +-4.65369778e-01 +-4.53096296e-01 +-4.37401323e-01 +-4.18408150e-01 +-3.96263859e-01 +-3.71138401e-01 +-3.43222707e-01 +-3.12727652e-01 +-2.79881691e-01 +-2.44929763e-01 +-2.08130639e-01 +-1.69755575e-01 +-1.30085764e-01 +-8.94104793e-02 +-4.80248844e-02 +-6.22776732e-03 +3.56804941e-02 +7.74001907e-02 +1.18634330e-01 +1.59090831e-01 +1.98484405e-01 +2.36538598e-01 +2.72987771e-01 +3.07578605e-01 +3.40071977e-01 +3.70244623e-01 +3.97890242e-01 +4.22820964e-01 +4.44868693e-01 +4.63885862e-01 +4.79746244e-01 +4.92345899e-01 +5.01603669e-01 +5.07461420e-01 +5.09884286e-01 +5.08860818e-01 +5.04402978e-01 +4.96545718e-01 +4.85346588e-01 +4.70885258e-01 +4.53262802e-01 +4.32601015e-01 +4.09041202e-01 +3.82743262e-01 +3.53884472e-01 +3.22658215e-01 +2.89272607e-01 +2.53949030e-01 +2.16920571e-01 +1.78430445e-01 +1.38730347e-01 +9.80787742e-02 +5.67393169e-02 +1.49789216e-02 +-2.69338407e-02 +-6.87305029e-02 +-1.10144414e-01 +-1.50912422e-01 +-1.90776520e-01 +-2.29485440e-01 +-2.66796202e-01 +-3.02475580e-01 +-3.36301509e-01 +-3.68064399e-01 +-3.97568365e-01 +-4.24632359e-01 +-4.49091199e-01 +-4.70796488e-01 +-4.89617430e-01 +-5.05441521e-01 +-5.18175124e-01 +-5.27743931e-01 +-5.34093285e-01 +-5.37188408e-01 +-5.37014468e-01 +-5.33576561e-01 +-5.26899553e-01 +-5.17027805e-01 +-5.04024787e-01 +-4.87972590e-01 +-4.68971297e-01 +-4.47138301e-01 +-4.22607498e-01 +-3.95528351e-01 +-3.66064949e-01 +-3.34394951e-01 +-3.00708414e-01 +-2.65206629e-01 +-2.28100866e-01 +-1.89611084e-01 +-1.49964582e-01 +-1.09394611e-01 +-6.81390039e-02 +-2.64387428e-02 +1.54634375e-02 +5.73244648e-02 +9.89023385e-02 +1.39957538e-01 +1.80254377e-01 +2.19562318e-01 +2.57657255e-01 +2.94322759e-01 +3.29351337e-01 +3.62545518e-01 +3.93718871e-01 +4.22696990e-01 +4.49318456e-01 +4.73435809e-01 +4.94916117e-01 +5.13641600e-01 +5.29510248e-01 +5.42436551e-01 +5.52351692e-01 +5.59203654e-01 +5.62957546e-01 +5.63596051e-01 +5.61119059e-01 +5.55543424e-01 +5.46903055e-01 +5.35248936e-01 +5.20648107e-01 +5.03183363e-01 +4.82953245e-01 +4.60070981e-01 +4.34663541e-01 +4.06871467e-01 +3.76847896e-01 +3.44757176e-01 +3.10774479e-01 +2.75084793e-01 +2.37881349e-01 +1.99365090e-01 +1.59743451e-01 +1.19228885e-01 +7.80381501e-02 +3.63908882e-02 +-5.49155787e-03 +-4.73871938e-02 +-8.90746894e-02 +-1.30334387e-01 +-1.70949686e-01 +-2.10707832e-01 +-2.49401321e-01 +-2.86828885e-01 +-3.22796151e-01 +-3.57117452e-01 +-3.89615653e-01 +-4.20124011e-01 +-4.48486472e-01 +-4.74558244e-01 +-4.98207438e-01 +-5.19314073e-01 +-5.37772662e-01 +-5.53490549e-01 +-5.66390260e-01 +-5.76408336e-01 +-5.83496458e-01 +-5.87621449e-01 +-5.88764860e-01 +-5.86924111e-01 +-5.82110820e-01 +-5.74352662e-01 +-5.63690893e-01 +-5.50182534e-01 +-5.33897437e-01 +-5.14920501e-01 +-4.93348564e-01 +-4.69292413e-01 +-4.42873719e-01 +-4.14226707e-01 +-3.83495256e-01 +-3.50834132e-01 +-3.16406411e-01 +-2.80384129e-01 +-2.42946200e-01 +-2.04278377e-01 +-1.64571765e-01 +-1.24022091e-01 +-8.28287566e-02 +-4.11936393e-02 +6.79625677e-04 +4.25868819e-02 +8.43243328e-02 +1.25689490e-01 +1.66482291e-01 +2.06505932e-01 +2.45567733e-01 +2.83480469e-01 +3.20062428e-01 +3.55139349e-01 +3.88544168e-01 +4.20118399e-01 +4.49713021e-01 +4.77188141e-01 +5.02415162e-01 +5.25275878e-01 +5.45663677e-01 +5.63484532e-01 +5.78655812e-01 +5.91108416e-01 +6.00786075e-01 +6.07645108e-01 +6.11656180e-01 +6.12802693e-01 +6.11081370e-01 +6.06503174e-01 +5.99091535e-01 +5.88883143e-01 +5.75928302e-01 +5.60289052e-01 +5.42039997e-01 +5.21268162e-01 +4.98071270e-01 +4.72558185e-01 +4.44848648e-01 +4.15071630e-01 +3.83365335e-01 +3.49876890e-01 +3.14760873e-01 +2.78178836e-01 +2.40298911e-01 +2.01294661e-01 +1.61344160e-01 +1.20629490e-01 +7.93358255e-02 +3.76503772e-02 +-4.23826810e-03 +-4.61410183e-02 +-8.78692251e-02 +-1.29235439e-01 +-1.70054233e-01 +-2.10143155e-01 +-2.49323460e-01 +-2.87420763e-01 +-3.24265918e-01 +-3.59695905e-01 +-3.93554341e-01 +-4.25692028e-01 +-4.55967754e-01 +-4.84249040e-01 +-5.10412553e-01 +-5.34344372e-01 +-5.55940679e-01 +-5.75108245e-01 +-5.91764913e-01 +-6.05839507e-01 +-6.17272246e-01 +-6.26015080e-01 +-6.32031912e-01 +-6.35298720e-01 +-6.35803268e-01 +-6.33545364e-01 +-6.28536808e-01 +-6.20801391e-01 +-6.10374720e-01 +-5.97303826e-01 +-5.81646962e-01 +-5.63473441e-01 +-5.42863275e-01 +-5.19906825e-01 +-4.94704318e-01 +-4.67365266e-01 +-4.38008088e-01 +-4.06759577e-01 +-3.73754325e-01 +-3.39134144e-01 +-3.03047405e-01 +-2.65648327e-01 +-2.27096362e-01 +-1.87555499e-01 +-1.47193567e-01 +-1.06181503e-01 +-6.46926183e-02 +-2.29018587e-02 +1.90149486e-02 +6.08818228e-02 +1.02523360e-01 +1.43765470e-01 +1.84436096e-01 +2.24365931e-01 +2.63389109e-01 +3.01343895e-01 +3.38073340e-01 +3.73425903e-01 +4.07256052e-01 +4.39424862e-01 +4.69800557e-01 +4.98259037e-01 +5.24684359e-01 +5.48969185e-01 +5.71015192e-01 +5.90733449e-01 +6.08044746e-01 +6.22879891e-01 +6.35179948e-01 +6.44896446e-01 +6.51991533e-01 +6.56438107e-01 +6.58219884e-01 +6.57331425e-01 +6.53778135e-01 +6.47576183e-01 +6.38752420e-01 +6.27344225e-01 +6.13399320e-01 +5.96975543e-01 +5.78140585e-01 +5.56971684e-01 +5.33555281e-01 +5.07986646e-01 +4.80369471e-01 +4.50815420e-01 +4.19443661e-01 +3.86380374e-01 +3.51758219e-01 +3.15715777e-01 +2.78397016e-01 +2.39950654e-01 +2.00529600e-01 +1.60290313e-01 +1.19392171e-01 +7.79968455e-02 +3.62676522e-02 +-5.63109717e-03 +-4.75347428e-02 +-8.92789227e-02 +-1.30700215e-01 +-1.71636772e-01 +-2.11928955e-01 +-2.51419946e-01 +-2.89956336e-01 +-3.27388741e-01 +-3.63572336e-01 +-3.98367434e-01 +-4.31639980e-01 +-4.63262082e-01 +-4.93112466e-01 +-5.21076930e-01 +-5.47048760e-01 +-5.70929125e-01 +-5.92627422e-01 +-6.12061605e-01 +-6.29158471e-01 +-6.43853914e-01 +-6.56093139e-01 +-6.65830850e-01 +-6.73031402e-01 +-6.77668887e-01 +-6.79727206e-01 +-6.79200108e-01 +-6.76091179e-01 +-6.70413794e-01 +-6.62191048e-01 +-6.51455627e-01 +-6.38249661e-01 +-6.22624535e-01 +-6.04640663e-01 +-5.84367246e-01 +-5.61882003e-01 +-5.37270819e-01 +-5.10627394e-01 +-4.82052875e-01 +-4.51655462e-01 +-4.19549981e-01 +-3.85857431e-01 +-3.50704522e-01 +-3.14223177e-01 +-2.76550056e-01 +-2.37826017e-01 +-1.98195544e-01 +-1.57806222e-01 +-1.16808191e-01 +-7.53535797e-02 +-3.35959406e-02 +8.31031672e-03 +5.02105006e-02 +9.19502289e-02 +1.33375986e-01 +1.74335678e-01 +2.14679178e-01 +2.54258870e-01 +2.92930174e-01 +3.30552116e-01 +3.66987843e-01 +4.02105043e-01 +4.35776408e-01 +4.67880113e-01 +4.98300212e-01 +5.26927096e-01 +5.53657988e-01 +5.78397076e-01 +6.01055890e-01 +6.21553607e-01 +6.39817296e-01 +6.55782304e-01 +6.69392540e-01 +6.80600339e-01 +6.89366676e-01 +6.95661359e-01 +6.99463061e-01 +7.00759759e-01 +6.99548272e-01 +6.95834294e-01 +6.89632390e-01 +6.80965932e-01 +6.69867374e-01 +6.56377702e-01 +6.40546156e-01 +6.22430162e-01 +6.02095146e-01 +5.79614657e-01 +5.55069548e-01 +5.28547686e-01 +5.00143728e-01 +4.69958947e-01 +4.38100966e-01 +4.04682855e-01 +3.69822924e-01 +3.33644357e-01 +2.96275032e-01 +2.57846675e-01 +2.18494379e-01 +1.78356256e-01 +1.37573089e-01 +9.62876705e-02 +5.46441963e-02 +1.27879142e-02 +-2.91353549e-02 +-7.09798443e-02 +-1.12600323e-01 +-1.53852487e-01 +-1.94593543e-01 +-2.34682847e-01 +-2.73982128e-01 +-3.12355916e-01 +-3.49672303e-01 +-3.85803423e-01 +-4.20625428e-01 +-4.54018975e-01 +-4.85870281e-01 +-5.16071013e-01 +-5.44518276e-01 +-5.71115293e-01 +-5.95772489e-01 +-6.18406591e-01 +-6.38940966e-01 +-6.57306764e-01 +-6.73442969e-01 +-6.87295526e-01 +-6.98818093e-01 +-7.07973390e-01 +-7.14731538e-01 +-7.19070297e-01 +-7.20976527e-01 +-7.20445432e-01 +-7.17479549e-01 +-7.12089947e-01 +-7.04296766e-01 +-6.94127152e-01 +-6.81616035e-01 +-6.66807416e-01 +-6.49752089e-01 +-6.30507798e-01 +-6.09140731e-01 +-5.85723635e-01 +-5.60335249e-01 +-5.33061775e-01 +-5.03995484e-01 +-4.73233635e-01 +-4.40879807e-01 +-4.07042771e-01 +-3.71835299e-01 +-3.35375182e-01 +-2.97784283e-01 +-2.59187393e-01 +-2.19712979e-01 +-1.79492223e-01 +-1.38658164e-01 +-9.73460664e-02 +-5.56924630e-02 +-1.38346729e-02 +2.80893279e-02 +6.99416970e-02 +1.11584884e-01 +1.52882382e-01 +1.93699001e-01 +2.33901033e-01 +2.73357523e-01 +3.11939711e-01 +3.49521784e-01 +3.85982092e-01 +4.21201874e-01 +4.55067122e-01 +4.87468728e-01 +5.18301333e-01 +5.47466230e-01 +5.74869521e-01 +6.00422633e-01 +6.24044710e-01 +6.45659461e-01 +6.65198184e-01 +6.82599374e-01 +6.97806795e-01 +7.10773640e-01 +7.21458680e-01 +7.29828317e-01 +7.35857798e-01 +7.39527543e-01 +7.40827989e-01 +7.39755748e-01 +7.36314822e-01 +7.30518527e-01 +7.22385094e-01 +7.11942698e-01 +6.99225307e-01 +6.84274095e-01 +6.67138732e-01 +6.47873401e-01 +6.26541521e-01 +6.03211021e-01 +5.77956897e-01 +5.50860573e-01 +5.22007698e-01 +4.91491455e-01 +4.59408018e-01 +4.25860038e-01 +3.90953744e-01 +3.54799547e-01 +3.17512305e-01 +2.79209140e-01 +2.40011515e-01 +2.00042325e-01 +1.59427628e-01 +1.18294789e-01 +7.67728162e-02 +3.49917983e-02 +-6.91767538e-03 +-4.88247009e-02 +-9.05985288e-02 +-1.32109190e-01 +-1.73227401e-01 +-2.13825628e-01 +-2.53777844e-01 +-2.92960287e-01 +-3.31251959e-01 +-3.68534208e-01 +-4.04692647e-01 +-4.39615143e-01 +-4.73195267e-01 +-5.05328862e-01 +-5.35918573e-01 +-5.64869672e-01 +-5.92094793e-01 +-6.17510011e-01 +-6.41038751e-01 +-6.62609055e-01 +-6.82155895e-01 +-6.99620188e-01 +-7.14949172e-01 +-7.28097297e-01 +-7.39024683e-01 +-7.47699764e-01 +-7.54096037e-01 +-7.58196164e-01 +-7.59987366e-01 +-7.59466605e-01 +-7.56634984e-01 +-7.51503679e-01 +-7.44087674e-01 +-7.34412087e-01 +-7.22505592e-01 +-7.08406852e-01 +-6.92157860e-01 +-6.73810260e-01 +-6.53418832e-01 +-6.31047494e-01 +-6.06763122e-01 +-5.80641064e-01 +-5.52759464e-01 +-5.23204109e-01 +-4.92063456e-01 +-4.59432634e-01 +-4.25409332e-01 +-3.90096819e-01 +-3.53600822e-01 +-3.16031477e-01 +-2.77501245e-01 +-2.38125803e-01 +-1.98022946e-01 +-1.57312544e-01 +-1.16116221e-01 +-7.45566947e-02 +-3.27578455e-02 +9.15610509e-03 +5.10606316e-02 +9.28313628e-02 +1.34344706e-01 +1.75477552e-01 +2.16108704e-01 +2.56117828e-01 +2.95387410e-01 +3.33801482e-01 +3.71247353e-01 +4.07615040e-01 +4.42797696e-01 +4.76692839e-01 +5.09200532e-01 +5.40226990e-01 +5.69680507e-01 +5.97476694e-01 +6.23533600e-01 +6.47776585e-01 +6.70135026e-01 +6.90544263e-01 +7.08946206e-01 +7.25286737e-01 +7.39520719e-01 +7.51605783e-01 +7.61509247e-01 +7.69202035e-01 +7.74663210e-01 +7.77878090e-01 +7.78837227e-01 +7.77540385e-01 +7.73990397e-01 +7.68200121e-01 +7.60186067e-01 +7.49972636e-01 +7.37590714e-01 +7.23075640e-01 +7.06471775e-01 +6.87826180e-01 +6.67194433e-01 +6.44636291e-01 +6.20216853e-01 +5.94008090e-01 +5.66084522e-01 +5.36528040e-01 +5.05423280e-01 +4.72859801e-01 +4.38931945e-01 +4.03736220e-01 +3.67374487e-01 +3.29950385e-01 +2.91571009e-01 +2.52346420e-01 +2.12387996e-01 +1.71810117e-01 +1.30728049e-01 +8.92585957e-02 +4.75196881e-02 +5.62956486e-03 +-3.62930036e-02 +-7.81294327e-02 +-1.19761359e-01 +-1.61071453e-01 +-2.01943005e-01 +-2.42260968e-01 +-2.81912135e-01 +-3.20784611e-01 +-3.58769855e-01 +-3.95761145e-01 +-4.31654628e-01 +-4.66350738e-01 +-4.99751804e-01 +-5.31764997e-01 +-5.62301627e-01 +-5.91275819e-01 +-6.18608086e-01 +-6.44222430e-01 +-6.68047269e-01 +-6.90018087e-01 +-7.10073438e-01 +-7.28157994e-01 +-7.44223350e-01 +-7.58224312e-01 +-7.70123165e-01 +-7.79888407e-01 +-7.87492427e-01 +-7.92915869e-01 +-7.96144748e-01 +-7.97169779e-01 +-7.95990167e-01 +-7.92609777e-01 +-7.87037832e-01 +-7.79291876e-01 +-7.69393556e-01 +-7.57370228e-01 +-7.43257147e-01 +-7.27093239e-01 +-7.08923178e-01 +-6.88798879e-01 +-6.66775623e-01 +-6.42914100e-01 +-6.17281536e-01 +-5.89948157e-01 +-5.60989049e-01 +-5.30484994e-01 +-4.98519419e-01 +-4.65179834e-01 +-4.30558523e-01 +-3.94750021e-01 +-3.57852038e-01 +-3.19966039e-01 +-2.81195292e-01 +-2.41645279e-01 +-2.01424117e-01 +-1.60641210e-01 +-1.19407227e-01 +-7.78343038e-02 +-3.60352023e-02 +5.87691455e-03 +4.77885428e-02 +8.95864477e-02 +1.31157719e-01 +1.72390122e-01 +2.13172789e-01 +2.53395845e-01 +2.92950943e-01 +3.31732184e-01 +3.69635550e-01 +4.06559128e-01 +4.42404300e-01 +4.77075623e-01 +5.10480054e-01 +5.42528403e-01 +5.73136053e-01 +6.02221227e-01 +6.29706270e-01 +6.55518894e-01 +6.79590955e-01 +7.01858202e-01 +7.22261916e-01 +7.40749266e-01 +7.57271117e-01 +7.71783773e-01 +7.84250061e-01 +7.94637783e-01 +8.02919390e-01 +8.09073596e-01 +8.13085803e-01 +8.14945617e-01 +8.14648380e-01 +8.12196070e-01 +8.07596493e-01 +8.00861853e-01 +7.92010394e-01 +7.81067001e-01 +7.68061240e-01 +7.53027504e-01 +7.36006037e-01 +7.17043111e-01 +6.96188888e-01 +6.73498405e-01 +6.49031986e-01 +6.22855067e-01 +5.95036402e-01 +5.65649164e-01 +5.34771027e-01 +5.02483709e-01 +4.68871688e-01 +4.34023057e-01 +3.98029409e-01 +3.60985290e-01 +3.22987323e-01 +2.84134727e-01 +2.44529066e-01 +2.04273778e-01 +1.63473535e-01 +1.22234469e-01 +8.06638581e-02 +3.88696997e-02 +-3.03967874e-03 +-4.49556596e-02 +-8.67696850e-02 +-1.28373698e-01 +-1.69660234e-01 +-2.10522678e-01 +-2.50855616e-01 +-2.90555356e-01 +-3.29519802e-01 +-3.67648686e-01 +-4.04844019e-01 +-4.41010575e-01 +-4.76055942e-01 +-5.09890249e-01 +-5.42426889e-01 +-5.73582807e-01 +-6.03279023e-01 +-6.31439795e-01 +-6.57993312e-01 +-6.82872047e-01 +-7.06013228e-01 +-7.27358587e-01 +-7.46853894e-01 +-7.64449846e-01 +-7.80102162e-01 +-7.93772117e-01 +-8.05425501e-01 +-8.15033034e-01 +-8.22570828e-01 +-8.28020485e-01 +-8.31369391e-01 +-8.32609489e-01 +-8.31738105e-01 +-8.28758039e-01 +-8.23677695e-01 +-8.16511073e-01 +-8.07276700e-01 +-7.95998416e-01 +-7.82705307e-01 +-7.67431750e-01 +-7.50217319e-01 +-7.31105792e-01 +-7.10145789e-01 +-6.87390632e-01 +-6.62898253e-01 +-6.36731163e-01 +-6.08955485e-01 +-5.79641356e-01 +-5.48862800e-01 +-5.16697507e-01 +-4.83226810e-01 +-4.48534923e-01 +-4.12708942e-01 +-3.75838818e-01 +-3.38017060e-01 +-2.99338562e-01 +-2.59900255e-01 +-2.19800665e-01 +-1.79139959e-01 +-1.38019636e-01 +-9.65422635e-02 +-5.48112202e-02 +-1.29303358e-02 +2.89962857e-02 +7.08644899e-02 +1.12570352e-01 +1.54010453e-01 +1.95082217e-01 +2.35684039e-01 +2.75715526e-01 +3.15077791e-01 +3.53673692e-01 +3.91408093e-01 +4.28188242e-01 +4.63923685e-01 +4.98526554e-01 +5.31911898e-01 +5.63997832e-01 +5.94705772e-01 +6.23960779e-01 +6.51691475e-01 +6.77830109e-01 +7.02312964e-01 +7.25080444e-01 +7.46077241e-01 +7.65252515e-01 +7.82560104e-01 +7.97958161e-01 +8.11409537e-01 +8.22881919e-01 +8.32347878e-01 +8.39784916e-01 +8.45175626e-01 +8.48507694e-01 +8.49773531e-01 +8.48970628e-01 +8.46101546e-01 +8.41173890e-01 +8.34200265e-01 +8.25198309e-01 +8.14190692e-01 +8.01204659e-01 +7.86272231e-01 +7.69430162e-01 +7.50719808e-01 +7.30187017e-01 +7.07882019e-01 +6.83859384e-01 +6.58177716e-01 +6.30899431e-01 +6.02090793e-01 +5.71821709e-01 +5.40165557e-01 +5.07198990e-01 +4.73001747e-01 +4.37656521e-01 +4.01248630e-01 +3.63865798e-01 +3.25598039e-01 +2.86537421e-01 +2.46777836e-01 +2.06414768e-01 +1.65545062e-01 +1.24266692e-01 +8.26785188e-02 +4.08800204e-02 +-1.02890677e-03 +-4.29481835e-02 +-8.47777921e-02 +-1.26418018e-01 +-1.67769687e-01 +-2.08734401e-01 +-2.49214777e-01 +-2.89114709e-01 +-3.28339536e-01 +-3.66796272e-01 +-4.04393831e-01 +-4.41043259e-01 +-4.76657923e-01 +-5.11153720e-01 +-5.44449285e-01 +-5.76466154e-01 +-6.07128969e-01 +-6.36365701e-01 +-6.64107713e-01 +-6.90289918e-01 +-7.14850977e-01 +-7.37733439e-01 +-7.58883859e-01 +-7.78252926e-01 +-7.95795564e-01 +-8.11471038e-01 +-8.25243040e-01 +-8.37079777e-01 +-8.46954074e-01 +-8.54843347e-01 +-8.60729651e-01 +-8.64599778e-01 +-8.66445236e-01 +-8.66262294e-01 +-8.64051993e-01 +-8.59820077e-01 +-8.53577055e-01 +-8.45338085e-01 +-8.35123011e-01 +-8.22956236e-01 +-8.08866729e-01 +-7.92887928e-01 +-7.75057600e-01 +-7.55417782e-01 +-7.34014690e-01 +-7.10898604e-01 +-6.86123740e-01 +-6.59748122e-01 +-6.31833440e-01 +-6.02444900e-01 +-5.71651069e-01 +-5.39523710e-01 +-5.06137612e-01 +-4.71570411e-01 +-4.35902409e-01 +-3.99216384e-01 +-3.61597397e-01 +-3.23132582e-01 +-2.83910943e-01 +-2.44023152e-01 +-2.03561346e-01 +-1.62618899e-01 +-1.21290214e-01 +-7.96705037e-02 +-3.78555636e-02 +4.05844204e-03 +4.59752051e-02 +8.77984942e-02 +1.29432375e-01 +1.70781431e-01 +2.11750979e-01 +2.52247289e-01 +2.92177791e-01 +3.31451292e-01 +3.69978180e-01 +4.07670627e-01 +4.44442787e-01 +4.80210986e-01 +5.14893910e-01 +5.48412789e-01 +5.80691572e-01 +6.11657099e-01 +6.41239259e-01 +6.69371150e-01 +6.95989220e-01 +7.21033414e-01 +7.44447303e-01 +7.66178207e-01 +7.86177300e-01 +8.04399731e-01 +8.20804717e-01 +8.35355606e-01 +8.48020003e-01 +8.58769773e-01 +8.67581170e-01 +8.74434807e-01 +8.79315775e-01 +8.82213601e-01 +8.83122297e-01 +8.82040385e-01 +8.78970854e-01 +8.73921165e-01 +8.66903235e-01 +8.57933404e-01 +8.47032382e-01 +8.34225198e-01 +8.19541141e-01 +8.03013689e-01 +7.84680427e-01 +7.64582957e-01 +7.42766800e-01 +7.19281289e-01 +6.94179447e-01 +6.67517869e-01 +6.39356593e-01 +6.09758967e-01 +5.78791481e-01 +5.46523623e-01 +5.13027745e-01 +4.78378858e-01 +4.42654488e-01 +4.05934495e-01 +3.68300881e-01 +3.29837621e-01 +2.90630462e-01 +2.50766731e-01 +2.10335150e-01 +1.69425618e-01 +1.28129027e-01 +8.65370534e-02 +4.47419500e-02 +2.83634531e-03 +-3.90869628e-02 +-8.09352131e-02 +-1.22615886e-01 +-1.64036909e-01 +-2.05106855e-01 +-2.45735150e-01 +-2.85832265e-01 +-3.25309916e-01 +-3.64081258e-01 +-4.02061071e-01 +-4.39165944e-01 +-4.75314463e-01 +-5.10427380e-01 +-5.44427793e-01 +-5.77241296e-01 +-6.08796160e-01 +-6.39023470e-01 +-6.67857278e-01 +-6.95234750e-01 +-7.21096283e-01 +-7.45385654e-01 +-7.68050116e-01 +-7.89040522e-01 +-8.08311430e-01 +-8.25821182e-01 +-8.41532006e-01 +-8.55410088e-01 +-8.67425636e-01 +-8.77552943e-01 +-8.85770440e-01 +-8.92060735e-01 +-8.96410643e-01 +-8.98811214e-01 +-8.99257743e-01 +-8.97749777e-01 +-8.94291109e-01 +-8.88889763e-01 +-8.81557976e-01 +-8.72312157e-01 +-8.61172854e-01 +-8.48164704e-01 +-8.33316369e-01 +-8.16660466e-01 +-7.98233505e-01 +-7.78075791e-01 +-7.56231341e-01 +-7.32747796e-01 +-7.07676269e-01 +-6.81071288e-01 +-6.52990613e-01 +-6.23495168e-01 +-5.92648858e-01 +-5.60518448e-01 +-5.27173429e-01 +-4.92685833e-01 +-4.57130096e-01 +-4.20582895e-01 +-3.83122977e-01 +-3.44830982e-01 +-3.05789275e-01 +-2.66081761e-01 +-2.25793711e-01 +-1.85011571e-01 +-1.43822778e-01 +-1.02315574e-01 +-6.05788140e-02 +-1.87017772e-02 +2.32260333e-02 +6.51150752e-02 +1.06875957e-01 +1.48419632e-01 +1.89657585e-01 +2.30502017e-01 +2.70866039e-01 +3.10663851e-01 +3.49810917e-01 +3.88224160e-01 +4.25822113e-01 +4.62525116e-01 +4.98255452e-01 +5.32937532e-01 +5.66498052e-01 +5.98866164e-01 +6.29973599e-01 +6.59754794e-01 +6.88147047e-01 +7.15090640e-01 +7.40528967e-01 +7.64408643e-01 +7.86679615e-01 +8.07295265e-01 +8.26212500e-01 +8.43391839e-01 +8.58797486e-01 +8.72397394e-01 +8.84163405e-01 +8.94071257e-01 +9.02100576e-01 +9.08234949e-01 +9.12461963e-01 +9.14773210e-01 +9.15164317e-01 +9.13634944e-01 +9.10188768e-01 +9.04833486e-01 +8.97580778e-01 +8.88446266e-01 +8.77449585e-01 +8.64614269e-01 +8.49967627e-01 +8.33540715e-01 +8.15368300e-01 +7.95488757e-01 +7.73943994e-01 +7.50779361e-01 +7.26043552e-01 +6.99788485e-01 +6.72069189e-01 +6.42943791e-01 +6.12473302e-01 +5.80721426e-01 +5.47754481e-01 +5.13641261e-01 +4.78452887e-01 +4.42262660e-01 +4.05145905e-01 +3.67179809e-01 +3.28443256e-01 +2.89016718e-01 +2.48982042e-01 +2.08422229e-01 +1.67421299e-01 +1.26064129e-01 +8.44362678e-02 +4.26237611e-02 +7.12979198e-04 +-4.12095615e-02 +-8.30573702e-02 +-1.24744195e-01 +-1.66184188e-01 +-2.07292075e-01 +-2.47983321e-01 +-2.88174306e-01 +-3.27782502e-01 +-3.66726622e-01 +-4.04926773e-01 +-4.42304659e-01 +-4.78783837e-01 +-5.14289709e-01 +-5.48749711e-01 +-5.82093472e-01 +-6.14252952e-01 +-6.45162571e-01 +-6.74759328e-01 +-7.02982900e-01 +-7.29776013e-01 +-7.55084343e-01 +-7.78856561e-01 +-8.01044504e-01 +-8.21603256e-01 +-8.40491244e-01 +-8.57670315e-01 +-8.73105735e-01 +-8.86766614e-01 +-8.98625717e-01 +-9.08659319e-01 +-9.16847457e-01 +-9.23173886e-01 +-9.27626172e-01 +-9.30195603e-01 +-9.30877313e-01 +-9.29670617e-01 +-9.26578477e-01 +-9.21607598e-01 +-9.14768471e-01 +-9.06075349e-01 +-8.95546196e-01 +-8.83202588e-01 +-8.69070058e-01 +-8.53177783e-01 +-8.35558268e-01 +-8.16247471e-01 +-7.95284727e-01 +-7.72712652e-01 +-7.48577003e-01 +-7.22926862e-01 +-6.95814473e-01 +-6.67294757e-01 +-6.37425411e-01 +-6.06266799e-01 +-5.73881814e-01 +-5.40335721e-01 +-5.05696277e-01 +-4.70033442e-01 +-4.33418994e-01 +-3.95926573e-01 +-3.57631519e-01 +-3.18610723e-01 +-2.78942469e-01 +-2.38706457e-01 +-1.97983374e-01 +-1.56854760e-01 +-1.15402913e-01 +-7.37107281e-02 +-3.18615399e-02 +1.00610197e-02 +5.19732569e-02 +9.37915988e-02 +1.35432712e-01 +1.76813657e-01 +2.17852033e-01 +2.58466124e-01 +2.98575282e-01 +3.38099896e-01 +3.76961528e-01 +4.15083092e-01 +4.52388975e-01 +4.88805124e-01 +5.24259627e-01 +5.58682503e-01 +5.92005738e-01 +6.24163513e-01 +6.55092306e-01 +6.84730910e-01 +7.13021210e-01 +7.39907727e-01 +7.65337611e-01 +7.89260878e-01 +8.11630476e-01 +8.32402287e-01 +8.51536082e-01 +8.68994655e-01 +8.84743911e-01 +8.98753122e-01 +9.10994851e-01 +9.21445181e-01 +9.30084488e-01 +9.36896251e-01 +9.41867423e-01 +9.44988518e-01 +9.46253460e-01 +9.45660323e-01 +9.43211166e-01 +9.38911167e-01 +9.32769073e-01 +9.24797109e-01 +9.15010978e-01 +9.03430830e-01 +8.90079880e-01 +8.74984559e-01 +8.58174615e-01 +8.39682929e-01 +8.19546235e-01 +7.97804646e-01 +7.74500882e-01 +7.49680657e-01 +7.23392439e-01 +6.95687720e-01 +6.66621313e-01 +6.36250133e-01 +6.04633482e-01 +5.71832993e-01 +5.37912527e-01 +5.02938717e-01 +4.66979819e-01 +4.30105806e-01 +3.92388352e-01 +3.53900688e-01 +3.14717933e-01 +2.74916285e-01 +2.34572944e-01 +1.93766108e-01 +1.52574836e-01 +1.11079100e-01 +6.93592688e-02 +2.74960123e-02 +-1.44297455e-02 +-5.63369316e-02 +-9.81445819e-02 +-1.39772070e-01 +-1.81139146e-01 +-2.22166046e-01 +-2.62773573e-01 +-3.02883706e-01 +-3.42419407e-01 +-3.81304681e-01 +-4.19464699e-01 +-4.56825962e-01 +-4.93317171e-01 +-5.28868483e-01 +-5.63411747e-01 +-5.96880559e-01 +-6.29210748e-01 +-6.60341086e-01 +-6.90212158e-01 +-7.18766829e-01 +-7.45950183e-01 +-7.71710674e-01 +-7.95999819e-01 +-8.18771373e-01 +-8.39981817e-01 +-8.59590372e-01 +-8.77560683e-01 +-8.93859003e-01 +-9.08454389e-01 +-9.21318797e-01 +-9.32427968e-01 +-9.41761986e-01 +-9.49303364e-01 +-9.55037790e-01 +-9.58954004e-01 +-9.61045766e-01 +-9.61309857e-01 +-9.59745928e-01 +-9.56356700e-01 +-9.51148962e-01 +-9.44133945e-01 +-9.35325246e-01 +-9.24739528e-01 +-9.12396604e-01 +-8.98321235e-01 +-8.82540664e-01 +-8.65084856e-01 +-8.45986509e-01 +-8.25282535e-01 +-8.03013109e-01 +-7.79220435e-01 +-7.53949289e-01 +-7.27247565e-01 +-6.99166887e-01 +-6.69760447e-01 +-6.39083650e-01 +-6.07194190e-01 +-5.74153241e-01 +-5.40023365e-01 +-5.04868824e-01 +-4.68755596e-01 +-4.31752366e-01 +-3.93929135e-01 +-3.55357001e-01 +-3.16108320e-01 +-2.76257232e-01 +-2.35878946e-01 +-1.95049228e-01 +-1.53844625e-01 +-1.12342626e-01 +-7.06212539e-02 +-2.87586418e-02 +1.31667856e-02 +5.50764036e-02 +9.68918009e-02 +1.38534830e-01 +1.79927548e-01 +2.20992475e-01 +2.61653194e-01 +3.01833882e-01 +3.41459395e-01 +3.80455674e-01 +4.18750588e-01 +4.56272887e-01 +4.92952420e-01 +5.28720769e-01 +5.63512215e-01 +5.97262159e-01 +6.29907475e-01 +6.61387466e-01 +6.91644730e-01 +7.20623173e-01 +7.48268498e-01 +7.74529613e-01 +7.99359047e-01 +8.22710799e-01 +8.44540926e-01 +8.64809589e-01 +8.83480495e-01 +9.00519018e-01 +9.15892820e-01 +9.29574617e-01 +9.41540164e-01 +9.51767133e-01 +9.60235817e-01 +9.66932284e-01 +9.71844871e-01 +9.74964086e-01 +9.76283676e-01 +9.75803202e-01 +9.73523864e-01 +9.69449167e-01 +9.63586810e-01 +9.55949430e-01 +9.46551046e-01 +9.35408054e-01 +9.22542068e-01 +9.07977985e-01 +8.91742242e-01 +8.73863900e-01 +8.54377595e-01 +8.33319570e-01 +8.10727862e-01 +7.86643868e-01 +7.61113426e-01 +7.34183262e-01 +7.05901951e-01 +6.76322220e-01 +6.45499125e-01 +6.13488700e-01 +5.80349043e-01 +5.46142091e-01 +5.10930496e-01 +4.74778070e-01 +4.37751145e-01 +3.99918157e-01 +3.61347910e-01 +3.22110396e-01 +2.82277920e-01 +2.41923183e-01 +2.01119434e-01 +1.59941096e-01 +1.18463496e-01 +7.67619544e-02 +3.49122616e-02 +-7.00930699e-03 +-4.89266625e-02 +-9.07636732e-02 +-1.32444257e-01 +-1.73893017e-01 +-2.15034828e-01 +-2.55794756e-01 +-2.96099334e-01 +-3.35875832e-01 +-3.75051864e-01 +-4.13556526e-01 +-4.51320966e-01 +-4.88276729e-01 +-5.24356381e-01 +-5.59495876e-01 +-5.93632001e-01 +-6.26702297e-01 +-6.58647701e-01 +-6.89411613e-01 +-7.18937972e-01 +-7.47173116e-01 +-7.74067945e-01 +-7.99573906e-01 +-8.23643874e-01 +-8.46236316e-01 +-8.67311180e-01 +-8.86829372e-01 +-9.04756501e-01 +-9.21062028e-01 +-9.35715796e-01 +-9.48690920e-01 +-9.59966526e-01 +-9.69522095e-01 +-9.77339062e-01 +-9.83405788e-01 +-9.87711893e-01 +-9.90248086e-01 +-9.91011238e-01 +-9.90001470e-01 +-9.87219289e-01 +-9.82669798e-01 +-9.76363452e-01 +-9.68310678e-01 +-9.58524961e-01 +-9.47026424e-01 +-9.33835322e-01 +-9.18973727e-01 +-9.02470540e-01 +-8.84355552e-01 +-8.64659490e-01 +-8.43419098e-01 +-8.20673219e-01 +-7.96460986e-01 +-7.70826234e-01 +-7.43816112e-01 +-7.15477571e-01 +-6.85861005e-01 +-6.55020824e-01 +-6.23011050e-01 +-5.89888070e-01 +-5.55712414e-01 +-5.20544273e-01 +-4.84445344e-01 +-4.47481134e-01 +-4.09716946e-01 +-3.71219000e-01 +-3.32056611e-01 +-2.92299070e-01 +-2.52016172e-01 +-2.11279924e-01 +-1.70162389e-01 +-1.28735885e-01 +-8.70740143e-02 +-4.52503576e-02 +-3.33862000e-03 +3.85870774e-02 +8.04529116e-02 +1.22184959e-01 +1.63709664e-01 +2.04954214e-01 +2.45845640e-01 +2.86312047e-01 +3.26282837e-01 +3.65659669e-01 +4.04342484e-01 +4.42299554e-01 +4.79465898e-01 +5.15777246e-01 +5.51170964e-01 +5.85586154e-01 +6.18963724e-01 +6.51246523e-01 +6.82379428e-01 +7.12309410e-01 +7.40985651e-01 +7.68359622e-01 +7.94385134e-01 +8.19018449e-01 +8.42218334e-01 +8.63946110e-01 +8.84165740e-01 +9.02843873e-01 +9.19949881e-01 +9.35455930e-01 +9.49337004e-01 +9.61570938e-01 +9.72138468e-01 +9.81023236e-01 +9.88211817e-01 +9.93693743e-01 +9.97461501e-01 +9.99510546e-01 +9.99839296e-01 +9.98449132e-01 +9.95344384e-01 +9.90532315e-01 +9.84023106e-01 +9.75829826e-01 +9.65968401e-01 +9.54457590e-01 +9.41318926e-01 +9.26576692e-01 +9.10257863e-01 +8.92392044e-01 +8.73011438e-01 +8.52150757e-01 +8.29847165e-01 +8.06140229e-01 +7.81071805e-01 +7.54685999e-01 +7.27029071e-01 +6.98149334e-01 +6.68097110e-01 +6.36924593e-01 +6.04685776e-01 +5.71436378e-01 +5.37233686e-01 +5.02136524e-01 +4.66205103e-01 +4.29500914e-01 +3.92086673e-01 +3.54026139e-01 +3.15384058e-01 +2.76226043e-01 +2.36618422e-01 +1.96628196e-01 +1.56322853e-01 +1.15770293e-01 +7.50387262e-02 +3.41964954e-02 +-6.68795150e-03 +-4.75462509e-02 +-8.83102067e-02 +-1.28911878e-01 +-1.69283763e-01 +-2.09358821e-01 +-2.49070657e-01 +-2.88353599e-01 +-3.27142784e-01 +-3.65374329e-01 +-4.02985347e-01 +-4.39914129e-01 +-4.76100200e-01 +-5.11484408e-01 +-5.46009071e-01 +-5.79617991e-01 +-6.12256623e-01 +-6.43872104e-01 +-6.74413351e-01 +-7.03831169e-01 +-7.32078271e-01 +-7.59109415e-01 +-7.84881419e-01 +-8.09353260e-01 +-8.32486131e-01 +-8.54243473e-01 +-8.74591079e-01 +-8.93497088e-01 +-9.10932080e-01 +-9.26869085e-01 +-9.41283633e-01 +-9.54153796e-01 +-9.65460194e-01 +-9.75186054e-01 +-9.83317195e-01 +-9.89842072e-01 +-9.94751774e-01 +-9.98040036e-01 +-9.99703243e-01 +-9.99740429e-01 +-9.98153270e-01 +-9.94946078e-01 +-9.90125784e-01 +-9.83701925e-01 +-9.75686616e-01 +-9.66094526e-01 +-9.54942857e-01 +-9.42251288e-01 +-9.28041968e-01 +-9.12339438e-01 +-8.95170623e-01 +-8.76564751e-01 +-8.56553318e-01 +-8.35170033e-01 +-8.12450736e-01 +-7.88433377e-01 +-7.63157893e-01 +-7.36666205e-01 +-7.09002076e-01 +-6.80211104e-01 +-6.50340587e-01 +-6.19439483e-01 +-5.87558309e-01 +-5.54749051e-01 +-5.21065110e-01 +-4.86561155e-01 +-4.51293109e-01 +-4.15317969e-01 +-3.78693809e-01 +-3.41479584e-01 +-3.03735133e-01 +-2.65520991e-01 +-2.26898366e-01 +-1.87928989e-01 +-1.48675040e-01 +-1.09199048e-01 +-6.95637658e-02 +-2.98321222e-02 +9.93295406e-03 +4.96685394e-02 +8.93119226e-02 +1.28800586e-01 +1.68072426e-01 +2.07065727e-01 +2.45719378e-01 +2.83972852e-01 +3.21766406e-01 +3.59041082e-01 +3.95738870e-01 +4.31802744e-01 +4.67176782e-01 +5.01806237e-01 +5.35637620e-01 +5.68618789e-01 +6.00699011e-01 +6.31829065e-01 +6.61961278e-01 +6.91049642e-01 +7.19049826e-01 +7.45919304e-01 +7.71617353e-01 +7.96105174e-01 +8.19345886e-01 +8.41304643e-01 +8.61948617e-01 +8.81247109e-01 +8.99171530e-01 +9.15695501e-01 +9.30794829e-01 +9.44447593e-01 +9.56634127e-01 +9.67337084e-01 +9.76541423e-01 +9.84234459e-01 +9.90405845e-01 +9.95047612e-01 +9.98154153e-01 +9.99722239e-01 +9.99751014e-01 +9.98241990e-01 +9.95199043e-01 +9.90628394e-01 +9.84538606e-01 +9.76940548e-01 +9.67847394e-01 +9.57274575e-01 +9.45239774e-01 +9.31762866e-01 +9.16865916e-01 +9.00573100e-01 +8.82910707e-01 +8.63907050e-01 +8.43592463e-01 +8.21999203e-01 +7.99161442e-01 +7.75115170e-01 +7.49898172e-01 +7.23549933e-01 +6.96111605e-01 +6.67625914e-01 +6.38137110e-01 +6.07690892e-01 +5.76334323e-01 +5.44115781e-01 +5.11084848e-01 +4.77292279e-01 +4.42789860e-01 +4.07630406e-01 +3.71867585e-01 +3.35555944e-01 +2.98750705e-01 +2.61507805e-01 +2.23883685e-01 +1.85935324e-01 +1.47720044e-01 +1.09295517e-01 +7.07195970e-02 +3.20502977e-02 +-6.65433692e-03 +-4.53363055e-02 +-8.39377218e-02 +-1.22400942e-01 +-1.60668584e-01 +-1.98683702e-01 +-2.36389762e-01 +-2.73730846e-01 +-3.10651609e-01 +-3.47097482e-01 +-3.83014640e-01 +-4.18350172e-01 +-4.53052096e-01 +-4.87069460e-01 +-5.20352424e-01 +-5.52852293e-01 +-5.84521650e-01 +-6.15314341e-01 +-6.45185633e-01 +-6.74092184e-01 +-7.01992189e-01 +-7.28845368e-01 +-7.54613074e-01 +-7.79258314e-01 +-8.02745810e-01 +-8.25042063e-01 +-8.46115356e-01 +-8.65935860e-01 +-8.84475600e-01 +-9.01708562e-01 +-9.17610673e-01 +-9.32159865e-01 +-9.45336087e-01 +-9.57121332e-01 +-9.67499670e-01 +-9.76457245e-01 +-9.83982317e-01 +-9.90065249e-01 +-9.94698535e-01 +-9.97876798e-01 +-9.99596794e-01 +-9.99857412e-01 +-9.98659673e-01 +-9.96006718e-01 +-9.91903808e-01 +-9.86358303e-01 +-9.79379650e-01 +-9.70979366e-01 +-9.61171012e-01 +-9.49970179e-01 +-9.37394441e-01 +-9.23463356e-01 +-9.08198396e-01 +-8.91622944e-01 +-8.73762239e-01 +-8.54643332e-01 +-8.34295069e-01 +-8.12747998e-01 +-7.90034378e-01 +-7.66188080e-01 +-7.41244560e-01 +-7.15240812e-01 +-6.88215269e-01 +-6.60207812e-01 +-6.31259635e-01 +-6.01413244e-01 +-5.70712361e-01 +-5.39201854e-01 +-5.06927711e-01 +-4.73936904e-01 +-4.40277394e-01 +-4.05998003e-01 +-3.71148361e-01 +-3.35778864e-01 +-2.99940525e-01 +-2.63684999e-01 +-2.27064415e-01 +-1.90131356e-01 +-1.52938785e-01 +-1.15539910e-01 +-7.79882013e-02 +-4.03372215e-02 +-2.64060771e-03 +3.50480079e-02 +7.26751277e-02 +1.10187373e-01 +1.47531655e-01 +1.84655187e-01 +2.21505562e-01 +2.58030884e-01 +2.94179745e-01 +3.29901389e-01 +3.65145730e-01 +3.99863416e-01 +4.34005953e-01 +4.67525692e-01 +5.00375962e-01 +5.32511108e-01 +5.63886524e-01 +5.94458785e-01 +6.24185626e-01 +6.53026047e-01 +6.80940374e-01 +7.07890257e-01 +7.33838795e-01 +7.58750528e-01 +7.82591498e-01 +8.05329324e-01 +8.26933185e-01 +8.47373919e-01 +8.66624027e-01 +8.84657705e-01 +9.01450904e-01 +9.16981328e-01 +9.31228482e-01 +9.44173694e-01 +9.55800123e-01 +9.66092798e-01 +9.75038627e-01 +9.82626399e-01 +9.88846820e-01 +9.93692500e-01 +9.97157970e-01 +9.99239684e-01 +9.99936019e-01 +9.99247271e-01 +9.97175654e-01 +9.93725294e-01 +9.88902212e-01 +9.82714320e-01 +9.75171403e-01 +9.66285095e-01 +9.56068873e-01 +9.44538025e-01 +9.31709618e-01 +9.17602494e-01 +9.02237215e-01 +8.85636041e-01 +8.67822910e-01 +8.48823370e-01 +8.28664570e-01 +8.07375214e-01 +7.84985492e-01 +7.61527078e-01 +7.37033054e-01 +7.11537857e-01 +6.85077265e-01 +6.57688306e-01 +6.29409213e-01 +6.00279407e-01 +5.70339379e-01 +5.39630673e-01 +5.08195838e-01 +4.76078318e-01 +4.43322435e-01 +4.09973329e-01 +3.76076847e-01 +3.41679534e-01 +3.06828550e-01 +2.71571574e-01 +2.35956788e-01 +2.00032792e-01 +1.63848500e-01 +1.27453140e-01 +9.08961455e-02 +5.42270704e-02 +1.74955811e-02 +-1.92486592e-02 +-5.59560624e-02 +-9.25771291e-02 +-1.29062567e-01 +-1.65363356e-01 +-2.01430760e-01 +-2.37216453e-01 +-2.72672570e-01 +-3.07751725e-01 +-3.42407132e-01 +-3.76592651e-01 +-4.10262812e-01 +-4.43372921e-01 +-4.75879111e-01 +-5.07738360e-01 +-5.38908591e-01 +-5.69348724e-01 +-5.99018687e-01 +-6.27879509e-01 +-6.55893372e-01 +-6.83023617e-01 +-7.09234829e-01 +-7.34492881e-01 +-7.58764947e-01 +-7.82019568e-01 +-8.04226696e-01 +-8.25357707e-01 +-8.45385448e-01 +-8.64284285e-01 +-8.82030110e-01 +-8.98600375e-01 +-9.13974137e-01 +-9.28132063e-01 +-9.41056453e-01 +-9.52731275e-01 +-9.63142172e-01 +-9.72276470e-01 +-9.80123212e-01 +-9.86673152e-01 +-9.91918768e-01 +-9.95854273e-01 +-9.98475613e-01 +-9.99780474e-01 +-9.99768277e-01 +-9.98440178e-01 +-9.95799063e-01 +-9.91849540e-01 +-9.86597928e-01 +-9.80052247e-01 +-9.72222208e-01 +-9.63119187e-01 +-9.52756213e-01 +-9.41147953e-01 +-9.28310679e-01 +-9.14262243e-01 +-8.99022065e-01 +-8.82611094e-01 +-8.65051769e-01 +-8.46368004e-01 +-8.26585150e-01 +-8.05729946e-01 +-7.83830489e-01 +-7.60916211e-01 +-7.37017812e-01 +-7.12167222e-01 +-6.86397581e-01 +-6.59743169e-01 +-6.32239357e-01 +-6.03922577e-01 +-5.74830274e-01 +-5.45000828e-01 +-5.14473518e-01 +-4.83288493e-01 +-4.51486683e-01 +-4.19109748e-01 +-3.86200046e-01 +-3.52800570e-01 +-3.18954867e-01 +-2.84706999e-01 +-2.50101508e-01 +-2.15183313e-01 +-1.79997669e-01 +-1.44590124e-01 +-1.09006455e-01 +-7.32925793e-02 +-3.74945204e-02 +-1.65836660e-03 +3.41698266e-02 +6.99440869e-02 +1.05618562e-01 +1.41147584e-01 +1.76485756e-01 +2.11587988e-01 +2.46409534e-01 +2.80906084e-01 +3.15033814e-01 +3.48749424e-01 +3.82010188e-01 +4.14774040e-01 +4.46999607e-01 +4.78646246e-01 +5.09674109e-01 +5.40044206e-01 +5.69718436e-01 +5.98659620e-01 +6.26831575e-01 +6.54199151e-01 +6.80728264e-01 +7.06385930e-01 +7.31140331e-01 +7.54960839e-01 +7.77818043e-01 +7.99683793e-01 +8.20531240e-01 +8.40334861e-01 +8.59070481e-01 +8.76715308e-01 +8.93247968e-01 +9.08648516e-01 +9.22898458e-01 +9.35980780e-01 +9.47879968e-01 +9.58582014e-01 +9.68074434e-01 +9.76346288e-01 +9.83388185e-01 +9.89192292e-01 +9.93752340e-01 +9.97063632e-01 +9.99123045e-01 +9.99929028e-01 +9.99481604e-01 +9.97782367e-01 +9.94834475e-01 +9.90642642e-01 +9.85213135e-01 +9.78553757e-01 +9.70673837e-01 +9.61584213e-01 +9.51297224e-01 +9.39826678e-01 +9.27187843e-01 +9.13397418e-01 +8.98473523e-01 +8.82435652e-01 +8.65304662e-01 +8.47102740e-01 +8.27853379e-01 +8.07581335e-01 +7.86312596e-01 +7.64074355e-01 +7.40894975e-01 +7.16803942e-01 +6.91831825e-01 +6.66010246e-01 +6.39371843e-01 +6.11950214e-01 +5.83779872e-01 +5.54896212e-01 +5.25335470e-01 +4.95134663e-01 +4.64331543e-01 +4.32964550e-01 +4.01072779e-01 +3.68695916e-01 +3.35874183e-01 +3.02648293e-01 +2.69059407e-01 +2.35149082e-01 +2.00959206e-01 +1.66531950e-01 +1.31909720e-01 +9.71351175e-02 +6.22508645e-02 +2.72997551e-02 +-7.67539238e-03 +-4.26317792e-02 +-7.75266845e-02 +-1.12317530e-01 +-1.46961922e-01 +-1.81417699e-01 +-2.15642976e-01 +-2.49596215e-01 +-2.83236267e-01 +-3.16522421e-01 +-3.49414441e-01 +-3.81872624e-01 +-4.13857856e-01 +-4.45331650e-01 +-4.76256190e-01 +-5.06594368e-01 +-5.36309842e-01 +-5.65367080e-01 +-5.93731393e-01 +-6.21368972e-01 +-6.48246930e-01 +-6.74333351e-01 +-6.99597317e-01 +-7.24008947e-01 +-7.47539421e-01 +-7.70161024e-01 +-7.91847180e-01 +-8.12572475e-01 +-8.32312685e-01 +-8.51044802e-01 +-8.68747065e-01 +-8.85398983e-01 +-9.00981358e-01 +-9.15476297e-01 +-9.28867238e-01 +-9.41138970e-01 +-9.52277646e-01 +-9.62270796e-01 +-9.71107338e-01 +-9.78777592e-01 +-9.85273288e-01 +-9.90587575e-01 +-9.94715023e-01 +-9.97651627e-01 +-9.99394814e-01 +-9.99943440e-01 +-9.99297786e-01 +-9.97459561e-01 +-9.94431894e-01 +-9.90219328e-01 +-9.84827811e-01 +-9.78264689e-01 +-9.70538692e-01 +-9.61659922e-01 +-9.51639841e-01 +-9.40491251e-01 +-9.28228277e-01 +-9.14866350e-01 +-9.00422184e-01 +-8.84913759e-01 +-8.68360289e-01 +-8.50782202e-01 +-8.32201113e-01 +-8.12639794e-01 +-7.92122155e-01 +-7.70673199e-01 +-7.48318999e-01 +-7.25086662e-01 +-7.01004295e-01 +-6.76100979e-01 +-6.50406722e-01 +-6.23952424e-01 +-5.96769841e-01 +-5.68891542e-01 +-5.40350879e-01 +-5.11181941e-01 +-4.81419510e-01 +-4.51099015e-01 +-4.20256498e-01 +-3.88928568e-01 +-3.57152361e-01 +-3.24965489e-01 +-2.92405992e-01 +-2.59512299e-01 +-2.26323181e-01 +-1.92877708e-01 +-1.59215203e-01 +-1.25375186e-01 +-9.13973351e-02 +-5.73214359e-02 +-2.31873399e-02 +1.09650810e-02 +4.50959843e-02 +7.91656080e-02 +1.13134312e-01 +1.46962625e-01 +1.80611288e-01 +2.14041297e-01 +2.47213953e-01 +2.80090910e-01 +3.12634214e-01 +3.44806344e-01 +3.76570260e-01 +4.07889436e-01 +4.38727911e-01 +4.69050329e-01 +4.98821977e-01 +5.28008822e-01 +5.56577551e-01 +5.84495602e-01 +6.11731213e-01 +6.38253447e-01 +6.64032233e-01 +6.89038394e-01 +7.13243681e-01 +7.36620801e-01 +7.59143450e-01 +7.80786345e-01 +8.01525245e-01 +8.21336981e-01 +8.40199476e-01 +8.58091773e-01 +8.74994055e-01 +8.90887667e-01 +9.05755136e-01 +9.19580186e-01 +9.32347758e-01 +9.44044021e-01 +9.54656389e-01 +9.64173532e-01 +9.72585389e-01 +9.79883172e-01 +9.86059381e-01 +9.91107804e-01 +9.95023523e-01 +9.97802921e-01 +9.99443680e-01 +9.99944785e-01 +9.99306517e-01 +9.97530457e-01 +9.94619479e-01 +9.90577742e-01 +9.85410689e-01 +9.79125032e-01 +9.71728748e-01 +9.63231062e-01 +9.53642440e-01 +9.42974570e-01 +9.31240352e-01 +9.18453877e-01 +9.04630408e-01 +8.89786365e-01 +8.73939303e-01 +8.57107886e-01 +8.39311871e-01 +8.20572080e-01 +8.00910374e-01 +7.80349628e-01 +7.58913702e-01 +7.36627412e-01 +7.13516503e-01 +6.89607618e-01 +6.64928264e-01 +6.39506785e-01 +6.13372320e-01 +5.86554774e-01 +5.59084785e-01 +5.30993683e-01 +5.02313458e-01 +4.73076722e-01 +4.43316674e-01 +4.13067055e-01 +3.82362113e-01 +3.51236564e-01 +3.19725553e-01 +2.87864612e-01 +2.55689621e-01 +2.23236768e-01 +1.90542509e-01 +1.57643521e-01 +1.24576667e-01 +9.13789489e-02 +5.80874722e-02 +2.47394002e-02 +-8.62808580e-03 +-4.19778263e-02 +-7.52727277e-02 +-1.08475804e-01 +-1.41550215e-01 +-1.74459311e-01 +-2.07166668e-01 +-2.39636131e-01 +-2.71831854e-01 +-3.03718335e-01 +-3.35260458e-01 +-3.66423534e-01 +-3.97173335e-01 +-4.27476130e-01 +-4.57298727e-01 +-4.86608503e-01 +-5.15373440e-01 +-5.43562163e-01 +-5.71143969e-01 +-5.98088860e-01 +-6.24367582e-01 +-6.49951648e-01 +-6.74813371e-01 +-6.98925894e-01 +-7.22263215e-01 +-7.44800218e-01 +-7.66512697e-01 +-7.87377380e-01 +-8.07371956e-01 +-8.26475097e-01 +-8.44666478e-01 +-8.61926800e-01 +-8.78237806e-01 +-8.93582304e-01 +-9.07944180e-01 +-9.21308415e-01 +-9.33661100e-01 +-9.44989449e-01 +-9.55281814e-01 +-9.64527690e-01 +-9.72717729e-01 +-9.79843747e-01 +-9.85898732e-01 +-9.90876846e-01 +-9.94773434e-01 +-9.97585026e-01 +-9.99309335e-01 +-9.99945263e-01 +-9.99492898e-01 +-9.97953509e-01 +-9.95329548e-01 +-9.91624641e-01 +-9.86843584e-01 +-9.80992335e-01 +-9.74078009e-01 +-9.66108862e-01 +-9.57094285e-01 +-9.47044792e-01 +-9.35972003e-01 +-9.23888634e-01 +-9.10808478e-01 +-8.96746390e-01 +-8.81718268e-01 +-8.65741038e-01 +-8.48832627e-01 +-8.31011948e-01 +-8.12298876e-01 +-7.92714225e-01 +-7.72279724e-01 +-7.51017991e-01 +-7.28952508e-01 +-7.06107596e-01 +-6.82508384e-01 +-6.58180783e-01 +-6.33151458e-01 +-6.07447794e-01 +-5.81097870e-01 +-5.54130425e-01 +-5.26574827e-01 +-4.98461039e-01 +-4.69819588e-01 +-4.40681530e-01 +-4.11078418e-01 +-3.81042263e-01 +-3.50605503e-01 +-3.19800966e-01 +-2.88661836e-01 +-2.57221613e-01 +-2.25514083e-01 +-1.93573274e-01 +-1.61433426e-01 +-1.29128950e-01 +-9.66943919e-02 +-6.41643962e-02 +-3.15736686e-02 +1.04306141e-03 +3.36510768e-02 +6.62157104e-02 +9.87023817e-02 +1.31076633e-01 +1.63304166e-01 +1.95350879e-01 +2.27182900e-01 +2.58766625e-01 +2.90068753e-01 +3.21056317e-01 +3.51696726e-01 +3.81957791e-01 +4.11807762e-01 +4.41215361e-01 +4.70149815e-01 +4.98580884e-01 +5.26478896e-01 +5.53814777e-01 +5.80560077e-01 +6.06687004e-01 +6.32168448e-01 +6.56978012e-01 +6.81090036e-01 +7.04479623e-01 +7.27122667e-01 +7.48995873e-01 +7.70076783e-01 +7.90343797e-01 +8.09776194e-01 +8.28354154e-01 +8.46058776e-01 +8.62872094e-01 +8.78777101e-01 +8.93757759e-01 +9.07799016e-01 +9.20886821e-01 +9.33008137e-01 +9.44150952e-01 +9.54304293e-01 +9.63458229e-01 +9.71603889e-01 +9.78733461e-01 +9.84840203e-01 +9.89918449e-01 +9.93963609e-01 +9.96972178e-01 +9.98941731e-01 +9.99870930e-01 +9.99759519e-01 +9.98608327e-01 +9.96419262e-01 +9.93195306e-01 +9.88940516e-01 +9.83660013e-01 +9.77359977e-01 +9.70047636e-01 +9.61731264e-01 +9.52420161e-01 +9.42124651e-01 +9.30856062e-01 +9.18626719e-01 +9.05449926e-01 +8.91339950e-01 +8.76312008e-01 +8.60382246e-01 +8.43567727e-01 +8.25886403e-01 +8.07357102e-01 +7.87999506e-01 +7.67834126e-01 +7.46882286e-01 +7.25166091e-01 +7.02708410e-01 +6.79532851e-01 +6.55663730e-01 +6.31126051e-01 +6.05945475e-01 +5.80148296e-01 +5.53761411e-01 +5.26812290e-01 +4.99328952e-01 +4.71339928e-01 +4.42874239e-01 +4.13961360e-01 +3.84631189e-01 +3.54914020e-01 +3.24840509e-01 +2.94441639e-01 +2.63748694e-01 +2.32793222e-01 +2.01607002e-01 +1.70222017e-01 +1.38670414e-01 +1.06984473e-01 +7.51965784e-02 +4.33391793e-02 +1.14447606e-02 +-2.04541915e-02 +-5.23252226e-02 +-8.41359428e-02 +-1.15854059e-01 +-1.47447410e-01 +-1.78883995e-01 +-2.10132008e-01 +-2.41159872e-01 +-2.71936266e-01 +-3.02430160e-01 +-3.32610843e-01 +-3.62447958e-01 +-3.91911528e-01 +-4.20971986e-01 +-4.49600208e-01 +-4.77767538e-01 +-5.05445818e-01 +-5.32607413e-01 +-5.59225244e-01 +-5.85272808e-01 +-6.10724208e-01 +-6.35554175e-01 +-6.59738097e-01 +-6.83252036e-01 +-7.06072760e-01 +-7.28177756e-01 +-7.49545259e-01 +-7.70154268e-01 +-7.89984568e-01 +-8.09016749e-01 +-8.27232224e-01 +-8.44613245e-01 +-8.61142922e-01 +-8.76805239e-01 +-8.91585063e-01 +-9.05468166e-01 +-9.18441233e-01 +-9.30491872e-01 +-9.41608632e-01 +-9.51781006e-01 +-9.60999443e-01 +-9.69255357e-01 +-9.76541132e-01 +-9.82850130e-01 +-9.88176694e-01 +-9.92516155e-01 +-9.95864833e-01 +-9.98220039e-01 +-9.99580077e-01 +-9.99944244e-01 +-9.99312831e-01 +-9.97687116e-01 +-9.95069369e-01 +-9.91462839e-01 +-9.86871759e-01 +-9.81301330e-01 +-9.74757726e-01 +-9.67248075e-01 +-9.58780457e-01 +-9.49363896e-01 +-9.39008343e-01 +-9.27724671e-01 +-9.15524660e-01 +-9.02420982e-01 +-8.88427193e-01 +-8.73557712e-01 +-8.57827811e-01 +-8.41253591e-01 +-8.23851975e-01 +-8.05640680e-01 +-7.86638207e-01 +-7.66863815e-01 +-7.46337503e-01 +-7.25079991e-01 +-7.03112696e-01 +-6.80457712e-01 +-6.57137785e-01 +-6.33176292e-01 +-6.08597214e-01 +-5.83425114e-01 +-5.57685112e-01 +-5.31402859e-01 +-5.04604509e-01 +-4.77316696e-01 +-4.49566506e-01 +-4.21381446e-01 +-3.92789424e-01 +-3.63818714e-01 +-3.34497931e-01 +-3.04856003e-01 +-2.74922140e-01 +-2.44725805e-01 +-2.14296690e-01 +-1.83664680e-01 +-1.52859825e-01 +-1.21912314e-01 +-9.08524416e-02 +-5.97105805e-02 +-2.85171502e-02 +2.69741184e-03 +3.39026802e-02 +6.50682707e-02 +9.61638706e-02 +1.27159267e-01 +1.58024378e-01 +1.88729278e-01 +2.19244232e-01 +2.49539719e-01 +2.79586463e-01 +3.09355460e-01 +3.38818009e-01 +3.67945733e-01 +3.96710612e-01 +4.25085007e-01 +4.53041686e-01 +4.80553851e-01 +5.07595161e-01 +5.34139761e-01 +5.60162301e-01 +5.85637963e-01 +6.10542486e-01 +6.34852184e-01 +6.58543969e-01 +6.81595376e-01 +7.03984581e-01 +7.25690420e-01 +7.46692411e-01 +7.66970771e-01 +7.86506436e-01 +8.05281074e-01 +8.23277107e-01 +8.40477723e-01 +8.56866893e-01 +8.72429383e-01 +8.87150771e-01 +9.01017456e-01 +9.14016672e-01 +9.26136499e-01 +9.37365870e-01 +9.47694587e-01 +9.57113323e-01 +9.65613632e-01 +9.73187956e-01 +9.79829632e-01 +9.85532895e-01 +9.90292883e-01 +9.94105641e-01 +9.96968122e-01 +9.98878190e-01 +9.99834620e-01 +9.99837098e-01 +9.98886220e-01 +9.96983490e-01 +9.94131317e-01 +9.90333012e-01 +9.85592783e-01 +9.79915730e-01 +9.73307838e-01 +9.65775973e-01 +9.57327869e-01 +9.47972123e-01 +9.37718187e-01 +9.26576353e-01 +9.14557747e-01 +9.01674313e-01 +8.87938804e-01 +8.73364766e-01 +8.57966525e-01 +8.41759173e-01 +8.24758553e-01 +8.06981240e-01 +7.88444528e-01 +7.69166411e-01 +7.49165563e-01 +7.28461322e-01 +7.07073671e-01 +6.85023216e-01 +6.62331168e-01 +6.39019320e-01 +6.15110027e-01 +5.90626185e-01 +5.65591204e-01 +5.40028993e-01 +5.13963929e-01 +4.87420839e-01 +4.60424972e-01 +4.33001978e-01 +4.05177881e-01 +3.76979056e-01 +3.48432201e-01 +3.19564313e-01 +2.90402664e-01 +2.60974772e-01 +2.31308377e-01 +2.01431414e-01 +1.71371984e-01 +1.41158334e-01 +1.10818823e-01 +8.03819001e-02 +4.98760764e-02 +1.93298976e-02 +-1.12280818e-02 +-4.17693258e-02 +-7.22653428e-02 +-1.02687713e-01 +-1.33008113e-01 +-1.63198346e-01 +-1.93230362e-01 +-2.23076290e-01 +-2.52708459e-01 +-2.82099425e-01 +-3.11221998e-01 +-3.40049263e-01 +-3.68554608e-01 +-3.96711749e-01 +-4.24494748e-01 +-4.51878045e-01 +-4.78836474e-01 +-5.05345289e-01 +-5.31380188e-01 +-5.56917331e-01 +-5.81933363e-01 +-6.06405437e-01 +-6.30311231e-01 +-6.53628971e-01 +-6.76337447e-01 +-6.98416037e-01 +-7.19844719e-01 +-7.40604093e-01 +-7.60675397e-01 +-7.80040522e-01 +-7.98682029e-01 +-8.16583165e-01 +-8.33727876e-01 +-8.50100821e-01 +-8.65687385e-01 +-8.80473694e-01 +-8.94446621e-01 +-9.07593803e-01 +-9.19903649e-01 +-9.31365349e-01 +-9.41968882e-01 +-9.51705028e-01 +-9.60565370e-01 +-9.68542305e-01 +-9.75629048e-01 +-9.81819637e-01 +-9.87108936e-01 +-9.91492643e-01 +-9.94967287e-01 +-9.97530235e-01 +-9.99179690e-01 +-9.99914692e-01 +-9.99735118e-01 +-9.98641685e-01 +-9.96635938e-01 +-9.93720260e-01 +-9.89897858e-01 +-9.85172766e-01 +-9.79549835e-01 +-9.73034732e-01 +-9.65633931e-01 +-9.57354706e-01 +-9.48205126e-01 +-9.38194041e-01 +-9.27331079e-01 +-9.15626632e-01 +-9.03091848e-01 +-8.89738618e-01 +-8.75579565e-01 +-8.60628030e-01 +-8.44898063e-01 +-8.28404404e-01 +-8.11162473e-01 +-7.93188351e-01 +-7.74498770e-01 +-7.55111090e-01 +-7.35043290e-01 +-7.14313945e-01 +-6.92942209e-01 +-6.70947801e-01 +-6.48350981e-01 +-6.25172534e-01 +-6.01433751e-01 +-5.77156408e-01 +-5.52362744e-01 +-5.27075444e-01 +-5.01317615e-01 +-4.75112766e-01 +-4.48484786e-01 +-4.21457922e-01 +-3.94056753e-01 +-3.66306176e-01 +-3.38231373e-01 +-3.09857797e-01 +-2.81211140e-01 +-2.52317319e-01 +-2.23202444e-01 +-1.93892800e-01 +-1.64414820e-01 +-1.34795063e-01 +-1.05060190e-01 +-7.52369363e-02 +-4.53520911e-02 +-1.54324728e-02 +1.44950956e-02 +4.44038101e-02 +7.42669104e-02 +1.04057703e-01 +1.33749584e-01 +1.63316065e-01 +1.92730796e-01 +2.21967586e-01 +2.51000433e-01 +2.79803540e-01 +3.08351339e-01 +3.36618517e-01 +3.64580036e-01 +3.92211153e-01 +4.19487444e-01 +4.46384826e-01 +4.72879574e-01 +4.98948348e-01 +5.24568208e-01 +5.49716636e-01 +5.74371554e-01 +5.98511345e-01 +6.22114872e-01 +6.45161491e-01 +6.67631075e-01 +6.89504027e-01 +7.10761299e-01 +7.31384406e-01 +7.51355445e-01 +7.70657107e-01 +7.89272692e-01 +8.07186125e-01 +8.24381966e-01 +8.40845424e-01 +8.56562373e-01 +8.71519355e-01 +8.85703601e-01 +8.99103036e-01 +9.11706289e-01 +9.23502700e-01 +9.34482335e-01 +9.44635988e-01 +9.53955189e-01 +9.62432211e-01 +9.70060077e-01 +9.76832565e-01 +9.82744210e-01 +9.87790311e-01 +9.91966931e-01 +9.95270902e-01 +9.97699826e-01 +9.99252075e-01 +9.99926793e-01 +9.99723893e-01 +9.98644061e-01 +9.96688749e-01 +9.93860175e-01 +9.90161322e-01 +9.85595930e-01 +9.80168495e-01 +9.73884264e-01 +9.66749227e-01 +9.58770114e-01 +9.49954386e-01 +9.40310226e-01 +9.29846536e-01 +9.18572922e-01 +9.06499690e-01 +8.93637831e-01 +8.79999017e-01 +8.65595585e-01 +8.50440526e-01 +8.34547473e-01 +8.17930689e-01 +8.00605054e-01 +7.82586050e-01 +7.63889746e-01 +7.44532787e-01 +7.24532377e-01 +7.03906261e-01 +6.82672710e-01 +6.60850507e-01 +6.38458926e-01 +6.15517716e-01 +5.92047085e-01 +5.68067682e-01 +5.43600577e-01 +5.18667242e-01 +4.93289532e-01 +4.67489666e-01 +4.41290206e-01 +4.14714039e-01 +3.87784355e-01 +3.60524630e-01 +3.32958604e-01 +3.05110256e-01 +2.77003787e-01 +2.48663598e-01 +2.20114266e-01 +1.91380527e-01 +1.62487254e-01 +1.33459432e-01 +1.04322141e-01 +7.51005315e-02 +4.58197989e-02 +1.65051676e-02 +-1.28181330e-02 +-4.21248899e-02 +-7.13899274e-02 +-1.00588127e-01 +-1.29694453e-01 +-1.58683972e-01 +-1.87531878e-01 +-2.16213505e-01 +-2.44704357e-01 +-2.72980121e-01 +-3.01016692e-01 +-3.28790191e-01 +-3.56276987e-01 +-3.83453719e-01 +-4.10297314e-01 +-4.36785003e-01 +-4.62894345e-01 +-4.88603239e-01 +-5.13889947e-01 +-5.38733115e-01 +-5.63111788e-01 +-5.87005425e-01 +-6.10393919e-01 +-6.33257613e-01 +-6.55577314e-01 +-6.77334309e-01 +-6.98510383e-01 +-7.19087835e-01 +-7.39049488e-01 +-7.58378706e-01 +-7.77059406e-01 +-7.95076071e-01 +-8.12413758e-01 +-8.29058122e-01 +-8.44995416e-01 +-8.60212508e-01 +-8.74696889e-01 +-8.88436683e-01 +-9.01420655e-01 +-9.13638221e-01 +-9.21600117e-01 +-9.06598683e-01 +-8.84977766e-01 +-8.60491908e-01 +-8.33400490e-01 +-8.03964080e-01 +-7.72439460e-01 +-7.39075357e-01 +-7.04108996e-01 +-6.67763293e-01 +-6.30244788e-01 +-5.91742253e-01 +-5.52425847e-01 +-5.12446805e-01 +-4.71937572e-01 +-4.31012290e-01 +-3.89767573e-01 +-3.48283469e-01 +-3.06624530e-01 +-2.64840806e-01 +-2.22968419e-01 +-1.81028725e-01 +-1.39022002e-01 +-9.68916163e-02 +-5.41204844e-02 +-2.70602422e-02 +0.00000000e+00 +-0.00000000e+00 +1.24470142e-05 +2.63184500e-05 +3.97295213e-05 +5.30856936e-05 +6.64250519e-05 +7.97569147e-05 +9.30847457e-05 +1.06410146e-04 +1.19733962e-04 +1.33056687e-04 +1.46378628e-04 +1.59699985e-04 +1.73020895e-04 +1.86341457e-04 +1.99661741e-04 +2.12981800e-04 +2.26301674e-04 +2.39621394e-04 +2.52940985e-04 +2.66260466e-04 +2.79579853e-04 +2.92899159e-04 +3.06218395e-04 +3.16759589e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17584985e-04 +3.10422511e-04 +2.97103293e-04 +2.83784010e-04 +2.70464650e-04 +2.57145200e-04 +2.43825645e-04 +2.30505968e-04 +2.17186146e-04 +2.03866150e-04 +1.90545942e-04 +1.77225474e-04 +1.63904683e-04 +1.50583479e-04 +1.37261741e-04 +1.23939291e-04 +1.10615861e-04 +9.72910306e-05 +8.39640919e-05 +7.06337512e-05 +5.72973432e-05 +4.39482617e-05 +3.05637079e-05 +1.69694118e-05 +8.48470589e-06 +-0.00000000e+00 +-0.00000000e+00 +-3.75894696e-02 +-5.41560073e-02 +-2.95835980e-02 +8.70411943e-03 +5.00911446e-02 +8.73083514e-02 +1.15036766e-01 +1.30269729e-01 +1.32053160e-01 +1.20990646e-01 +9.87467118e-02 +6.76333901e-02 +3.02898900e-02 +-1.05583227e-02 +-5.22773787e-02 +-9.24531424e-02 +-1.28979264e-01 +-1.60113819e-01 +-1.84508910e-01 +-2.01219804e-01 +-2.09696810e-01 +-2.09763641e-01 +-2.01585619e-01 +-1.85630373e-01 +-1.62623319e-01 +-1.33500301e-01 +-9.93589388e-02 +-6.14104577e-02 +-2.09331343e-02 +2.07714714e-02 +6.24187235e-02 +1.02776896e-01 +1.40698472e-01 +1.75146527e-01 +2.05215986e-01 +2.30149830e-01 +2.49350314e-01 +2.62385426e-01 +2.68990985e-01 +2.69068324e-01 +2.62678554e-01 +2.50033875e-01 +2.31485030e-01 +2.07507710e-01 +1.78686246e-01 +1.45696380e-01 +1.09286934e-01 +7.02611030e-02 +2.94576468e-02 +-1.22676087e-02 +-5.40596119e-02 +-9.50809915e-02 +-1.34527761e-01 +-1.71643601e-01 +-2.05732566e-01 +-2.36170062e-01 +-2.62411987e-01 +-2.84002057e-01 +-3.00577154e-01 +-3.11870911e-01 +-3.17715324e-01 +-3.18040743e-01 +-3.12874101e-01 +-3.02335615e-01 +-2.86634098e-01 +-2.66060979e-01 +-2.40983210e-01 +-2.11835222e-01 +-1.79110219e-01 +-1.43350654e-01 +-1.05138483e-01 +-6.50851022e-02 +-2.38211104e-02 +1.80136981e-02 +5.97803026e-02 +1.00849969e-01 +1.40613336e-01 +1.78488910e-01 +2.13930854e-01 +2.46436109e-01 +2.75550517e-01 +3.00874285e-01 +3.22066287e-01 +3.38847639e-01 +3.51004124e-01 +3.58387871e-01 +3.60917821e-01 +3.58579610e-01 +3.51424287e-01 +3.39566323e-01 +3.23180918e-01 +3.02500479e-01 +2.77810470e-01 +2.49444762e-01 +2.17780462e-01 +1.83232319e-01 +1.46246805e-01 +1.07295983e-01 +6.68711827e-02 +2.54766276e-02 +-1.63769532e-02 +-5.81786332e-02 +-9.94234227e-02 +-1.39618246e-01 +-1.78287538e-01 +-2.14978579e-01 +-2.49266463e-01 +-2.80758507e-01 +-3.09098300e-01 +-3.33969201e-01 +-3.55097333e-01 +-3.72254011e-01 +-3.85257608e-01 +-3.93974752e-01 +-3.98321236e-01 +-3.98262138e-01 +-3.93811339e-01 +-3.85030774e-01 +-3.72029074e-01 +-3.54959465e-01 +-3.34017806e-01 +-3.09439576e-01 +-2.81496989e-01 +-2.50495535e-01 +-2.16770269e-01 +-1.80681983e-01 +-1.42613005e-01 +-1.02963025e-01 +-6.21447308e-02 +-2.05793883e-02 +2.13074978e-02 +6.30905927e-02 +1.04348973e-01 +1.44670310e-01 +1.83654789e-01 +2.20919008e-01 +2.56099479e-01 +2.88855895e-01 +3.18874232e-01 +3.45869477e-01 +3.69587935e-01 +3.89809263e-01 +4.06348296e-01 +4.19056316e-01 +4.27821951e-01 +4.32571840e-01 +4.33270894e-01 +4.29922087e-01 +4.22566030e-01 +4.11280202e-01 +3.96177735e-01 +3.77405983e-01 +3.55144809e-01 +3.29604567e-01 +3.01023877e-01 +2.69667134e-01 +2.35821879e-01 +1.99795962e-01 +1.61914601e-01 +1.22517307e-01 +8.19547487e-02 +4.05855556e-02 +-1.22689239e-03 +-4.31176730e-02 +-8.47234958e-02 +-1.25685814e-01 +-1.65653855e-01 +-2.04287531e-01 +-2.41260222e-01 +-2.76261404e-01 +-3.08999101e-01 +-3.39202169e-01 +-3.66622370e-01 +-3.91036174e-01 +-4.12246366e-01 +-4.30083417e-01 +-4.44406678e-01 +-4.55105238e-01 +-4.62098443e-01 +-4.65336272e-01 +-4.64799611e-01 +-4.60500042e-01 +-4.52479260e-01 +-4.40808664e-01 +-4.25588631e-01 +-4.06947078e-01 +-3.85038355e-01 +-3.60042093e-01 +-3.32161009e-01 +-3.01619434e-01 +-2.68661467e-01 +-2.33548453e-01 +-1.96557349e-01 +-1.57978033e-01 +-1.18111090e-01 +-7.72655131e-02 +-3.57560444e-02 +6.09905073e-03 +4.79805945e-02 +8.95708455e-02 +1.30555886e-01 +1.70628002e-01 +2.09487853e-01 +2.46846744e-01 +2.82428549e-01 +3.15971849e-01 +3.47231449e-01 +3.75980488e-01 +4.02011341e-01 +4.25137777e-01 +4.45195210e-01 +4.62042680e-01 +4.75562879e-01 +4.85663241e-01 +4.92276512e-01 +4.95360404e-01 +4.94898622e-01 +4.90899956e-01 +4.83398333e-01 +4.72452727e-01 +4.58145815e-01 +4.40583759e-01 +4.19895326e-01 +3.96230283e-01 +3.69758665e-01 +3.40669438e-01 +3.09168678e-01 +2.75478278e-01 +2.39834384e-01 +2.02485449e-01 +1.63690475e-01 +1.23717284e-01 +8.28405618e-02 +4.13398945e-02 +-5.02122253e-04 +-4.24017956e-02 +-8.40762839e-02 +-1.25245500e-01 +-1.65633941e-01 +-2.04972501e-01 +-2.43000209e-01 +-2.79465990e-01 +-3.14130138e-01 +-3.46765884e-01 +-3.77160773e-01 +-4.05117975e-01 +-4.30457480e-01 +-4.53017158e-01 +-4.72653669e-01 +-4.89243264e-01 +-5.02682454e-01 +-5.12888555e-01 +-5.19800079e-01 +-5.23376984e-01 +-5.23600779e-01 +-5.20474510e-01 +-5.14022591e-01 +-5.04290501e-01 +-4.91344361e-01 +-4.75270374e-01 +-4.56174159e-01 +-4.34179953e-01 +-4.09429713e-01 +-3.82082112e-01 +-3.52311438e-01 +-3.20306408e-01 +-2.86268908e-01 +-2.50412650e-01 +-2.12961783e-01 +-1.74149441e-01 +-1.34216253e-01 +-9.34088200e-02 +-5.19781704e-02 +-1.01781988e-02 +3.17358982e-02 +7.35091781e-02 +1.14888497e-01 +1.55624025e-01 +1.95470737e-01 +2.34189853e-01 +2.71550234e-01 +3.07329717e-01 +3.41316405e-01 +3.73309829e-01 +4.03122097e-01 +4.30578949e-01 +4.55520662e-01 +4.77802924e-01 +4.97297598e-01 +5.13893390e-01 +5.27496417e-01 +5.38030585e-01 +5.45438013e-01 +5.49679179e-01 +5.50733094e-01 +5.48597272e-01 +5.43287733e-01 +5.34838785e-01 +5.23302636e-01 +5.08749014e-01 +4.91264680e-01 +4.70952847e-01 +4.47932604e-01 +4.22338020e-01 +3.94317269e-01 +3.64031741e-01 +3.31655124e-01 +2.97372416e-01 +2.61378654e-01 +2.23877788e-01 +1.85081548e-01 +1.45208303e-01 +1.04481672e-01 +6.31292447e-02 +2.13813784e-02 +-2.05300884e-02 +-6.23732104e-02 +-1.03917148e-01 +-1.44933406e-01 +-1.85197207e-01 +-2.24488580e-01 +-2.62593467e-01 +-2.99305108e-01 +-3.34425014e-01 +-3.67763755e-01 +-3.99142295e-01 +-4.28392947e-01 +-4.55359686e-01 +-4.79899413e-01 +-5.01882846e-01 +-5.21194311e-01 +-5.37733028e-01 +-5.51413680e-01 +-5.62165806e-01 +-5.69935231e-01 +-5.74683884e-01 +-5.76389196e-01 +-5.75045542e-01 +-5.70663050e-01 +-5.63267538e-01 +-5.52901411e-01 +-5.39621635e-01 +-5.23500876e-01 +-5.04626394e-01 +-4.83099041e-01 +-4.59034084e-01 +-4.32558732e-01 +-4.03812956e-01 +-3.72947863e-01 +-3.40124880e-01 +-3.05515571e-01 +-2.69299533e-01 +-2.31664779e-01 +-1.92805478e-01 +-1.52921933e-01 +-1.12218849e-01 +-7.09046404e-02 +-2.91902196e-02 +1.27120897e-02 +5.45895963e-02 +9.62303057e-02 +1.37424120e-01 +1.77963589e-01 +2.17645436e-01 +2.56270854e-01 +2.93647397e-01 +3.29588796e-01 +3.63917166e-01 +3.96462374e-01 +4.27064486e-01 +4.55572750e-01 +4.81848153e-01 +5.05762174e-01 +5.27199201e-01 +5.46055369e-01 +5.62240408e-01 +5.75677061e-01 +5.86301800e-01 +5.94065366e-01 +5.98931900e-01 +6.00880845e-01 +5.99904591e-01 +5.96011168e-01 +5.89221470e-01 +5.79571299e-01 +5.67109783e-01 +5.51899292e-01 +5.34016050e-01 +5.13547815e-01 +4.90595689e-01 +4.65271562e-01 +4.37698691e-01 +4.08011046e-01 +3.76351639e-01 +3.42873293e-01 +3.07736519e-01 +2.71109416e-01 +2.33167004e-01 +1.94089588e-01 +1.54062765e-01 +1.13276007e-01 +7.19217746e-02 +3.01949021e-02 +-1.17086670e-02 +-5.35925845e-02 +-9.52611279e-02 +-1.36520043e-01 +-1.77177401e-01 +-2.17044759e-01 +-2.55937573e-01 +-2.93676289e-01 +-3.30087435e-01 +-3.65003733e-01 +-3.98265240e-01 +-4.29720424e-01 +-4.59226006e-01 +-4.86647946e-01 +-5.11862575e-01 +-5.34756278e-01 +-5.55226091e-01 +-5.73180789e-01 +-5.88540826e-01 +-6.01238171e-01 +-6.11217257e-01 +-6.18435390e-01 +-6.22861953e-01 +-6.24478945e-01 +-6.23281446e-01 +-6.19277282e-01 +-6.12486421e-01 +-6.02941404e-01 +-5.90687393e-01 +-5.75781404e-01 +-5.58291890e-01 +-5.38298796e-01 +-5.15893293e-01 +-4.91176922e-01 +-4.64261042e-01 +-4.35266600e-01 +-4.04323630e-01 +-3.71570448e-01 +-3.37152848e-01 +-3.01223684e-01 +-2.63942174e-01 +-2.25473181e-01 +-1.85986270e-01 +-1.45655074e-01 +-1.04656566e-01 +-6.31702590e-02 +-2.13773711e-02 +2.05399918e-02 +6.23995691e-02 +1.04019739e-01 +1.45220331e-01 +1.85823427e-01 +2.25654077e-01 +2.64541016e-01 +3.02317420e-01 +3.38821613e-01 +3.73897781e-01 +4.07396608e-01 +4.39175787e-01 +4.69100666e-01 +4.97044806e-01 +5.22890488e-01 +5.46529232e-01 +5.67862210e-01 +5.86800516e-01 +6.03265589e-01 +6.17189485e-01 +6.28515167e-01 +6.37196694e-01 +6.43199363e-01 +6.46499873e-01 +6.47086289e-01 +6.44958049e-01 +6.40125977e-01 +6.32612195e-01 +6.22449985e-01 +6.09683611e-01 +5.94368094e-01 +5.76568964e-01 +5.56361933e-01 +5.33832524e-01 +5.09075692e-01 +4.82195416e-01 +4.53304232e-01 +4.22522743e-01 +3.89979091e-01 +3.55808405e-01 +3.20152217e-01 +2.83157866e-01 +2.44977870e-01 +2.05769287e-01 +1.65693051e-01 +1.24913310e-01 +8.35967396e-02 +4.19118636e-02 +2.83603840e-05 +-4.18836291e-02 +-8.36541927e-02 +-1.25114333e-01 +-1.66096650e-01 +-2.06436008e-01 +-2.45970194e-01 +-2.84540562e-01 +-3.21992661e-01 +-3.58176836e-01 +-3.92948814e-01 +-4.26170265e-01 +-4.57709337e-01 +-4.87441155e-01 +-5.15248297e-01 +-5.41021246e-01 +-5.64658797e-01 +-5.86068404e-01 +-6.05166583e-01 +-6.21879127e-01 +-6.36141449e-01 +-6.47898771e-01 +-6.57106284e-01 +-6.63729334e-01 +-6.67743514e-01 +-6.69134718e-01 +-6.67899168e-01 +-6.64043392e-01 +-6.57584167e-01 +-6.48548421e-01 +-6.36973114e-01 +-6.22905034e-01 +-6.06400570e-01 +-5.87525532e-01 +-5.66354775e-01 +-5.42971960e-01 +-5.17469137e-01 +-4.89946411e-01 +-4.60511505e-01 +-4.29279319e-01 +-3.96371477e-01 +-3.61915828e-01 +-3.26045939e-01 +-2.88900563e-01 +-2.50623088e-01 +-2.11360979e-01 +-1.71265194e-01 +-1.30489604e-01 +-8.91903904e-02 +-4.75254421e-02 +-5.65374831e-03 +3.62652080e-02 +7.80720575e-02 +1.19608148e-01 +1.60716145e-01 +2.01240623e-01 +2.41028643e-01 +2.79930326e-01 +3.17799406e-01 +3.54493773e-01 +3.89876011e-01 +4.23813890e-01 +4.56180834e-01 +4.86856384e-01 +5.15726632e-01 +5.42684630e-01 +5.67630757e-01 +5.90473078e-01 +6.11127650e-01 +6.29518861e-01 +6.45579694e-01 +6.59251862e-01 +6.70486035e-01 +6.79242007e-01 +6.85488805e-01 +6.89204777e-01 +6.90377639e-01 +6.89004587e-01 +6.85092236e-01 +6.78656460e-01 +6.69722381e-01 +6.58324231e-01 +6.44505201e-01 +6.28317275e-01 +6.09821093e-01 +5.89085673e-01 +5.66188000e-01 +5.41212771e-01 +5.14252118e-01 +4.85405216e-01 +4.54777970e-01 +4.22482669e-01 +3.88637348e-01 +3.53365431e-01 +3.16795286e-01 +2.79059746e-01 +2.40295687e-01 +2.00643504e-01 +1.60246466e-01 +1.19250262e-01 +7.78025092e-02 +3.60522149e-02 +-5.85075311e-03 +-4.77562824e-02 +-8.95145068e-02 +-1.30976313e-01 +-1.71993852e-01 +-2.12421169e-01 +-2.52114689e-01 +-2.90933638e-01 +-3.28740536e-01 +-3.65401669e-01 +-4.00787811e-01 +-4.34774428e-01 +-4.67242034e-01 +-4.98076620e-01 +-5.27170188e-01 +-5.54421350e-01 +-5.79735147e-01 +-6.03023469e-01 +-6.24205372e-01 +-6.43207873e-01 +-6.59965673e-01 +-6.74421178e-01 +-6.86524791e-01 +-6.96235582e-01 +-7.03521245e-01 +-7.08357565e-01 +-7.10728723e-01 +-7.10627801e-01 +-7.08056873e-01 +-7.03026078e-01 +-6.95553861e-01 +-6.85667441e-01 +-6.73402737e-01 +-6.58803284e-01 +-6.41920403e-01 +-6.22813697e-01 +-6.01550543e-01 +-5.78205091e-01 +-5.52858411e-01 +-5.25598971e-01 +-4.96521490e-01 +-4.65726363e-01 +-4.33319796e-01 +-3.99413906e-01 +-3.64125291e-01 +-3.27574913e-01 +-2.89888208e-01 +-2.51194359e-01 +-2.11625427e-01 +-1.71316313e-01 +-1.30404526e-01 +-8.90291276e-02 +-4.73305318e-02 +-5.45018461e-03 +3.64701732e-02 +7.82888826e-02 +1.19864753e-01 +1.61057802e-01 +2.01729446e-01 +2.41742895e-01 +2.80964173e-01 +3.19261983e-01 +3.56507986e-01 +3.92578130e-01 +4.27352381e-01 +4.60714642e-01 +4.92554359e-01 +5.22766315e-01 +5.51250034e-01 +5.77911668e-01 +6.02663828e-01 +6.25424548e-01 +6.46119373e-01 +6.64681204e-01 +6.81048838e-01 +6.95169367e-01 +7.06997766e-01 +7.16495224e-01 +7.23631896e-01 +7.28385903e-01 +7.30741797e-01 +7.30693624e-01 +7.28242997e-01 +7.23398165e-01 +7.16177116e-01 +7.06604600e-01 +6.94712310e-01 +6.80541382e-01 +6.64138724e-01 +6.45558628e-01 +6.24863726e-01 +6.02121650e-01 +5.77407696e-01 +5.50803706e-01 +5.22396172e-01 +4.92278970e-01 +4.60550446e-01 +4.27313748e-01 +3.92677962e-01 +3.56755200e-01 +3.19662342e-01 +2.81519947e-01 +2.42451048e-01 +2.02582448e-01 +1.62042632e-01 +1.20962276e-01 +7.94738050e-02 +3.77103990e-02 +-4.19374843e-03 +-4.61043847e-02 +-8.78872877e-02 +-1.29409031e-01 +-1.70536889e-01 +-2.11139962e-01 +-2.51088972e-01 +-2.90256771e-01 +-3.28519495e-01 +-3.65755292e-01 +-4.01846960e-01 +-4.36680098e-01 +-4.70144834e-01 +-5.02136246e-01 +-5.32552906e-01 +-5.61300448e-01 +-5.88287794e-01 +-6.13431314e-01 +-6.36652344e-01 +-6.57878258e-01 +-6.77044075e-01 +-6.94089164e-01 +-7.08962439e-01 +-7.21616822e-01 +-7.32014698e-01 +-7.40124009e-01 +-7.45920304e-01 +-7.49387213e-01 +-7.50513785e-01 +-7.49299090e-01 +-7.45746287e-01 +-7.39869174e-01 +-7.31685671e-01 +-7.21223315e-01 +-7.08515086e-01 +-6.93601508e-01 +-6.76530242e-01 +-6.57354366e-01 +-6.36135293e-01 +-6.12938278e-01 +-5.87837315e-01 +-5.60909337e-01 +-5.32239594e-01 +-5.01916013e-01 +-4.70033750e-01 +-4.36690774e-01 +-4.01990834e-01 +-3.66040716e-01 +-3.28951498e-01 +-2.90837340e-01 +-2.51815386e-01 +-2.12005602e-01 +-1.71529875e-01 +-1.30512360e-01 +-8.90782965e-02 +-4.73543939e-02 +-5.46779601e-03 +3.64538621e-02 +7.82830264e-02 +1.19892735e-01 +1.61156538e-01 +2.01949707e-01 +2.42148408e-01 +2.81631653e-01 +3.20279705e-01 +3.57976764e-01 +3.94608620e-01 +4.30066022e-01 +4.64241656e-01 +4.97034090e-01 +5.28344194e-01 +5.58079495e-01 +5.86150253e-01 +6.12473970e-01 +6.36971401e-01 +6.59570882e-01 +6.80204663e-01 +6.98812614e-01 +7.15339364e-01 +7.29736851e-01 +7.41962831e-01 +7.51981695e-01 +7.59764895e-01 +7.65289539e-01 +7.68541139e-01 +7.69509704e-01 +7.68194874e-01 +7.64599765e-01 +7.58737863e-01 +7.50625576e-01 +7.40289699e-01 +7.27760065e-01 +7.13075982e-01 +6.96280675e-01 +6.77425158e-01 +6.56565721e-01 +6.33764275e-01 +6.09089481e-01 +5.82613520e-01 +5.54416246e-01 +5.24579718e-01 +4.93193405e-01 +4.60348812e-01 +4.26143437e-01 +3.90677520e-01 +3.54055198e-01 +3.16384241e-01 +2.77774399e-01 +2.38339295e-01 +1.98193490e-01 +1.57454612e-01 +1.16241058e-01 +7.46729003e-02 +3.28709624e-02 +-9.04344693e-03 +-5.09487765e-02 +-9.27236112e-02 +-1.34247246e-01 +-1.75399595e-01 +-2.16061945e-01 +-2.56117285e-01 +-2.95449906e-01 +-3.33947369e-01 +-3.71498479e-01 +-4.07996085e-01 +-4.43335524e-01 +-4.77415382e-01 +-5.10139185e-01 +-5.41412524e-01 +-5.71147384e-01 +-5.99258644e-01 +-6.25666384e-01 +-6.50296663e-01 +-6.73078487e-01 +-6.93948925e-01 +-7.12848369e-01 +-7.29723665e-01 +-7.44528560e-01 +-7.57220222e-01 +-7.67764875e-01 +-7.76132638e-01 +-7.82300284e-01 +-7.86252489e-01 +-7.87977283e-01 +-7.87471909e-01 +-7.84738383e-01 +-7.79784445e-01 +-7.72626556e-01 +-7.63284335e-01 +-7.51785544e-01 +-7.38163987e-01 +-7.22457527e-01 +-7.04712572e-01 +-6.84979133e-01 +-6.63312991e-01 +-6.39776969e-01 +-6.14436592e-01 +-5.87364081e-01 +-5.58636375e-01 +-5.28333510e-01 +-4.96541776e-01 +-4.63350293e-01 +-4.28851800e-01 +-3.93143926e-01 +-3.56326077e-01 +-3.18501226e-01 +-2.79775581e-01 +-2.40256649e-01 +-2.00054790e-01 +-1.59282084e-01 +-1.18051593e-01 +-7.64780411e-02 +-3.46767256e-02 +7.23658345e-03 +4.91458214e-02 +9.09351819e-02 +1.32489137e-01 +1.73693234e-01 +2.14433913e-01 +2.54598811e-01 +2.94077922e-01 +3.32762669e-01 +3.70546661e-01 +4.07327005e-01 +4.43002761e-01 +4.77476093e-01 +5.10653714e-01 +5.42444775e-01 +5.72762341e-01 +6.01524942e-01 +6.28654058e-01 +6.54075675e-01 +6.77722053e-01 +6.99528926e-01 +7.19436900e-01 +7.37393490e-01 +7.53350284e-01 +7.67263839e-01 +7.79098024e-01 +7.88821506e-01 +7.96407753e-01 +8.01837640e-01 +8.05097711e-01 +8.06178922e-01 +8.05079403e-01 +8.01803833e-01 +7.96360873e-01 +7.88765843e-01 +7.79041149e-01 +7.67213060e-01 +7.53313706e-01 +7.37382213e-01 +7.19462001e-01 +6.99601250e-01 +6.77854465e-01 +6.54281186e-01 +6.28944531e-01 +6.01912984e-01 +5.73260360e-01 +5.43063404e-01 +5.11403080e-01 +4.78365054e-01 +4.44038093e-01 +4.08513796e-01 +3.71887393e-01 +3.34257312e-01 +2.95723744e-01 +2.56389404e-01 +2.16359436e-01 +1.75740434e-01 +1.34640253e-01 +9.31681575e-02 +5.14343463e-02 +9.54935920e-03 +-3.23758526e-02 +-7.42303241e-02 +-1.15903521e-01 +-1.57285380e-01 +-1.98266656e-01 +-2.38739544e-01 +-2.78597597e-01 +-3.17735847e-01 +-3.56051440e-01 +-3.93444248e-01 +-4.29816190e-01 +-4.65071827e-01 +-4.99119016e-01 +-5.31869372e-01 +-5.63237205e-01 +-5.93140552e-01 +-6.21501782e-01 +-6.48247776e-01 +-6.73308770e-01 +-6.96619601e-01 +-7.18120255e-01 +-7.37755799e-01 +-7.55475222e-01 +-7.71232753e-01 +-7.84988281e-01 +-7.96707288e-01 +-8.06359526e-01 +-8.13920322e-01 +-8.19370959e-01 +-8.22698658e-01 +-8.23895066e-01 +-8.22957502e-01 +-8.19889165e-01 +-8.14699435e-01 +-8.07402105e-01 +-7.98016409e-01 +-7.86567215e-01 +-7.73085381e-01 +-7.57606281e-01 +-7.40170090e-01 +-7.20822228e-01 +-6.99613464e-01 +-6.76599244e-01 +-6.51838915e-01 +-6.25396484e-01 +-5.97340419e-01 +-5.67743654e-01 +-5.36682321e-01 +-5.04236245e-01 +-4.70488867e-01 +-4.35527150e-01 +-3.99440972e-01 +-3.62322625e-01 +-3.24267112e-01 +-2.85371819e-01 +-2.45736349e-01 +-2.05461813e-01 +-1.64650826e-01 +-1.23407359e-01 +-8.18364300e-02 +-4.00437810e-02 +1.86450583e-03 +4.37820996e-02 +8.56027091e-02 +1.27220412e-01 +1.68530008e-01 +2.09427090e-01 +2.49808357e-01 +2.89571906e-01 +3.28617572e-01 +3.66847258e-01 +4.04164772e-01 +4.40476299e-01 +4.75690671e-01 +5.09719651e-01 +5.42478335e-01 +5.73884721e-01 +6.03860258e-01 +6.32330106e-01 +6.59223317e-01 +6.84473322e-01 +7.08017416e-01 +7.29797044e-01 +7.49758207e-01 +7.67851537e-01 +7.84032600e-01 +7.98261908e-01 +8.10504365e-01 +8.20729978e-01 +8.28913857e-01 +8.35036257e-01 +8.39082934e-01 +8.41044539e-01 +8.40916667e-01 +8.38700223e-01 +8.34401330e-01 +8.28031349e-01 +8.19607071e-01 +8.09149951e-01 +7.96686370e-01 +7.82247739e-01 +7.65870356e-01 +7.47595335e-01 +7.27468694e-01 +7.05540627e-01 +6.81865642e-01 +6.56502609e-01 +6.29514503e-01 +6.00968278e-01 +5.70934822e-01 +5.39488471e-01 +5.06706805e-01 +4.72670693e-01 +4.37464022e-01 +4.01173496e-01 +3.63888432e-01 +3.25700550e-01 +2.86703527e-01 +2.46992952e-01 +2.06666102e-01 +1.65821683e-01 +1.24559580e-01 +8.29806157e-02 +4.11862686e-02 +-7.21592729e-04 +-4.26408936e-02 +-8.44696137e-02 +-1.26106042e-01 +-1.67449027e-01 +-2.08398241e-01 +-2.48854459e-01 +-2.88719695e-01 +-3.27897467e-01 +-3.66293054e-01 +-4.03813711e-01 +-4.40368898e-01 +-4.75870503e-01 +-5.10233120e-01 +-5.43374163e-01 +-5.75213966e-01 +-6.05676094e-01 +-6.34687513e-01 +-6.62178758e-01 +-6.88084087e-01 +-7.12341640e-01 +-7.34893688e-01 +-7.55686615e-01 +-7.74670952e-01 +-7.91801651e-01 +-8.07038162e-01 +-8.20344523e-01 +-8.31689431e-01 +-8.41046311e-01 +-8.48393409e-01 +-8.53713891e-01 +-8.56995627e-01 +-8.58231349e-01 +-8.57418706e-01 +-8.54560241e-01 +-8.49663385e-01 +-8.42740425e-01 +-8.33808452e-01 +-8.22889352e-01 +-8.10009796e-01 +-7.95200983e-01 +-7.78498642e-01 +-7.59942962e-01 +-7.39578536e-01 +-7.17454184e-01 +-6.93622867e-01 +-6.68141555e-01 +-6.41071052e-01 +-6.12475884e-01 +-5.82424174e-01 +-5.50987367e-01 +-5.18240078e-01 +-4.84259967e-01 +-4.49127540e-01 +-4.12925955e-01 +-3.75740810e-01 +-3.37659949e-01 +-2.98773243e-01 +-2.59172380e-01 +-2.18950644e-01 +-1.78202704e-01 +-1.37024360e-01 +-9.55123305e-02 +-5.37640371e-02 +-1.18773698e-02 +3.00495407e-02 +7.19185565e-02 +1.13631760e-01 +1.55091687e-01 +1.96201547e-01 +2.36865457e-01 +2.76988655e-01 +3.16477733e-01 +3.55240853e-01 +3.93187939e-01 +4.30230886e-01 +4.66283774e-01 +5.01263057e-01 +5.35087758e-01 +5.67679654e-01 +5.98963451e-01 +6.28866956e-01 +6.57321240e-01 +6.84260792e-01 +7.09623666e-01 +7.33351619e-01 +7.55390242e-01 +7.75689083e-01 +7.94201765e-01 +8.10886066e-01 +8.25704005e-01 +8.38621938e-01 +8.49610639e-01 +8.58645346e-01 +8.65705818e-01 +8.70776383e-01 +8.73845944e-01 +8.74908029e-01 +8.73960769e-01 +8.71006920e-01 +8.66053833e-01 +8.59113438e-01 +8.50202215e-01 +8.39341138e-01 +8.26555624e-01 +8.11875479e-01 +7.95334810e-01 +7.76971954e-01 +7.56829373e-01 +7.34953551e-01 +7.11394883e-01 +6.86207560e-01 +6.59449439e-01 +6.31181904e-01 +6.01469725e-01 +5.70380901e-01 +5.37986503e-01 +5.04360510e-01 +4.69579634e-01 +4.33723145e-01 +3.96872682e-01 +3.59112071e-01 +3.20527131e-01 +2.81205468e-01 +2.41236293e-01 +2.00710194e-01 +1.59718952e-01 +1.18355313e-01 +7.67127923e-02 +3.48854529e-02 +-7.03230382e-03 +-4.89459514e-02 +-9.07610532e-02 +-1.32383472e-01 +-1.73719583e-01 +-2.14676486e-01 +-2.55162209e-01 +-2.95085917e-01 +-3.34358112e-01 +-3.72890831e-01 +-4.10597845e-01 +-4.47394849e-01 +-4.83199646e-01 +-5.17932328e-01 +-5.51515455e-01 +-5.83874217e-01 +-6.14936608e-01 +-6.44633585e-01 +-6.72899202e-01 +-6.99670754e-01 +-7.24888945e-01 +-7.48497969e-01 +-7.70445659e-01 +-7.90683598e-01 +-8.09167200e-01 +-8.25855833e-01 +-8.40712880e-01 +-8.53705822e-01 +-8.64806321e-01 +-8.73990245e-01 +-8.81237743e-01 +-8.86533277e-01 +-8.89865641e-01 +-8.91227987e-01 +-8.90617835e-01 +-8.88037072e-01 +-8.83491941e-01 +-8.76993018e-01 +-8.68555190e-01 +-8.58197610e-01 +-8.45943651e-01 +-8.31820851e-01 +-8.15860844e-01 +-7.98099284e-01 +-7.78575764e-01 +-7.57333721e-01 +-7.34420338e-01 +-7.09886435e-01 +-6.83786344e-01 +-6.56177801e-01 +-6.27121801e-01 +-5.96682464e-01 +-5.64926897e-01 +-5.31925027e-01 +-4.97749463e-01 +-4.62475321e-01 +-4.26180057e-01 +-3.88943304e-01 +-3.50846683e-01 +-3.11973630e-01 +-2.72409208e-01 +-2.32239921e-01 +-1.91553524e-01 +-1.50438825e-01 +-1.08985500e-01 +-6.72838848e-02 +-2.54247876e-02 +1.65007148e-02 +5.84014733e-02 +1.00186465e-01 +1.41764990e-01 +1.83046870e-01 +2.23942640e-01 +2.64363741e-01 +3.04222717e-01 +3.43433395e-01 +3.81911071e-01 +4.19572696e-01 +4.56337051e-01 +4.92124917e-01 +5.26859262e-01 +5.60465367e-01 +5.92871028e-01 +6.24006665e-01 +6.53805509e-01 +6.82203711e-01 +7.09140484e-01 +7.34558254e-01 +7.58402739e-01 +7.80623083e-01 +8.01171966e-01 +8.20005697e-01 +8.37084295e-01 +8.52371575e-01 +8.65835219e-01 +8.77446844e-01 +8.87182053e-01 +8.95020485e-01 +9.00945846e-01 +9.04945959e-01 +9.07012794e-01 +9.07142442e-01 +9.05335120e-01 +9.01595180e-01 +8.95931108e-01 +8.88355478e-01 +8.78884907e-01 +8.67540064e-01 +8.54345580e-01 +8.39329988e-01 +8.22525702e-01 +8.03968876e-01 +7.83699392e-01 +7.61760705e-01 +7.38199797e-01 +7.13067055e-01 +6.86416196e-01 +6.58304090e-01 +6.28790645e-01 +5.97938687e-01 +5.65813832e-01 +5.32484333e-01 +4.98020940e-01 +4.62496739e-01 +4.25987006e-01 +3.88569036e-01 +3.50321981e-01 +3.11326682e-01 +2.71665492e-01 +2.31422129e-01 +1.90681467e-01 +1.49529346e-01 +1.08052405e-01 +6.63379010e-02 +2.44735242e-02 +-1.74527862e-02 +-5.93530267e-02 +-1.01139313e-01 +-1.42724064e-01 +-1.84020182e-01 +-2.24941227e-01 +-2.65401627e-01 +-3.05316853e-01 +-3.44603574e-01 +-3.83179827e-01 +-4.20965200e-01 +-4.57880987e-01 +-4.93850356e-01 +-5.28798502e-01 +-5.62652802e-01 +-5.95342953e-01 +-6.26801103e-01 +-6.56962094e-01 +-6.85763537e-01 +-7.13145868e-01 +-7.39052518e-01 +-7.63430019e-01 +-7.86228121e-01 +-8.07399881e-01 +-8.26901759e-01 +-8.44693698e-01 +-8.60739169e-01 +-8.75005399e-01 +-8.87463386e-01 +-8.98087798e-01 +-9.06857098e-01 +-9.13753609e-01 +-9.18763531e-01 +-9.21876953e-01 +-9.23087898e-01 +-9.22394253e-01 +-9.19797878e-01 +-9.15304748e-01 +-9.08924605e-01 +-9.00671062e-01 +-8.90561541e-01 +-8.78617279e-01 +-8.64863277e-01 +-8.49328212e-01 +-8.32044356e-01 +-8.13047609e-01 +-7.92377543e-01 +-7.70076987e-01 +-7.46192051e-01 +-7.20772056e-01 +-6.93869427e-01 +-6.65539582e-01 +-6.35840801e-01 +-6.04834099e-01 +-5.72583304e-01 +-5.39154686e-01 +-5.04616797e-01 +-4.69040402e-01 +-4.32498324e-01 +-3.95065306e-01 +-3.56817857e-01 +-3.17834069e-01 +-2.78193593e-01 +-2.37977328e-01 +-1.97267216e-01 +-1.56146158e-01 +-1.14697824e-01 +-7.30064999e-02 +-3.11569089e-02 +1.07659383e-02 +5.26769474e-02 +9.44911437e-02 +1.36123811e-01 +1.77490657e-01 +2.18507976e-01 +2.59092813e-01 +2.99163097e-01 +3.38637935e-01 +3.77437755e-01 +4.15484347e-01 +4.52701068e-01 +4.89012993e-01 +5.24347048e-01 +5.58632100e-01 +5.91799307e-01 +6.23782283e-01 +6.54516924e-01 +6.83941664e-01 +7.11997596e-01 +7.38628569e-01 +7.63781221e-01 +7.87405448e-01 +8.09454401e-01 +8.29884193e-01 +8.48654213e-01 +8.65727160e-01 +8.81069112e-01 +8.94649521e-01 +9.06441887e-01 +9.16423185e-01 +9.24573854e-01 +9.30877976e-01 +9.35323306e-01 +9.37901182e-01 +9.38606867e-01 +9.37439778e-01 +9.34402684e-01 +9.29502031e-01 +9.22747944e-01 +9.14154146e-01 +9.03737965e-01 +8.91520967e-01 +8.77527964e-01 +8.61787140e-01 +8.44330109e-01 +8.25191814e-01 +8.04410401e-01 +7.82027826e-01 +7.58089021e-01 +7.32641753e-01 +7.05736723e-01 +6.77427457e-01 +6.47770117e-01 +6.16824002e-01 +5.84650760e-01 +5.51314233e-01 +5.16880499e-01 +4.81417736e-01 +4.44996067e-01 +4.07687860e-01 +3.69566973e-01 +3.30708695e-01 +2.91189728e-01 +2.51088006e-01 +2.10482614e-01 +1.69453746e-01 +1.28082194e-01 +8.64493434e-02 +4.46370534e-02 +2.72751445e-03 +-3.91968958e-02 +-8.10538944e-02 +-1.22761415e-01 +-1.64237719e-01 +-2.05401523e-01 +-2.46172126e-01 +-2.86469877e-01 +-3.26216076e-01 +-3.65333090e-01 +-4.03744514e-01 +-4.41375218e-01 +-4.78151898e-01 +-5.14003157e-01 +-5.48859216e-01 +-5.82652243e-01 +-6.15316344e-01 +-6.46787937e-01 +-6.77006390e-01 +-7.05913181e-01 +-7.33452252e-01 +-7.59570119e-01 +-7.84215940e-01 +-8.07342656e-01 +-8.28905816e-01 +-8.48863798e-01 +-8.67177997e-01 +-8.83812772e-01 +-8.98736765e-01 +-9.11921689e-01 +-9.23342275e-01 +-9.32976566e-01 +-9.40805772e-01 +-9.46815689e-01 +-9.50995437e-01 +-9.53337221e-01 +-9.53836666e-01 +-9.52492664e-01 +-9.49308832e-01 +-9.44292055e-01 +-9.37452275e-01 +-9.28802798e-01 +-9.18360172e-01 +-9.06145647e-01 +-8.92183360e-01 +-8.76500420e-01 +-8.59127040e-01 +-8.40096629e-01 +-8.19446932e-01 +-7.97218060e-01 +-7.73452880e-01 +-7.48196965e-01 +-7.21499025e-01 +-6.93411282e-01 +-6.63987835e-01 +-6.33285172e-01 +-6.01362001e-01 +-5.68280003e-01 +-5.34103142e-01 +-4.98896915e-01 +-4.62728673e-01 +-4.25667524e-01 +-3.87784947e-01 +-3.49153527e-01 +-3.09847051e-01 +-2.69940497e-01 +-2.29510180e-01 +-1.88633554e-01 +-1.47388536e-01 +-1.05853695e-01 +-6.41081579e-02 +-2.22315702e-02 +1.96963936e-02 +6.15960420e-02 +1.03387684e-01 +1.44991840e-01 +1.86329645e-01 +2.27322729e-01 +2.67893304e-01 +3.07964250e-01 +3.47459945e-01 +3.86305791e-01 +4.24428276e-01 +4.61754987e-01 +4.98215557e-01 +5.33741596e-01 +5.68266047e-01 +6.01723490e-01 +6.34050686e-01 +6.65187531e-01 +6.95075495e-01 +7.23658116e-01 +7.50881152e-01 +7.76694413e-01 +8.01049723e-01 +8.23901218e-01 +8.45205386e-01 +8.64923172e-01 +8.83018287e-01 +8.99456762e-01 +9.14207193e-01 +9.27242621e-01 +9.38539731e-01 +9.48077421e-01 +9.55837313e-01 +9.61805310e-01 +9.65971680e-01 +9.68328733e-01 +9.68871625e-01 +9.67599587e-01 +9.64516580e-01 +9.59628559e-01 +9.52944244e-01 +9.44476243e-01 +9.34242025e-01 +9.22260883e-01 +9.08554798e-01 +8.93149396e-01 +8.76075037e-01 +8.57363717e-01 +8.37049909e-01 +8.15171558e-01 +7.91770909e-01 +7.66891626e-01 +7.40579592e-01 +7.12883961e-01 +6.83857525e-01 +6.53554252e-01 +6.22030027e-01 +5.89343759e-01 +5.55557131e-01 +5.20732778e-01 +4.84934915e-01 +4.48230418e-01 +4.10687972e-01 +3.72377007e-01 +3.33368183e-01 +2.93734264e-01 +2.53548882e-01 +2.12886223e-01 +1.71821348e-01 +1.30430566e-01 +8.87903547e-02 +4.69775039e-02 +5.06925387e-03 +-3.68569826e-02 +-7.87239981e-02 +-1.20454584e-01 +-1.61971755e-01 +-2.03199313e-01 +-2.44061455e-01 +-2.84482728e-01 +-3.24388981e-01 +-3.63707297e-01 +-4.02365371e-01 +-4.40291755e-01 +-4.77417576e-01 +-5.13675043e-01 +-5.48997304e-01 +-5.83319405e-01 +-6.16579591e-01 +-6.48716997e-01 +-6.79672051e-01 +-7.09388788e-01 +-7.37813809e-01 +-7.64894822e-01 +-7.90581607e-01 +-8.14828863e-01 +-8.37592668e-01 +-8.58830648e-01 +-8.78504334e-01 +-8.96579484e-01 +-9.13022899e-01 +-9.27803535e-01 +-9.40896298e-01 +-9.52278015e-01 +-9.61927125e-01 +-9.69826073e-01 +-9.75962535e-01 +-9.80325158e-01 +-9.82904800e-01 +-9.83698681e-01 +-9.82706187e-01 +-9.79928188e-01 +-9.75369758e-01 +-9.69041315e-01 +-9.60954038e-01 +-9.51121392e-01 +-9.39563257e-01 +-9.26301216e-01 +-9.11358236e-01 +-8.94761777e-01 +-8.76543716e-01 +-8.56736493e-01 +-8.35375024e-01 +-8.12499999e-01 +-7.88152953e-01 +-7.62376784e-01 +-7.35219033e-01 +-7.06729834e-01 +-6.76959876e-01 +-6.45962603e-01 +-6.13795531e-01 +-5.80516376e-01 +-5.46184279e-01 +-5.10862408e-01 +-4.74614574e-01 +-4.37505306e-01 +-3.99601842e-01 +-3.60973039e-01 +-3.21687858e-01 +-2.81816784e-01 +-2.41432193e-01 +-2.00606350e-01 +-1.59412259e-01 +-1.17924312e-01 +-7.62168149e-02 +-3.43643692e-02 +7.55786596e-03 +4.94748983e-02 +9.13117225e-02 +1.32993372e-01 +1.74445597e-01 +2.15594274e-01 +2.56365577e-01 +2.96687292e-01 +3.36487490e-01 +3.75694552e-01 +4.14239363e-01 +4.52053486e-01 +4.89068713e-01 +5.25219846e-01 +5.60443209e-01 +5.94675222e-01 +6.27855327e-01 +6.59925772e-01 +6.90828696e-01 +7.20508995e-01 +7.48915744e-01 +7.75997814e-01 +8.01706382e-01 +8.25998046e-01 +8.48829304e-01 +8.70158411e-01 +8.89950025e-01 +9.08168994e-01 +9.24781417e-01 +9.39760360e-01 +9.53079625e-01 +9.64713778e-01 +9.74644548e-01 +9.82855115e-01 +9.89328983e-01 +9.94056713e-01 +9.97031102e-01 +9.98244893e-01 +9.97697576e-01 +9.95391619e-01 +9.91329107e-01 +9.85518489e-01 +9.77971772e-01 +9.68700327e-01 +9.57721480e-01 +9.45056480e-01 +9.30659921e-01 +9.14519898e-01 +8.96777961e-01 +8.77469189e-01 +8.56629252e-01 +8.34296427e-01 +8.10511526e-01 +7.85317835e-01 +7.58761016e-01 +7.30889010e-01 +7.01751986e-01 +6.71402210e-01 +6.39893953e-01 +6.07283421e-01 +5.73628618e-01 +5.38989244e-01 +5.03426621e-01 +4.67003536e-01 +4.29784149e-01 +3.91833901e-01 +3.53219348e-01 +3.14008077e-01 +2.74268599e-01 +2.34070175e-01 +1.93482748e-01 +1.52576807e-01 +1.11423228e-01 +7.00932094e-02 +2.86581113e-02 +-1.28106815e-02 +-5.42418250e-02 +-9.55641975e-02 +-1.36707005e-01 +-1.77599862e-01 +-2.18172978e-01 +-2.58357229e-01 +-2.98084268e-01 +-3.37286695e-01 +-3.75898099e-01 +-4.13853212e-01 +-4.51088029e-01 +-4.87539855e-01 +-5.23147475e-01 +-5.57851222e-01 +-5.91593057e-01 +-6.24316715e-01 +-6.55967743e-01 +-6.86493610e-01 +-7.15843813e-01 +-7.43969904e-01 +-7.70825622e-01 +-7.96366938e-01 +-8.20552109e-01 +-8.43341789e-01 +-8.64699039e-01 +-8.84589412e-01 +-9.02981007e-01 +-9.19844489e-01 +-9.35153167e-01 +-9.48883005e-01 +-9.61012665e-01 +-9.71523546e-01 +-9.80399785e-01 +-9.87628300e-01 +-9.93198792e-01 +-9.97103755e-01 +-9.99338489e-01 +-9.99901093e-01 +-9.98792464e-01 +-9.96016288e-01 +-9.91579030e-01 +-9.85489908e-01 +-9.77760882e-01 +-9.68406616e-01 +-9.57444449e-01 +-9.44894373e-01 +-9.30778966e-01 +-9.15123379e-01 +-8.97955263e-01 +-8.79304725e-01 +-8.59204287e-01 +-8.37688788e-01 +-8.14795373e-01 +-7.90563374e-01 +-7.65034274e-01 +-7.38251626e-01 +-7.10260952e-01 +-6.81109715e-01 +-6.50847170e-01 +-6.19524337e-01 +-5.87193878e-01 +-5.53910008e-01 +-5.19728437e-01 +-4.84706206e-01 +-4.48901680e-01 +-4.12374360e-01 +-3.75184848e-01 +-3.37394719e-01 +-2.99066399e-01 +-2.60263121e-01 +-2.21048731e-01 +-1.81487679e-01 +-1.41644831e-01 +-1.01585410e-01 +-6.13748838e-02 +-2.10788202e-02 +1.92371454e-02 +5.95075167e-02 +9.96669337e-02 +1.39650377e-01 +1.79393202e-01 +2.18831272e-01 +2.57901076e-01 +2.96539776e-01 +3.34685390e-01 +3.72276787e-01 +4.09253895e-01 +4.45557691e-01 +4.81130375e-01 +5.15915413e-01 +5.49857632e-01 +5.82903337e-01 +6.15000332e-01 +6.46098079e-01 +6.76147690e-01 +7.05102086e-01 +7.32915989e-01 +7.59546058e-01 +7.84950902e-01 +8.09091171e-01 +8.31929611e-01 +8.53431097e-01 +8.73562720e-01 +8.92293792e-01 +9.09595934e-01 +9.25443070e-01 +9.39811506e-01 +9.52679925e-01 +9.64029446e-01 +9.73843620e-01 +9.82108475e-01 +9.88812516e-01 +9.93946741e-01 +9.97504654e-01 +9.99482262e-01 +9.99878083e-01 +9.98693134e-01 +9.95930930e-01 +9.91597469e-01 +9.85701216e-01 +9.78253090e-01 +9.69266427e-01 +9.58756973e-01 +9.46742832e-01 +9.33244451e-01 +9.18284567e-01 +9.01888177e-01 +8.84082486e-01 +8.64896863e-01 +8.44362788e-01 +8.22513796e-01 +7.99385429e-01 +7.75015156e-01 +7.49442339e-01 +7.22708129e-01 +6.94855445e-01 +6.65928844e-01 +6.35974519e-01 +6.05040141e-01 +5.73174871e-01 +5.40429185e-01 +5.06854893e-01 +4.72504948e-01 +4.37433474e-01 +4.01695565e-01 +3.65347310e-01 +3.28445591e-01 +2.91048110e-01 +2.53213175e-01 +2.14999736e-01 +1.76467163e-01 +1.37675281e-01 +9.86841533e-02 +5.95541089e-02 +2.03455269e-02 +-1.88811308e-02 +-5.80655408e-02 +-9.71474819e-02 +-1.36067056e-01 +-1.74764651e-01 +-2.13181159e-01 +-2.51257940e-01 +-2.88937033e-01 +-3.26161126e-01 +-3.62873755e-01 +-3.99019277e-01 +-4.34543063e-01 +-4.69391472e-01 +-5.03512034e-01 +-5.36853430e-01 +-5.69365655e-01 +-6.01000014e-01 +-6.31709261e-01 +-6.61447608e-01 +-6.90170841e-01 +-7.17836345e-01 +-7.44403192e-01 +-7.69832183e-01 +-7.94085908e-01 +-8.17128806e-01 +-8.38927197e-01 +-8.59449354e-01 +-8.78665512e-01 +-8.96547952e-01 +-9.13070988e-01 +-9.28211056e-01 +-9.41946687e-01 +-9.54258590e-01 +-9.65129626e-01 +-9.74544873e-01 +-9.82491606e-01 +-9.88959340e-01 +-9.93939820e-01 +-9.97427040e-01 +-9.99417243e-01 +-9.99908923e-01 +-9.98902818e-01 +-9.96401910e-01 +-9.92411408e-01 +-9.86938744e-01 +-9.79993547e-01 +-9.71587634e-01 +-9.61734974e-01 +-9.50451682e-01 +-9.37755963e-01 +-9.23668111e-01 +-9.08210444e-01 +-8.91407293e-01 +-8.73284942e-01 +-8.53871588e-01 +-8.33197312e-01 +-8.11293993e-01 +-7.88195312e-01 +-7.63936627e-01 +-7.38554997e-01 +-7.12089044e-01 +-6.84578961e-01 +-6.56066397e-01 +-6.26594424e-01 +-5.96207465e-01 +-5.64951197e-01 +-5.32872543e-01 +-5.00019514e-01 +-4.66441233e-01 +-4.32187763e-01 +-3.97310117e-01 +-3.61860120e-01 +-3.25890359e-01 +-2.89454111e-01 +-2.52605220e-01 +-2.15398096e-01 +-1.77887531e-01 +-1.40128726e-01 +-1.02177113e-01 +-6.40883444e-02 +-2.59181775e-02 +1.22776179e-02 +5.04432853e-02 +8.85232544e-02 +1.26462110e-01 +1.64204784e-01 +2.01696543e-01 +2.38883122e-01 +2.75710796e-01 +3.12126412e-01 +3.48077549e-01 +3.83512490e-01 +4.18380394e-01 +4.52631294e-01 +4.86216198e-01 +5.19087177e-01 +5.51197370e-01 +5.82501138e-01 +6.12954032e-01 +6.42512934e-01 +6.71136071e-01 +6.98783074e-01 +7.25415073e-01 +7.50994680e-01 +7.75486117e-01 +7.98855202e-01 +8.21069426e-01 +8.42098001e-01 +8.61911861e-01 +8.80483760e-01 +8.97788247e-01 +9.13801740e-01 +9.28502543e-01 +9.41870857e-01 +9.53888839e-01 +9.64540582e-01 +9.73812171e-01 +9.81691672e-01 +9.88169154e-01 +9.93236707e-01 +9.96888432e-01 +9.99120459e-01 +9.99930942e-01 +9.99320057e-01 +9.97289999e-01 +9.93844977e-01 +9.88991195e-01 +9.82736848e-01 +9.75092105e-01 +9.66069080e-01 +9.55681829e-01 +9.43946308e-01 +9.30880353e-01 +9.16503661e-01 +9.00837733e-01 +8.83905874e-01 +8.65733122e-01 +8.46346229e-01 +8.25773627e-01 +8.04045350e-01 +7.81193032e-01 +7.57249830e-01 +7.32250372e-01 +7.06230741e-01 +6.79228367e-01 +6.51282016e-01 +6.22431723e-01 +5.92718702e-01 +5.62185344e-01 +5.30875100e-01 +4.98832437e-01 +4.66102807e-01 +4.32732508e-01 +3.98768697e-01 +3.64259277e-01 +3.29252815e-01 +2.93798538e-01 +2.57946186e-01 +2.21745984e-01 +1.85248589e-01 +1.48504950e-01 +1.11566319e-01 +7.44841293e-02 +3.73099117e-02 +9.52898650e-05 +-3.71081704e-02 +-7.42489932e-02 +-1.11275837e-01 +-1.48137641e-01 +-1.84783617e-01 +-2.21163352e-01 +-2.57226908e-01 +-2.92924818e-01 +-3.28208215e-01 +-3.63028889e-01 +-3.97339303e-01 +-4.31092728e-01 +-4.64243264e-01 +-4.96745886e-01 +-5.28556560e-01 +-5.59632249e-01 +-5.89930979e-01 +-6.19411935e-01 +-6.48035455e-01 +-6.75763117e-01 +-7.02557801e-01 +-7.28383690e-01 +-7.53206361e-01 +-7.76992821e-01 +-7.99711515e-01 +-8.21332416e-01 +-8.41827033e-01 +-8.61168438e-01 +-8.79331335e-01 +-8.96292057e-01 +-9.12028603e-01 +-9.26520685e-01 +-9.39749723e-01 +-9.51698880e-01 +-9.62353089e-01 +-9.71699055e-01 +-9.79725274e-01 +-9.86422055e-01 +-9.91781512e-01 +-9.95797586e-01 +-9.98466042e-01 +-9.99784471e-01 +-9.99752291e-01 +-9.98370744e-01 +-9.95642892e-01 +-9.91573607e-01 +-9.86169557e-01 +-9.79439203e-01 +-9.71392777e-01 +-9.62042262e-01 +-9.51401382e-01 +-9.39485572e-01 +-9.26311950e-01 +-9.11899308e-01 +-8.96268065e-01 +-8.79440238e-01 +-8.61439428e-01 +-8.42290763e-01 +-8.22020863e-01 +-8.00657824e-01 +-7.78231153e-01 +-7.54771727e-01 +-7.30311770e-01 +-7.04884792e-01 +-6.78525526e-01 +-6.51269917e-01 +-6.23155048e-01 +-5.94219074e-01 +-5.64501205e-01 +-5.34041634e-01 +-5.02881462e-01 +-4.71062676e-01 +-4.38628082e-01 +-4.05621218e-01 +-3.72086329e-01 +-3.38068311e-01 +-3.03612607e-01 +-2.68765181e-01 +-2.33572470e-01 +-1.98081274e-01 +-1.62338718e-01 +-1.26392219e-01 +-9.02893721e-02 +-5.40779010e-02 +-1.78056310e-02 +1.84796138e-02 +5.47300775e-02 +9.08980969e-02 +1.26936184e-01 +1.62797114e-01 +1.98433947e-01 +2.33800093e-01 +2.68849405e-01 +3.03536219e-01 +3.37815385e-01 +3.71642374e-01 +4.04973317e-01 +4.37765038e-01 +4.69975131e-01 +5.01562030e-01 +5.32485025e-01 +5.62704322e-01 +5.92181126e-01 +6.20877655e-01 +6.48757183e-01 +6.75784117e-01 +7.01924028e-01 +7.27143672e-01 +7.51411056e-01 +7.74695478e-01 +7.96967549e-01 +8.18199227e-01 +8.38363872e-01 +8.57436265e-01 +8.75392624e-01 +8.92210655e-01 +9.07869574e-01 +9.22350114e-01 +9.35634560e-01 +9.47706774e-01 +9.58552203e-01 +9.68157891e-01 +9.76512505e-01 +9.83606341e-01 +9.89431329e-01 +9.93981044e-01 +9.97250713e-01 +9.99237215e-01 +9.99939080e-01 +9.99356493e-01 +9.97491286e-01 +9.94346934e-01 +9.89928547e-01 +9.84242861e-01 +9.77298224e-01 +9.69104587e-01 +9.59673483e-01 +9.49018009e-01 +9.37152809e-01 +9.24094057e-01 +9.09859423e-01 +8.94468048e-01 +8.77940528e-01 +8.60298882e-01 +8.41566504e-01 +8.21768150e-01 +8.00929903e-01 +7.79079129e-01 +7.56244435e-01 +7.32455642e-01 +7.07743751e-01 +6.82140879e-01 +6.55680224e-01 +6.28396036e-01 +6.00323563e-01 +5.71498990e-01 +5.41959402e-01 +5.11742751e-01 +4.80887788e-01 +4.49434007e-01 +4.17421602e-01 +3.84891436e-01 +3.51884954e-01 +3.18444140e-01 +2.84611468e-01 +2.50429863e-01 +2.15942618e-01 +1.81193341e-01 +1.46225918e-01 +1.11084463e-01 +7.58132283e-02 +4.04565682e-02 +5.05888916e-03 +-3.03354012e-02 +-6.56819757e-02 +-1.00936630e-01 +-1.36055329e-01 +-1.70994255e-01 +-2.05709895e-01 +-2.40159072e-01 +-2.74298995e-01 +-3.08087309e-01 +-3.41482170e-01 +-3.74442282e-01 +-4.06926939e-01 +-4.38896078e-01 +-4.70310341e-01 +-5.01131120e-01 +-5.31320586e-01 +-5.60841742e-01 +-5.89658481e-01 +-6.17735621e-01 +-6.45038942e-01 +-6.71535220e-01 +-6.97192286e-01 +-7.21979058e-01 +-7.45865568e-01 +-7.68822995e-01 +-7.90823714e-01 +-8.11841322e-01 +-8.31850662e-01 +-8.50827851e-01 +-8.68750317e-01 +-8.85596818e-01 +-9.01347471e-01 +-9.15983761e-01 +-9.29488571e-01 +-9.41846205e-01 +-9.53042397e-01 +-9.63064325e-01 +-9.71900625e-01 +-9.79541409e-01 +-9.85978267e-01 +-9.91204276e-01 +-9.95214006e-01 +-9.98003525e-01 +-9.99570402e-01 +-9.99913702e-01 +-9.99033990e-01 +-9.96933324e-01 +-9.93615252e-01 +-9.89084803e-01 +-9.83348479e-01 +-9.76414244e-01 +-9.68291514e-01 +-9.58991137e-01 +-9.48525381e-01 +-9.36907919e-01 +-9.24153805e-01 +-9.10279456e-01 +-8.95302626e-01 +-8.79242384e-01 +-8.62119094e-01 +-8.43954380e-01 +-8.24771097e-01 +-8.04593306e-01 +-7.83446241e-01 +-7.61356281e-01 +-7.38350904e-01 +-7.14458660e-01 +-6.89709130e-01 +-6.64132901e-01 +-6.37761514e-01 +-6.10627425e-01 +-5.82763964e-01 +-5.54205301e-01 +-5.24986402e-01 +-4.95142980e-01 +-4.64711448e-01 +-4.33728877e-01 +-4.02232957e-01 +-3.70261950e-01 +-3.37854632e-01 +-3.05050248e-01 +-2.71888469e-01 +-2.38409349e-01 +-2.04653270e-01 +-1.70660888e-01 +-1.36473085e-01 +-1.02130927e-01 +-6.76756127e-02 +-3.31484264e-02 +1.40932364e-03 +3.59563472e-02 +7.04514209e-02 +1.04853432e-01 +1.39121429e-01 +1.73214683e-01 +2.07092725e-01 +2.40715396e-01 +2.74042887e-01 +3.07035792e-01 +3.39655157e-01 +3.71862526e-01 +4.03619981e-01 +4.34890184e-01 +4.65636420e-01 +4.95822649e-01 +5.25413542e-01 +5.54374520e-01 +5.82671794e-01 +6.10272399e-01 +6.37144240e-01 +6.63256129e-01 +6.88577813e-01 +7.13080012e-01 +7.36734447e-01 +7.59513876e-01 +7.81392128e-01 +8.02344126e-01 +8.22345917e-01 +8.41374694e-01 +8.59408822e-01 +8.76427869e-01 +8.92412621e-01 +9.07345104e-01 +9.21208599e-01 +9.33987665e-01 +9.45668151e-01 +9.56237215e-01 +9.65683330e-01 +9.73996303e-01 +9.81167276e-01 +9.87188739e-01 +9.92054536e-01 +9.95759871e-01 +9.98301307e-01 +9.99676771e-01 +9.99885553e-01 +9.98928304e-01 +9.96807034e-01 +9.93525106e-01 +9.89087230e-01 +9.83499454e-01 +9.76769159e-01 +9.68905042e-01 +9.59917107e-01 +9.49816652e-01 +9.38616248e-01 +9.26329729e-01 +9.12972173e-01 +8.98559877e-01 +8.83110340e-01 +8.66642240e-01 +8.49175407e-01 +8.30730805e-01 +8.11330501e-01 +7.90997640e-01 +7.69756411e-01 +7.47632022e-01 +7.24650668e-01 +7.00839498e-01 +6.76226587e-01 +6.50840898e-01 +6.24712244e-01 +5.97871254e-01 +5.70349341e-01 +5.42178659e-01 +5.13392070e-01 +4.84023103e-01 +4.54105909e-01 +4.23675226e-01 +3.92766337e-01 +3.61415030e-01 +3.29657553e-01 +2.97530579e-01 +2.65071154e-01 +2.32316658e-01 +1.99304758e-01 +1.66073373e-01 +1.32660621e-01 +9.91047852e-02 +6.54442617e-02 +3.17175168e-02 +-2.03695629e-03 +-3.57806809e-02 +-6.94752407e-02 +-1.03082322e-01 +-1.36563757e-01 +-1.69881569e-01 +-2.02998015e-01 +-2.35875631e-01 +-2.68477268e-01 +-3.00766137e-01 +-3.32705850e-01 +-3.64260455e-01 +-3.95394485e-01 +-4.26072995e-01 +-4.56261598e-01 +-4.85926503e-01 +-5.15034554e-01 +-5.43553266e-01 +-5.71450856e-01 +-5.98696285e-01 +-6.25259287e-01 +-6.51110406e-01 +-6.76221024e-01 +-7.00563392e-01 +-7.24110661e-01 +-7.46836909e-01 +-7.68717169e-01 +-7.89727460e-01 +-8.09844805e-01 +-8.29047263e-01 +-8.47313944e-01 +-8.64625034e-01 +-8.80961817e-01 +-8.96306690e-01 +-9.10643187e-01 +-9.23955988e-01 +-9.36230943e-01 +-9.47455076e-01 +-9.57616607e-01 +-9.66704953e-01 +-9.74710748e-01 +-9.81625844e-01 +-9.87443322e-01 +-9.92157496e-01 +-9.95763917e-01 +-9.98259377e-01 +-9.99641910e-01 +-9.99910792e-01 +-9.99066537e-01 +-9.97110900e-01 +-9.94046870e-01 +-9.89878661e-01 +-9.84611712e-01 +-9.78252674e-01 +-9.70809402e-01 +-9.62290944e-01 +-9.52707531e-01 +-9.42070559e-01 +-9.30392581e-01 +-9.17687284e-01 +-9.03969476e-01 +-8.89255069e-01 +-8.73561055e-01 +-8.56905488e-01 +-8.39307465e-01 +-8.20787098e-01 +-8.01365494e-01 +-7.81064728e-01 +-7.59907817e-01 +-7.37918692e-01 +-7.15122174e-01 +-6.91543943e-01 +-6.67210506e-01 +-6.42149170e-01 +-6.16388010e-01 +-5.89955836e-01 +-5.62882159e-01 +-5.35197158e-01 +-5.06931648e-01 +-4.78117043e-01 +-4.48785320e-01 +-4.18968985e-01 +-3.88701037e-01 +-3.58014927e-01 +-3.26944528e-01 +-2.95524087e-01 +-2.63788195e-01 +-2.31771747e-01 +-1.99509900e-01 +-1.67038038e-01 +-1.34391734e-01 +-1.01606705e-01 +-6.87187785e-02 +-3.57638530e-02 +-2.77785462e-03 +3.02032990e-02 +6.31437386e-02 +9.60076818e-02 +1.28759472e-01 +1.61363617e-01 +1.93784826e-01 +2.25988051e-01 +2.57938519e-01 +2.89601774e-01 +3.20943711e-01 +3.51930616e-01 +3.82529197e-01 +4.12706623e-01 +4.42430558e-01 +4.71669192e-01 +5.00391279e-01 +5.28566168e-01 +5.56163833e-01 +5.83154909e-01 +6.09510717e-01 +6.35203298e-01 +6.60205441e-01 +6.84490711e-01 +7.08033474e-01 +7.30808927e-01 +7.52793121e-01 +7.73962986e-01 +7.94296352e-01 +8.13771975e-01 +8.32369557e-01 +8.50069764e-01 +8.66854249e-01 +8.82705668e-01 +8.97607695e-01 +9.11545042e-01 +9.24503471e-01 +9.36469807e-01 +9.47431953e-01 +9.57378897e-01 +9.66300726e-01 +9.74188634e-01 +9.81034927e-01 +9.86833032e-01 +9.91577502e-01 +9.95264019e-01 +9.97889396e-01 +9.99451582e-01 +9.99949657e-01 +9.99383837e-01 +9.97755467e-01 +9.95067021e-01 +9.91322095e-01 +9.86525405e-01 +9.80682774e-01 +9.73801131e-01 +9.65888497e-01 +9.56953979e-01 +9.47007753e-01 +9.36061055e-01 +9.24126169e-01 +9.11216407e-01 +8.97346099e-01 +8.82530573e-01 +8.66786136e-01 +8.50130060e-01 +8.32580557e-01 +8.14156760e-01 +7.94878705e-01 +7.74767303e-01 +7.53844317e-01 +7.32132344e-01 +7.09654783e-01 +6.86435809e-01 +6.62500353e-01 +6.37874068e-01 +6.12583303e-01 +5.86655077e-01 +5.60117043e-01 +5.32997465e-01 +5.05325184e-01 +4.77129586e-01 +4.48440572e-01 +4.19288526e-01 +3.89704281e-01 +3.59719089e-01 +3.29364581e-01 +2.98672743e-01 +2.67675873e-01 +2.36406553e-01 +2.04897610e-01 +1.73182085e-01 +1.41293196e-01 +1.09264304e-01 +7.71288772e-02 +4.49204576e-02 +1.26726242e-02 +-1.95810411e-02 +-5.18069888e-02 +-8.39717362e-02 +-1.16041903e-01 +-1.47984243e-01 +-1.79765684e-01 +-2.11353356e-01 +-2.42714627e-01 +-2.73817138e-01 +-3.04628835e-01 +-3.35118001e-01 +-3.65253289e-01 +-3.95003754e-01 +-4.24338884e-01 +-4.53228631e-01 +-4.81643442e-01 +-5.09554287e-01 +-5.36932690e-01 +-5.63750756e-01 +-5.89981200e-01 +-6.15597373e-01 +-6.40573292e-01 +-6.64883660e-01 +-6.88503894e-01 +-7.11410151e-01 +-7.33579347e-01 +-7.54989184e-01 +-7.75618169e-01 +-7.95445635e-01 +-8.14451762e-01 +-8.32617595e-01 +-8.49925062e-01 +-8.66356993e-01 +-8.81897133e-01 +-8.96530162e-01 +-9.10241702e-01 +-9.23018338e-01 +-9.34847625e-01 +-9.45718102e-01 +-9.55619300e-01 +-9.64541753e-01 +-9.72477004e-01 +-9.79417615e-01 +-9.85357170e-01 +-9.90290283e-01 +-9.94212599e-01 +-9.97120797e-01 +-9.99012595e-01 +-9.99886747e-01 +-9.99743045e-01 +-9.98582316e-01 +-9.96406420e-01 +-9.93218248e-01 +-9.89021715e-01 +-9.83821756e-01 +-9.77624320e-01 +-9.70436360e-01 +-9.62265826e-01 +-9.53121656e-01 +-9.43013764e-01 +-9.31953030e-01 +-9.19951285e-01 +-9.07021300e-01 +-8.93176771e-01 +-8.78432303e-01 +-8.62803394e-01 +-8.46306418e-01 +-8.28958610e-01 +-8.10778040e-01 +-7.91783601e-01 +-7.71994986e-01 +-7.51432666e-01 +-7.30117869e-01 +-7.08072556e-01 +-6.85319401e-01 +-6.61881765e-01 +-6.37783669e-01 +-6.13049775e-01 +-5.87705354e-01 +-5.61776264e-01 +-5.35288921e-01 +-5.08270272e-01 +-4.80747766e-01 +-4.52749329e-01 +-4.24303334e-01 +-3.95438567e-01 +-3.66184206e-01 +-3.36569785e-01 +-3.06625165e-01 +-2.76380507e-01 +-2.45866236e-01 +-2.15113016e-01 +-1.84151712e-01 +-1.53013367e-01 +-1.21729165e-01 +-9.03304009e-02 +-5.88484499e-02 +-2.73147362e-02 +4.23929893e-03 +3.57822284e-02 +6.72826704e-02 +9.87093195e-02 +1.30030978e-01 +1.61216586e-01 +1.92235254e-01 +2.23056290e-01 +2.53649232e-01 +2.83983879e-01 +3.14030317e-01 +3.43758951e-01 +3.73140534e-01 +4.02146192e-01 +4.30747456e-01 +4.58916290e-01 +4.86625112e-01 +5.13846827e-01 +5.40554852e-01 +5.66723137e-01 +5.92326196e-01 +6.17339127e-01 +6.41737636e-01 +6.65498065e-01 +6.88597406e-01 +7.11013329e-01 +7.32724203e-01 +7.53709111e-01 +7.73947876e-01 +7.93421074e-01 +8.12110056e-01 +8.29996964e-01 +8.47064746e-01 +8.63297173e-01 +8.78678854e-01 +8.93195248e-01 +9.06832679e-01 +9.19578348e-01 +9.31420340e-01 +9.42347642e-01 +9.52350145e-01 +9.61418658e-01 +9.69544912e-01 +9.76721568e-01 +9.82942224e-01 +9.88201417e-01 +9.92494631e-01 +9.95818294e-01 +9.98169788e-01 +9.99547441e-01 +9.99950537e-01 +9.99379306e-01 +9.97834930e-01 +9.95319533e-01 +9.91836187e-01 +9.87388897e-01 +9.81982603e-01 +9.75623174e-01 +9.68317394e-01 +9.60072963e-01 +9.50898480e-01 +9.40803441e-01 +9.29798221e-01 +9.17894068e-01 +9.05103090e-01 +8.91438239e-01 +8.76913301e-01 +8.61542877e-01 +8.45342374e-01 +8.28327983e-01 +8.10516664e-01 +7.91926130e-01 +7.72574827e-01 +7.52481918e-01 +7.31667257e-01 +7.10151377e-01 +6.87955463e-01 +6.65101334e-01 +6.41611419e-01 +6.17508736e-01 +5.92816870e-01 +5.67559944e-01 +5.41762603e-01 +5.15449983e-01 +4.88647689e-01 +4.61381770e-01 +4.33678692e-01 +4.05565313e-01 +3.77068856e-01 +3.48216882e-01 +3.19037266e-01 +2.89558165e-01 +2.59807994e-01 +2.29815399e-01 +1.99609227e-01 +1.69218497e-01 +1.38672377e-01 +1.08000152e-01 +7.72311960e-02 +4.63949453e-02 +1.55208694e-02 +-1.53615568e-02 +-4.62228815e-02 +-7.70337035e-02 +-1.07764701e-01 +-1.38386657e-01 +-1.68870492e-01 +-1.99187285e-01 +-2.29308306e-01 +-2.59205040e-01 +-2.88849217e-01 +-3.18212833e-01 +-3.47268182e-01 +-3.75987879e-01 +-4.04344884e-01 +-4.32312533e-01 +-4.59864555e-01 +-4.86975102e-01 +-5.13618770e-01 +-5.39770626e-01 +-5.65406224e-01 +-5.90501635e-01 +-6.15033465e-01 +-6.38978877e-01 +-6.62315610e-01 +-6.85022004e-01 +-7.07077013e-01 +-7.28460229e-01 +-7.49151901e-01 +-7.69132947e-01 +-7.88384976e-01 +-8.06890303e-01 +-8.24631963e-01 +-8.41593730e-01 +-8.57760126e-01 +-8.73116438e-01 +-8.87648731e-01 +-9.01343855e-01 +-9.14189464e-01 +-9.26174021e-01 +-9.37286809e-01 +-9.47517939e-01 +-9.56858361e-01 +-9.65299866e-01 +-9.72835100e-01 +-9.79457563e-01 +-9.85161616e-01 +-9.89942486e-01 +-9.93796268e-01 +-9.96719930e-01 +-9.98711310e-01 +-9.99769119e-01 +-9.99892945e-01 +-9.99083244e-01 +-9.97341346e-01 +-9.94669446e-01 +-9.91070607e-01 +-9.86548752e-01 +-9.81108660e-01 +-9.74755958e-01 +-9.67497120e-01 +-9.59339455e-01 +-9.50291102e-01 +-9.40361017e-01 +-9.29558970e-01 +-9.17895527e-01 +-9.05382048e-01 +-8.92030667e-01 +-8.77854284e-01 +-8.62866551e-01 +-8.47081858e-01 +-8.30515321e-01 +-8.13182763e-01 +-7.95100701e-01 +-7.76286329e-01 +-7.56757501e-01 +-7.36532713e-01 +-7.15631087e-01 +-6.94072350e-01 +-6.71876817e-01 +-6.49065369e-01 +-6.25659437e-01 +-6.01680975e-01 +-5.77152447e-01 +-5.52096798e-01 +-5.26537438e-01 +-5.00498215e-01 +-4.74003396e-01 +-4.47077645e-01 +-4.19745994e-01 +-3.92033826e-01 +-3.63966845e-01 +-3.35571059e-01 +-3.06872748e-01 +-2.77898446e-01 +-2.48674912e-01 +-2.19229109e-01 +-1.89588174e-01 +-1.59779396e-01 +-1.29830193e-01 +-9.97680816e-02 +-6.96206542e-02 +-3.94155551e-02 +-9.18045308e-03 +2.10569837e-02 +5.12691127e-02 +8.14283421e-02 +1.11507156e-01 +1.41478140e-01 +1.71314005e-01 +2.00987612e-01 +2.30471999e-01 +2.59740400e-01 +2.88766277e-01 +3.17523335e-01 +3.45985553e-01 +3.74127203e-01 +4.01922874e-01 +4.29347495e-01 +4.56376360e-01 +4.82985143e-01 +5.09149927e-01 +5.34847222e-01 +5.60053982e-01 +5.84747633e-01 +6.08906087e-01 +6.32507764e-01 +6.55531608e-01 +6.77957109e-01 +6.99764317e-01 +7.20933865e-01 +7.41446980e-01 +7.61285501e-01 +7.80431895e-01 +7.98869272e-01 +8.16581401e-01 +8.33552718e-01 +8.49768347e-01 +8.65214105e-01 +8.79876520e-01 +8.93742837e-01 +9.06801033e-01 +9.19039825e-01 +9.30448678e-01 +9.41017814e-01 +9.50738222e-01 +9.59601660e-01 +9.67600669e-01 +9.74728570e-01 +9.80979474e-01 +9.86348288e-01 +9.90830712e-01 +9.94423249e-01 +9.97123200e-01 +9.98928672e-01 +9.99838574e-01 +9.99852618e-01 +9.98971321e-01 +9.97195996e-01 +9.94528760e-01 +9.90972523e-01 +9.86530986e-01 +9.81208640e-01 +9.75010757e-01 +9.67943386e-01 +9.60013347e-01 +9.51228222e-01 +9.41596349e-01 +9.31126811e-01 +9.19829432e-01 +9.07714761e-01 +8.94794066e-01 +8.81079323e-01 +8.66583199e-01 +8.51319048e-01 +8.35300891e-01 +8.18543406e-01 +8.01061913e-01 +7.82872363e-01 +7.63991317e-01 +7.44435934e-01 +7.24223956e-01 +7.03373691e-01 +6.81903992e-01 +6.59834244e-01 +6.37184344e-01 +6.13974684e-01 +5.90226131e-01 +5.65960009e-01 +5.41198079e-01 +5.15962518e-01 +4.90275905e-01 +4.64161189e-01 +4.37641679e-01 +4.10741018e-01 +3.83483159e-01 +3.55892351e-01 +3.27993112e-01 +2.99810206e-01 +2.71368626e-01 +2.42693570e-01 +2.13810412e-01 +1.84744690e-01 +1.55522074e-01 +1.26168347e-01 +9.67093852e-02 +6.71711300e-02 +3.75795681e-02 +7.96070935e-03 +-2.16594371e-02 +-5.12548874e-02 +-8.07997047e-02 +-1.10268021e-01 +-1.39634061e-01 +-1.68872163e-01 +-1.97956803e-01 +-2.26862613e-01 +-2.55564408e-01 +-2.84037203e-01 +-3.12256240e-01 +-3.40197005e-01 +-3.67835253e-01 +-3.95147023e-01 +-4.22108666e-01 +-4.48696857e-01 +-4.74888621e-01 +-5.00661348e-01 +-5.25992817e-01 +-5.50861214e-01 +-5.75245147e-01 +-5.99123667e-01 +-6.22476285e-01 +-6.45282989e-01 +-6.67524261e-01 +-6.89181090e-01 +-7.10234993e-01 +-7.30668029e-01 +-7.50462814e-01 +-7.69602532e-01 +-7.88070954e-01 +-8.05852446e-01 +-8.22931987e-01 +-8.39295173e-01 +-8.54928240e-01 +-8.69818068e-01 +-8.83952190e-01 +-8.97318810e-01 +-9.09906802e-01 +-9.21705726e-01 +-9.32705833e-01 +-9.42898074e-01 +-9.52274104e-01 +-9.60826295e-01 +-9.68547733e-01 +-9.75432230e-01 +-9.81474324e-01 +-9.86669284e-01 +-9.91013114e-01 +-9.94502555e-01 +-9.97135087e-01 +-9.98908928e-01 +-9.99823038e-01 +-9.99877119e-01 +-9.99071609e-01 +-9.97407687e-01 +-9.94887267e-01 +-9.91512996e-01 +-9.87288255e-01 +-9.82217148e-01 +-9.76304502e-01 +-9.69555860e-01 +-9.61977479e-01 +-9.53576319e-01 +-9.44360040e-01 +-9.34336990e-01 +-9.23516203e-01 +-9.11907382e-01 +-8.99520900e-01 +-8.86367781e-01 +-8.72459696e-01 +-8.57808951e-01 +-8.42428474e-01 +-8.26331801e-01 +-8.09533070e-01 +-7.92047002e-01 +-7.73888890e-01 +-7.55074587e-01 +-7.35620492e-01 +-7.15543532e-01 +-6.94861149e-01 +-6.73591280e-01 +-6.51752349e-01 +-6.29363245e-01 +-6.06443308e-01 +-5.83012313e-01 +-5.59090450e-01 +-5.34698303e-01 +-5.09856840e-01 +-4.84587388e-01 +-4.58911618e-01 +-4.32851526e-01 +-4.06429416e-01 +-3.78298490e-01 +-3.42189750e-01 +-3.06283181e-01 +-2.72263415e-01 +-2.40277257e-01 +-2.10432400e-01 +-1.82799535e-01 +-1.57415030e-01 +-1.34283875e-01 +-1.13382963e-01 +-9.46644222e-02 +-7.80588691e-02 +-6.34786147e-02 +-5.08206408e-02 +-3.99693355e-02 +-3.07989458e-02 +-2.31757423e-02 +-1.69598645e-02 +-1.20068991e-02 +-8.16915332e-03 +-5.29668892e-03 +-3.23792782e-03 +-1.84037921e-03 +-9.50725995e-04 +-4.12370929e-04 +-2.06185465e-04 +-0.00000000e+00 +-0.00000000e+00 +3.91914656e-02 +8.28679559e-02 +1.25094913e-01 +1.67149012e-01 +2.09150169e-01 +2.51127726e-01 +2.93092587e-01 +3.35049794e-01 +3.77002015e-01 +4.18950800e-01 +4.60897115e-01 +5.02841591e-01 +5.44784663e-01 +5.86726637e-01 +6.28667735e-01 +6.70608124e-01 +7.12547932e-01 +7.54487255e-01 +7.96426171e-01 +8.38364741e-01 +8.80303016e-01 +9.22241036e-01 +9.64178834e-01 +9.97369514e-01 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +9.99968409e-01 +9.77416184e-01 +9.35478441e-01 +8.93540494e-01 +8.51602304e-01 +8.09663831e-01 +7.67725030e-01 +7.25785843e-01 +6.83846198e-01 +6.41906005e-01 +5.99965146e-01 +5.58023470e-01 +5.16080773e-01 +4.74136780e-01 +4.32191102e-01 +3.90243182e-01 +3.48292178e-01 +3.06336765e-01 +2.64374713e-01 +2.22401949e-01 +1.80410081e-01 +1.38378309e-01 +9.62348465e-02 +5.34309759e-02 +2.67154879e-02 +-0.00000000e+00 +0.00000000e+00 +6.60950883e-03 +3.98860155e-02 +7.18446490e-02 +8.75483750e-02 +8.55736464e-02 +6.72426990e-02 +3.63143010e-02 +-2.37996636e-03 +-4.39658627e-02 +-8.41267001e-02 +-1.19378529e-01 +-1.47150103e-01 +-1.65758319e-01 +-1.74330710e-01 +-1.72702447e-01 +-1.61302504e-01 +-1.41037079e-01 +-1.13177036e-01 +-7.92500710e-02 +-4.09427032e-02 +-1.17695239e-05 +4.17930314e-02 +8.27950981e-02 +1.21445430e-01 +1.56365786e-01 +1.86381060e-01 +2.10541393e-01 +2.28134963e-01 +2.38692204e-01 +2.41982557e-01 +2.38004675e-01 +2.26971159e-01 +2.09288806e-01 +1.85535421e-01 +1.56434055e-01 +1.22825629e-01 +8.56407277e-02 +4.58713195e-02 +4.54306185e-03 +-3.73112615e-02 +-7.86765268e-02 +-1.18578230e-01 +-1.56102732e-01 +-1.90415199e-01 +-2.20774469e-01 +-2.46545215e-01 +-2.67207050e-01 +-2.82360811e-01 +-2.91732001e-01 +-2.95171511e-01 +-2.92653875e-01 +-2.84273162e-01 +-2.70236799e-01 +-2.50857528e-01 +-2.26543825e-01 +-1.97788962e-01 +-1.65159032e-01 +-1.29280277e-01 +-9.08258146e-02 +-5.05022237e-02 +-9.03605188e-03 +3.28393885e-02 +7.43968231e-02 +1.14927176e-01 +1.53750940e-01 +1.90228615e-01 +2.23770079e-01 +2.53842787e-01 +2.79978864e-01 +3.01780709e-01 +3.18925445e-01 +3.31168131e-01 +3.38343280e-01 +3.40365791e-01 +3.37229937e-01 +3.29007687e-01 +3.15845751e-01 +2.97961645e-01 +2.75638869e-01 +2.49221400e-01 +2.19107263e-01 +1.85741835e-01 +1.49610431e-01 +1.11230761e-01 +7.11450335e-02 +2.99120603e-02 +-1.19007217e-02 +-5.37250318e-02 +-9.49993804e-02 +-1.35176351e-01 +-1.73729531e-01 +-2.10159974e-01 +-2.44002097e-01 +-2.74829034e-01 +-3.02257349e-01 +-3.25951074e-01 +-3.45625028e-01 +-3.61047473e-01 +-3.72041967e-01 +-3.78488586e-01 +-3.80324346e-01 +-3.77543021e-01 +-3.70194091e-01 +-3.58381445e-01 +-3.42260927e-01 +-3.22037802e-01 +-2.97963539e-01 +-2.70332000e-01 +-2.39475423e-01 +-2.05759976e-01 +-1.69581038e-01 +-1.31358245e-01 +-9.15303636e-02 +-5.05500664e-02 +-8.87872642e-03 +3.30188630e-02 +7.46796459e-02 +1.15647321e-01 +1.55477244e-01 +1.93740979e-01 +2.30030777e-01 +2.63963515e-01 +2.95184485e-01 +3.23370723e-01 +3.48233895e-01 +3.69522927e-01 +3.87025971e-01 +4.00572137e-01 +4.10032704e-01 +4.15321687e-01 +4.16396480e-01 +4.13257259e-01 +4.05946816e-01 +3.94549390e-01 +3.79189165e-01 +3.60028831e-01 +3.37267257e-01 +3.11137079e-01 +2.81902131e-01 +2.49854464e-01 +2.15311087e-01 +1.78610658e-01 +1.40110047e-01 +1.00180662e-01 +5.92047402e-02 +1.75716540e-02 +-2.43258327e-02 +-6.60952742e-02 +-1.07348170e-01 +-1.47703531e-01 +-1.86791286e-01 +-2.24255540e-01 +-2.59757666e-01 +-2.92979172e-01 +-3.23624370e-01 +-3.51422752e-01 +-3.76131160e-01 +-3.97535626e-01 +-4.15452974e-01 +-4.29732086e-01 +-4.40254894e-01 +-4.46937051e-01 +-4.49728304e-01 +-4.48612588e-01 +-4.43607779e-01 +-4.34765200e-01 +-4.22168829e-01 +-4.05934235e-01 +-3.86207271e-01 +-3.63162526e-01 +-3.37001564e-01 +-3.07950973e-01 +-2.76260216e-01 +-2.42199281e-01 +-2.06056254e-01 +-1.68134761e-01 +-1.28751350e-01 +-8.82327286e-02 +-4.69129722e-02 +-5.13076709e-03 +3.67733693e-02 +7.84599036e-02 +1.19592975e-01 +1.59843043e-01 +1.98889550e-01 +2.36423276e-01 +2.72148672e-01 +3.05786313e-01 +3.37074614e-01 +3.65771874e-01 +3.91658186e-01 +4.14536413e-01 +4.34234197e-01 +4.50604566e-01 +4.63526917e-01 +4.72908114e-01 +4.78682168e-01 +4.80811524e-01 +4.79286035e-01 +4.74123753e-01 +4.65369778e-01 +4.53096296e-01 +4.37401323e-01 +4.18408150e-01 +3.96263859e-01 +3.71138401e-01 +3.43222707e-01 +3.12727652e-01 +2.79881691e-01 +2.44929763e-01 +2.08130639e-01 +1.69755575e-01 +1.30085764e-01 +8.94104793e-02 +4.80248844e-02 +6.22776732e-03 +-3.56804941e-02 +-7.74001907e-02 +-1.18634330e-01 +-1.59090831e-01 +-1.98484405e-01 +-2.36538598e-01 +-2.72987771e-01 +-3.07578605e-01 +-3.40071977e-01 +-3.70244623e-01 +-3.97890242e-01 +-4.22820964e-01 +-4.44868693e-01 +-4.63885862e-01 +-4.79746244e-01 +-4.92345899e-01 +-5.01603669e-01 +-5.07461420e-01 +-5.09884286e-01 +-5.08860818e-01 +-5.04402978e-01 +-4.96545718e-01 +-4.85346588e-01 +-4.70885258e-01 +-4.53262802e-01 +-4.32601015e-01 +-4.09041202e-01 +-3.82743262e-01 +-3.53884472e-01 +-3.22658215e-01 +-2.89272607e-01 +-2.53949030e-01 +-2.16920571e-01 +-1.78430445e-01 +-1.38730347e-01 +-9.80787742e-02 +-5.67393169e-02 +-1.49789216e-02 +2.69338407e-02 +6.87305029e-02 +1.10144414e-01 +1.50912422e-01 +1.90776520e-01 +2.29485440e-01 +2.66796202e-01 +3.02475580e-01 +3.36301509e-01 +3.68064399e-01 +3.97568365e-01 +4.24632359e-01 +4.49091199e-01 +4.70796488e-01 +4.89617430e-01 +5.05441521e-01 +5.18175124e-01 +5.27743931e-01 +5.34093285e-01 +5.37188408e-01 +5.37014468e-01 +5.33576561e-01 +5.26899553e-01 +5.17027805e-01 +5.04024787e-01 +4.87972590e-01 +4.68971297e-01 +4.47138301e-01 +4.22607498e-01 +3.95528351e-01 +3.66064949e-01 +3.34394951e-01 +3.00708414e-01 +2.65206629e-01 +2.28100866e-01 +1.89611084e-01 +1.49964582e-01 +1.09394611e-01 +6.81390039e-02 +2.64387428e-02 +-1.54634375e-02 +-5.73244648e-02 +-9.89023385e-02 +-1.39957538e-01 +-1.80254377e-01 +-2.19562318e-01 +-2.57657255e-01 +-2.94322759e-01 +-3.29351337e-01 +-3.62545518e-01 +-3.93718871e-01 +-4.22696990e-01 +-4.49318456e-01 +-4.73435809e-01 +-4.94916117e-01 +-5.13641600e-01 +-5.29510248e-01 +-5.42436551e-01 +-5.52351692e-01 +-5.59203654e-01 +-5.62957546e-01 +-5.63596051e-01 +-5.61119059e-01 +-5.55543424e-01 +-5.46903055e-01 +-5.35248936e-01 +-5.20648107e-01 +-5.03183363e-01 +-4.82953245e-01 +-4.60070981e-01 +-4.34663541e-01 +-4.06871467e-01 +-3.76847896e-01 +-3.44757176e-01 +-3.10774479e-01 +-2.75084793e-01 +-2.37881349e-01 +-1.99365090e-01 +-1.59743451e-01 +-1.19228885e-01 +-7.80381501e-02 +-3.63908882e-02 +5.49155787e-03 +4.73871938e-02 +8.90746894e-02 +1.30334387e-01 +1.70949686e-01 +2.10707832e-01 +2.49401321e-01 +2.86828885e-01 +3.22796151e-01 +3.57117452e-01 +3.89615653e-01 +4.20124011e-01 +4.48486472e-01 +4.74558244e-01 +4.98207438e-01 +5.19314073e-01 +5.37772662e-01 +5.53490549e-01 +5.66390260e-01 +5.76408336e-01 +5.83496458e-01 +5.87621449e-01 +5.88764860e-01 +5.86924111e-01 +5.82110820e-01 +5.74352662e-01 +5.63690893e-01 +5.50182534e-01 +5.33897437e-01 +5.14920501e-01 +4.93348564e-01 +4.69292413e-01 +4.42873719e-01 +4.14226707e-01 +3.83495256e-01 +3.50834132e-01 +3.16406411e-01 +2.80384129e-01 +2.42946200e-01 +2.04278377e-01 +1.64571765e-01 +1.24022091e-01 +8.28287566e-02 +4.11936393e-02 +-6.79625677e-04 +-4.25868819e-02 +-8.43243328e-02 +-1.25689490e-01 +-1.66482291e-01 +-2.06505932e-01 +-2.45567733e-01 +-2.83480469e-01 +-3.20062428e-01 +-3.55139349e-01 +-3.88544168e-01 +-4.20118399e-01 +-4.49713021e-01 +-4.77188141e-01 +-5.02415162e-01 +-5.25275878e-01 +-5.45663677e-01 +-5.63484532e-01 +-5.78655812e-01 +-5.91108416e-01 +-6.00786075e-01 +-6.07645108e-01 +-6.11656180e-01 +-6.12802693e-01 +-6.11081370e-01 +-6.06503174e-01 +-5.99091535e-01 +-5.88883143e-01 +-5.75928302e-01 +-5.60289052e-01 +-5.42039997e-01 +-5.21268162e-01 +-4.98071270e-01 +-4.72558185e-01 +-4.44848648e-01 +-4.15071630e-01 +-3.83365335e-01 +-3.49876890e-01 +-3.14760873e-01 +-2.78178836e-01 +-2.40298911e-01 +-2.01294661e-01 +-1.61344160e-01 +-1.20629490e-01 +-7.93358255e-02 +-3.76503772e-02 +4.23826810e-03 +4.61410183e-02 +8.78692251e-02 +1.29235439e-01 +1.70054233e-01 +2.10143155e-01 +2.49323460e-01 +2.87420763e-01 +3.24265918e-01 +3.59695905e-01 +3.93554341e-01 +4.25692028e-01 +4.55967754e-01 +4.84249040e-01 +5.10412553e-01 +5.34344372e-01 +5.55940679e-01 +5.75108245e-01 +5.91764913e-01 +6.05839507e-01 +6.17272246e-01 +6.26015080e-01 +6.32031912e-01 +6.35298720e-01 +6.35803268e-01 +6.33545364e-01 +6.28536808e-01 +6.20801391e-01 +6.10374720e-01 +5.97303826e-01 +5.81646962e-01 +5.63473441e-01 +5.42863275e-01 +5.19906825e-01 +4.94704318e-01 +4.67365266e-01 +4.38008088e-01 +4.06759577e-01 +3.73754325e-01 +3.39134144e-01 +3.03047405e-01 +2.65648327e-01 +2.27096362e-01 +1.87555499e-01 +1.47193567e-01 +1.06181503e-01 +6.46926183e-02 +2.29018587e-02 +-1.90149486e-02 +-6.08818228e-02 +-1.02523360e-01 +-1.43765470e-01 +-1.84436096e-01 +-2.24365931e-01 +-2.63389109e-01 +-3.01343895e-01 +-3.38073340e-01 +-3.73425903e-01 +-4.07256052e-01 +-4.39424862e-01 +-4.69800557e-01 +-4.98259037e-01 +-5.24684359e-01 +-5.48969185e-01 +-5.71015192e-01 +-5.90733449e-01 +-6.08044746e-01 +-6.22879891e-01 +-6.35179948e-01 +-6.44896446e-01 +-6.51991533e-01 +-6.56438107e-01 +-6.58219884e-01 +-6.57331425e-01 +-6.53778135e-01 +-6.47576183e-01 +-6.38752420e-01 +-6.27344225e-01 +-6.13399320e-01 +-5.96975543e-01 +-5.78140585e-01 +-5.56971684e-01 +-5.33555281e-01 +-5.07986646e-01 +-4.80369471e-01 +-4.50815420e-01 +-4.19443661e-01 +-3.86380374e-01 +-3.51758219e-01 +-3.15715777e-01 +-2.78397016e-01 +-2.39950654e-01 +-2.00529600e-01 +-1.60290313e-01 +-1.19392171e-01 +-7.79968455e-02 +-3.62676522e-02 +5.63109717e-03 +4.75347428e-02 +8.92789227e-02 +1.30700215e-01 +1.71636772e-01 +2.11928955e-01 +2.51419946e-01 +2.89956336e-01 +3.27388741e-01 +3.63572336e-01 +3.98367434e-01 +4.31639980e-01 +4.63262082e-01 +4.93112466e-01 +5.21076930e-01 +5.47048760e-01 +5.70929125e-01 +5.92627422e-01 +6.12061605e-01 +6.29158471e-01 +6.43853914e-01 +6.56093139e-01 +6.65830850e-01 +6.73031402e-01 +6.77668887e-01 +6.79727206e-01 +6.79200108e-01 +6.76091179e-01 +6.70413794e-01 +6.62191048e-01 +6.51455627e-01 +6.38249661e-01 +6.22624535e-01 +6.04640663e-01 +5.84367246e-01 +5.61882003e-01 +5.37270819e-01 +5.10627394e-01 +4.82052875e-01 +4.51655462e-01 +4.19549981e-01 +3.85857431e-01 +3.50704522e-01 +3.14223177e-01 +2.76550056e-01 +2.37826017e-01 +1.98195544e-01 +1.57806222e-01 +1.16808191e-01 +7.53535797e-02 +3.35959406e-02 +-8.31031672e-03 +-5.02105006e-02 +-9.19502289e-02 +-1.33375986e-01 +-1.74335678e-01 +-2.14679178e-01 +-2.54258870e-01 +-2.92930174e-01 +-3.30552116e-01 +-3.66987843e-01 +-4.02105043e-01 +-4.35776408e-01 +-4.67880113e-01 +-4.98300212e-01 +-5.26927096e-01 +-5.53657988e-01 +-5.78397076e-01 +-6.01055890e-01 +-6.21553607e-01 +-6.39817296e-01 +-6.55782304e-01 +-6.69392540e-01 +-6.80600339e-01 +-6.89366676e-01 +-6.95661359e-01 +-6.99463061e-01 +-7.00759759e-01 +-6.99548272e-01 +-6.95834294e-01 +-6.89632390e-01 +-6.80965932e-01 +-6.69867374e-01 +-6.56377702e-01 +-6.40546156e-01 +-6.22430162e-01 +-6.02095146e-01 +-5.79614657e-01 +-5.55069548e-01 +-5.28547686e-01 +-5.00143728e-01 +-4.69958947e-01 +-4.38100966e-01 +-4.04682855e-01 +-3.69822924e-01 +-3.33644357e-01 +-2.96275032e-01 +-2.57846675e-01 +-2.18494379e-01 +-1.78356256e-01 +-1.37573089e-01 +-9.62876705e-02 +-5.46441963e-02 +-1.27879142e-02 +2.91353549e-02 +7.09798443e-02 +1.12600323e-01 +1.53852487e-01 +1.94593543e-01 +2.34682847e-01 +2.73982128e-01 +3.12355916e-01 +3.49672303e-01 +3.85803423e-01 +4.20625428e-01 +4.54018975e-01 +4.85870281e-01 +5.16071013e-01 +5.44518276e-01 +5.71115293e-01 +5.95772489e-01 +6.18406591e-01 +6.38940966e-01 +6.57306764e-01 +6.73442969e-01 +6.87295526e-01 +6.98818093e-01 +7.07973390e-01 +7.14731538e-01 +7.19070297e-01 +7.20976527e-01 +7.20445432e-01 +7.17479549e-01 +7.12089947e-01 +7.04296766e-01 +6.94127152e-01 +6.81616035e-01 +6.66807416e-01 +6.49752089e-01 +6.30507798e-01 +6.09140731e-01 +5.85723635e-01 +5.60335249e-01 +5.33061775e-01 +5.03995484e-01 +4.73233635e-01 +4.40879807e-01 +4.07042771e-01 +3.71835299e-01 +3.35375182e-01 +2.97784283e-01 +2.59187393e-01 +2.19712979e-01 +1.79492223e-01 +1.38658164e-01 +9.73460664e-02 +5.56924630e-02 +1.38346729e-02 +-2.80893279e-02 +-6.99416970e-02 +-1.11584884e-01 +-1.52882382e-01 +-1.93699001e-01 +-2.33901033e-01 +-2.73357523e-01 +-3.11939711e-01 +-3.49521784e-01 +-3.85982092e-01 +-4.21201874e-01 +-4.55067122e-01 +-4.87468728e-01 +-5.18301333e-01 +-5.47466230e-01 +-5.74869521e-01 +-6.00422633e-01 +-6.24044710e-01 +-6.45659461e-01 +-6.65198184e-01 +-6.82599374e-01 +-6.97806795e-01 +-7.10773640e-01 +-7.21458680e-01 +-7.29828317e-01 +-7.35857798e-01 +-7.39527543e-01 +-7.40827989e-01 +-7.39755748e-01 +-7.36314822e-01 +-7.30518527e-01 +-7.22385094e-01 +-7.11942698e-01 +-6.99225307e-01 +-6.84274095e-01 +-6.67138732e-01 +-6.47873401e-01 +-6.26541521e-01 +-6.03211021e-01 +-5.77956897e-01 +-5.50860573e-01 +-5.22007698e-01 +-4.91491455e-01 +-4.59408018e-01 +-4.25860038e-01 +-3.90953744e-01 +-3.54799547e-01 +-3.17512305e-01 +-2.79209140e-01 +-2.40011515e-01 +-2.00042325e-01 +-1.59427628e-01 +-1.18294789e-01 +-7.67728162e-02 +-3.49917983e-02 +6.91767538e-03 +4.88247009e-02 +9.05985288e-02 +1.32109190e-01 +1.73227401e-01 +2.13825628e-01 +2.53777844e-01 +2.92960287e-01 +3.31251959e-01 +3.68534208e-01 +4.04692647e-01 +4.39615143e-01 +4.73195267e-01 +5.05328862e-01 +5.35918573e-01 +5.64869672e-01 +5.92094793e-01 +6.17510011e-01 +6.41038751e-01 +6.62609055e-01 +6.82155895e-01 +6.99620188e-01 +7.14949172e-01 +7.28097297e-01 +7.39024683e-01 +7.47699764e-01 +7.54096037e-01 +7.58196164e-01 +7.59987366e-01 +7.59466605e-01 +7.56634984e-01 +7.51503679e-01 +7.44087674e-01 +7.34412087e-01 +7.22505592e-01 +7.08406852e-01 +6.92157860e-01 +6.73810260e-01 +6.53418832e-01 +6.31047494e-01 +6.06763122e-01 +5.80641064e-01 +5.52759464e-01 +5.23204109e-01 +4.92063456e-01 +4.59432634e-01 +4.25409332e-01 +3.90096819e-01 +3.53600822e-01 +3.16031477e-01 +2.77501245e-01 +2.38125803e-01 +1.98022946e-01 +1.57312544e-01 +1.16116221e-01 +7.45566947e-02 +3.27578455e-02 +-9.15610509e-03 +-5.10606316e-02 +-9.28313628e-02 +-1.34344706e-01 +-1.75477552e-01 +-2.16108704e-01 +-2.56117828e-01 +-2.95387410e-01 +-3.33801482e-01 +-3.71247353e-01 +-4.07615040e-01 +-4.42797696e-01 +-4.76692839e-01 +-5.09200532e-01 +-5.40226990e-01 +-5.69680507e-01 +-5.97476694e-01 +-6.23533600e-01 +-6.47776585e-01 +-6.70135026e-01 +-6.90544263e-01 +-7.08946206e-01 +-7.25286737e-01 +-7.39520719e-01 +-7.51605783e-01 +-7.61509247e-01 +-7.69202035e-01 +-7.74663210e-01 +-7.77878090e-01 +-7.78837227e-01 +-7.77540385e-01 +-7.73990397e-01 +-7.68200121e-01 +-7.60186067e-01 +-7.49972636e-01 +-7.37590714e-01 +-7.23075640e-01 +-7.06471775e-01 +-6.87826180e-01 +-6.67194433e-01 +-6.44636291e-01 +-6.20216853e-01 +-5.94008090e-01 +-5.66084522e-01 +-5.36528040e-01 +-5.05423280e-01 +-4.72859801e-01 +-4.38931945e-01 +-4.03736220e-01 +-3.67374487e-01 +-3.29950385e-01 +-2.91571009e-01 +-2.52346420e-01 +-2.12387996e-01 +-1.71810117e-01 +-1.30728049e-01 +-8.92585957e-02 +-4.75196881e-02 +-5.62956486e-03 +3.62930036e-02 +7.81294327e-02 +1.19761359e-01 +1.61071453e-01 +2.01943005e-01 +2.42260968e-01 +2.81912135e-01 +3.20784611e-01 +3.58769855e-01 +3.95761145e-01 +4.31654628e-01 +4.66350738e-01 +4.99751804e-01 +5.31764997e-01 +5.62301627e-01 +5.91275819e-01 +6.18608086e-01 +6.44222430e-01 +6.68047269e-01 +6.90018087e-01 +7.10073438e-01 +7.28157994e-01 +7.44223350e-01 +7.58224312e-01 +7.70123165e-01 +7.79888407e-01 +7.87492427e-01 +7.92915869e-01 +7.96144748e-01 +7.97169779e-01 +7.95990167e-01 +7.92609777e-01 +7.87037832e-01 +7.79291876e-01 +7.69393556e-01 +7.57370228e-01 +7.43257147e-01 +7.27093239e-01 +7.08923178e-01 +6.88798879e-01 +6.66775623e-01 +6.42914100e-01 +6.17281536e-01 +5.89948157e-01 +5.60989049e-01 +5.30484994e-01 +4.98519419e-01 +4.65179834e-01 +4.30558523e-01 +3.94750021e-01 +3.57852038e-01 +3.19966039e-01 +2.81195292e-01 +2.41645279e-01 +2.01424117e-01 +1.60641210e-01 +1.19407227e-01 +7.78343038e-02 +3.60352023e-02 +-5.87691455e-03 +-4.77885428e-02 +-8.95864477e-02 +-1.31157719e-01 +-1.72390122e-01 +-2.13172789e-01 +-2.53395845e-01 +-2.92950943e-01 +-3.31732184e-01 +-3.69635550e-01 +-4.06559128e-01 +-4.42404300e-01 +-4.77075623e-01 +-5.10480054e-01 +-5.42528403e-01 +-5.73136053e-01 +-6.02221227e-01 +-6.29706270e-01 +-6.55518894e-01 +-6.79590955e-01 +-7.01858202e-01 +-7.22261916e-01 +-7.40749266e-01 +-7.57271117e-01 +-7.71783773e-01 +-7.84250061e-01 +-7.94637783e-01 +-8.02919390e-01 +-8.09073596e-01 +-8.13085803e-01 +-8.14945617e-01 +-8.14648380e-01 +-8.12196070e-01 +-8.07596493e-01 +-8.00861853e-01 +-7.92010394e-01 +-7.81067001e-01 +-7.68061240e-01 +-7.53027504e-01 +-7.36006037e-01 +-7.17043111e-01 +-6.96188888e-01 +-6.73498405e-01 +-6.49031986e-01 +-6.22855067e-01 +-5.95036402e-01 +-5.65649164e-01 +-5.34771027e-01 +-5.02483709e-01 +-4.68871688e-01 +-4.34023057e-01 +-3.98029409e-01 +-3.60985290e-01 +-3.22987323e-01 +-2.84134727e-01 +-2.44529066e-01 +-2.04273778e-01 +-1.63473535e-01 +-1.22234469e-01 +-8.06638581e-02 +-3.88696997e-02 +3.03967874e-03 +4.49556596e-02 +8.67696850e-02 +1.28373698e-01 +1.69660234e-01 +2.10522678e-01 +2.50855616e-01 +2.90555356e-01 +3.29519802e-01 +3.67648686e-01 +4.04844019e-01 +4.41010575e-01 +4.76055942e-01 +5.09890249e-01 +5.42426889e-01 +5.73582807e-01 +6.03279023e-01 +6.31439795e-01 +6.57993312e-01 +6.82872047e-01 +7.06013228e-01 +7.27358587e-01 +7.46853894e-01 +7.64449846e-01 +7.80102162e-01 +7.93772117e-01 +8.05425501e-01 +8.15033034e-01 +8.22570828e-01 +8.28020485e-01 +8.31369391e-01 +8.32609489e-01 +8.31738105e-01 +8.28758039e-01 +8.23677695e-01 +8.16511073e-01 +8.07276700e-01 +7.95998416e-01 +7.82705307e-01 +7.67431750e-01 +7.50217319e-01 +7.31105792e-01 +7.10145789e-01 +6.87390632e-01 +6.62898253e-01 +6.36731163e-01 +6.08955485e-01 +5.79641356e-01 +5.48862800e-01 +5.16697507e-01 +4.83226810e-01 +4.48534923e-01 +4.12708942e-01 +3.75838818e-01 +3.38017060e-01 +2.99338562e-01 +2.59900255e-01 +2.19800665e-01 +1.79139959e-01 +1.38019636e-01 +9.65422635e-02 +5.48112202e-02 +1.29303358e-02 +-2.89962857e-02 +-7.08644899e-02 +-1.12570352e-01 +-1.54010453e-01 +-1.95082217e-01 +-2.35684039e-01 +-2.75715526e-01 +-3.15077791e-01 +-3.53673692e-01 +-3.91408093e-01 +-4.28188242e-01 +-4.63923685e-01 +-4.98526554e-01 +-5.31911898e-01 +-5.63997832e-01 +-5.94705772e-01 +-6.23960779e-01 +-6.51691475e-01 +-6.77830109e-01 +-7.02312964e-01 +-7.25080444e-01 +-7.46077241e-01 +-7.65252515e-01 +-7.82560104e-01 +-7.97958161e-01 +-8.11409537e-01 +-8.22881919e-01 +-8.32347878e-01 +-8.39784916e-01 +-8.45175626e-01 +-8.48507694e-01 +-8.49773531e-01 +-8.48970628e-01 +-8.46101546e-01 +-8.41173890e-01 +-8.34200265e-01 +-8.25198309e-01 +-8.14190692e-01 +-8.01204659e-01 +-7.86272231e-01 +-7.69430162e-01 +-7.50719808e-01 +-7.30187017e-01 +-7.07882019e-01 +-6.83859384e-01 +-6.58177716e-01 +-6.30899431e-01 +-6.02090793e-01 +-5.71821709e-01 +-5.40165557e-01 +-5.07198990e-01 +-4.73001747e-01 +-4.37656521e-01 +-4.01248630e-01 +-3.63865798e-01 +-3.25598039e-01 +-2.86537421e-01 +-2.46777836e-01 +-2.06414768e-01 +-1.65545062e-01 +-1.24266692e-01 +-8.26785188e-02 +-4.08800204e-02 +1.02890677e-03 +4.29481835e-02 +8.47777921e-02 +1.26418018e-01 +1.67769687e-01 +2.08734401e-01 +2.49214777e-01 +2.89114709e-01 +3.28339536e-01 +3.66796272e-01 +4.04393831e-01 +4.41043259e-01 +4.76657923e-01 +5.11153720e-01 +5.44449285e-01 +5.76466154e-01 +6.07128969e-01 +6.36365701e-01 +6.64107713e-01 +6.90289918e-01 +7.14850977e-01 +7.37733439e-01 +7.58883859e-01 +7.78252926e-01 +7.95795564e-01 +8.11471038e-01 +8.25243040e-01 +8.37079777e-01 +8.46954074e-01 +8.54843347e-01 +8.60729651e-01 +8.64599778e-01 +8.66445236e-01 +8.66262294e-01 +8.64051993e-01 +8.59820077e-01 +8.53577055e-01 +8.45338085e-01 +8.35123011e-01 +8.22956236e-01 +8.08866729e-01 +7.92887928e-01 +7.75057600e-01 +7.55417782e-01 +7.34014690e-01 +7.10898604e-01 +6.86123740e-01 +6.59748122e-01 +6.31833440e-01 +6.02444900e-01 +5.71651069e-01 +5.39523710e-01 +5.06137612e-01 +4.71570411e-01 +4.35902409e-01 +3.99216384e-01 +3.61597397e-01 +3.23132582e-01 +2.83910943e-01 +2.44023152e-01 +2.03561346e-01 +1.62618899e-01 +1.21290214e-01 +7.96705037e-02 +3.78555636e-02 +-4.05844204e-03 +-4.59752051e-02 +-8.77984942e-02 +-1.29432375e-01 +-1.70781431e-01 +-2.11750979e-01 +-2.52247289e-01 +-2.92177791e-01 +-3.31451292e-01 +-3.69978180e-01 +-4.07670627e-01 +-4.44442787e-01 +-4.80210986e-01 +-5.14893910e-01 +-5.48412789e-01 +-5.80691572e-01 +-6.11657099e-01 +-6.41239259e-01 +-6.69371150e-01 +-6.95989220e-01 +-7.21033414e-01 +-7.44447303e-01 +-7.66178207e-01 +-7.86177300e-01 +-8.04399731e-01 +-8.20804717e-01 +-8.35355606e-01 +-8.48020003e-01 +-8.58769773e-01 +-8.67581170e-01 +-8.74434807e-01 +-8.79315775e-01 +-8.82213601e-01 +-8.83122297e-01 +-8.82040385e-01 +-8.78970854e-01 +-8.73921165e-01 +-8.66903235e-01 +-8.57933404e-01 +-8.47032382e-01 +-8.34225198e-01 +-8.19541141e-01 +-8.03013689e-01 +-7.84680427e-01 +-7.64582957e-01 +-7.42766800e-01 +-7.19281289e-01 +-6.94179447e-01 +-6.67517869e-01 +-6.39356593e-01 +-6.09758967e-01 +-5.78791481e-01 +-5.46523623e-01 +-5.13027745e-01 +-4.78378858e-01 +-4.42654488e-01 +-4.05934495e-01 +-3.68300881e-01 +-3.29837621e-01 +-2.90630462e-01 +-2.50766731e-01 +-2.10335150e-01 +-1.69425618e-01 +-1.28129027e-01 +-8.65370534e-02 +-4.47419500e-02 +-2.83634531e-03 +3.90869628e-02 +8.09352131e-02 +1.22615886e-01 +1.64036909e-01 +2.05106855e-01 +2.45735150e-01 +2.85832265e-01 +3.25309916e-01 +3.64081258e-01 +4.02061071e-01 +4.39165944e-01 +4.75314463e-01 +5.10427380e-01 +5.44427793e-01 +5.77241296e-01 +6.08796160e-01 +6.39023470e-01 +6.67857278e-01 +6.95234750e-01 +7.21096283e-01 +7.45385654e-01 +7.68050116e-01 +7.89040522e-01 +8.08311430e-01 +8.25821182e-01 +8.41532006e-01 +8.55410088e-01 +8.67425636e-01 +8.77552943e-01 +8.85770440e-01 +8.92060735e-01 +8.96410643e-01 +8.98811214e-01 +8.99257743e-01 +8.97749777e-01 +8.94291109e-01 +8.88889763e-01 +8.81557976e-01 +8.72312157e-01 +8.61172854e-01 +8.48164704e-01 +8.33316369e-01 +8.16660466e-01 +7.98233505e-01 +7.78075791e-01 +7.56231341e-01 +7.32747796e-01 +7.07676269e-01 +6.81071288e-01 +6.52990613e-01 +6.23495168e-01 +5.92648858e-01 +5.60518448e-01 +5.27173429e-01 +4.92685833e-01 +4.57130096e-01 +4.20582895e-01 +3.83122977e-01 +3.44830982e-01 +3.05789275e-01 +2.66081761e-01 +2.25793711e-01 +1.85011571e-01 +1.43822778e-01 +1.02315574e-01 +6.05788140e-02 +1.87017772e-02 +-2.32260333e-02 +-6.51150752e-02 +-1.06875957e-01 +-1.48419632e-01 +-1.89657585e-01 +-2.30502017e-01 +-2.70866039e-01 +-3.10663851e-01 +-3.49810917e-01 +-3.88224160e-01 +-4.25822113e-01 +-4.62525116e-01 +-4.98255452e-01 +-5.32937532e-01 +-5.66498052e-01 +-5.98866164e-01 +-6.29973599e-01 +-6.59754794e-01 +-6.88147047e-01 +-7.15090640e-01 +-7.40528967e-01 +-7.64408643e-01 +-7.86679615e-01 +-8.07295265e-01 +-8.26212500e-01 +-8.43391839e-01 +-8.58797486e-01 +-8.72397394e-01 +-8.84163405e-01 +-8.94071257e-01 +-9.02100576e-01 +-9.08234949e-01 +-9.12461963e-01 +-9.14773210e-01 +-9.15164317e-01 +-9.13634944e-01 +-9.10188768e-01 +-9.04833486e-01 +-8.97580778e-01 +-8.88446266e-01 +-8.77449585e-01 +-8.64614269e-01 +-8.49967627e-01 +-8.33540715e-01 +-8.15368300e-01 +-7.95488757e-01 +-7.73943994e-01 +-7.50779361e-01 +-7.26043552e-01 +-6.99788485e-01 +-6.72069189e-01 +-6.42943791e-01 +-6.12473302e-01 +-5.80721426e-01 +-5.47754481e-01 +-5.13641261e-01 +-4.78452887e-01 +-4.42262660e-01 +-4.05145905e-01 +-3.67179809e-01 +-3.28443256e-01 +-2.89016718e-01 +-2.48982042e-01 +-2.08422229e-01 +-1.67421299e-01 +-1.26064129e-01 +-8.44362678e-02 +-4.26237611e-02 +-7.12979198e-04 +4.12095615e-02 +8.30573702e-02 +1.24744195e-01 +1.66184188e-01 +2.07292075e-01 +2.47983321e-01 +2.88174306e-01 +3.27782502e-01 +3.66726622e-01 +4.04926773e-01 +4.42304659e-01 +4.78783837e-01 +5.14289709e-01 +5.48749711e-01 +5.82093472e-01 +6.14252952e-01 +6.45162571e-01 +6.74759328e-01 +7.02982900e-01 +7.29776013e-01 +7.55084343e-01 +7.78856561e-01 +8.01044504e-01 +8.21603256e-01 +8.40491244e-01 +8.57670315e-01 +8.73105735e-01 +8.86766614e-01 +8.98625717e-01 +9.08659319e-01 +9.16847457e-01 +9.23173886e-01 +9.27626172e-01 +9.30195603e-01 +9.30877313e-01 +9.29670617e-01 +9.26578477e-01 +9.21607598e-01 +9.14768471e-01 +9.06075349e-01 +8.95546196e-01 +8.83202588e-01 +8.69070058e-01 +8.53177783e-01 +8.35558268e-01 +8.16247471e-01 +7.95284727e-01 +7.72712652e-01 +7.48577003e-01 +7.22926862e-01 +6.95814473e-01 +6.67294757e-01 +6.37425411e-01 +6.06266799e-01 +5.73881814e-01 +5.40335721e-01 +5.05696277e-01 +4.70033442e-01 +4.33418994e-01 +3.95926573e-01 +3.57631519e-01 +3.18610723e-01 +2.78942469e-01 +2.38706457e-01 +1.97983374e-01 +1.56854760e-01 +1.15402913e-01 +7.37107281e-02 +3.18615399e-02 +-1.00610197e-02 +-5.19732569e-02 +-9.37915988e-02 +-1.35432712e-01 +-1.76813657e-01 +-2.17852033e-01 +-2.58466124e-01 +-2.98575282e-01 +-3.38099896e-01 +-3.76961528e-01 +-4.15083092e-01 +-4.52388975e-01 +-4.88805124e-01 +-5.24259627e-01 +-5.58682503e-01 +-5.92005738e-01 +-6.24163513e-01 +-6.55092306e-01 +-6.84730910e-01 +-7.13021210e-01 +-7.39907727e-01 +-7.65337611e-01 +-7.89260878e-01 +-8.11630476e-01 +-8.32402287e-01 +-8.51536082e-01 +-8.68994655e-01 +-8.84743911e-01 +-8.98753122e-01 +-9.10994851e-01 +-9.21445181e-01 +-9.30084488e-01 +-9.36896251e-01 +-9.41867423e-01 +-9.44988518e-01 +-9.46253460e-01 +-9.45660323e-01 +-9.43211166e-01 +-9.38911167e-01 +-9.32769073e-01 +-9.24797109e-01 +-9.15010978e-01 +-9.03430830e-01 +-8.90079880e-01 +-8.74984559e-01 +-8.58174615e-01 +-8.39682929e-01 +-8.19546235e-01 +-7.97804646e-01 +-7.74500882e-01 +-7.49680657e-01 +-7.23392439e-01 +-6.95687720e-01 +-6.66621313e-01 +-6.36250133e-01 +-6.04633482e-01 +-5.71832993e-01 +-5.37912527e-01 +-5.02938717e-01 +-4.66979819e-01 +-4.30105806e-01 +-3.92388352e-01 +-3.53900688e-01 +-3.14717933e-01 +-2.74916285e-01 +-2.34572944e-01 +-1.93766108e-01 +-1.52574836e-01 +-1.11079100e-01 +-6.93592688e-02 +-2.74960123e-02 +1.44297455e-02 +5.63369316e-02 +9.81445819e-02 +1.39772070e-01 +1.81139146e-01 +2.22166046e-01 +2.62773573e-01 +3.02883706e-01 +3.42419407e-01 +3.81304681e-01 +4.19464699e-01 +4.56825962e-01 +4.93317171e-01 +5.28868483e-01 +5.63411747e-01 +5.96880559e-01 +6.29210748e-01 +6.60341086e-01 +6.90212158e-01 +7.18766829e-01 +7.45950183e-01 +7.71710674e-01 +7.95999819e-01 +8.18771373e-01 +8.39981817e-01 +8.59590372e-01 +8.77560683e-01 +8.93859003e-01 +9.08454389e-01 +9.21318797e-01 +9.32427968e-01 +9.41761986e-01 +9.49303364e-01 +9.55037790e-01 +9.58954004e-01 +9.61045766e-01 +9.61309857e-01 +9.59745928e-01 +9.56356700e-01 +9.51148962e-01 +9.44133945e-01 +9.35325246e-01 +9.24739528e-01 +9.12396604e-01 +8.98321235e-01 +8.82540664e-01 +8.65084856e-01 +8.45986509e-01 +8.25282535e-01 +8.03013109e-01 +7.79220435e-01 +7.53949289e-01 +7.27247565e-01 +6.99166887e-01 +6.69760447e-01 +6.39083650e-01 +6.07194190e-01 +5.74153241e-01 +5.40023365e-01 +5.04868824e-01 +4.68755596e-01 +4.31752366e-01 +3.93929135e-01 +3.55357001e-01 +3.16108320e-01 +2.76257232e-01 +2.35878946e-01 +1.95049228e-01 +1.53844625e-01 +1.12342626e-01 +7.06212539e-02 +2.87586418e-02 +-1.31667856e-02 +-5.50764036e-02 +-9.68918009e-02 +-1.38534830e-01 +-1.79927548e-01 +-2.20992475e-01 +-2.61653194e-01 +-3.01833882e-01 +-3.41459395e-01 +-3.80455674e-01 +-4.18750588e-01 +-4.56272887e-01 +-4.92952420e-01 +-5.28720769e-01 +-5.63512215e-01 +-5.97262159e-01 +-6.29907475e-01 +-6.61387466e-01 +-6.91644730e-01 +-7.20623173e-01 +-7.48268498e-01 +-7.74529613e-01 +-7.99359047e-01 +-8.22710799e-01 +-8.44540926e-01 +-8.64809589e-01 +-8.83480495e-01 +-9.00519018e-01 +-9.15892820e-01 +-9.29574617e-01 +-9.41540164e-01 +-9.51767133e-01 +-9.60235817e-01 +-9.66932284e-01 +-9.71844871e-01 +-9.74964086e-01 +-9.76283676e-01 +-9.75803202e-01 +-9.73523864e-01 +-9.69449167e-01 +-9.63586810e-01 +-9.55949430e-01 +-9.46551046e-01 +-9.35408054e-01 +-9.22542068e-01 +-9.07977985e-01 +-8.91742242e-01 +-8.73863900e-01 +-8.54377595e-01 +-8.33319570e-01 +-8.10727862e-01 +-7.86643868e-01 +-7.61113426e-01 +-7.34183262e-01 +-7.05901951e-01 +-6.76322220e-01 +-6.45499125e-01 +-6.13488700e-01 +-5.80349043e-01 +-5.46142091e-01 +-5.10930496e-01 +-4.74778070e-01 +-4.37751145e-01 +-3.99918157e-01 +-3.61347910e-01 +-3.22110396e-01 +-2.82277920e-01 +-2.41923183e-01 +-2.01119434e-01 +-1.59941096e-01 +-1.18463496e-01 +-7.67619544e-02 +-3.49122616e-02 +7.00930699e-03 +4.89266625e-02 +9.07636732e-02 +1.32444257e-01 +1.73893017e-01 +2.15034828e-01 +2.55794756e-01 +2.96099334e-01 +3.35875832e-01 +3.75051864e-01 +4.13556526e-01 +4.51320966e-01 +4.88276729e-01 +5.24356381e-01 +5.59495876e-01 +5.93632001e-01 +6.26702297e-01 +6.58647701e-01 +6.89411613e-01 +7.18937972e-01 +7.47173116e-01 +7.74067945e-01 +7.99573906e-01 +8.23643874e-01 +8.46236316e-01 +8.67311180e-01 +8.86829372e-01 +9.04756501e-01 +9.21062028e-01 +9.35715796e-01 +9.48690920e-01 +9.59966526e-01 +9.69522095e-01 +9.77339062e-01 +9.83405788e-01 +9.87711893e-01 +9.90248086e-01 +9.91011238e-01 +9.90001470e-01 +9.87219289e-01 +9.82669798e-01 +9.76363452e-01 +9.68310678e-01 +9.58524961e-01 +9.47026424e-01 +9.33835322e-01 +9.18973727e-01 +9.02470540e-01 +8.84355552e-01 +8.64659490e-01 +8.43419098e-01 +8.20673219e-01 +7.96460986e-01 +7.70826234e-01 +7.43816112e-01 +7.15477571e-01 +6.85861005e-01 +6.55020824e-01 +6.23011050e-01 +5.89888070e-01 +5.55712414e-01 +5.20544273e-01 +4.84445344e-01 +4.47481134e-01 +4.09716946e-01 +3.71219000e-01 +3.32056611e-01 +2.92299070e-01 +2.52016172e-01 +2.11279924e-01 +1.70162389e-01 +1.28735885e-01 +8.70740143e-02 +4.52503576e-02 +3.33862000e-03 +-3.85870774e-02 +-8.04529116e-02 +-1.22184959e-01 +-1.63709664e-01 +-2.04954214e-01 +-2.45845640e-01 +-2.86312047e-01 +-3.26282837e-01 +-3.65659669e-01 +-4.04342484e-01 +-4.42299554e-01 +-4.79465898e-01 +-5.15777246e-01 +-5.51170964e-01 +-5.85586154e-01 +-6.18963724e-01 +-6.51246523e-01 +-6.82379428e-01 +-7.12309410e-01 +-7.40985651e-01 +-7.68359622e-01 +-7.94385134e-01 +-8.19018449e-01 +-8.42218334e-01 +-8.63946110e-01 +-8.84165740e-01 +-9.02843873e-01 +-9.19949881e-01 +-9.35455930e-01 +-9.49337004e-01 +-9.61570938e-01 +-9.72138468e-01 +-9.81023236e-01 +-9.88211817e-01 +-9.93693743e-01 +-9.97461501e-01 +-9.99510546e-01 +-9.99839296e-01 +-9.98449132e-01 +-9.95344384e-01 +-9.90532315e-01 +-9.84023106e-01 +-9.75829826e-01 +-9.65968401e-01 +-9.54457590e-01 +-9.41318926e-01 +-9.26576692e-01 +-9.10257863e-01 +-8.92392044e-01 +-8.73011438e-01 +-8.52150757e-01 +-8.29847165e-01 +-8.06140229e-01 +-7.81071805e-01 +-7.54685999e-01 +-7.27029071e-01 +-6.98149334e-01 +-6.68097110e-01 +-6.36924593e-01 +-6.04685776e-01 +-5.71436378e-01 +-5.37233686e-01 +-5.02136524e-01 +-4.66205103e-01 +-4.29500914e-01 +-3.92086673e-01 +-3.54026139e-01 +-3.15384058e-01 +-2.76226043e-01 +-2.36618422e-01 +-1.96628196e-01 +-1.56322853e-01 +-1.15770293e-01 +-7.50387262e-02 +-3.41964954e-02 +6.68795150e-03 +4.75462509e-02 +8.83102067e-02 +1.28911878e-01 +1.69283763e-01 +2.09358821e-01 +2.49070657e-01 +2.88353599e-01 +3.27142784e-01 +3.65374329e-01 +4.02985347e-01 +4.39914129e-01 +4.76100200e-01 +5.11484408e-01 +5.46009071e-01 +5.79617991e-01 +6.12256623e-01 +6.43872104e-01 +6.74413351e-01 +7.03831169e-01 +7.32078271e-01 +7.59109415e-01 +7.84881419e-01 +8.09353260e-01 +8.32486131e-01 +8.54243473e-01 +8.74591079e-01 +8.93497088e-01 +9.10932080e-01 +9.26869085e-01 +9.41283633e-01 +9.54153796e-01 +9.65460194e-01 +9.75186054e-01 +9.83317195e-01 +9.89842072e-01 +9.94751774e-01 +9.98040036e-01 +9.99703243e-01 +9.99740429e-01 +9.98153270e-01 +9.94946078e-01 +9.90125784e-01 +9.83701925e-01 +9.75686616e-01 +9.66094526e-01 +9.54942857e-01 +9.42251288e-01 +9.28041968e-01 +9.12339438e-01 +8.95170623e-01 +8.76564751e-01 +8.56553318e-01 +8.35170033e-01 +8.12450736e-01 +7.88433377e-01 +7.63157893e-01 +7.36666205e-01 +7.09002076e-01 +6.80211104e-01 +6.50340587e-01 +6.19439483e-01 +5.87558309e-01 +5.54749051e-01 +5.21065110e-01 +4.86561155e-01 +4.51293109e-01 +4.15317969e-01 +3.78693809e-01 +3.41479584e-01 +3.03735133e-01 +2.65520991e-01 +2.26898366e-01 +1.87928989e-01 +1.48675040e-01 +1.09199048e-01 +6.95637658e-02 +2.98321222e-02 +-9.93295406e-03 +-4.96685394e-02 +-8.93119226e-02 +-1.28800586e-01 +-1.68072426e-01 +-2.07065727e-01 +-2.45719378e-01 +-2.83972852e-01 +-3.21766406e-01 +-3.59041082e-01 +-3.95738870e-01 +-4.31802744e-01 +-4.67176782e-01 +-5.01806237e-01 +-5.35637620e-01 +-5.68618789e-01 +-6.00699011e-01 +-6.31829065e-01 +-6.61961278e-01 +-6.91049642e-01 +-7.19049826e-01 +-7.45919304e-01 +-7.71617353e-01 +-7.96105174e-01 +-8.19345886e-01 +-8.41304643e-01 +-8.61948617e-01 +-8.81247109e-01 +-8.99171530e-01 +-9.15695501e-01 +-9.30794829e-01 +-9.44447593e-01 +-9.56634127e-01 +-9.67337084e-01 +-9.76541423e-01 +-9.84234459e-01 +-9.90405845e-01 +-9.95047612e-01 +-9.98154153e-01 +-9.99722239e-01 +-9.99751014e-01 +-9.98241990e-01 +-9.95199043e-01 +-9.90628394e-01 +-9.84538606e-01 +-9.76940548e-01 +-9.67847394e-01 +-9.57274575e-01 +-9.45239774e-01 +-9.31762866e-01 +-9.16865916e-01 +-9.00573100e-01 +-8.82910707e-01 +-8.63907050e-01 +-8.43592463e-01 +-8.21999203e-01 +-7.99161442e-01 +-7.75115170e-01 +-7.49898172e-01 +-7.23549933e-01 +-6.96111605e-01 +-6.67625914e-01 +-6.38137110e-01 +-6.07690892e-01 +-5.76334323e-01 +-5.44115781e-01 +-5.11084848e-01 +-4.77292279e-01 +-4.42789860e-01 +-4.07630406e-01 +-3.71867585e-01 +-3.35555944e-01 +-2.98750705e-01 +-2.61507805e-01 +-2.23883685e-01 +-1.85935324e-01 +-1.47720044e-01 +-1.09295517e-01 +-7.07195970e-02 +-3.20502977e-02 +6.65433692e-03 +4.53363055e-02 +8.39377218e-02 +1.22400942e-01 +1.60668584e-01 +1.98683702e-01 +2.36389762e-01 +2.73730846e-01 +3.10651609e-01 +3.47097482e-01 +3.83014640e-01 +4.18350172e-01 +4.53052096e-01 +4.87069460e-01 +5.20352424e-01 +5.52852293e-01 +5.84521650e-01 +6.15314341e-01 +6.45185633e-01 +6.74092184e-01 +7.01992189e-01 +7.28845368e-01 +7.54613074e-01 +7.79258314e-01 +8.02745810e-01 +8.25042063e-01 +8.46115356e-01 +8.65935860e-01 +8.84475600e-01 +9.01708562e-01 +9.17610673e-01 +9.32159865e-01 +9.45336087e-01 +9.57121332e-01 +9.67499670e-01 +9.76457245e-01 +9.83982317e-01 +9.90065249e-01 +9.94698535e-01 +9.97876798e-01 +9.99596794e-01 +9.99857412e-01 +9.98659673e-01 +9.96006718e-01 +9.91903808e-01 +9.86358303e-01 +9.79379650e-01 +9.70979366e-01 +9.61171012e-01 +9.49970179e-01 +9.37394441e-01 +9.23463356e-01 +9.08198396e-01 +8.91622944e-01 +8.73762239e-01 +8.54643332e-01 +8.34295069e-01 +8.12747998e-01 +7.90034378e-01 +7.66188080e-01 +7.41244560e-01 +7.15240812e-01 +6.88215269e-01 +6.60207812e-01 +6.31259635e-01 +6.01413244e-01 +5.70712361e-01 +5.39201854e-01 +5.06927711e-01 +4.73936904e-01 +4.40277394e-01 +4.05998003e-01 +3.71148361e-01 +3.35778864e-01 +2.99940525e-01 +2.63684999e-01 +2.27064415e-01 +1.90131356e-01 +1.52938785e-01 +1.15539910e-01 +7.79882013e-02 +4.03372215e-02 +2.64060771e-03 +-3.50480079e-02 +-7.26751277e-02 +-1.10187373e-01 +-1.47531655e-01 +-1.84655187e-01 +-2.21505562e-01 +-2.58030884e-01 +-2.94179745e-01 +-3.29901389e-01 +-3.65145730e-01 +-3.99863416e-01 +-4.34005953e-01 +-4.67525692e-01 +-5.00375962e-01 +-5.32511108e-01 +-5.63886524e-01 +-5.94458785e-01 +-6.24185626e-01 +-6.53026047e-01 +-6.80940374e-01 +-7.07890257e-01 +-7.33838795e-01 +-7.58750528e-01 +-7.82591498e-01 +-8.05329324e-01 +-8.26933185e-01 +-8.47373919e-01 +-8.66624027e-01 +-8.84657705e-01 +-9.01450904e-01 +-9.16981328e-01 +-9.31228482e-01 +-9.44173694e-01 +-9.55800123e-01 +-9.66092798e-01 +-9.75038627e-01 +-9.82626399e-01 +-9.88846820e-01 +-9.93692500e-01 +-9.97157970e-01 +-9.99239684e-01 +-9.99936019e-01 +-9.99247271e-01 +-9.97175654e-01 +-9.93725294e-01 +-9.88902212e-01 +-9.82714320e-01 +-9.75171403e-01 +-9.66285095e-01 +-9.56068873e-01 +-9.44538025e-01 +-9.31709618e-01 +-9.17602494e-01 +-9.02237215e-01 +-8.85636041e-01 +-8.67822910e-01 +-8.48823370e-01 +-8.28664570e-01 +-8.07375214e-01 +-7.84985492e-01 +-7.61527078e-01 +-7.37033054e-01 +-7.11537857e-01 +-6.85077265e-01 +-6.57688306e-01 +-6.29409213e-01 +-6.00279407e-01 +-5.70339379e-01 +-5.39630673e-01 +-5.08195838e-01 +-4.76078318e-01 +-4.43322435e-01 +-4.09973329e-01 +-3.76076847e-01 +-3.41679534e-01 +-3.06828550e-01 +-2.71571574e-01 +-2.35956788e-01 +-2.00032792e-01 +-1.63848500e-01 +-1.27453140e-01 +-9.08961455e-02 +-5.42270704e-02 +-1.74955811e-02 +1.92486592e-02 +5.59560624e-02 +9.25771291e-02 +1.29062567e-01 +1.65363356e-01 +2.01430760e-01 +2.37216453e-01 +2.72672570e-01 +3.07751725e-01 +3.42407132e-01 +3.76592651e-01 +4.10262812e-01 +4.43372921e-01 +4.75879111e-01 +5.07738360e-01 +5.38908591e-01 +5.69348724e-01 +5.99018687e-01 +6.27879509e-01 +6.55893372e-01 +6.83023617e-01 +7.09234829e-01 +7.34492881e-01 +7.58764947e-01 +7.82019568e-01 +8.04226696e-01 +8.25357707e-01 +8.45385448e-01 +8.64284285e-01 +8.82030110e-01 +8.98600375e-01 +9.13974137e-01 +9.28132063e-01 +9.41056453e-01 +9.52731275e-01 +9.63142172e-01 +9.72276470e-01 +9.80123212e-01 +9.86673152e-01 +9.91918768e-01 +9.95854273e-01 +9.98475613e-01 +9.99780474e-01 +9.99768277e-01 +9.98440178e-01 +9.95799063e-01 +9.91849540e-01 +9.86597928e-01 +9.80052247e-01 +9.72222208e-01 +9.63119187e-01 +9.52756213e-01 +9.41147953e-01 +9.28310679e-01 +9.14262243e-01 +8.99022065e-01 +8.82611094e-01 +8.65051769e-01 +8.46368004e-01 +8.26585150e-01 +8.05729946e-01 +7.83830489e-01 +7.60916211e-01 +7.37017812e-01 +7.12167222e-01 +6.86397581e-01 +6.59743169e-01 +6.32239357e-01 +6.03922577e-01 +5.74830274e-01 +5.45000828e-01 +5.14473518e-01 +4.83288493e-01 +4.51486683e-01 +4.19109748e-01 +3.86200046e-01 +3.52800570e-01 +3.18954867e-01 +2.84706999e-01 +2.50101508e-01 +2.15183313e-01 +1.79997669e-01 +1.44590124e-01 +1.09006455e-01 +7.32925793e-02 +3.74945204e-02 +1.65836660e-03 +-3.41698266e-02 +-6.99440869e-02 +-1.05618562e-01 +-1.41147584e-01 +-1.76485756e-01 +-2.11587988e-01 +-2.46409534e-01 +-2.80906084e-01 +-3.15033814e-01 +-3.48749424e-01 +-3.82010188e-01 +-4.14774040e-01 +-4.46999607e-01 +-4.78646246e-01 +-5.09674109e-01 +-5.40044206e-01 +-5.69718436e-01 +-5.98659620e-01 +-6.26831575e-01 +-6.54199151e-01 +-6.80728264e-01 +-7.06385930e-01 +-7.31140331e-01 +-7.54960839e-01 +-7.77818043e-01 +-7.99683793e-01 +-8.20531240e-01 +-8.40334861e-01 +-8.59070481e-01 +-8.76715308e-01 +-8.93247968e-01 +-9.08648516e-01 +-9.22898458e-01 +-9.35980780e-01 +-9.47879968e-01 +-9.58582014e-01 +-9.68074434e-01 +-9.76346288e-01 +-9.83388185e-01 +-9.89192292e-01 +-9.93752340e-01 +-9.97063632e-01 +-9.99123045e-01 +-9.99929028e-01 +-9.99481604e-01 +-9.97782367e-01 +-9.94834475e-01 +-9.90642642e-01 +-9.85213135e-01 +-9.78553757e-01 +-9.70673837e-01 +-9.61584213e-01 +-9.51297224e-01 +-9.39826678e-01 +-9.27187843e-01 +-9.13397418e-01 +-8.98473523e-01 +-8.82435652e-01 +-8.65304662e-01 +-8.47102740e-01 +-8.27853379e-01 +-8.07581335e-01 +-7.86312596e-01 +-7.64074355e-01 +-7.40894975e-01 +-7.16803942e-01 +-6.91831825e-01 +-6.66010246e-01 +-6.39371843e-01 +-6.11950214e-01 +-5.83779872e-01 +-5.54896212e-01 +-5.25335470e-01 +-4.95134663e-01 +-4.64331543e-01 +-4.32964550e-01 +-4.01072779e-01 +-3.68695916e-01 +-3.35874183e-01 +-3.02648293e-01 +-2.69059407e-01 +-2.35149082e-01 +-2.00959206e-01 +-1.66531950e-01 +-1.31909720e-01 +-9.71351175e-02 +-6.22508645e-02 +-2.72997551e-02 +7.67539238e-03 +4.26317792e-02 +7.75266845e-02 +1.12317530e-01 +1.46961922e-01 +1.81417699e-01 +2.15642976e-01 +2.49596215e-01 +2.83236267e-01 +3.16522421e-01 +3.49414441e-01 +3.81872624e-01 +4.13857856e-01 +4.45331650e-01 +4.76256190e-01 +5.06594368e-01 +5.36309842e-01 +5.65367080e-01 +5.93731393e-01 +6.21368972e-01 +6.48246930e-01 +6.74333351e-01 +6.99597317e-01 +7.24008947e-01 +7.47539421e-01 +7.70161024e-01 +7.91847180e-01 +8.12572475e-01 +8.32312685e-01 +8.51044802e-01 +8.68747065e-01 +8.85398983e-01 +9.00981358e-01 +9.15476297e-01 +9.28867238e-01 +9.41138970e-01 +9.52277646e-01 +9.62270796e-01 +9.71107338e-01 +9.78777592e-01 +9.85273288e-01 +9.90587575e-01 +9.94715023e-01 +9.97651627e-01 +9.99394814e-01 +9.99943440e-01 +9.99297786e-01 +9.97459561e-01 +9.94431894e-01 +9.90219328e-01 +9.84827811e-01 +9.78264689e-01 +9.70538692e-01 +9.61659922e-01 +9.51639841e-01 +9.40491251e-01 +9.28228277e-01 +9.14866350e-01 +9.00422184e-01 +8.84913759e-01 +8.68360289e-01 +8.50782202e-01 +8.32201113e-01 +8.12639794e-01 +7.92122155e-01 +7.70673199e-01 +7.48318999e-01 +7.25086662e-01 +7.01004295e-01 +6.76100979e-01 +6.50406722e-01 +6.23952424e-01 +5.96769841e-01 +5.68891542e-01 +5.40350879e-01 +5.11181941e-01 +4.81419510e-01 +4.51099015e-01 +4.20256498e-01 +3.88928568e-01 +3.57152361e-01 +3.24965489e-01 +2.92405992e-01 +2.59512299e-01 +2.26323181e-01 +1.92877708e-01 +1.59215203e-01 +1.25375186e-01 +9.13973351e-02 +5.73214359e-02 +2.31873399e-02 +-1.09650810e-02 +-4.50959843e-02 +-7.91656080e-02 +-1.13134312e-01 +-1.46962625e-01 +-1.80611288e-01 +-2.14041297e-01 +-2.47213953e-01 +-2.80090910e-01 +-3.12634214e-01 +-3.44806344e-01 +-3.76570260e-01 +-4.07889436e-01 +-4.38727911e-01 +-4.69050329e-01 +-4.98821977e-01 +-5.28008822e-01 +-5.56577551e-01 +-5.84495602e-01 +-6.11731213e-01 +-6.38253447e-01 +-6.64032233e-01 +-6.89038394e-01 +-7.13243681e-01 +-7.36620801e-01 +-7.59143450e-01 +-7.80786345e-01 +-8.01525245e-01 +-8.21336981e-01 +-8.40199476e-01 +-8.58091773e-01 +-8.74994055e-01 +-8.90887667e-01 +-9.05755136e-01 +-9.19580186e-01 +-9.32347758e-01 +-9.44044021e-01 +-9.54656389e-01 +-9.64173532e-01 +-9.72585389e-01 +-9.79883172e-01 +-9.86059381e-01 +-9.91107804e-01 +-9.95023523e-01 +-9.97802921e-01 +-9.99443680e-01 +-9.99944785e-01 +-9.99306517e-01 +-9.97530457e-01 +-9.94619479e-01 +-9.90577742e-01 +-9.85410689e-01 +-9.79125032e-01 +-9.71728748e-01 +-9.63231062e-01 +-9.53642440e-01 +-9.42974570e-01 +-9.31240352e-01 +-9.18453877e-01 +-9.04630408e-01 +-8.89786365e-01 +-8.73939303e-01 +-8.57107886e-01 +-8.39311871e-01 +-8.20572080e-01 +-8.00910374e-01 +-7.80349628e-01 +-7.58913702e-01 +-7.36627412e-01 +-7.13516503e-01 +-6.89607618e-01 +-6.64928264e-01 +-6.39506785e-01 +-6.13372320e-01 +-5.86554774e-01 +-5.59084785e-01 +-5.30993683e-01 +-5.02313458e-01 +-4.73076722e-01 +-4.43316674e-01 +-4.13067055e-01 +-3.82362113e-01 +-3.51236564e-01 +-3.19725553e-01 +-2.87864612e-01 +-2.55689621e-01 +-2.23236768e-01 +-1.90542509e-01 +-1.57643521e-01 +-1.24576667e-01 +-9.13789489e-02 +-5.80874722e-02 +-2.47394002e-02 +8.62808580e-03 +4.19778263e-02 +7.52727277e-02 +1.08475804e-01 +1.41550215e-01 +1.74459311e-01 +2.07166668e-01 +2.39636131e-01 +2.71831854e-01 +3.03718335e-01 +3.35260458e-01 +3.66423534e-01 +3.97173335e-01 +4.27476130e-01 +4.57298727e-01 +4.86608503e-01 +5.15373440e-01 +5.43562163e-01 +5.71143969e-01 +5.98088860e-01 +6.24367582e-01 +6.49951648e-01 +6.74813371e-01 +6.98925894e-01 +7.22263215e-01 +7.44800218e-01 +7.66512697e-01 +7.87377380e-01 +8.07371956e-01 +8.26475097e-01 +8.44666478e-01 +8.61926800e-01 +8.78237806e-01 +8.93582304e-01 +9.07944180e-01 +9.21308415e-01 +9.33661100e-01 +9.44989449e-01 +9.55281814e-01 +9.64527690e-01 +9.72717729e-01 +9.79843747e-01 +9.85898732e-01 +9.90876846e-01 +9.94773434e-01 +9.97585026e-01 +9.99309335e-01 +9.99945263e-01 +9.99492898e-01 +9.97953509e-01 +9.95329548e-01 +9.91624641e-01 +9.86843584e-01 +9.80992335e-01 +9.74078009e-01 +9.66108862e-01 +9.57094285e-01 +9.47044792e-01 +9.35972003e-01 +9.23888634e-01 +9.10808478e-01 +8.96746390e-01 +8.81718268e-01 +8.65741038e-01 +8.48832627e-01 +8.31011948e-01 +8.12298876e-01 +7.92714225e-01 +7.72279724e-01 +7.51017991e-01 +7.28952508e-01 +7.06107596e-01 +6.82508384e-01 +6.58180783e-01 +6.33151458e-01 +6.07447794e-01 +5.81097870e-01 +5.54130425e-01 +5.26574827e-01 +4.98461039e-01 +4.69819588e-01 +4.40681530e-01 +4.11078418e-01 +3.81042263e-01 +3.50605503e-01 +3.19800966e-01 +2.88661836e-01 +2.57221613e-01 +2.25514083e-01 +1.93573274e-01 +1.61433426e-01 +1.29128950e-01 +9.66943919e-02 +6.41643962e-02 +3.15736686e-02 +-1.04306141e-03 +-3.36510768e-02 +-6.62157104e-02 +-9.87023817e-02 +-1.31076633e-01 +-1.63304166e-01 +-1.95350879e-01 +-2.27182900e-01 +-2.58766625e-01 +-2.90068753e-01 +-3.21056317e-01 +-3.51696726e-01 +-3.81957791e-01 +-4.11807762e-01 +-4.41215361e-01 +-4.70149815e-01 +-4.98580884e-01 +-5.26478896e-01 +-5.53814777e-01 +-5.80560077e-01 +-6.06687004e-01 +-6.32168448e-01 +-6.56978012e-01 +-6.81090036e-01 +-7.04479623e-01 +-7.27122667e-01 +-7.48995873e-01 +-7.70076783e-01 +-7.90343797e-01 +-8.09776194e-01 +-8.28354154e-01 +-8.46058776e-01 +-8.62872094e-01 +-8.78777101e-01 +-8.93757759e-01 +-9.07799016e-01 +-9.20886821e-01 +-9.33008137e-01 +-9.44150952e-01 +-9.54304293e-01 +-9.63458229e-01 +-9.71603889e-01 +-9.78733461e-01 +-9.84840203e-01 +-9.89918449e-01 +-9.93963609e-01 +-9.96972178e-01 +-9.98941731e-01 +-9.99870930e-01 +-9.99759519e-01 +-9.98608327e-01 +-9.96419262e-01 +-9.93195306e-01 +-9.88940516e-01 +-9.83660013e-01 +-9.77359977e-01 +-9.70047636e-01 +-9.61731264e-01 +-9.52420161e-01 +-9.42124651e-01 +-9.30856062e-01 +-9.18626719e-01 +-9.05449926e-01 +-8.91339950e-01 +-8.76312008e-01 +-8.60382246e-01 +-8.43567727e-01 +-8.25886403e-01 +-8.07357102e-01 +-7.87999506e-01 +-7.67834126e-01 +-7.46882286e-01 +-7.25166091e-01 +-7.02708410e-01 +-6.79532851e-01 +-6.55663730e-01 +-6.31126051e-01 +-6.05945475e-01 +-5.80148296e-01 +-5.53761411e-01 +-5.26812290e-01 +-4.99328952e-01 +-4.71339928e-01 +-4.42874239e-01 +-4.13961360e-01 +-3.84631189e-01 +-3.54914020e-01 +-3.24840509e-01 +-2.94441639e-01 +-2.63748694e-01 +-2.32793222e-01 +-2.01607002e-01 +-1.70222017e-01 +-1.38670414e-01 +-1.06984473e-01 +-7.51965784e-02 +-4.33391793e-02 +-1.14447606e-02 +2.04541915e-02 +5.23252226e-02 +8.41359428e-02 +1.15854059e-01 +1.47447410e-01 +1.78883995e-01 +2.10132008e-01 +2.41159872e-01 +2.71936266e-01 +3.02430160e-01 +3.32610843e-01 +3.62447958e-01 +3.91911528e-01 +4.20971986e-01 +4.49600208e-01 +4.77767538e-01 +5.05445818e-01 +5.32607413e-01 +5.59225244e-01 +5.85272808e-01 +6.10724208e-01 +6.35554175e-01 +6.59738097e-01 +6.83252036e-01 +7.06072760e-01 +7.28177756e-01 +7.49545259e-01 +7.70154268e-01 +7.89984568e-01 +8.09016749e-01 +8.27232224e-01 +8.44613245e-01 +8.61142922e-01 +8.76805239e-01 +8.91585063e-01 +9.05468166e-01 +9.18441233e-01 +9.30491872e-01 +9.41608632e-01 +9.51781006e-01 +9.60999443e-01 +9.69255357e-01 +9.76541132e-01 +9.82850130e-01 +9.88176694e-01 +9.92516155e-01 +9.95864833e-01 +9.98220039e-01 +9.99580077e-01 +9.99944244e-01 +9.99312831e-01 +9.97687116e-01 +9.95069369e-01 +9.91462839e-01 +9.86871759e-01 +9.81301330e-01 +9.74757726e-01 +9.67248075e-01 +9.58780457e-01 +9.49363896e-01 +9.39008343e-01 +9.27724671e-01 +9.15524660e-01 +9.02420982e-01 +8.88427193e-01 +8.73557712e-01 +8.57827811e-01 +8.41253591e-01 +8.23851975e-01 +8.05640680e-01 +7.86638207e-01 +7.66863815e-01 +7.46337503e-01 +7.25079991e-01 +7.03112696e-01 +6.80457712e-01 +6.57137785e-01 +6.33176292e-01 +6.08597214e-01 +5.83425114e-01 +5.57685112e-01 +5.31402859e-01 +5.04604509e-01 +4.77316696e-01 +4.49566506e-01 +4.21381446e-01 +3.92789424e-01 +3.63818714e-01 +3.34497931e-01 +3.04856003e-01 +2.74922140e-01 +2.44725805e-01 +2.14296690e-01 +1.83664680e-01 +1.52859825e-01 +1.21912314e-01 +9.08524416e-02 +5.97105805e-02 +2.85171502e-02 +-2.69741184e-03 +-3.39026802e-02 +-6.50682707e-02 +-9.61638706e-02 +-1.27159267e-01 +-1.58024378e-01 +-1.88729278e-01 +-2.19244232e-01 +-2.49539719e-01 +-2.79586463e-01 +-3.09355460e-01 +-3.38818009e-01 +-3.67945733e-01 +-3.96710612e-01 +-4.25085007e-01 +-4.53041686e-01 +-4.80553851e-01 +-5.07595161e-01 +-5.34139761e-01 +-5.60162301e-01 +-5.85637963e-01 +-6.10542486e-01 +-6.34852184e-01 +-6.58543969e-01 +-6.81595376e-01 +-7.03984581e-01 +-7.25690420e-01 +-7.46692411e-01 +-7.66970771e-01 +-7.86506436e-01 +-8.05281074e-01 +-8.23277107e-01 +-8.40477723e-01 +-8.56866893e-01 +-8.72429383e-01 +-8.87150771e-01 +-9.01017456e-01 +-9.14016672e-01 +-9.26136499e-01 +-9.37365870e-01 +-9.47694587e-01 +-9.57113323e-01 +-9.65613632e-01 +-9.73187956e-01 +-9.79829632e-01 +-9.85532895e-01 +-9.90292883e-01 +-9.94105641e-01 +-9.96968122e-01 +-9.98878190e-01 +-9.99834620e-01 +-9.99837098e-01 +-9.98886220e-01 +-9.96983490e-01 +-9.94131317e-01 +-9.90333012e-01 +-9.85592783e-01 +-9.79915730e-01 +-9.73307838e-01 +-9.65775973e-01 +-9.57327869e-01 +-9.47972123e-01 +-9.37718187e-01 +-9.26576353e-01 +-9.14557747e-01 +-9.01674313e-01 +-8.87938804e-01 +-8.73364766e-01 +-8.57966525e-01 +-8.41759173e-01 +-8.24758553e-01 +-8.06981240e-01 +-7.88444528e-01 +-7.69166411e-01 +-7.49165563e-01 +-7.28461322e-01 +-7.07073671e-01 +-6.85023216e-01 +-6.62331168e-01 +-6.39019320e-01 +-6.15110027e-01 +-5.90626185e-01 +-5.65591204e-01 +-5.40028993e-01 +-5.13963929e-01 +-4.87420839e-01 +-4.60424972e-01 +-4.33001978e-01 +-4.05177881e-01 +-3.76979056e-01 +-3.48432201e-01 +-3.19564313e-01 +-2.90402664e-01 +-2.60974772e-01 +-2.31308377e-01 +-2.01431414e-01 +-1.71371984e-01 +-1.41158334e-01 +-1.10818823e-01 +-8.03819001e-02 +-4.98760764e-02 +-1.93298976e-02 +1.12280818e-02 +4.17693258e-02 +7.22653428e-02 +1.02687713e-01 +1.33008113e-01 +1.63198346e-01 +1.93230362e-01 +2.23076290e-01 +2.52708459e-01 +2.82099425e-01 +3.11221998e-01 +3.40049263e-01 +3.68554608e-01 +3.96711749e-01 +4.24494748e-01 +4.51878045e-01 +4.78836474e-01 +5.05345289e-01 +5.31380188e-01 +5.56917331e-01 +5.81933363e-01 +6.06405437e-01 +6.30311231e-01 +6.53628971e-01 +6.76337447e-01 +6.98416037e-01 +7.19844719e-01 +7.40604093e-01 +7.60675397e-01 +7.80040522e-01 +7.98682029e-01 +8.16583165e-01 +8.33727876e-01 +8.50100821e-01 +8.65687385e-01 +8.80473694e-01 +8.94446621e-01 +9.07593803e-01 +9.19903649e-01 +9.31365349e-01 +9.41968882e-01 +9.51705028e-01 +9.60565370e-01 +9.68542305e-01 +9.75629048e-01 +9.81819637e-01 +9.87108936e-01 +9.91492643e-01 +9.94967287e-01 +9.97530235e-01 +9.99179690e-01 +9.99914692e-01 +9.99735118e-01 +9.98641685e-01 +9.96635938e-01 +9.93720260e-01 +9.89897858e-01 +9.85172766e-01 +9.79549835e-01 +9.73034732e-01 +9.65633931e-01 +9.57354706e-01 +9.48205126e-01 +9.38194041e-01 +9.27331079e-01 +9.15626632e-01 +9.03091848e-01 +8.89738618e-01 +8.75579565e-01 +8.60628030e-01 +8.44898063e-01 +8.28404404e-01 +8.11162473e-01 +7.93188351e-01 +7.74498770e-01 +7.55111090e-01 +7.35043290e-01 +7.14313945e-01 +6.92942209e-01 +6.70947801e-01 +6.48350981e-01 +6.25172534e-01 +6.01433751e-01 +5.77156408e-01 +5.52362744e-01 +5.27075444e-01 +5.01317615e-01 +4.75112766e-01 +4.48484786e-01 +4.21457922e-01 +3.94056753e-01 +3.66306176e-01 +3.38231373e-01 +3.09857797e-01 +2.81211140e-01 +2.52317319e-01 +2.23202444e-01 +1.93892800e-01 +1.64414820e-01 +1.34795063e-01 +1.05060190e-01 +7.52369363e-02 +4.53520911e-02 +1.54324728e-02 +-1.44950956e-02 +-4.44038101e-02 +-7.42669104e-02 +-1.04057703e-01 +-1.33749584e-01 +-1.63316065e-01 +-1.92730796e-01 +-2.21967586e-01 +-2.51000433e-01 +-2.79803540e-01 +-3.08351339e-01 +-3.36618517e-01 +-3.64580036e-01 +-3.92211153e-01 +-4.19487444e-01 +-4.46384826e-01 +-4.72879574e-01 +-4.98948348e-01 +-5.24568208e-01 +-5.49716636e-01 +-5.74371554e-01 +-5.98511345e-01 +-6.22114872e-01 +-6.45161491e-01 +-6.67631075e-01 +-6.89504027e-01 +-7.10761299e-01 +-7.31384406e-01 +-7.51355445e-01 +-7.70657107e-01 +-7.89272692e-01 +-8.07186125e-01 +-8.24381966e-01 +-8.40845424e-01 +-8.56562373e-01 +-8.71519355e-01 +-8.85703601e-01 +-8.99103036e-01 +-9.11706289e-01 +-9.23502700e-01 +-9.34482335e-01 +-9.44635988e-01 +-9.53955189e-01 +-9.62432211e-01 +-9.70060077e-01 +-9.76832565e-01 +-9.82744210e-01 +-9.87790311e-01 +-9.91966931e-01 +-9.95270902e-01 +-9.97699826e-01 +-9.99252075e-01 +-9.99926793e-01 +-9.99723893e-01 +-9.98644061e-01 +-9.96688749e-01 +-9.93860175e-01 +-9.90161322e-01 +-9.85595930e-01 +-9.80168495e-01 +-9.73884264e-01 +-9.66749227e-01 +-9.58770114e-01 +-9.49954386e-01 +-9.40310226e-01 +-9.29846536e-01 +-9.18572922e-01 +-9.06499690e-01 +-8.93637831e-01 +-8.79999017e-01 +-8.65595585e-01 +-8.50440526e-01 +-8.34547473e-01 +-8.17930689e-01 +-8.00605054e-01 +-7.82586050e-01 +-7.63889746e-01 +-7.44532787e-01 +-7.24532377e-01 +-7.03906261e-01 +-6.82672710e-01 +-6.60850507e-01 +-6.38458926e-01 +-6.15517716e-01 +-5.92047085e-01 +-5.68067682e-01 +-5.43600577e-01 +-5.18667242e-01 +-4.93289532e-01 +-4.67489666e-01 +-4.41290206e-01 +-4.14714039e-01 +-3.87784355e-01 +-3.60524630e-01 +-3.32958604e-01 +-3.05110256e-01 +-2.77003787e-01 +-2.48663598e-01 +-2.20114266e-01 +-1.91380527e-01 +-1.62487254e-01 +-1.33459432e-01 +-1.04322141e-01 +-7.51005315e-02 +-4.58197989e-02 +-1.65051676e-02 +1.28181330e-02 +4.21248899e-02 +7.13899274e-02 +1.00588127e-01 +1.29694453e-01 +1.58683972e-01 +1.87531878e-01 +2.16213505e-01 +2.44704357e-01 +2.72980121e-01 +3.01016692e-01 +3.28790191e-01 +3.56276987e-01 +3.83453719e-01 +4.10297314e-01 +4.36785003e-01 +4.62894345e-01 +4.88603239e-01 +5.13889947e-01 +5.38733115e-01 +5.63111788e-01 +5.87005425e-01 +6.10393919e-01 +6.33257613e-01 +6.55577314e-01 +6.77334309e-01 +6.98510383e-01 +7.19087835e-01 +7.39049488e-01 +7.58378706e-01 +7.77059406e-01 +7.95076071e-01 +8.12413758e-01 +8.29058122e-01 +8.44995416e-01 +8.60212508e-01 +8.74696889e-01 +8.88436683e-01 +9.01420655e-01 +9.13638221e-01 +9.21600117e-01 +9.06598683e-01 +8.84977766e-01 +8.60491908e-01 +8.33400490e-01 +8.03964080e-01 +7.72439460e-01 +7.39075357e-01 +7.04108996e-01 +6.67763293e-01 +6.30244788e-01 +5.91742253e-01 +5.52425847e-01 +5.12446805e-01 +4.71937572e-01 +4.31012290e-01 +3.89767573e-01 +3.48283469e-01 +3.06624530e-01 +2.64840806e-01 +2.22968419e-01 +1.81028725e-01 +1.39022002e-01 +9.68916163e-02 +5.41204844e-02 +2.70602422e-02 +0.00000000e+00 +-0.00000000e+00 +-1.24470142e-05 +-2.63184500e-05 +-3.97295213e-05 +-5.30856936e-05 +-6.64250519e-05 +-7.97569147e-05 +-9.30847457e-05 +-1.06410146e-04 +-1.19733962e-04 +-1.33056687e-04 +-1.46378628e-04 +-1.59699985e-04 +-1.73020895e-04 +-1.86341457e-04 +-1.99661741e-04 +-2.12981800e-04 +-2.26301674e-04 +-2.39621394e-04 +-2.52940985e-04 +-2.66260466e-04 +-2.79579853e-04 +-2.92899159e-04 +-3.06218395e-04 +-3.16759589e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17584985e-04 +-3.10422511e-04 +-2.97103293e-04 +-2.83784010e-04 +-2.70464650e-04 +-2.57145200e-04 +-2.43825645e-04 +-2.30505968e-04 +-2.17186146e-04 +-2.03866150e-04 +-1.90545942e-04 +-1.77225474e-04 +-1.63904683e-04 +-1.50583479e-04 +-1.37261741e-04 +-1.23939291e-04 +-1.10615861e-04 +-9.72910306e-05 +-8.39640919e-05 +-7.06337512e-05 +-5.72973432e-05 +-4.39482617e-05 +-3.05637079e-05 +-1.69694118e-05 +-8.48470589e-06 +-0.00000000e+00 +0.00000000e+00 +6.60950883e-03 +3.98860155e-02 +7.18446490e-02 +8.75483750e-02 +8.55736464e-02 +6.72426990e-02 +3.63143010e-02 +-2.37996636e-03 +-4.39658627e-02 +-8.41267001e-02 +-1.19378529e-01 +-1.47150103e-01 +-1.65758319e-01 +-1.74330710e-01 +-1.72702447e-01 +-1.61302504e-01 +-1.41037079e-01 +-1.13177036e-01 +-7.92500710e-02 +-4.09427032e-02 +-1.17695239e-05 +4.17930314e-02 +8.27950981e-02 +1.21445430e-01 +1.56365786e-01 +1.86381060e-01 +2.10541393e-01 +2.28134963e-01 +2.38692204e-01 +2.41982557e-01 +2.38004675e-01 +2.26971159e-01 +2.09288806e-01 +1.85535421e-01 +1.56434055e-01 +1.22825629e-01 +8.56407277e-02 +4.58713195e-02 +4.54306185e-03 +-3.73112615e-02 +-7.86765268e-02 +-1.18578230e-01 +-1.56102732e-01 +-1.90415199e-01 +-2.20774469e-01 +-2.46545215e-01 +-2.67207050e-01 +-2.82360811e-01 +-2.91732001e-01 +-2.95171511e-01 +-2.92653875e-01 +-2.84273162e-01 +-2.70236799e-01 +-2.50857528e-01 +-2.26543825e-01 +-1.97788962e-01 +-1.65159032e-01 +-1.29280277e-01 +-9.08258146e-02 +-5.05022237e-02 +-9.03605188e-03 +3.28393885e-02 +7.43968231e-02 +1.14927176e-01 +1.53750940e-01 +1.90228615e-01 +2.23770079e-01 +2.53842787e-01 +2.79978864e-01 +3.01780709e-01 +3.18925445e-01 +3.31168131e-01 +3.38343280e-01 +3.40365791e-01 +3.37229937e-01 +3.29007687e-01 +3.15845751e-01 +2.97961645e-01 +2.75638869e-01 +2.49221400e-01 +2.19107263e-01 +1.85741835e-01 +1.49610431e-01 +1.11230761e-01 +7.11450335e-02 +2.99120603e-02 +-1.19007217e-02 +-5.37250318e-02 +-9.49993804e-02 +-1.35176351e-01 +-1.73729531e-01 +-2.10159974e-01 +-2.44002097e-01 +-2.74829034e-01 +-3.02257349e-01 +-3.25951074e-01 +-3.45625028e-01 +-3.61047473e-01 +-3.72041967e-01 +-3.78488586e-01 +-3.80324346e-01 +-3.77543021e-01 +-3.70194091e-01 +-3.58381445e-01 +-3.42260927e-01 +-3.22037802e-01 +-2.97963539e-01 +-2.70332000e-01 +-2.39475423e-01 +-2.05759976e-01 +-1.69581038e-01 +-1.31358245e-01 +-9.15303636e-02 +-5.05500664e-02 +-8.87872642e-03 +3.30188630e-02 +7.46796459e-02 +1.15647321e-01 +1.55477244e-01 +1.93740979e-01 +2.30030777e-01 +2.63963515e-01 +2.95184485e-01 +3.23370723e-01 +3.48233895e-01 +3.69522927e-01 +3.87025971e-01 +4.00572137e-01 +4.10032704e-01 +4.15321687e-01 +4.16396480e-01 +4.13257259e-01 +4.05946816e-01 +3.94549390e-01 +3.79189165e-01 +3.60028831e-01 +3.37267257e-01 +3.11137079e-01 +2.81902131e-01 +2.49854464e-01 +2.15311087e-01 +1.78610658e-01 +1.40110047e-01 +1.00180662e-01 +5.92047402e-02 +1.75716540e-02 +-2.43258327e-02 +-6.60952742e-02 +-1.07348170e-01 +-1.47703531e-01 +-1.86791286e-01 +-2.24255540e-01 +-2.59757666e-01 +-2.92979172e-01 +-3.23624370e-01 +-3.51422752e-01 +-3.76131160e-01 +-3.97535626e-01 +-4.15452974e-01 +-4.29732086e-01 +-4.40254894e-01 +-4.46937051e-01 +-4.49728304e-01 +-4.48612588e-01 +-4.43607779e-01 +-4.34765200e-01 +-4.22168829e-01 +-4.05934235e-01 +-3.86207271e-01 +-3.63162526e-01 +-3.37001564e-01 +-3.07950973e-01 +-2.76260216e-01 +-2.42199281e-01 +-2.06056254e-01 +-1.68134761e-01 +-1.28751350e-01 +-8.82327286e-02 +-4.69129722e-02 +-5.13076709e-03 +3.67733693e-02 +7.84599036e-02 +1.19592975e-01 +1.59843043e-01 +1.98889550e-01 +2.36423276e-01 +2.72148672e-01 +3.05786313e-01 +3.37074614e-01 +3.65771874e-01 +3.91658186e-01 +4.14536413e-01 +4.34234197e-01 +4.50604566e-01 +4.63526917e-01 +4.72908114e-01 +4.78682168e-01 +4.80811524e-01 +4.79286035e-01 +4.74123753e-01 +4.65369778e-01 +4.53096296e-01 +4.37401323e-01 +4.18408150e-01 +3.96263859e-01 +3.71138401e-01 +3.43222707e-01 +3.12727652e-01 +2.79881691e-01 +2.44929763e-01 +2.08130639e-01 +1.69755575e-01 +1.30085764e-01 +8.94104793e-02 +4.80248844e-02 +6.22776732e-03 +-3.56804941e-02 +-7.74001907e-02 +-1.18634330e-01 +-1.59090831e-01 +-1.98484405e-01 +-2.36538598e-01 +-2.72987771e-01 +-3.07578605e-01 +-3.40071977e-01 +-3.70244623e-01 +-3.97890242e-01 +-4.22820964e-01 +-4.44868693e-01 +-4.63885862e-01 +-4.79746244e-01 +-4.92345899e-01 +-5.01603669e-01 +-5.07461420e-01 +-5.09884286e-01 +-5.08860818e-01 +-5.04402978e-01 +-4.96545718e-01 +-4.85346588e-01 +-4.70885258e-01 +-4.53262802e-01 +-4.32601015e-01 +-4.09041202e-01 +-3.82743262e-01 +-3.53884472e-01 +-3.22658215e-01 +-2.89272607e-01 +-2.53949030e-01 +-2.16920571e-01 +-1.78430445e-01 +-1.38730347e-01 +-9.80787742e-02 +-5.67393169e-02 +-1.49789216e-02 +2.69338407e-02 +6.87305029e-02 +1.10144414e-01 +1.50912422e-01 +1.90776520e-01 +2.29485440e-01 +2.66796202e-01 +3.02475580e-01 +3.36301509e-01 +3.68064399e-01 +3.97568365e-01 +4.24632359e-01 +4.49091199e-01 +4.70796488e-01 +4.89617430e-01 +5.05441521e-01 +5.18175124e-01 +5.27743931e-01 +5.34093285e-01 +5.37188408e-01 +5.37014468e-01 +5.33576561e-01 +5.26899553e-01 +5.17027805e-01 +5.04024787e-01 +4.87972590e-01 +4.68971297e-01 +4.47138301e-01 +4.22607498e-01 +3.95528351e-01 +3.66064949e-01 +3.34394951e-01 +3.00708414e-01 +2.65206629e-01 +2.28100866e-01 +1.89611084e-01 +1.49964582e-01 +1.09394611e-01 +6.81390039e-02 +2.64387428e-02 +-1.54634375e-02 +-5.73244648e-02 +-9.89023385e-02 +-1.39957538e-01 +-1.80254377e-01 +-2.19562318e-01 +-2.57657255e-01 +-2.94322759e-01 +-3.29351337e-01 +-3.62545518e-01 +-3.93718871e-01 +-4.22696990e-01 +-4.49318456e-01 +-4.73435809e-01 +-4.94916117e-01 +-5.13641600e-01 +-5.29510248e-01 +-5.42436551e-01 +-5.52351692e-01 +-5.59203654e-01 +-5.62957546e-01 +-5.63596051e-01 +-5.61119059e-01 +-5.55543424e-01 +-5.46903055e-01 +-5.35248936e-01 +-5.20648107e-01 +-5.03183363e-01 +-4.82953245e-01 +-4.60070981e-01 +-4.34663541e-01 +-4.06871467e-01 +-3.76847896e-01 +-3.44757176e-01 +-3.10774479e-01 +-2.75084793e-01 +-2.37881349e-01 +-1.99365090e-01 +-1.59743451e-01 +-1.19228885e-01 +-7.80381501e-02 +-3.63908882e-02 +5.49155787e-03 +4.73871938e-02 +8.90746894e-02 +1.30334387e-01 +1.70949686e-01 +2.10707832e-01 +2.49401321e-01 +2.86828885e-01 +3.22796151e-01 +3.57117452e-01 +3.89615653e-01 +4.20124011e-01 +4.48486472e-01 +4.74558244e-01 +4.98207438e-01 +5.19314073e-01 +5.37772662e-01 +5.53490549e-01 +5.66390260e-01 +5.76408336e-01 +5.83496458e-01 +5.87621449e-01 +5.88764860e-01 +5.86924111e-01 +5.82110820e-01 +5.74352662e-01 +5.63690893e-01 +5.50182534e-01 +5.33897437e-01 +5.14920501e-01 +4.93348564e-01 +4.69292413e-01 +4.42873719e-01 +4.14226707e-01 +3.83495256e-01 +3.50834132e-01 +3.16406411e-01 +2.80384129e-01 +2.42946200e-01 +2.04278377e-01 +1.64571765e-01 +1.24022091e-01 +8.28287566e-02 +4.11936393e-02 +-6.79625677e-04 +-4.25868819e-02 +-8.43243328e-02 +-1.25689490e-01 +-1.66482291e-01 +-2.06505932e-01 +-2.45567733e-01 +-2.83480469e-01 +-3.20062428e-01 +-3.55139349e-01 +-3.88544168e-01 +-4.20118399e-01 +-4.49713021e-01 +-4.77188141e-01 +-5.02415162e-01 +-5.25275878e-01 +-5.45663677e-01 +-5.63484532e-01 +-5.78655812e-01 +-5.91108416e-01 +-6.00786075e-01 +-6.07645108e-01 +-6.11656180e-01 +-6.12802693e-01 +-6.11081370e-01 +-6.06503174e-01 +-5.99091535e-01 +-5.88883143e-01 +-5.75928302e-01 +-5.60289052e-01 +-5.42039997e-01 +-5.21268162e-01 +-4.98071270e-01 +-4.72558185e-01 +-4.44848648e-01 +-4.15071630e-01 +-3.83365335e-01 +-3.49876890e-01 +-3.14760873e-01 +-2.78178836e-01 +-2.40298911e-01 +-2.01294661e-01 +-1.61344160e-01 +-1.20629490e-01 +-7.93358255e-02 +-3.76503772e-02 +4.23826810e-03 +4.61410183e-02 +8.78692251e-02 +1.29235439e-01 +1.70054233e-01 +2.10143155e-01 +2.49323460e-01 +2.87420763e-01 +3.24265918e-01 +3.59695905e-01 +3.93554341e-01 +4.25692028e-01 +4.55967754e-01 +4.84249040e-01 +5.10412553e-01 +5.34344372e-01 +5.55940679e-01 +5.75108245e-01 +5.91764913e-01 +6.05839507e-01 +6.17272246e-01 +6.26015080e-01 +6.32031912e-01 +6.35298720e-01 +6.35803268e-01 +6.33545364e-01 +6.28536808e-01 +6.20801391e-01 +6.10374720e-01 +5.97303826e-01 +5.81646962e-01 +5.63473441e-01 +5.42863275e-01 +5.19906825e-01 +4.94704318e-01 +4.67365266e-01 +4.38008088e-01 +4.06759577e-01 +3.73754325e-01 +3.39134144e-01 +3.03047405e-01 +2.65648327e-01 +2.27096362e-01 +1.87555499e-01 +1.47193567e-01 +1.06181503e-01 +6.46926183e-02 +2.29018587e-02 +-1.90149486e-02 +-6.08818228e-02 +-1.02523360e-01 +-1.43765470e-01 +-1.84436096e-01 +-2.24365931e-01 +-2.63389109e-01 +-3.01343895e-01 +-3.38073340e-01 +-3.73425903e-01 +-4.07256052e-01 +-4.39424862e-01 +-4.69800557e-01 +-4.98259037e-01 +-5.24684359e-01 +-5.48969185e-01 +-5.71015192e-01 +-5.90733449e-01 +-6.08044746e-01 +-6.22879891e-01 +-6.35179948e-01 +-6.44896446e-01 +-6.51991533e-01 +-6.56438107e-01 +-6.58219884e-01 +-6.57331425e-01 +-6.53778135e-01 +-6.47576183e-01 +-6.38752420e-01 +-6.27344225e-01 +-6.13399320e-01 +-5.96975543e-01 +-5.78140585e-01 +-5.56971684e-01 +-5.33555281e-01 +-5.07986646e-01 +-4.80369471e-01 +-4.50815420e-01 +-4.19443661e-01 +-3.86380374e-01 +-3.51758219e-01 +-3.15715777e-01 +-2.78397016e-01 +-2.39950654e-01 +-2.00529600e-01 +-1.60290313e-01 +-1.19392171e-01 +-7.79968455e-02 +-3.62676522e-02 +5.63109717e-03 +4.75347428e-02 +8.92789227e-02 +1.30700215e-01 +1.71636772e-01 +2.11928955e-01 +2.51419946e-01 +2.89956336e-01 +3.27388741e-01 +3.63572336e-01 +3.98367434e-01 +4.31639980e-01 +4.63262082e-01 +4.93112466e-01 +5.21076930e-01 +5.47048760e-01 +5.70929125e-01 +5.92627422e-01 +6.12061605e-01 +6.29158471e-01 +6.43853914e-01 +6.56093139e-01 +6.65830850e-01 +6.73031402e-01 +6.77668887e-01 +6.79727206e-01 +6.79200108e-01 +6.76091179e-01 +6.70413794e-01 +6.62191048e-01 +6.51455627e-01 +6.38249661e-01 +6.22624535e-01 +6.04640663e-01 +5.84367246e-01 +5.61882003e-01 +5.37270819e-01 +5.10627394e-01 +4.82052875e-01 +4.51655462e-01 +4.19549981e-01 +3.85857431e-01 +3.50704522e-01 +3.14223177e-01 +2.76550056e-01 +2.37826017e-01 +1.98195544e-01 +1.57806222e-01 +1.16808191e-01 +7.53535797e-02 +3.35959406e-02 +-8.31031672e-03 +-5.02105006e-02 +-9.19502289e-02 +-1.33375986e-01 +-1.74335678e-01 +-2.14679178e-01 +-2.54258870e-01 +-2.92930174e-01 +-3.30552116e-01 +-3.66987843e-01 +-4.02105043e-01 +-4.35776408e-01 +-4.67880113e-01 +-4.98300212e-01 +-5.26927096e-01 +-5.53657988e-01 +-5.78397076e-01 +-6.01055890e-01 +-6.21553607e-01 +-6.39817296e-01 +-6.55782304e-01 +-6.69392540e-01 +-6.80600339e-01 +-6.89366676e-01 +-6.95661359e-01 +-6.99463061e-01 +-7.00759759e-01 +-6.99548272e-01 +-6.95834294e-01 +-6.89632390e-01 +-6.80965932e-01 +-6.69867374e-01 +-6.56377702e-01 +-6.40546156e-01 +-6.22430162e-01 +-6.02095146e-01 +-5.79614657e-01 +-5.55069548e-01 +-5.28547686e-01 +-5.00143728e-01 +-4.69958947e-01 +-4.38100966e-01 +-4.04682855e-01 +-3.69822924e-01 +-3.33644357e-01 +-2.96275032e-01 +-2.57846675e-01 +-2.18494379e-01 +-1.78356256e-01 +-1.37573089e-01 +-9.62876705e-02 +-5.46441963e-02 +-1.27879142e-02 +2.91353549e-02 +7.09798443e-02 +1.12600323e-01 +1.53852487e-01 +1.94593543e-01 +2.34682847e-01 +2.73982128e-01 +3.12355916e-01 +3.49672303e-01 +3.85803423e-01 +4.20625428e-01 +4.54018975e-01 +4.85870281e-01 +5.16071013e-01 +5.44518276e-01 +5.71115293e-01 +5.95772489e-01 +6.18406591e-01 +6.38940966e-01 +6.57306764e-01 +6.73442969e-01 +6.87295526e-01 +6.98818093e-01 +7.07973390e-01 +7.14731538e-01 +7.19070297e-01 +7.20976527e-01 +7.20445432e-01 +7.17479549e-01 +7.12089947e-01 +7.04296766e-01 +6.94127152e-01 +6.81616035e-01 +6.66807416e-01 +6.49752089e-01 +6.30507798e-01 +6.09140731e-01 +5.85723635e-01 +5.60335249e-01 +5.33061775e-01 +5.03995484e-01 +4.73233635e-01 +4.40879807e-01 +4.07042771e-01 +3.71835299e-01 +3.35375182e-01 +2.97784283e-01 +2.59187393e-01 +2.19712979e-01 +1.79492223e-01 +1.38658164e-01 +9.73460664e-02 +5.56924630e-02 +1.38346729e-02 +-2.80893279e-02 +-6.99416970e-02 +-1.11584884e-01 +-1.52882382e-01 +-1.93699001e-01 +-2.33901033e-01 +-2.73357523e-01 +-3.11939711e-01 +-3.49521784e-01 +-3.85982092e-01 +-4.21201874e-01 +-4.55067122e-01 +-4.87468728e-01 +-5.18301333e-01 +-5.47466230e-01 +-5.74869521e-01 +-6.00422633e-01 +-6.24044710e-01 +-6.45659461e-01 +-6.65198184e-01 +-6.82599374e-01 +-6.97806795e-01 +-7.10773640e-01 +-7.21458680e-01 +-7.29828317e-01 +-7.35857798e-01 +-7.39527543e-01 +-7.40827989e-01 +-7.39755748e-01 +-7.36314822e-01 +-7.30518527e-01 +-7.22385094e-01 +-7.11942698e-01 +-6.99225307e-01 +-6.84274095e-01 +-6.67138732e-01 +-6.47873401e-01 +-6.26541521e-01 +-6.03211021e-01 +-5.77956897e-01 +-5.50860573e-01 +-5.22007698e-01 +-4.91491455e-01 +-4.59408018e-01 +-4.25860038e-01 +-3.90953744e-01 +-3.54799547e-01 +-3.17512305e-01 +-2.79209140e-01 +-2.40011515e-01 +-2.00042325e-01 +-1.59427628e-01 +-1.18294789e-01 +-7.67728162e-02 +-3.49917983e-02 +6.91767538e-03 +4.88247009e-02 +9.05985288e-02 +1.32109190e-01 +1.73227401e-01 +2.13825628e-01 +2.53777844e-01 +2.92960287e-01 +3.31251959e-01 +3.68534208e-01 +4.04692647e-01 +4.39615143e-01 +4.73195267e-01 +5.05328862e-01 +5.35918573e-01 +5.64869672e-01 +5.92094793e-01 +6.17510011e-01 +6.41038751e-01 +6.62609055e-01 +6.82155895e-01 +6.99620188e-01 +7.14949172e-01 +7.28097297e-01 +7.39024683e-01 +7.47699764e-01 +7.54096037e-01 +7.58196164e-01 +7.59987366e-01 +7.59466605e-01 +7.56634984e-01 +7.51503679e-01 +7.44087674e-01 +7.34412087e-01 +7.22505592e-01 +7.08406852e-01 +6.92157860e-01 +6.73810260e-01 +6.53418832e-01 +6.31047494e-01 +6.06763122e-01 +5.80641064e-01 +5.52759464e-01 +5.23204109e-01 +4.92063456e-01 +4.59432634e-01 +4.25409332e-01 +3.90096819e-01 +3.53600822e-01 +3.16031477e-01 +2.77501245e-01 +2.38125803e-01 +1.98022946e-01 +1.57312544e-01 +1.16116221e-01 +7.45566947e-02 +3.27578455e-02 +-9.15610509e-03 +-5.10606316e-02 +-9.28313628e-02 +-1.34344706e-01 +-1.75477552e-01 +-2.16108704e-01 +-2.56117828e-01 +-2.95387410e-01 +-3.33801482e-01 +-3.71247353e-01 +-4.07615040e-01 +-4.42797696e-01 +-4.76692839e-01 +-5.09200532e-01 +-5.40226990e-01 +-5.69680507e-01 +-5.97476694e-01 +-6.23533600e-01 +-6.47776585e-01 +-6.70135026e-01 +-6.90544263e-01 +-7.08946206e-01 +-7.25286737e-01 +-7.39520719e-01 +-7.51605783e-01 +-7.61509247e-01 +-7.69202035e-01 +-7.74663210e-01 +-7.77878090e-01 +-7.78837227e-01 +-7.77540385e-01 +-7.73990397e-01 +-7.68200121e-01 +-7.60186067e-01 +-7.49972636e-01 +-7.37590714e-01 +-7.23075640e-01 +-7.06471775e-01 +-6.87826180e-01 +-6.67194433e-01 +-6.44636291e-01 +-6.20216853e-01 +-5.94008090e-01 +-5.66084522e-01 +-5.36528040e-01 +-5.05423280e-01 +-4.72859801e-01 +-4.38931945e-01 +-4.03736220e-01 +-3.67374487e-01 +-3.29950385e-01 +-2.91571009e-01 +-2.52346420e-01 +-2.12387996e-01 +-1.71810117e-01 +-1.30728049e-01 +-8.92585957e-02 +-4.75196881e-02 +-5.62956486e-03 +3.62930036e-02 +7.81294327e-02 +1.19761359e-01 +1.61071453e-01 +2.01943005e-01 +2.42260968e-01 +2.81912135e-01 +3.20784611e-01 +3.58769855e-01 +3.95761145e-01 +4.31654628e-01 +4.66350738e-01 +4.99751804e-01 +5.31764997e-01 +5.62301627e-01 +5.91275819e-01 +6.18608086e-01 +6.44222430e-01 +6.68047269e-01 +6.90018087e-01 +7.10073438e-01 +7.28157994e-01 +7.44223350e-01 +7.58224312e-01 +7.70123165e-01 +7.79888407e-01 +7.87492427e-01 +7.92915869e-01 +7.96144748e-01 +7.97169779e-01 +7.95990167e-01 +7.92609777e-01 +7.87037832e-01 +7.79291876e-01 +7.69393556e-01 +7.57370228e-01 +7.43257147e-01 +7.27093239e-01 +7.08923178e-01 +6.88798879e-01 +6.66775623e-01 +6.42914100e-01 +6.17281536e-01 +5.89948157e-01 +5.60989049e-01 +5.30484994e-01 +4.98519419e-01 +4.65179834e-01 +4.30558523e-01 +3.94750021e-01 +3.57852038e-01 +3.19966039e-01 +2.81195292e-01 +2.41645279e-01 +2.01424117e-01 +1.60641210e-01 +1.19407227e-01 +7.78343038e-02 +3.60352023e-02 +-5.87691455e-03 +-4.77885428e-02 +-8.95864477e-02 +-1.31157719e-01 +-1.72390122e-01 +-2.13172789e-01 +-2.53395845e-01 +-2.92950943e-01 +-3.31732184e-01 +-3.69635550e-01 +-4.06559128e-01 +-4.42404300e-01 +-4.77075623e-01 +-5.10480054e-01 +-5.42528403e-01 +-5.73136053e-01 +-6.02221227e-01 +-6.29706270e-01 +-6.55518894e-01 +-6.79590955e-01 +-7.01858202e-01 +-7.22261916e-01 +-7.40749266e-01 +-7.57271117e-01 +-7.71783773e-01 +-7.84250061e-01 +-7.94637783e-01 +-8.02919390e-01 +-8.09073596e-01 +-8.13085803e-01 +-8.14945617e-01 +-8.14648380e-01 +-8.12196070e-01 +-8.07596493e-01 +-8.00861853e-01 +-7.92010394e-01 +-7.81067001e-01 +-7.68061240e-01 +-7.53027504e-01 +-7.36006037e-01 +-7.17043111e-01 +-6.96188888e-01 +-6.73498405e-01 +-6.49031986e-01 +-6.22855067e-01 +-5.95036402e-01 +-5.65649164e-01 +-5.34771027e-01 +-5.02483709e-01 +-4.68871688e-01 +-4.34023057e-01 +-3.98029409e-01 +-3.60985290e-01 +-3.22987323e-01 +-2.84134727e-01 +-2.44529066e-01 +-2.04273778e-01 +-1.63473535e-01 +-1.22234469e-01 +-8.06638581e-02 +-3.88696997e-02 +3.03967874e-03 +4.49556596e-02 +8.67696850e-02 +1.28373698e-01 +1.69660234e-01 +2.10522678e-01 +2.50855616e-01 +2.90555356e-01 +3.29519802e-01 +3.67648686e-01 +4.04844019e-01 +4.41010575e-01 +4.76055942e-01 +5.09890249e-01 +5.42426889e-01 +5.73582807e-01 +6.03279023e-01 +6.31439795e-01 +6.57993312e-01 +6.82872047e-01 +7.06013228e-01 +7.27358587e-01 +7.46853894e-01 +7.64449846e-01 +7.80102162e-01 +7.93772117e-01 +8.05425501e-01 +8.15033034e-01 +8.22570828e-01 +8.28020485e-01 +8.31369391e-01 +8.32609489e-01 +8.31738105e-01 +8.28758039e-01 +8.23677695e-01 +8.16511073e-01 +8.07276700e-01 +7.95998416e-01 +7.82705307e-01 +7.67431750e-01 +7.50217319e-01 +7.31105792e-01 +7.10145789e-01 +6.87390632e-01 +6.62898253e-01 +6.36731163e-01 +6.08955485e-01 +5.79641356e-01 +5.48862800e-01 +5.16697507e-01 +4.83226810e-01 +4.48534923e-01 +4.12708942e-01 +3.75838818e-01 +3.38017060e-01 +2.99338562e-01 +2.59900255e-01 +2.19800665e-01 +1.79139959e-01 +1.38019636e-01 +9.65422635e-02 +5.48112202e-02 +1.29303358e-02 +-2.89962857e-02 +-7.08644899e-02 +-1.12570352e-01 +-1.54010453e-01 +-1.95082217e-01 +-2.35684039e-01 +-2.75715526e-01 +-3.15077791e-01 +-3.53673692e-01 +-3.91408093e-01 +-4.28188242e-01 +-4.63923685e-01 +-4.98526554e-01 +-5.31911898e-01 +-5.63997832e-01 +-5.94705772e-01 +-6.23960779e-01 +-6.51691475e-01 +-6.77830109e-01 +-7.02312964e-01 +-7.25080444e-01 +-7.46077241e-01 +-7.65252515e-01 +-7.82560104e-01 +-7.97958161e-01 +-8.11409537e-01 +-8.22881919e-01 +-8.32347878e-01 +-8.39784916e-01 +-8.45175626e-01 +-8.48507694e-01 +-8.49773531e-01 +-8.48970628e-01 +-8.46101546e-01 +-8.41173890e-01 +-8.34200265e-01 +-8.25198309e-01 +-8.14190692e-01 +-8.01204659e-01 +-7.86272231e-01 +-7.69430162e-01 +-7.50719808e-01 +-7.30187017e-01 +-7.07882019e-01 +-6.83859384e-01 +-6.58177716e-01 +-6.30899431e-01 +-6.02090793e-01 +-5.71821709e-01 +-5.40165557e-01 +-5.07198990e-01 +-4.73001747e-01 +-4.37656521e-01 +-4.01248630e-01 +-3.63865798e-01 +-3.25598039e-01 +-2.86537421e-01 +-2.46777836e-01 +-2.06414768e-01 +-1.65545062e-01 +-1.24266692e-01 +-8.26785188e-02 +-4.08800204e-02 +1.02890677e-03 +4.29481835e-02 +8.47777921e-02 +1.26418018e-01 +1.67769687e-01 +2.08734401e-01 +2.49214777e-01 +2.89114709e-01 +3.28339536e-01 +3.66796272e-01 +4.04393831e-01 +4.41043259e-01 +4.76657923e-01 +5.11153720e-01 +5.44449285e-01 +5.76466154e-01 +6.07128969e-01 +6.36365701e-01 +6.64107713e-01 +6.90289918e-01 +7.14850977e-01 +7.37733439e-01 +7.58883859e-01 +7.78252926e-01 +7.95795564e-01 +8.11471038e-01 +8.25243040e-01 +8.37079777e-01 +8.46954074e-01 +8.54843347e-01 +8.60729651e-01 +8.64599778e-01 +8.66445236e-01 +8.66262294e-01 +8.64051993e-01 +8.59820077e-01 +8.53577055e-01 +8.45338085e-01 +8.35123011e-01 +8.22956236e-01 +8.08866729e-01 +7.92887928e-01 +7.75057600e-01 +7.55417782e-01 +7.34014690e-01 +7.10898604e-01 +6.86123740e-01 +6.59748122e-01 +6.31833440e-01 +6.02444900e-01 +5.71651069e-01 +5.39523710e-01 +5.06137612e-01 +4.71570411e-01 +4.35902409e-01 +3.99216384e-01 +3.61597397e-01 +3.23132582e-01 +2.83910943e-01 +2.44023152e-01 +2.03561346e-01 +1.62618899e-01 +1.21290214e-01 +7.96705037e-02 +3.78555636e-02 +-4.05844204e-03 +-4.59752051e-02 +-8.77984942e-02 +-1.29432375e-01 +-1.70781431e-01 +-2.11750979e-01 +-2.52247289e-01 +-2.92177791e-01 +-3.31451292e-01 +-3.69978180e-01 +-4.07670627e-01 +-4.44442787e-01 +-4.80210986e-01 +-5.14893910e-01 +-5.48412789e-01 +-5.80691572e-01 +-6.11657099e-01 +-6.41239259e-01 +-6.69371150e-01 +-6.95989220e-01 +-7.21033414e-01 +-7.44447303e-01 +-7.66178207e-01 +-7.86177300e-01 +-8.04399731e-01 +-8.20804717e-01 +-8.35355606e-01 +-8.48020003e-01 +-8.58769773e-01 +-8.67581170e-01 +-8.74434807e-01 +-8.79315775e-01 +-8.82213601e-01 +-8.83122297e-01 +-8.82040385e-01 +-8.78970854e-01 +-8.73921165e-01 +-8.66903235e-01 +-8.57933404e-01 +-8.47032382e-01 +-8.34225198e-01 +-8.19541141e-01 +-8.03013689e-01 +-7.84680427e-01 +-7.64582957e-01 +-7.42766800e-01 +-7.19281289e-01 +-6.94179447e-01 +-6.67517869e-01 +-6.39356593e-01 +-6.09758967e-01 +-5.78791481e-01 +-5.46523623e-01 +-5.13027745e-01 +-4.78378858e-01 +-4.42654488e-01 +-4.05934495e-01 +-3.68300881e-01 +-3.29837621e-01 +-2.90630462e-01 +-2.50766731e-01 +-2.10335150e-01 +-1.69425618e-01 +-1.28129027e-01 +-8.65370534e-02 +-4.47419500e-02 +-2.83634531e-03 +3.90869628e-02 +8.09352131e-02 +1.22615886e-01 +1.64036909e-01 +2.05106855e-01 +2.45735150e-01 +2.85832265e-01 +3.25309916e-01 +3.64081258e-01 +4.02061071e-01 +4.39165944e-01 +4.75314463e-01 +5.10427380e-01 +5.44427793e-01 +5.77241296e-01 +6.08796160e-01 +6.39023470e-01 +6.67857278e-01 +6.95234750e-01 +7.21096283e-01 +7.45385654e-01 +7.68050116e-01 +7.89040522e-01 +8.08311430e-01 +8.25821182e-01 +8.41532006e-01 +8.55410088e-01 +8.67425636e-01 +8.77552943e-01 +8.85770440e-01 +8.92060735e-01 +8.96410643e-01 +8.98811214e-01 +8.99257743e-01 +8.97749777e-01 +8.94291109e-01 +8.88889763e-01 +8.81557976e-01 +8.72312157e-01 +8.61172854e-01 +8.48164704e-01 +8.33316369e-01 +8.16660466e-01 +7.98233505e-01 +7.78075791e-01 +7.56231341e-01 +7.32747796e-01 +7.07676269e-01 +6.81071288e-01 +6.52990613e-01 +6.23495168e-01 +5.92648858e-01 +5.60518448e-01 +5.27173429e-01 +4.92685833e-01 +4.57130096e-01 +4.20582895e-01 +3.83122977e-01 +3.44830982e-01 +3.05789275e-01 +2.66081761e-01 +2.25793711e-01 +1.85011571e-01 +1.43822778e-01 +1.02315574e-01 +6.05788140e-02 +1.87017772e-02 +-2.32260333e-02 +-6.51150752e-02 +-1.06875957e-01 +-1.48419632e-01 +-1.89657585e-01 +-2.30502017e-01 +-2.70866039e-01 +-3.10663851e-01 +-3.49810917e-01 +-3.88224160e-01 +-4.25822113e-01 +-4.62525116e-01 +-4.98255452e-01 +-5.32937532e-01 +-5.66498052e-01 +-5.98866164e-01 +-6.29973599e-01 +-6.59754794e-01 +-6.88147047e-01 +-7.15090640e-01 +-7.40528967e-01 +-7.64408643e-01 +-7.86679615e-01 +-8.07295265e-01 +-8.26212500e-01 +-8.43391839e-01 +-8.58797486e-01 +-8.72397394e-01 +-8.84163405e-01 +-8.94071257e-01 +-9.02100576e-01 +-9.08234949e-01 +-9.12461963e-01 +-9.14773210e-01 +-9.15164317e-01 +-9.13634944e-01 +-9.10188768e-01 +-9.04833486e-01 +-8.97580778e-01 +-8.88446266e-01 +-8.77449585e-01 +-8.64614269e-01 +-8.49967627e-01 +-8.33540715e-01 +-8.15368300e-01 +-7.95488757e-01 +-7.73943994e-01 +-7.50779361e-01 +-7.26043552e-01 +-6.99788485e-01 +-6.72069189e-01 +-6.42943791e-01 +-6.12473302e-01 +-5.80721426e-01 +-5.47754481e-01 +-5.13641261e-01 +-4.78452887e-01 +-4.42262660e-01 +-4.05145905e-01 +-3.67179809e-01 +-3.28443256e-01 +-2.89016718e-01 +-2.48982042e-01 +-2.08422229e-01 +-1.67421299e-01 +-1.26064129e-01 +-8.44362678e-02 +-4.26237611e-02 +-7.12979198e-04 +4.12095615e-02 +8.30573702e-02 +1.24744195e-01 +1.66184188e-01 +2.07292075e-01 +2.47983321e-01 +2.88174306e-01 +3.27782502e-01 +3.66726622e-01 +4.04926773e-01 +4.42304659e-01 +4.78783837e-01 +5.14289709e-01 +5.48749711e-01 +5.82093472e-01 +6.14252952e-01 +6.45162571e-01 +6.74759328e-01 +7.02982900e-01 +7.29776013e-01 +7.55084343e-01 +7.78856561e-01 +8.01044504e-01 +8.21603256e-01 +8.40491244e-01 +8.57670315e-01 +8.73105735e-01 +8.86766614e-01 +8.98625717e-01 +9.08659319e-01 +9.16847457e-01 +9.23173886e-01 +9.27626172e-01 +9.30195603e-01 +9.30877313e-01 +9.29670617e-01 +9.26578477e-01 +9.21607598e-01 +9.14768471e-01 +9.06075349e-01 +8.95546196e-01 +8.83202588e-01 +8.69070058e-01 +8.53177783e-01 +8.35558268e-01 +8.16247471e-01 +7.95284727e-01 +7.72712652e-01 +7.48577003e-01 +7.22926862e-01 +6.95814473e-01 +6.67294757e-01 +6.37425411e-01 +6.06266799e-01 +5.73881814e-01 +5.40335721e-01 +5.05696277e-01 +4.70033442e-01 +4.33418994e-01 +3.95926573e-01 +3.57631519e-01 +3.18610723e-01 +2.78942469e-01 +2.38706457e-01 +1.97983374e-01 +1.56854760e-01 +1.15402913e-01 +7.37107281e-02 +3.18615399e-02 +-1.00610197e-02 +-5.19732569e-02 +-9.37915988e-02 +-1.35432712e-01 +-1.76813657e-01 +-2.17852033e-01 +-2.58466124e-01 +-2.98575282e-01 +-3.38099896e-01 +-3.76961528e-01 +-4.15083092e-01 +-4.52388975e-01 +-4.88805124e-01 +-5.24259627e-01 +-5.58682503e-01 +-5.92005738e-01 +-6.24163513e-01 +-6.55092306e-01 +-6.84730910e-01 +-7.13021210e-01 +-7.39907727e-01 +-7.65337611e-01 +-7.89260878e-01 +-8.11630476e-01 +-8.32402287e-01 +-8.51536082e-01 +-8.68994655e-01 +-8.84743911e-01 +-8.98753122e-01 +-9.10994851e-01 +-9.21445181e-01 +-9.30084488e-01 +-9.36896251e-01 +-9.41867423e-01 +-9.44988518e-01 +-9.46253460e-01 +-9.45660323e-01 +-9.43211166e-01 +-9.38911167e-01 +-9.32769073e-01 +-9.24797109e-01 +-9.15010978e-01 +-9.03430830e-01 +-8.90079880e-01 +-8.74984559e-01 +-8.58174615e-01 +-8.39682929e-01 +-8.19546235e-01 +-7.97804646e-01 +-7.74500882e-01 +-7.49680657e-01 +-7.23392439e-01 +-6.95687720e-01 +-6.66621313e-01 +-6.36250133e-01 +-6.04633482e-01 +-5.71832993e-01 +-5.37912527e-01 +-5.02938717e-01 +-4.66979819e-01 +-4.30105806e-01 +-3.92388352e-01 +-3.53900688e-01 +-3.14717933e-01 +-2.74916285e-01 +-2.34572944e-01 +-1.93766108e-01 +-1.52574836e-01 +-1.11079100e-01 +-6.93592688e-02 +-2.74960123e-02 +1.44297455e-02 +5.63369316e-02 +9.81445819e-02 +1.39772070e-01 +1.81139146e-01 +2.22166046e-01 +2.62773573e-01 +3.02883706e-01 +3.42419407e-01 +3.81304681e-01 +4.19464699e-01 +4.56825962e-01 +4.93317171e-01 +5.28868483e-01 +5.63411747e-01 +5.96880559e-01 +6.29210748e-01 +6.60341086e-01 +6.90212158e-01 +7.18766829e-01 +7.45950183e-01 +7.71710674e-01 +7.95999819e-01 +8.18771373e-01 +8.39981817e-01 +8.59590372e-01 +8.77560683e-01 +8.93859003e-01 +9.08454389e-01 +9.21318797e-01 +9.32427968e-01 +9.41761986e-01 +9.49303364e-01 +9.55037790e-01 +9.58954004e-01 +9.61045766e-01 +9.61309857e-01 +9.59745928e-01 +9.56356700e-01 +9.51148962e-01 +9.44133945e-01 +9.35325246e-01 +9.24739528e-01 +9.12396604e-01 +8.98321235e-01 +8.82540664e-01 +8.65084856e-01 +8.45986509e-01 +8.25282535e-01 +8.03013109e-01 +7.79220435e-01 +7.53949289e-01 +7.27247565e-01 +6.99166887e-01 +6.69760447e-01 +6.39083650e-01 +6.07194190e-01 +5.74153241e-01 +5.40023365e-01 +5.04868824e-01 +4.68755596e-01 +4.31752366e-01 +3.93929135e-01 +3.55357001e-01 +3.16108320e-01 +2.76257232e-01 +2.35878946e-01 +1.95049228e-01 +1.53844625e-01 +1.12342626e-01 +7.06212539e-02 +2.87586418e-02 +-1.31667856e-02 +-5.50764036e-02 +-9.68918009e-02 +-1.38534830e-01 +-1.79927548e-01 +-2.20992475e-01 +-2.61653194e-01 +-3.01833882e-01 +-3.41459395e-01 +-3.80455674e-01 +-4.18750588e-01 +-4.56272887e-01 +-4.92952420e-01 +-5.28720769e-01 +-5.63512215e-01 +-5.97262159e-01 +-6.29907475e-01 +-6.61387466e-01 +-6.91644730e-01 +-7.20623173e-01 +-7.48268498e-01 +-7.74529613e-01 +-7.99359047e-01 +-8.22710799e-01 +-8.44540926e-01 +-8.64809589e-01 +-8.83480495e-01 +-9.00519018e-01 +-9.15892820e-01 +-9.29574617e-01 +-9.41540164e-01 +-9.51767133e-01 +-9.60235817e-01 +-9.66932284e-01 +-9.71844871e-01 +-9.74964086e-01 +-9.76283676e-01 +-9.75803202e-01 +-9.73523864e-01 +-9.69449167e-01 +-9.63586810e-01 +-9.55949430e-01 +-9.46551046e-01 +-9.35408054e-01 +-9.22542068e-01 +-9.07977985e-01 +-8.91742242e-01 +-8.73863900e-01 +-8.54377595e-01 +-8.33319570e-01 +-8.10727862e-01 +-7.86643868e-01 +-7.61113426e-01 +-7.34183262e-01 +-7.05901951e-01 +-6.76322220e-01 +-6.45499125e-01 +-6.13488700e-01 +-5.80349043e-01 +-5.46142091e-01 +-5.10930496e-01 +-4.74778070e-01 +-4.37751145e-01 +-3.99918157e-01 +-3.61347910e-01 +-3.22110396e-01 +-2.82277920e-01 +-2.41923183e-01 +-2.01119434e-01 +-1.59941096e-01 +-1.18463496e-01 +-7.67619544e-02 +-3.49122616e-02 +7.00930699e-03 +4.89266625e-02 +9.07636732e-02 +1.32444257e-01 +1.73893017e-01 +2.15034828e-01 +2.55794756e-01 +2.96099334e-01 +3.35875832e-01 +3.75051864e-01 +4.13556526e-01 +4.51320966e-01 +4.88276729e-01 +5.24356381e-01 +5.59495876e-01 +5.93632001e-01 +6.26702297e-01 +6.58647701e-01 +6.89411613e-01 +7.18937972e-01 +7.47173116e-01 +7.74067945e-01 +7.99573906e-01 +8.23643874e-01 +8.46236316e-01 +8.67311180e-01 +8.86829372e-01 +9.04756501e-01 +9.21062028e-01 +9.35715796e-01 +9.48690920e-01 +9.59966526e-01 +9.69522095e-01 +9.77339062e-01 +9.83405788e-01 +9.87711893e-01 +9.90248086e-01 +9.91011238e-01 +9.90001470e-01 +9.87219289e-01 +9.82669798e-01 +9.76363452e-01 +9.68310678e-01 +9.58524961e-01 +9.47026424e-01 +9.33835322e-01 +9.18973727e-01 +9.02470540e-01 +8.84355552e-01 +8.64659490e-01 +8.43419098e-01 +8.20673219e-01 +7.96460986e-01 +7.70826234e-01 +7.43816112e-01 +7.15477571e-01 +6.85861005e-01 +6.55020824e-01 +6.23011050e-01 +5.89888070e-01 +5.55712414e-01 +5.20544273e-01 +4.84445344e-01 +4.47481134e-01 +4.09716946e-01 +3.71219000e-01 +3.32056611e-01 +2.92299070e-01 +2.52016172e-01 +2.11279924e-01 +1.70162389e-01 +1.28735885e-01 +8.70740143e-02 +4.52503576e-02 +3.33862000e-03 +-3.85870774e-02 +-8.04529116e-02 +-1.22184959e-01 +-1.63709664e-01 +-2.04954214e-01 +-2.45845640e-01 +-2.86312047e-01 +-3.26282837e-01 +-3.65659669e-01 +-4.04342484e-01 +-4.42299554e-01 +-4.79465898e-01 +-5.15777246e-01 +-5.51170964e-01 +-5.85586154e-01 +-6.18963724e-01 +-6.51246523e-01 +-6.82379428e-01 +-7.12309410e-01 +-7.40985651e-01 +-7.68359622e-01 +-7.94385134e-01 +-8.19018449e-01 +-8.42218334e-01 +-8.63946110e-01 +-8.84165740e-01 +-9.02843873e-01 +-9.19949881e-01 +-9.35455930e-01 +-9.49337004e-01 +-9.61570938e-01 +-9.72138468e-01 +-9.81023236e-01 +-9.88211817e-01 +-9.93693743e-01 +-9.97461501e-01 +-9.99510546e-01 +-9.99839296e-01 +-9.98449132e-01 +-9.95344384e-01 +-9.90532315e-01 +-9.84023106e-01 +-9.75829826e-01 +-9.65968401e-01 +-9.54457590e-01 +-9.41318926e-01 +-9.26576692e-01 +-9.10257863e-01 +-8.92392044e-01 +-8.73011438e-01 +-8.52150757e-01 +-8.29847165e-01 +-8.06140229e-01 +-7.81071805e-01 +-7.54685999e-01 +-7.27029071e-01 +-6.98149334e-01 +-6.68097110e-01 +-6.36924593e-01 +-6.04685776e-01 +-5.71436378e-01 +-5.37233686e-01 +-5.02136524e-01 +-4.66205103e-01 +-4.29500914e-01 +-3.92086673e-01 +-3.54026139e-01 +-3.15384058e-01 +-2.76226043e-01 +-2.36618422e-01 +-1.96628196e-01 +-1.56322853e-01 +-1.15770293e-01 +-7.50387262e-02 +-3.41964954e-02 +6.68795150e-03 +4.75462509e-02 +8.83102067e-02 +1.28911878e-01 +1.69283763e-01 +2.09358821e-01 +2.49070657e-01 +2.88353599e-01 +3.27142784e-01 +3.65374329e-01 +4.02985347e-01 +4.39914129e-01 +4.76100200e-01 +5.11484408e-01 +5.46009071e-01 +5.79617991e-01 +6.12256623e-01 +6.43872104e-01 +6.74413351e-01 +7.03831169e-01 +7.32078271e-01 +7.59109415e-01 +7.84881419e-01 +8.09353260e-01 +8.32486131e-01 +8.54243473e-01 +8.74591079e-01 +8.93497088e-01 +9.10932080e-01 +9.26869085e-01 +9.41283633e-01 +9.54153796e-01 +9.65460194e-01 +9.75186054e-01 +9.83317195e-01 +9.89842072e-01 +9.94751774e-01 +9.98040036e-01 +9.99703243e-01 +9.99740429e-01 +9.98153270e-01 +9.94946078e-01 +9.90125784e-01 +9.83701925e-01 +9.75686616e-01 +9.66094526e-01 +9.54942857e-01 +9.42251288e-01 +9.28041968e-01 +9.12339438e-01 +8.95170623e-01 +8.76564751e-01 +8.56553318e-01 +8.35170033e-01 +8.12450736e-01 +7.88433377e-01 +7.63157893e-01 +7.36666205e-01 +7.09002076e-01 +6.80211104e-01 +6.50340587e-01 +6.19439483e-01 +5.87558309e-01 +5.54749051e-01 +5.21065110e-01 +4.86561155e-01 +4.51293109e-01 +4.15317969e-01 +3.78693809e-01 +3.41479584e-01 +3.03735133e-01 +2.65520991e-01 +2.26898366e-01 +1.87928989e-01 +1.48675040e-01 +1.09199048e-01 +6.95637658e-02 +2.98321222e-02 +-9.93295406e-03 +-4.96685394e-02 +-8.93119226e-02 +-1.28800586e-01 +-1.68072426e-01 +-2.07065727e-01 +-2.45719378e-01 +-2.83972852e-01 +-3.21766406e-01 +-3.59041082e-01 +-3.95738870e-01 +-4.31802744e-01 +-4.67176782e-01 +-5.01806237e-01 +-5.35637620e-01 +-5.68618789e-01 +-6.00699011e-01 +-6.31829065e-01 +-6.61961278e-01 +-6.91049642e-01 +-7.19049826e-01 +-7.45919304e-01 +-7.71617353e-01 +-7.96105174e-01 +-8.19345886e-01 +-8.41304643e-01 +-8.61948617e-01 +-8.81247109e-01 +-8.99171530e-01 +-9.15695501e-01 +-9.30794829e-01 +-9.44447593e-01 +-9.56634127e-01 +-9.67337084e-01 +-9.76541423e-01 +-9.84234459e-01 +-9.90405845e-01 +-9.95047612e-01 +-9.98154153e-01 +-9.99722239e-01 +-9.99751014e-01 +-9.98241990e-01 +-9.95199043e-01 +-9.90628394e-01 +-9.84538606e-01 +-9.76940548e-01 +-9.67847394e-01 +-9.57274575e-01 +-9.45239774e-01 +-9.31762866e-01 +-9.16865916e-01 +-9.00573100e-01 +-8.82910707e-01 +-8.63907050e-01 +-8.43592463e-01 +-8.21999203e-01 +-7.99161442e-01 +-7.75115170e-01 +-7.49898172e-01 +-7.23549933e-01 +-6.96111605e-01 +-6.67625914e-01 +-6.38137110e-01 +-6.07690892e-01 +-5.76334323e-01 +-5.44115781e-01 +-5.11084848e-01 +-4.77292279e-01 +-4.42789860e-01 +-4.07630406e-01 +-3.71867585e-01 +-3.35555944e-01 +-2.98750705e-01 +-2.61507805e-01 +-2.23883685e-01 +-1.85935324e-01 +-1.47720044e-01 +-1.09295517e-01 +-7.07195970e-02 +-3.20502977e-02 +6.65433692e-03 +4.53363055e-02 +8.39377218e-02 +1.22400942e-01 +1.60668584e-01 +1.98683702e-01 +2.36389762e-01 +2.73730846e-01 +3.10651609e-01 +3.47097482e-01 +3.83014640e-01 +4.18350172e-01 +4.53052096e-01 +4.87069460e-01 +5.20352424e-01 +5.52852293e-01 +5.84521650e-01 +6.15314341e-01 +6.45185633e-01 +6.74092184e-01 +7.01992189e-01 +7.28845368e-01 +7.54613074e-01 +7.79258314e-01 +8.02745810e-01 +8.25042063e-01 +8.46115356e-01 +8.65935860e-01 +8.84475600e-01 +9.01708562e-01 +9.17610673e-01 +9.32159865e-01 +9.45336087e-01 +9.57121332e-01 +9.67499670e-01 +9.76457245e-01 +9.83982317e-01 +9.90065249e-01 +9.94698535e-01 +9.97876798e-01 +9.99596794e-01 +9.99857412e-01 +9.98659673e-01 +9.96006718e-01 +9.91903808e-01 +9.86358303e-01 +9.79379650e-01 +9.70979366e-01 +9.61171012e-01 +9.49970179e-01 +9.37394441e-01 +9.23463356e-01 +9.08198396e-01 +8.91622944e-01 +8.73762239e-01 +8.54643332e-01 +8.34295069e-01 +8.12747998e-01 +7.90034378e-01 +7.66188080e-01 +7.41244560e-01 +7.15240812e-01 +6.88215269e-01 +6.60207812e-01 +6.31259635e-01 +6.01413244e-01 +5.70712361e-01 +5.39201854e-01 +5.06927711e-01 +4.73936904e-01 +4.40277394e-01 +4.05998003e-01 +3.71148361e-01 +3.35778864e-01 +2.99940525e-01 +2.63684999e-01 +2.27064415e-01 +1.90131356e-01 +1.52938785e-01 +1.15539910e-01 +7.79882013e-02 +4.03372215e-02 +2.64060771e-03 +-3.50480079e-02 +-7.26751277e-02 +-1.10187373e-01 +-1.47531655e-01 +-1.84655187e-01 +-2.21505562e-01 +-2.58030884e-01 +-2.94179745e-01 +-3.29901389e-01 +-3.65145730e-01 +-3.99863416e-01 +-4.34005953e-01 +-4.67525692e-01 +-5.00375962e-01 +-5.32511108e-01 +-5.63886524e-01 +-5.94458785e-01 +-6.24185626e-01 +-6.53026047e-01 +-6.80940374e-01 +-7.07890257e-01 +-7.33838795e-01 +-7.58750528e-01 +-7.82591498e-01 +-8.05329324e-01 +-8.26933185e-01 +-8.47373919e-01 +-8.66624027e-01 +-8.84657705e-01 +-9.01450904e-01 +-9.16981328e-01 +-9.31228482e-01 +-9.44173694e-01 +-9.55800123e-01 +-9.66092798e-01 +-9.75038627e-01 +-9.82626399e-01 +-9.88846820e-01 +-9.93692500e-01 +-9.97157970e-01 +-9.99239684e-01 +-9.99936019e-01 +-9.99247271e-01 +-9.97175654e-01 +-9.93725294e-01 +-9.88902212e-01 +-9.82714320e-01 +-9.75171403e-01 +-9.66285095e-01 +-9.56068873e-01 +-9.44538025e-01 +-9.31709618e-01 +-9.17602494e-01 +-9.02237215e-01 +-8.85636041e-01 +-8.67822910e-01 +-8.48823370e-01 +-8.28664570e-01 +-8.07375214e-01 +-7.84985492e-01 +-7.61527078e-01 +-7.37033054e-01 +-7.11537857e-01 +-6.85077265e-01 +-6.57688306e-01 +-6.29409213e-01 +-6.00279407e-01 +-5.70339379e-01 +-5.39630673e-01 +-5.08195838e-01 +-4.76078318e-01 +-4.43322435e-01 +-4.09973329e-01 +-3.76076847e-01 +-3.41679534e-01 +-3.06828550e-01 +-2.71571574e-01 +-2.35956788e-01 +-2.00032792e-01 +-1.63848500e-01 +-1.27453140e-01 +-9.08961455e-02 +-5.42270704e-02 +-1.74955811e-02 +1.92486592e-02 +5.59560624e-02 +9.25771291e-02 +1.29062567e-01 +1.65363356e-01 +2.01430760e-01 +2.37216453e-01 +2.72672570e-01 +3.07751725e-01 +3.42407132e-01 +3.76592651e-01 +4.10262812e-01 +4.43372921e-01 +4.75879111e-01 +5.07738360e-01 +5.38908591e-01 +5.69348724e-01 +5.99018687e-01 +6.27879509e-01 +6.55893372e-01 +6.83023617e-01 +7.09234829e-01 +7.34492881e-01 +7.58764947e-01 +7.82019568e-01 +8.04226696e-01 +8.25357707e-01 +8.45385448e-01 +8.64284285e-01 +8.82030110e-01 +8.98600375e-01 +9.13974137e-01 +9.28132063e-01 +9.41056453e-01 +9.52731275e-01 +9.63142172e-01 +9.72276470e-01 +9.80123212e-01 +9.86673152e-01 +9.91918768e-01 +9.95854273e-01 +9.98475613e-01 +9.99780474e-01 +9.99768277e-01 +9.98440178e-01 +9.95799063e-01 +9.91849540e-01 +9.86597928e-01 +9.80052247e-01 +9.72222208e-01 +9.63119187e-01 +9.52756213e-01 +9.41147953e-01 +9.28310679e-01 +9.14262243e-01 +8.99022065e-01 +8.82611094e-01 +8.65051769e-01 +8.46368004e-01 +8.26585150e-01 +8.05729946e-01 +7.83830489e-01 +7.60916211e-01 +7.37017812e-01 +7.12167222e-01 +6.86397581e-01 +6.59743169e-01 +6.32239357e-01 +6.03922577e-01 +5.74830274e-01 +5.45000828e-01 +5.14473518e-01 +4.83288493e-01 +4.51486683e-01 +4.19109748e-01 +3.86200046e-01 +3.52800570e-01 +3.18954867e-01 +2.84706999e-01 +2.50101508e-01 +2.15183313e-01 +1.79997669e-01 +1.44590124e-01 +1.09006455e-01 +7.32925793e-02 +3.74945204e-02 +1.65836660e-03 +-3.41698266e-02 +-6.99440869e-02 +-1.05618562e-01 +-1.41147584e-01 +-1.76485756e-01 +-2.11587988e-01 +-2.46409534e-01 +-2.80906084e-01 +-3.15033814e-01 +-3.48749424e-01 +-3.82010188e-01 +-4.14774040e-01 +-4.46999607e-01 +-4.78646246e-01 +-5.09674109e-01 +-5.40044206e-01 +-5.69718436e-01 +-5.98659620e-01 +-6.26831575e-01 +-6.54199151e-01 +-6.80728264e-01 +-7.06385930e-01 +-7.31140331e-01 +-7.54960839e-01 +-7.77818043e-01 +-7.99683793e-01 +-8.20531240e-01 +-8.40334861e-01 +-8.59070481e-01 +-8.76715308e-01 +-8.93247968e-01 +-9.08648516e-01 +-9.22898458e-01 +-9.35980780e-01 +-9.47879968e-01 +-9.58582014e-01 +-9.68074434e-01 +-9.76346288e-01 +-9.83388185e-01 +-9.89192292e-01 +-9.93752340e-01 +-9.97063632e-01 +-9.99123045e-01 +-9.99929028e-01 +-9.99481604e-01 +-9.97782367e-01 +-9.94834475e-01 +-9.90642642e-01 +-9.85213135e-01 +-9.78553757e-01 +-9.70673837e-01 +-9.61584213e-01 +-9.51297224e-01 +-9.39826678e-01 +-9.27187843e-01 +-9.13397418e-01 +-8.98473523e-01 +-8.82435652e-01 +-8.65304662e-01 +-8.47102740e-01 +-8.27853379e-01 +-8.07581335e-01 +-7.86312596e-01 +-7.64074355e-01 +-7.40894975e-01 +-7.16803942e-01 +-6.91831825e-01 +-6.66010246e-01 +-6.39371843e-01 +-6.11950214e-01 +-5.83779872e-01 +-5.54896212e-01 +-5.25335470e-01 +-4.95134663e-01 +-4.64331543e-01 +-4.32964550e-01 +-4.01072779e-01 +-3.68695916e-01 +-3.35874183e-01 +-3.02648293e-01 +-2.69059407e-01 +-2.35149082e-01 +-2.00959206e-01 +-1.66531950e-01 +-1.31909720e-01 +-9.71351175e-02 +-6.22508645e-02 +-2.72997551e-02 +7.67539238e-03 +4.26317792e-02 +7.75266845e-02 +1.12317530e-01 +1.46961922e-01 +1.81417699e-01 +2.15642976e-01 +2.49596215e-01 +2.83236267e-01 +3.16522421e-01 +3.49414441e-01 +3.81872624e-01 +4.13857856e-01 +4.45331650e-01 +4.76256190e-01 +5.06594368e-01 +5.36309842e-01 +5.65367080e-01 +5.93731393e-01 +6.21368972e-01 +6.48246930e-01 +6.74333351e-01 +6.99597317e-01 +7.24008947e-01 +7.47539421e-01 +7.70161024e-01 +7.91847180e-01 +8.12572475e-01 +8.32312685e-01 +8.51044802e-01 +8.68747065e-01 +8.85398983e-01 +9.00981358e-01 +9.15476297e-01 +9.28867238e-01 +9.41138970e-01 +9.52277646e-01 +9.62270796e-01 +9.71107338e-01 +9.78777592e-01 +9.85273288e-01 +9.90587575e-01 +9.94715023e-01 +9.97651627e-01 +9.99394814e-01 +9.99943440e-01 +9.99297786e-01 +9.97459561e-01 +9.94431894e-01 +9.90219328e-01 +9.84827811e-01 +9.78264689e-01 +9.70538692e-01 +9.61659922e-01 +9.51639841e-01 +9.40491251e-01 +9.28228277e-01 +9.14866350e-01 +9.00422184e-01 +8.84913759e-01 +8.68360289e-01 +8.50782202e-01 +8.32201113e-01 +8.12639794e-01 +7.92122155e-01 +7.70673199e-01 +7.48318999e-01 +7.25086662e-01 +7.01004295e-01 +6.76100979e-01 +6.50406722e-01 +6.23952424e-01 +5.96769841e-01 +5.68891542e-01 +5.40350879e-01 +5.11181941e-01 +4.81419510e-01 +4.51099015e-01 +4.20256498e-01 +3.88928568e-01 +3.57152361e-01 +3.24965489e-01 +2.92405992e-01 +2.59512299e-01 +2.26323181e-01 +1.92877708e-01 +1.59215203e-01 +1.25375186e-01 +9.13973351e-02 +5.73214359e-02 +2.31873399e-02 +-1.09650810e-02 +-4.50959843e-02 +-7.91656080e-02 +-1.13134312e-01 +-1.46962625e-01 +-1.80611288e-01 +-2.14041297e-01 +-2.47213953e-01 +-2.80090910e-01 +-3.12634214e-01 +-3.44806344e-01 +-3.76570260e-01 +-4.07889436e-01 +-4.38727911e-01 +-4.69050329e-01 +-4.98821977e-01 +-5.28008822e-01 +-5.56577551e-01 +-5.84495602e-01 +-6.11731213e-01 +-6.38253447e-01 +-6.64032233e-01 +-6.89038394e-01 +-7.13243681e-01 +-7.36620801e-01 +-7.59143450e-01 +-7.80786345e-01 +-8.01525245e-01 +-8.21336981e-01 +-8.40199476e-01 +-8.58091773e-01 +-8.74994055e-01 +-8.90887667e-01 +-9.05755136e-01 +-9.19580186e-01 +-9.32347758e-01 +-9.44044021e-01 +-9.54656389e-01 +-9.64173532e-01 +-9.72585389e-01 +-9.79883172e-01 +-9.86059381e-01 +-9.91107804e-01 +-9.95023523e-01 +-9.97802921e-01 +-9.99443680e-01 +-9.99944785e-01 +-9.99306517e-01 +-9.97530457e-01 +-9.94619479e-01 +-9.90577742e-01 +-9.85410689e-01 +-9.79125032e-01 +-9.71728748e-01 +-9.63231062e-01 +-9.53642440e-01 +-9.42974570e-01 +-9.31240352e-01 +-9.18453877e-01 +-9.04630408e-01 +-8.89786365e-01 +-8.73939303e-01 +-8.57107886e-01 +-8.39311871e-01 +-8.20572080e-01 +-8.00910374e-01 +-7.80349628e-01 +-7.58913702e-01 +-7.36627412e-01 +-7.13516503e-01 +-6.89607618e-01 +-6.64928264e-01 +-6.39506785e-01 +-6.13372320e-01 +-5.86554774e-01 +-5.59084785e-01 +-5.30993683e-01 +-5.02313458e-01 +-4.73076722e-01 +-4.43316674e-01 +-4.13067055e-01 +-3.82362113e-01 +-3.51236564e-01 +-3.19725553e-01 +-2.87864612e-01 +-2.55689621e-01 +-2.23236768e-01 +-1.90542509e-01 +-1.57643521e-01 +-1.24576667e-01 +-9.13789489e-02 +-5.80874722e-02 +-2.47394002e-02 +8.62808580e-03 +4.19778263e-02 +7.52727277e-02 +1.08475804e-01 +1.41550215e-01 +1.74459311e-01 +2.07166668e-01 +2.39636131e-01 +2.71831854e-01 +3.03718335e-01 +3.35260458e-01 +3.66423534e-01 +3.97173335e-01 +4.27476130e-01 +4.57298727e-01 +4.86608503e-01 +5.15373440e-01 +5.43562163e-01 +5.71143969e-01 +5.98088860e-01 +6.24367582e-01 +6.49951648e-01 +6.74813371e-01 +6.98925894e-01 +7.22263215e-01 +7.44800218e-01 +7.66512697e-01 +7.87377380e-01 +8.07371956e-01 +8.26475097e-01 +8.44666478e-01 +8.61926800e-01 +8.78237806e-01 +8.93582304e-01 +9.07944180e-01 +9.21308415e-01 +9.33661100e-01 +9.44989449e-01 +9.55281814e-01 +9.64527690e-01 +9.72717729e-01 +9.79843747e-01 +9.85898732e-01 +9.90876846e-01 +9.94773434e-01 +9.97585026e-01 +9.99309335e-01 +9.99945263e-01 +9.99492898e-01 +9.97953509e-01 +9.95329548e-01 +9.91624641e-01 +9.86843584e-01 +9.80992335e-01 +9.74078009e-01 +9.66108862e-01 +9.57094285e-01 +9.47044792e-01 +9.35972003e-01 +9.23888634e-01 +9.10808478e-01 +8.96746390e-01 +8.81718268e-01 +8.65741038e-01 +8.48832627e-01 +8.31011948e-01 +8.12298876e-01 +7.92714225e-01 +7.72279724e-01 +7.51017991e-01 +7.28952508e-01 +7.06107596e-01 +6.82508384e-01 +6.58180783e-01 +6.33151458e-01 +6.07447794e-01 +5.81097870e-01 +5.54130425e-01 +5.26574827e-01 +4.98461039e-01 +4.69819588e-01 +4.40681530e-01 +4.11078418e-01 +3.81042263e-01 +3.50605503e-01 +3.19800966e-01 +2.88661836e-01 +2.57221613e-01 +2.25514083e-01 +1.93573274e-01 +1.61433426e-01 +1.29128950e-01 +9.66943919e-02 +6.41643962e-02 +3.15736686e-02 +-1.04306141e-03 +-3.36510768e-02 +-6.62157104e-02 +-9.87023817e-02 +-1.31076633e-01 +-1.63304166e-01 +-1.95350879e-01 +-2.27182900e-01 +-2.58766625e-01 +-2.90068753e-01 +-3.21056317e-01 +-3.51696726e-01 +-3.81957791e-01 +-4.11807762e-01 +-4.41215361e-01 +-4.70149815e-01 +-4.98580884e-01 +-5.26478896e-01 +-5.53814777e-01 +-5.80560077e-01 +-6.06687004e-01 +-6.32168448e-01 +-6.56978012e-01 +-6.81090036e-01 +-7.04479623e-01 +-7.27122667e-01 +-7.48995873e-01 +-7.70076783e-01 +-7.90343797e-01 +-8.09776194e-01 +-8.28354154e-01 +-8.46058776e-01 +-8.62872094e-01 +-8.78777101e-01 +-8.93757759e-01 +-9.07799016e-01 +-9.20886821e-01 +-9.33008137e-01 +-9.44150952e-01 +-9.54304293e-01 +-9.63458229e-01 +-9.71603889e-01 +-9.78733461e-01 +-9.84840203e-01 +-9.89918449e-01 +-9.93963609e-01 +-9.96972178e-01 +-9.98941731e-01 +-9.99870930e-01 +-9.99759519e-01 +-9.98608327e-01 +-9.96419262e-01 +-9.93195306e-01 +-9.88940516e-01 +-9.83660013e-01 +-9.77359977e-01 +-9.70047636e-01 +-9.61731264e-01 +-9.52420161e-01 +-9.42124651e-01 +-9.30856062e-01 +-9.18626719e-01 +-9.05449926e-01 +-8.91339950e-01 +-8.76312008e-01 +-8.60382246e-01 +-8.43567727e-01 +-8.25886403e-01 +-8.07357102e-01 +-7.87999506e-01 +-7.67834126e-01 +-7.46882286e-01 +-7.25166091e-01 +-7.02708410e-01 +-6.79532851e-01 +-6.55663730e-01 +-6.31126051e-01 +-6.05945475e-01 +-5.80148296e-01 +-5.53761411e-01 +-5.26812290e-01 +-4.99328952e-01 +-4.71339928e-01 +-4.42874239e-01 +-4.13961360e-01 +-3.84631189e-01 +-3.54914020e-01 +-3.24840509e-01 +-2.94441639e-01 +-2.63748694e-01 +-2.32793222e-01 +-2.01607002e-01 +-1.70222017e-01 +-1.38670414e-01 +-1.06984473e-01 +-7.51965784e-02 +-4.33391793e-02 +-1.14447606e-02 +2.04541915e-02 +5.23252226e-02 +8.41359428e-02 +1.15854059e-01 +1.47447410e-01 +1.78883995e-01 +2.10132008e-01 +2.41159872e-01 +2.71936266e-01 +3.02430160e-01 +3.32610843e-01 +3.62447958e-01 +3.91911528e-01 +4.20971986e-01 +4.49600208e-01 +4.77767538e-01 +5.05445818e-01 +5.32607413e-01 +5.59225244e-01 +5.85272808e-01 +6.10724208e-01 +6.35554175e-01 +6.59738097e-01 +6.83252036e-01 +7.06072760e-01 +7.28177756e-01 +7.49545259e-01 +7.70154268e-01 +7.89984568e-01 +8.09016749e-01 +8.27232224e-01 +8.44613245e-01 +8.61142922e-01 +8.76805239e-01 +8.91585063e-01 +9.05468166e-01 +9.18441233e-01 +9.30491872e-01 +9.41608632e-01 +9.51781006e-01 +9.60999443e-01 +9.69255357e-01 +9.76541132e-01 +9.82850130e-01 +9.88176694e-01 +9.92516155e-01 +9.95864833e-01 +9.98220039e-01 +9.99580077e-01 +9.99944244e-01 +9.99312831e-01 +9.97687116e-01 +9.95069369e-01 +9.91462839e-01 +9.86871759e-01 +9.81301330e-01 +9.74757726e-01 +9.67248075e-01 +9.58780457e-01 +9.49363896e-01 +9.39008343e-01 +9.27724671e-01 +9.15524660e-01 +9.02420982e-01 +8.88427193e-01 +8.73557712e-01 +8.57827811e-01 +8.41253591e-01 +8.23851975e-01 +8.05640680e-01 +7.86638207e-01 +7.66863815e-01 +7.46337503e-01 +7.25079991e-01 +7.03112696e-01 +6.80457712e-01 +6.57137785e-01 +6.33176292e-01 +6.08597214e-01 +5.83425114e-01 +5.57685112e-01 +5.31402859e-01 +5.04604509e-01 +4.77316696e-01 +4.49566506e-01 +4.21381446e-01 +3.92789424e-01 +3.63818714e-01 +3.34497931e-01 +3.04856003e-01 +2.74922140e-01 +2.44725805e-01 +2.14296690e-01 +1.83664680e-01 +1.52859825e-01 +1.21912314e-01 +9.08524416e-02 +5.97105805e-02 +2.85171502e-02 +-2.69741184e-03 +-3.39026802e-02 +-6.50682707e-02 +-9.61638706e-02 +-1.27159267e-01 +-1.58024378e-01 +-1.88729278e-01 +-2.19244232e-01 +-2.49539719e-01 +-2.79586463e-01 +-3.09355460e-01 +-3.38818009e-01 +-3.67945733e-01 +-3.96710612e-01 +-4.25085007e-01 +-4.53041686e-01 +-4.80553851e-01 +-5.07595161e-01 +-5.34139761e-01 +-5.60162301e-01 +-5.85637963e-01 +-6.10542486e-01 +-6.34852184e-01 +-6.58543969e-01 +-6.81595376e-01 +-7.03984581e-01 +-7.25690420e-01 +-7.46692411e-01 +-7.66970771e-01 +-7.86506436e-01 +-8.05281074e-01 +-8.23277107e-01 +-8.40477723e-01 +-8.56866893e-01 +-8.72429383e-01 +-8.87150771e-01 +-9.01017456e-01 +-9.14016672e-01 +-9.26136499e-01 +-9.37365870e-01 +-9.47694587e-01 +-9.57113323e-01 +-9.65613632e-01 +-9.73187956e-01 +-9.79829632e-01 +-9.85532895e-01 +-9.90292883e-01 +-9.94105641e-01 +-9.96968122e-01 +-9.98878190e-01 +-9.99834620e-01 +-9.99837098e-01 +-9.98886220e-01 +-9.96983490e-01 +-9.94131317e-01 +-9.90333012e-01 +-9.85592783e-01 +-9.79915730e-01 +-9.73307838e-01 +-9.65775973e-01 +-9.57327869e-01 +-9.47972123e-01 +-9.37718187e-01 +-9.26576353e-01 +-9.14557747e-01 +-9.01674313e-01 +-8.87938804e-01 +-8.73364766e-01 +-8.57966525e-01 +-8.41759173e-01 +-8.24758553e-01 +-8.06981240e-01 +-7.88444528e-01 +-7.69166411e-01 +-7.49165563e-01 +-7.28461322e-01 +-7.07073671e-01 +-6.85023216e-01 +-6.62331168e-01 +-6.39019320e-01 +-6.15110027e-01 +-5.90626185e-01 +-5.65591204e-01 +-5.40028993e-01 +-5.13963929e-01 +-4.87420839e-01 +-4.60424972e-01 +-4.33001978e-01 +-4.05177881e-01 +-3.76979056e-01 +-3.48432201e-01 +-3.19564313e-01 +-2.90402664e-01 +-2.60974772e-01 +-2.31308377e-01 +-2.01431414e-01 +-1.71371984e-01 +-1.41158334e-01 +-1.10818823e-01 +-8.03819001e-02 +-4.98760764e-02 +-1.93298976e-02 +1.12280818e-02 +4.17693258e-02 +7.22653428e-02 +1.02687713e-01 +1.33008113e-01 +1.63198346e-01 +1.93230362e-01 +2.23076290e-01 +2.52708459e-01 +2.82099425e-01 +3.11221998e-01 +3.40049263e-01 +3.68554608e-01 +3.96711749e-01 +4.24494748e-01 +4.51878045e-01 +4.78836474e-01 +5.05345289e-01 +5.31380188e-01 +5.56917331e-01 +5.81933363e-01 +6.06405437e-01 +6.30311231e-01 +6.53628971e-01 +6.76337447e-01 +6.98416037e-01 +7.19844719e-01 +7.40604093e-01 +7.60675397e-01 +7.80040522e-01 +7.98682029e-01 +8.16583165e-01 +8.33727876e-01 +8.50100821e-01 +8.65687385e-01 +8.80473694e-01 +8.94446621e-01 +9.07593803e-01 +9.19903649e-01 +9.31365349e-01 +9.41968882e-01 +9.51705028e-01 +9.60565370e-01 +9.68542305e-01 +9.75629048e-01 +9.81819637e-01 +9.87108936e-01 +9.91492643e-01 +9.94967287e-01 +9.97530235e-01 +9.99179690e-01 +9.99914692e-01 +9.99735118e-01 +9.98641685e-01 +9.96635938e-01 +9.93720260e-01 +9.89897858e-01 +9.85172766e-01 +9.79549835e-01 +9.73034732e-01 +9.65633931e-01 +9.57354706e-01 +9.48205126e-01 +9.38194041e-01 +9.27331079e-01 +9.15626632e-01 +9.03091848e-01 +8.89738618e-01 +8.75579565e-01 +8.60628030e-01 +8.44898063e-01 +8.28404404e-01 +8.11162473e-01 +7.93188351e-01 +7.74498770e-01 +7.55111090e-01 +7.35043290e-01 +7.14313945e-01 +6.92942209e-01 +6.70947801e-01 +6.48350981e-01 +6.25172534e-01 +6.01433751e-01 +5.77156408e-01 +5.52362744e-01 +5.27075444e-01 +5.01317615e-01 +4.75112766e-01 +4.48484786e-01 +4.21457922e-01 +3.94056753e-01 +3.66306176e-01 +3.38231373e-01 +3.09857797e-01 +2.81211140e-01 +2.52317319e-01 +2.23202444e-01 +1.93892800e-01 +1.64414820e-01 +1.34795063e-01 +1.05060190e-01 +7.52369363e-02 +4.53520911e-02 +1.54324728e-02 +-1.44950956e-02 +-4.44038101e-02 +-7.42669104e-02 +-1.04057703e-01 +-1.33749584e-01 +-1.63316065e-01 +-1.92730796e-01 +-2.21967586e-01 +-2.51000433e-01 +-2.79803540e-01 +-3.08351339e-01 +-3.36618517e-01 +-3.64580036e-01 +-3.92211153e-01 +-4.19487444e-01 +-4.46384826e-01 +-4.72879574e-01 +-4.98948348e-01 +-5.24568208e-01 +-5.49716636e-01 +-5.74371554e-01 +-5.98511345e-01 +-6.22114872e-01 +-6.45161491e-01 +-6.67631075e-01 +-6.89504027e-01 +-7.10761299e-01 +-7.31384406e-01 +-7.51355445e-01 +-7.70657107e-01 +-7.89272692e-01 +-8.07186125e-01 +-8.24381966e-01 +-8.40845424e-01 +-8.56562373e-01 +-8.71519355e-01 +-8.85703601e-01 +-8.99103036e-01 +-9.11706289e-01 +-9.23502700e-01 +-9.34482335e-01 +-9.44635988e-01 +-9.53955189e-01 +-9.62432211e-01 +-9.70060077e-01 +-9.76832565e-01 +-9.82744210e-01 +-9.87790311e-01 +-9.91966931e-01 +-9.95270902e-01 +-9.97699826e-01 +-9.99252075e-01 +-9.99926793e-01 +-9.99723893e-01 +-9.98644061e-01 +-9.96688749e-01 +-9.93860175e-01 +-9.90161322e-01 +-9.85595930e-01 +-9.80168495e-01 +-9.73884264e-01 +-9.66749227e-01 +-9.58770114e-01 +-9.49954386e-01 +-9.40310226e-01 +-9.29846536e-01 +-9.18572922e-01 +-9.06499690e-01 +-8.93637831e-01 +-8.79999017e-01 +-8.65595585e-01 +-8.50440526e-01 +-8.34547473e-01 +-8.17930689e-01 +-8.00605054e-01 +-7.82586050e-01 +-7.63889746e-01 +-7.44532787e-01 +-7.24532377e-01 +-7.03906261e-01 +-6.82672710e-01 +-6.60850507e-01 +-6.38458926e-01 +-6.15517716e-01 +-5.92047085e-01 +-5.68067682e-01 +-5.43600577e-01 +-5.18667242e-01 +-4.93289532e-01 +-4.67489666e-01 +-4.41290206e-01 +-4.14714039e-01 +-3.87784355e-01 +-3.60524630e-01 +-3.32958604e-01 +-3.05110256e-01 +-2.77003787e-01 +-2.48663598e-01 +-2.20114266e-01 +-1.91380527e-01 +-1.62487254e-01 +-1.33459432e-01 +-1.04322141e-01 +-7.51005315e-02 +-4.58197989e-02 +-1.65051676e-02 +1.28181330e-02 +4.21248899e-02 +7.13899274e-02 +1.00588127e-01 +1.29694453e-01 +1.58683972e-01 +1.87531878e-01 +2.16213505e-01 +2.44704357e-01 +2.72980121e-01 +3.01016692e-01 +3.28790191e-01 +3.56276987e-01 +3.83453719e-01 +4.10297314e-01 +4.36785003e-01 +4.62894345e-01 +4.88603239e-01 +5.13889947e-01 +5.38733115e-01 +5.63111788e-01 +5.87005425e-01 +6.10393919e-01 +6.33257613e-01 +6.55577314e-01 +6.77334309e-01 +6.98510383e-01 +7.19087835e-01 +7.39049488e-01 +7.58378706e-01 +7.77059406e-01 +7.95076071e-01 +8.12413758e-01 +8.29058122e-01 +8.44995416e-01 +8.60212508e-01 +8.74696889e-01 +8.88436683e-01 +9.01420655e-01 +9.13638221e-01 +9.21600117e-01 +9.06598683e-01 +8.84977766e-01 +8.60491908e-01 +8.33400490e-01 +8.03964080e-01 +7.72439460e-01 +7.39075357e-01 +7.04108996e-01 +6.67763293e-01 +6.30244788e-01 +5.91742253e-01 +5.52425847e-01 +5.12446805e-01 +4.71937572e-01 +4.31012290e-01 +3.89767573e-01 +3.48283469e-01 +3.06624530e-01 +2.64840806e-01 +2.22968419e-01 +1.81028725e-01 +1.39022002e-01 +9.68916163e-02 +5.41204844e-02 +2.70602422e-02 +0.00000000e+00 +-0.00000000e+00 +-1.24470142e-05 +-2.63184500e-05 +-3.97295213e-05 +-5.30856936e-05 +-6.64250519e-05 +-7.97569147e-05 +-9.30847457e-05 +-1.06410146e-04 +-1.19733962e-04 +-1.33056687e-04 +-1.46378628e-04 +-1.59699985e-04 +-1.73020895e-04 +-1.86341457e-04 +-1.99661741e-04 +-2.12981800e-04 +-2.26301674e-04 +-2.39621394e-04 +-2.52940985e-04 +-2.66260466e-04 +-2.79579853e-04 +-2.92899159e-04 +-3.06218395e-04 +-3.16759589e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17595019e-04 +-3.17584985e-04 +-3.10422511e-04 +-2.97103293e-04 +-2.83784010e-04 +-2.70464650e-04 +-2.57145200e-04 +-2.43825645e-04 +-2.30505968e-04 +-2.17186146e-04 +-2.03866150e-04 +-1.90545942e-04 +-1.77225474e-04 +-1.63904683e-04 +-1.50583479e-04 +-1.37261741e-04 +-1.23939291e-04 +-1.10615861e-04 +-9.72910306e-05 +-8.39640919e-05 +-7.06337512e-05 +-5.72973432e-05 +-4.39482617e-05 +-3.05637079e-05 +-1.69694118e-05 +-8.48470589e-06 +-0.00000000e+00 +0.00000000e+00 +3.75894696e-02 +5.41560073e-02 +2.95835980e-02 +-8.70411943e-03 +-5.00911446e-02 +-8.73083514e-02 +-1.15036766e-01 +-1.30269729e-01 +-1.32053160e-01 +-1.20990646e-01 +-9.87467118e-02 +-6.76333901e-02 +-3.02898900e-02 +1.05583227e-02 +5.22773787e-02 +9.24531424e-02 +1.28979264e-01 +1.60113819e-01 +1.84508910e-01 +2.01219804e-01 +2.09696810e-01 +2.09763641e-01 +2.01585619e-01 +1.85630373e-01 +1.62623319e-01 +1.33500301e-01 +9.93589388e-02 +6.14104577e-02 +2.09331343e-02 +-2.07714714e-02 +-6.24187235e-02 +-1.02776896e-01 +-1.40698472e-01 +-1.75146527e-01 +-2.05215986e-01 +-2.30149830e-01 +-2.49350314e-01 +-2.62385426e-01 +-2.68990985e-01 +-2.69068324e-01 +-2.62678554e-01 +-2.50033875e-01 +-2.31485030e-01 +-2.07507710e-01 +-1.78686246e-01 +-1.45696380e-01 +-1.09286934e-01 +-7.02611030e-02 +-2.94576468e-02 +1.22676087e-02 +5.40596119e-02 +9.50809915e-02 +1.34527761e-01 +1.71643601e-01 +2.05732566e-01 +2.36170062e-01 +2.62411987e-01 +2.84002057e-01 +3.00577154e-01 +3.11870911e-01 +3.17715324e-01 +3.18040743e-01 +3.12874101e-01 +3.02335615e-01 +2.86634098e-01 +2.66060979e-01 +2.40983210e-01 +2.11835222e-01 +1.79110219e-01 +1.43350654e-01 +1.05138483e-01 +6.50851022e-02 +2.38211104e-02 +-1.80136981e-02 +-5.97803026e-02 +-1.00849969e-01 +-1.40613336e-01 +-1.78488910e-01 +-2.13930854e-01 +-2.46436109e-01 +-2.75550517e-01 +-3.00874285e-01 +-3.22066287e-01 +-3.38847639e-01 +-3.51004124e-01 +-3.58387871e-01 +-3.60917821e-01 +-3.58579610e-01 +-3.51424287e-01 +-3.39566323e-01 +-3.23180918e-01 +-3.02500479e-01 +-2.77810470e-01 +-2.49444762e-01 +-2.17780462e-01 +-1.83232319e-01 +-1.46246805e-01 +-1.07295983e-01 +-6.68711827e-02 +-2.54766276e-02 +1.63769532e-02 +5.81786332e-02 +9.94234227e-02 +1.39618246e-01 +1.78287538e-01 +2.14978579e-01 +2.49266463e-01 +2.80758507e-01 +3.09098300e-01 +3.33969201e-01 +3.55097333e-01 +3.72254011e-01 +3.85257608e-01 +3.93974752e-01 +3.98321236e-01 +3.98262138e-01 +3.93811339e-01 +3.85030774e-01 +3.72029074e-01 +3.54959465e-01 +3.34017806e-01 +3.09439576e-01 +2.81496989e-01 +2.50495535e-01 +2.16770269e-01 +1.80681983e-01 +1.42613005e-01 +1.02963025e-01 +6.21447308e-02 +2.05793883e-02 +-2.13074978e-02 +-6.30905927e-02 +-1.04348973e-01 +-1.44670310e-01 +-1.83654789e-01 +-2.20919008e-01 +-2.56099479e-01 +-2.88855895e-01 +-3.18874232e-01 +-3.45869477e-01 +-3.69587935e-01 +-3.89809263e-01 +-4.06348296e-01 +-4.19056316e-01 +-4.27821951e-01 +-4.32571840e-01 +-4.33270894e-01 +-4.29922087e-01 +-4.22566030e-01 +-4.11280202e-01 +-3.96177735e-01 +-3.77405983e-01 +-3.55144809e-01 +-3.29604567e-01 +-3.01023877e-01 +-2.69667134e-01 +-2.35821879e-01 +-1.99795962e-01 +-1.61914601e-01 +-1.22517307e-01 +-8.19547487e-02 +-4.05855556e-02 +1.22689239e-03 +4.31176730e-02 +8.47234958e-02 +1.25685814e-01 +1.65653855e-01 +2.04287531e-01 +2.41260222e-01 +2.76261404e-01 +3.08999101e-01 +3.39202169e-01 +3.66622370e-01 +3.91036174e-01 +4.12246366e-01 +4.30083417e-01 +4.44406678e-01 +4.55105238e-01 +4.62098443e-01 +4.65336272e-01 +4.64799611e-01 +4.60500042e-01 +4.52479260e-01 +4.40808664e-01 +4.25588631e-01 +4.06947078e-01 +3.85038355e-01 +3.60042093e-01 +3.32161009e-01 +3.01619434e-01 +2.68661467e-01 +2.33548453e-01 +1.96557349e-01 +1.57978033e-01 +1.18111090e-01 +7.72655131e-02 +3.57560444e-02 +-6.09905073e-03 +-4.79805945e-02 +-8.95708455e-02 +-1.30555886e-01 +-1.70628002e-01 +-2.09487853e-01 +-2.46846744e-01 +-2.82428549e-01 +-3.15971849e-01 +-3.47231449e-01 +-3.75980488e-01 +-4.02011341e-01 +-4.25137777e-01 +-4.45195210e-01 +-4.62042680e-01 +-4.75562879e-01 +-4.85663241e-01 +-4.92276512e-01 +-4.95360404e-01 +-4.94898622e-01 +-4.90899956e-01 +-4.83398333e-01 +-4.72452727e-01 +-4.58145815e-01 +-4.40583759e-01 +-4.19895326e-01 +-3.96230283e-01 +-3.69758665e-01 +-3.40669438e-01 +-3.09168678e-01 +-2.75478278e-01 +-2.39834384e-01 +-2.02485449e-01 +-1.63690475e-01 +-1.23717284e-01 +-8.28405618e-02 +-4.13398945e-02 +5.02122253e-04 +4.24017956e-02 +8.40762839e-02 +1.25245500e-01 +1.65633941e-01 +2.04972501e-01 +2.43000209e-01 +2.79465990e-01 +3.14130138e-01 +3.46765884e-01 +3.77160773e-01 +4.05117975e-01 +4.30457480e-01 +4.53017158e-01 +4.72653669e-01 +4.89243264e-01 +5.02682454e-01 +5.12888555e-01 +5.19800079e-01 +5.23376984e-01 +5.23600779e-01 +5.20474510e-01 +5.14022591e-01 +5.04290501e-01 +4.91344361e-01 +4.75270374e-01 +4.56174159e-01 +4.34179953e-01 +4.09429713e-01 +3.82082112e-01 +3.52311438e-01 +3.20306408e-01 +2.86268908e-01 +2.50412650e-01 +2.12961783e-01 +1.74149441e-01 +1.34216253e-01 +9.34088200e-02 +5.19781704e-02 +1.01781988e-02 +-3.17358982e-02 +-7.35091781e-02 +-1.14888497e-01 +-1.55624025e-01 +-1.95470737e-01 +-2.34189853e-01 +-2.71550234e-01 +-3.07329717e-01 +-3.41316405e-01 +-3.73309829e-01 +-4.03122097e-01 +-4.30578949e-01 +-4.55520662e-01 +-4.77802924e-01 +-4.97297598e-01 +-5.13893390e-01 +-5.27496417e-01 +-5.38030585e-01 +-5.45438013e-01 +-5.49679179e-01 +-5.50733094e-01 +-5.48597272e-01 +-5.43287733e-01 +-5.34838785e-01 +-5.23302636e-01 +-5.08749014e-01 +-4.91264680e-01 +-4.70952847e-01 +-4.47932604e-01 +-4.22338020e-01 +-3.94317269e-01 +-3.64031741e-01 +-3.31655124e-01 +-2.97372416e-01 +-2.61378654e-01 +-2.23877788e-01 +-1.85081548e-01 +-1.45208303e-01 +-1.04481672e-01 +-6.31292447e-02 +-2.13813784e-02 +2.05300884e-02 +6.23732104e-02 +1.03917148e-01 +1.44933406e-01 +1.85197207e-01 +2.24488580e-01 +2.62593467e-01 +2.99305108e-01 +3.34425014e-01 +3.67763755e-01 +3.99142295e-01 +4.28392947e-01 +4.55359686e-01 +4.79899413e-01 +5.01882846e-01 +5.21194311e-01 +5.37733028e-01 +5.51413680e-01 +5.62165806e-01 +5.69935231e-01 +5.74683884e-01 +5.76389196e-01 +5.75045542e-01 +5.70663050e-01 +5.63267538e-01 +5.52901411e-01 +5.39621635e-01 +5.23500876e-01 +5.04626394e-01 +4.83099041e-01 +4.59034084e-01 +4.32558732e-01 +4.03812956e-01 +3.72947863e-01 +3.40124880e-01 +3.05515571e-01 +2.69299533e-01 +2.31664779e-01 +1.92805478e-01 +1.52921933e-01 +1.12218849e-01 +7.09046404e-02 +2.91902196e-02 +-1.27120897e-02 +-5.45895963e-02 +-9.62303057e-02 +-1.37424120e-01 +-1.77963589e-01 +-2.17645436e-01 +-2.56270854e-01 +-2.93647397e-01 +-3.29588796e-01 +-3.63917166e-01 +-3.96462374e-01 +-4.27064486e-01 +-4.55572750e-01 +-4.81848153e-01 +-5.05762174e-01 +-5.27199201e-01 +-5.46055369e-01 +-5.62240408e-01 +-5.75677061e-01 +-5.86301800e-01 +-5.94065366e-01 +-5.98931900e-01 +-6.00880845e-01 +-5.99904591e-01 +-5.96011168e-01 +-5.89221470e-01 +-5.79571299e-01 +-5.67109783e-01 +-5.51899292e-01 +-5.34016050e-01 +-5.13547815e-01 +-4.90595689e-01 +-4.65271562e-01 +-4.37698691e-01 +-4.08011046e-01 +-3.76351639e-01 +-3.42873293e-01 +-3.07736519e-01 +-2.71109416e-01 +-2.33167004e-01 +-1.94089588e-01 +-1.54062765e-01 +-1.13276007e-01 +-7.19217746e-02 +-3.01949021e-02 +1.17086670e-02 +5.35925845e-02 +9.52611279e-02 +1.36520043e-01 +1.77177401e-01 +2.17044759e-01 +2.55937573e-01 +2.93676289e-01 +3.30087435e-01 +3.65003733e-01 +3.98265240e-01 +4.29720424e-01 +4.59226006e-01 +4.86647946e-01 +5.11862575e-01 +5.34756278e-01 +5.55226091e-01 +5.73180789e-01 +5.88540826e-01 +6.01238171e-01 +6.11217257e-01 +6.18435390e-01 +6.22861953e-01 +6.24478945e-01 +6.23281446e-01 +6.19277282e-01 +6.12486421e-01 +6.02941404e-01 +5.90687393e-01 +5.75781404e-01 +5.58291890e-01 +5.38298796e-01 +5.15893293e-01 +4.91176922e-01 +4.64261042e-01 +4.35266600e-01 +4.04323630e-01 +3.71570448e-01 +3.37152848e-01 +3.01223684e-01 +2.63942174e-01 +2.25473181e-01 +1.85986270e-01 +1.45655074e-01 +1.04656566e-01 +6.31702590e-02 +2.13773711e-02 +-2.05399918e-02 +-6.23995691e-02 +-1.04019739e-01 +-1.45220331e-01 +-1.85823427e-01 +-2.25654077e-01 +-2.64541016e-01 +-3.02317420e-01 +-3.38821613e-01 +-3.73897781e-01 +-4.07396608e-01 +-4.39175787e-01 +-4.69100666e-01 +-4.97044806e-01 +-5.22890488e-01 +-5.46529232e-01 +-5.67862210e-01 +-5.86800516e-01 +-6.03265589e-01 +-6.17189485e-01 +-6.28515167e-01 +-6.37196694e-01 +-6.43199363e-01 +-6.46499873e-01 +-6.47086289e-01 +-6.44958049e-01 +-6.40125977e-01 +-6.32612195e-01 +-6.22449985e-01 +-6.09683611e-01 +-5.94368094e-01 +-5.76568964e-01 +-5.56361933e-01 +-5.33832524e-01 +-5.09075692e-01 +-4.82195416e-01 +-4.53304232e-01 +-4.22522743e-01 +-3.89979091e-01 +-3.55808405e-01 +-3.20152217e-01 +-2.83157866e-01 +-2.44977870e-01 +-2.05769287e-01 +-1.65693051e-01 +-1.24913310e-01 +-8.35967396e-02 +-4.19118636e-02 +-2.83603840e-05 +4.18836291e-02 +8.36541927e-02 +1.25114333e-01 +1.66096650e-01 +2.06436008e-01 +2.45970194e-01 +2.84540562e-01 +3.21992661e-01 +3.58176836e-01 +3.92948814e-01 +4.26170265e-01 +4.57709337e-01 +4.87441155e-01 +5.15248297e-01 +5.41021246e-01 +5.64658797e-01 +5.86068404e-01 +6.05166583e-01 +6.21879127e-01 +6.36141449e-01 +6.47898771e-01 +6.57106284e-01 +6.63729334e-01 +6.67743514e-01 +6.69134718e-01 +6.67899168e-01 +6.64043392e-01 +6.57584167e-01 +6.48548421e-01 +6.36973114e-01 +6.22905034e-01 +6.06400570e-01 +5.87525532e-01 +5.66354775e-01 +5.42971960e-01 +5.17469137e-01 +4.89946411e-01 +4.60511505e-01 +4.29279319e-01 +3.96371477e-01 +3.61915828e-01 +3.26045939e-01 +2.88900563e-01 +2.50623088e-01 +2.11360979e-01 +1.71265194e-01 +1.30489604e-01 +8.91903904e-02 +4.75254421e-02 +5.65374831e-03 +-3.62652080e-02 +-7.80720575e-02 +-1.19608148e-01 +-1.60716145e-01 +-2.01240623e-01 +-2.41028643e-01 +-2.79930326e-01 +-3.17799406e-01 +-3.54493773e-01 +-3.89876011e-01 +-4.23813890e-01 +-4.56180834e-01 +-4.86856384e-01 +-5.15726632e-01 +-5.42684630e-01 +-5.67630757e-01 +-5.90473078e-01 +-6.11127650e-01 +-6.29518861e-01 +-6.45579694e-01 +-6.59251862e-01 +-6.70486035e-01 +-6.79242007e-01 +-6.85488805e-01 +-6.89204777e-01 +-6.90377639e-01 +-6.89004587e-01 +-6.85092236e-01 +-6.78656460e-01 +-6.69722381e-01 +-6.58324231e-01 +-6.44505201e-01 +-6.28317275e-01 +-6.09821093e-01 +-5.89085673e-01 +-5.66188000e-01 +-5.41212771e-01 +-5.14252118e-01 +-4.85405216e-01 +-4.54777970e-01 +-4.22482669e-01 +-3.88637348e-01 +-3.53365431e-01 +-3.16795286e-01 +-2.79059746e-01 +-2.40295687e-01 +-2.00643504e-01 +-1.60246466e-01 +-1.19250262e-01 +-7.78025092e-02 +-3.60522149e-02 +5.85075311e-03 +4.77562824e-02 +8.95145068e-02 +1.30976313e-01 +1.71993852e-01 +2.12421169e-01 +2.52114689e-01 +2.90933638e-01 +3.28740536e-01 +3.65401669e-01 +4.00787811e-01 +4.34774428e-01 +4.67242034e-01 +4.98076620e-01 +5.27170188e-01 +5.54421350e-01 +5.79735147e-01 +6.03023469e-01 +6.24205372e-01 +6.43207873e-01 +6.59965673e-01 +6.74421178e-01 +6.86524791e-01 +6.96235582e-01 +7.03521245e-01 +7.08357565e-01 +7.10728723e-01 +7.10627801e-01 +7.08056873e-01 +7.03026078e-01 +6.95553861e-01 +6.85667441e-01 +6.73402737e-01 +6.58803284e-01 +6.41920403e-01 +6.22813697e-01 +6.01550543e-01 +5.78205091e-01 +5.52858411e-01 +5.25598971e-01 +4.96521490e-01 +4.65726363e-01 +4.33319796e-01 +3.99413906e-01 +3.64125291e-01 +3.27574913e-01 +2.89888208e-01 +2.51194359e-01 +2.11625427e-01 +1.71316313e-01 +1.30404526e-01 +8.90291276e-02 +4.73305318e-02 +5.45018461e-03 +-3.64701732e-02 +-7.82888826e-02 +-1.19864753e-01 +-1.61057802e-01 +-2.01729446e-01 +-2.41742895e-01 +-2.80964173e-01 +-3.19261983e-01 +-3.56507986e-01 +-3.92578130e-01 +-4.27352381e-01 +-4.60714642e-01 +-4.92554359e-01 +-5.22766315e-01 +-5.51250034e-01 +-5.77911668e-01 +-6.02663828e-01 +-6.25424548e-01 +-6.46119373e-01 +-6.64681204e-01 +-6.81048838e-01 +-6.95169367e-01 +-7.06997766e-01 +-7.16495224e-01 +-7.23631896e-01 +-7.28385903e-01 +-7.30741797e-01 +-7.30693624e-01 +-7.28242997e-01 +-7.23398165e-01 +-7.16177116e-01 +-7.06604600e-01 +-6.94712310e-01 +-6.80541382e-01 +-6.64138724e-01 +-6.45558628e-01 +-6.24863726e-01 +-6.02121650e-01 +-5.77407696e-01 +-5.50803706e-01 +-5.22396172e-01 +-4.92278970e-01 +-4.60550446e-01 +-4.27313748e-01 +-3.92677962e-01 +-3.56755200e-01 +-3.19662342e-01 +-2.81519947e-01 +-2.42451048e-01 +-2.02582448e-01 +-1.62042632e-01 +-1.20962276e-01 +-7.94738050e-02 +-3.77103990e-02 +4.19374843e-03 +4.61043847e-02 +8.78872877e-02 +1.29409031e-01 +1.70536889e-01 +2.11139962e-01 +2.51088972e-01 +2.90256771e-01 +3.28519495e-01 +3.65755292e-01 +4.01846960e-01 +4.36680098e-01 +4.70144834e-01 +5.02136246e-01 +5.32552906e-01 +5.61300448e-01 +5.88287794e-01 +6.13431314e-01 +6.36652344e-01 +6.57878258e-01 +6.77044075e-01 +6.94089164e-01 +7.08962439e-01 +7.21616822e-01 +7.32014698e-01 +7.40124009e-01 +7.45920304e-01 +7.49387213e-01 +7.50513785e-01 +7.49299090e-01 +7.45746287e-01 +7.39869174e-01 +7.31685671e-01 +7.21223315e-01 +7.08515086e-01 +6.93601508e-01 +6.76530242e-01 +6.57354366e-01 +6.36135293e-01 +6.12938278e-01 +5.87837315e-01 +5.60909337e-01 +5.32239594e-01 +5.01916013e-01 +4.70033750e-01 +4.36690774e-01 +4.01990834e-01 +3.66040716e-01 +3.28951498e-01 +2.90837340e-01 +2.51815386e-01 +2.12005602e-01 +1.71529875e-01 +1.30512360e-01 +8.90782965e-02 +4.73543939e-02 +5.46779601e-03 +-3.64538621e-02 +-7.82830264e-02 +-1.19892735e-01 +-1.61156538e-01 +-2.01949707e-01 +-2.42148408e-01 +-2.81631653e-01 +-3.20279705e-01 +-3.57976764e-01 +-3.94608620e-01 +-4.30066022e-01 +-4.64241656e-01 +-4.97034090e-01 +-5.28344194e-01 +-5.58079495e-01 +-5.86150253e-01 +-6.12473970e-01 +-6.36971401e-01 +-6.59570882e-01 +-6.80204663e-01 +-6.98812614e-01 +-7.15339364e-01 +-7.29736851e-01 +-7.41962831e-01 +-7.51981695e-01 +-7.59764895e-01 +-7.65289539e-01 +-7.68541139e-01 +-7.69509704e-01 +-7.68194874e-01 +-7.64599765e-01 +-7.58737863e-01 +-7.50625576e-01 +-7.40289699e-01 +-7.27760065e-01 +-7.13075982e-01 +-6.96280675e-01 +-6.77425158e-01 +-6.56565721e-01 +-6.33764275e-01 +-6.09089481e-01 +-5.82613520e-01 +-5.54416246e-01 +-5.24579718e-01 +-4.93193405e-01 +-4.60348812e-01 +-4.26143437e-01 +-3.90677520e-01 +-3.54055198e-01 +-3.16384241e-01 +-2.77774399e-01 +-2.38339295e-01 +-1.98193490e-01 +-1.57454612e-01 +-1.16241058e-01 +-7.46729003e-02 +-3.28709624e-02 +9.04344693e-03 +5.09487765e-02 +9.27236112e-02 +1.34247246e-01 +1.75399595e-01 +2.16061945e-01 +2.56117285e-01 +2.95449906e-01 +3.33947369e-01 +3.71498479e-01 +4.07996085e-01 +4.43335524e-01 +4.77415382e-01 +5.10139185e-01 +5.41412524e-01 +5.71147384e-01 +5.99258644e-01 +6.25666384e-01 +6.50296663e-01 +6.73078487e-01 +6.93948925e-01 +7.12848369e-01 +7.29723665e-01 +7.44528560e-01 +7.57220222e-01 +7.67764875e-01 +7.76132638e-01 +7.82300284e-01 +7.86252489e-01 +7.87977283e-01 +7.87471909e-01 +7.84738383e-01 +7.79784445e-01 +7.72626556e-01 +7.63284335e-01 +7.51785544e-01 +7.38163987e-01 +7.22457527e-01 +7.04712572e-01 +6.84979133e-01 +6.63312991e-01 +6.39776969e-01 +6.14436592e-01 +5.87364081e-01 +5.58636375e-01 +5.28333510e-01 +4.96541776e-01 +4.63350293e-01 +4.28851800e-01 +3.93143926e-01 +3.56326077e-01 +3.18501226e-01 +2.79775581e-01 +2.40256649e-01 +2.00054790e-01 +1.59282084e-01 +1.18051593e-01 +7.64780411e-02 +3.46767256e-02 +-7.23658345e-03 +-4.91458214e-02 +-9.09351819e-02 +-1.32489137e-01 +-1.73693234e-01 +-2.14433913e-01 +-2.54598811e-01 +-2.94077922e-01 +-3.32762669e-01 +-3.70546661e-01 +-4.07327005e-01 +-4.43002761e-01 +-4.77476093e-01 +-5.10653714e-01 +-5.42444775e-01 +-5.72762341e-01 +-6.01524942e-01 +-6.28654058e-01 +-6.54075675e-01 +-6.77722053e-01 +-6.99528926e-01 +-7.19436900e-01 +-7.37393490e-01 +-7.53350284e-01 +-7.67263839e-01 +-7.79098024e-01 +-7.88821506e-01 +-7.96407753e-01 +-8.01837640e-01 +-8.05097711e-01 +-8.06178922e-01 +-8.05079403e-01 +-8.01803833e-01 +-7.96360873e-01 +-7.88765843e-01 +-7.79041149e-01 +-7.67213060e-01 +-7.53313706e-01 +-7.37382213e-01 +-7.19462001e-01 +-6.99601250e-01 +-6.77854465e-01 +-6.54281186e-01 +-6.28944531e-01 +-6.01912984e-01 +-5.73260360e-01 +-5.43063404e-01 +-5.11403080e-01 +-4.78365054e-01 +-4.44038093e-01 +-4.08513796e-01 +-3.71887393e-01 +-3.34257312e-01 +-2.95723744e-01 +-2.56389404e-01 +-2.16359436e-01 +-1.75740434e-01 +-1.34640253e-01 +-9.31681575e-02 +-5.14343463e-02 +-9.54935920e-03 +3.23758526e-02 +7.42303241e-02 +1.15903521e-01 +1.57285380e-01 +1.98266656e-01 +2.38739544e-01 +2.78597597e-01 +3.17735847e-01 +3.56051440e-01 +3.93444248e-01 +4.29816190e-01 +4.65071827e-01 +4.99119016e-01 +5.31869372e-01 +5.63237205e-01 +5.93140552e-01 +6.21501782e-01 +6.48247776e-01 +6.73308770e-01 +6.96619601e-01 +7.18120255e-01 +7.37755799e-01 +7.55475222e-01 +7.71232753e-01 +7.84988281e-01 +7.96707288e-01 +8.06359526e-01 +8.13920322e-01 +8.19370959e-01 +8.22698658e-01 +8.23895066e-01 +8.22957502e-01 +8.19889165e-01 +8.14699435e-01 +8.07402105e-01 +7.98016409e-01 +7.86567215e-01 +7.73085381e-01 +7.57606281e-01 +7.40170090e-01 +7.20822228e-01 +6.99613464e-01 +6.76599244e-01 +6.51838915e-01 +6.25396484e-01 +5.97340419e-01 +5.67743654e-01 +5.36682321e-01 +5.04236245e-01 +4.70488867e-01 +4.35527150e-01 +3.99440972e-01 +3.62322625e-01 +3.24267112e-01 +2.85371819e-01 +2.45736349e-01 +2.05461813e-01 +1.64650826e-01 +1.23407359e-01 +8.18364300e-02 +4.00437810e-02 +-1.86450583e-03 +-4.37820996e-02 +-8.56027091e-02 +-1.27220412e-01 +-1.68530008e-01 +-2.09427090e-01 +-2.49808357e-01 +-2.89571906e-01 +-3.28617572e-01 +-3.66847258e-01 +-4.04164772e-01 +-4.40476299e-01 +-4.75690671e-01 +-5.09719651e-01 +-5.42478335e-01 +-5.73884721e-01 +-6.03860258e-01 +-6.32330106e-01 +-6.59223317e-01 +-6.84473322e-01 +-7.08017416e-01 +-7.29797044e-01 +-7.49758207e-01 +-7.67851537e-01 +-7.84032600e-01 +-7.98261908e-01 +-8.10504365e-01 +-8.20729978e-01 +-8.28913857e-01 +-8.35036257e-01 +-8.39082934e-01 +-8.41044539e-01 +-8.40916667e-01 +-8.38700223e-01 +-8.34401330e-01 +-8.28031349e-01 +-8.19607071e-01 +-8.09149951e-01 +-7.96686370e-01 +-7.82247739e-01 +-7.65870356e-01 +-7.47595335e-01 +-7.27468694e-01 +-7.05540627e-01 +-6.81865642e-01 +-6.56502609e-01 +-6.29514503e-01 +-6.00968278e-01 +-5.70934822e-01 +-5.39488471e-01 +-5.06706805e-01 +-4.72670693e-01 +-4.37464022e-01 +-4.01173496e-01 +-3.63888432e-01 +-3.25700550e-01 +-2.86703527e-01 +-2.46992952e-01 +-2.06666102e-01 +-1.65821683e-01 +-1.24559580e-01 +-8.29806157e-02 +-4.11862686e-02 +7.21592729e-04 +4.26408936e-02 +8.44696137e-02 +1.26106042e-01 +1.67449027e-01 +2.08398241e-01 +2.48854459e-01 +2.88719695e-01 +3.27897467e-01 +3.66293054e-01 +4.03813711e-01 +4.40368898e-01 +4.75870503e-01 +5.10233120e-01 +5.43374163e-01 +5.75213966e-01 +6.05676094e-01 +6.34687513e-01 +6.62178758e-01 +6.88084087e-01 +7.12341640e-01 +7.34893688e-01 +7.55686615e-01 +7.74670952e-01 +7.91801651e-01 +8.07038162e-01 +8.20344523e-01 +8.31689431e-01 +8.41046311e-01 +8.48393409e-01 +8.53713891e-01 +8.56995627e-01 +8.58231349e-01 +8.57418706e-01 +8.54560241e-01 +8.49663385e-01 +8.42740425e-01 +8.33808452e-01 +8.22889352e-01 +8.10009796e-01 +7.95200983e-01 +7.78498642e-01 +7.59942962e-01 +7.39578536e-01 +7.17454184e-01 +6.93622867e-01 +6.68141555e-01 +6.41071052e-01 +6.12475884e-01 +5.82424174e-01 +5.50987367e-01 +5.18240078e-01 +4.84259967e-01 +4.49127540e-01 +4.12925955e-01 +3.75740810e-01 +3.37659949e-01 +2.98773243e-01 +2.59172380e-01 +2.18950644e-01 +1.78202704e-01 +1.37024360e-01 +9.55123305e-02 +5.37640371e-02 +1.18773698e-02 +-3.00495407e-02 +-7.19185565e-02 +-1.13631760e-01 +-1.55091687e-01 +-1.96201547e-01 +-2.36865457e-01 +-2.76988655e-01 +-3.16477733e-01 +-3.55240853e-01 +-3.93187939e-01 +-4.30230886e-01 +-4.66283774e-01 +-5.01263057e-01 +-5.35087758e-01 +-5.67679654e-01 +-5.98963451e-01 +-6.28866956e-01 +-6.57321240e-01 +-6.84260792e-01 +-7.09623666e-01 +-7.33351619e-01 +-7.55390242e-01 +-7.75689083e-01 +-7.94201765e-01 +-8.10886066e-01 +-8.25704005e-01 +-8.38621938e-01 +-8.49610639e-01 +-8.58645346e-01 +-8.65705818e-01 +-8.70776383e-01 +-8.73845944e-01 +-8.74908029e-01 +-8.73960769e-01 +-8.71006920e-01 +-8.66053833e-01 +-8.59113438e-01 +-8.50202215e-01 +-8.39341138e-01 +-8.26555624e-01 +-8.11875479e-01 +-7.95334810e-01 +-7.76971954e-01 +-7.56829373e-01 +-7.34953551e-01 +-7.11394883e-01 +-6.86207560e-01 +-6.59449439e-01 +-6.31181904e-01 +-6.01469725e-01 +-5.70380901e-01 +-5.37986503e-01 +-5.04360510e-01 +-4.69579634e-01 +-4.33723145e-01 +-3.96872682e-01 +-3.59112071e-01 +-3.20527131e-01 +-2.81205468e-01 +-2.41236293e-01 +-2.00710194e-01 +-1.59718952e-01 +-1.18355313e-01 +-7.67127923e-02 +-3.48854529e-02 +7.03230382e-03 +4.89459514e-02 +9.07610532e-02 +1.32383472e-01 +1.73719583e-01 +2.14676486e-01 +2.55162209e-01 +2.95085917e-01 +3.34358112e-01 +3.72890831e-01 +4.10597845e-01 +4.47394849e-01 +4.83199646e-01 +5.17932328e-01 +5.51515455e-01 +5.83874217e-01 +6.14936608e-01 +6.44633585e-01 +6.72899202e-01 +6.99670754e-01 +7.24888945e-01 +7.48497969e-01 +7.70445659e-01 +7.90683598e-01 +8.09167200e-01 +8.25855833e-01 +8.40712880e-01 +8.53705822e-01 +8.64806321e-01 +8.73990245e-01 +8.81237743e-01 +8.86533277e-01 +8.89865641e-01 +8.91227987e-01 +8.90617835e-01 +8.88037072e-01 +8.83491941e-01 +8.76993018e-01 +8.68555190e-01 +8.58197610e-01 +8.45943651e-01 +8.31820851e-01 +8.15860844e-01 +7.98099284e-01 +7.78575764e-01 +7.57333721e-01 +7.34420338e-01 +7.09886435e-01 +6.83786344e-01 +6.56177801e-01 +6.27121801e-01 +5.96682464e-01 +5.64926897e-01 +5.31925027e-01 +4.97749463e-01 +4.62475321e-01 +4.26180057e-01 +3.88943304e-01 +3.50846683e-01 +3.11973630e-01 +2.72409208e-01 +2.32239921e-01 +1.91553524e-01 +1.50438825e-01 +1.08985500e-01 +6.72838848e-02 +2.54247876e-02 +-1.65007148e-02 +-5.84014733e-02 +-1.00186465e-01 +-1.41764990e-01 +-1.83046870e-01 +-2.23942640e-01 +-2.64363741e-01 +-3.04222717e-01 +-3.43433395e-01 +-3.81911071e-01 +-4.19572696e-01 +-4.56337051e-01 +-4.92124917e-01 +-5.26859262e-01 +-5.60465367e-01 +-5.92871028e-01 +-6.24006665e-01 +-6.53805509e-01 +-6.82203711e-01 +-7.09140484e-01 +-7.34558254e-01 +-7.58402739e-01 +-7.80623083e-01 +-8.01171966e-01 +-8.20005697e-01 +-8.37084295e-01 +-8.52371575e-01 +-8.65835219e-01 +-8.77446844e-01 +-8.87182053e-01 +-8.95020485e-01 +-9.00945846e-01 +-9.04945959e-01 +-9.07012794e-01 +-9.07142442e-01 +-9.05335120e-01 +-9.01595180e-01 +-8.95931108e-01 +-8.88355478e-01 +-8.78884907e-01 +-8.67540064e-01 +-8.54345580e-01 +-8.39329988e-01 +-8.22525702e-01 +-8.03968876e-01 +-7.83699392e-01 +-7.61760705e-01 +-7.38199797e-01 +-7.13067055e-01 +-6.86416196e-01 +-6.58304090e-01 +-6.28790645e-01 +-5.97938687e-01 +-5.65813832e-01 +-5.32484333e-01 +-4.98020940e-01 +-4.62496739e-01 +-4.25987006e-01 +-3.88569036e-01 +-3.50321981e-01 +-3.11326682e-01 +-2.71665492e-01 +-2.31422129e-01 +-1.90681467e-01 +-1.49529346e-01 +-1.08052405e-01 +-6.63379010e-02 +-2.44735242e-02 +1.74527862e-02 +5.93530267e-02 +1.01139313e-01 +1.42724064e-01 +1.84020182e-01 +2.24941227e-01 +2.65401627e-01 +3.05316853e-01 +3.44603574e-01 +3.83179827e-01 +4.20965200e-01 +4.57880987e-01 +4.93850356e-01 +5.28798502e-01 +5.62652802e-01 +5.95342953e-01 +6.26801103e-01 +6.56962094e-01 +6.85763537e-01 +7.13145868e-01 +7.39052518e-01 +7.63430019e-01 +7.86228121e-01 +8.07399881e-01 +8.26901759e-01 +8.44693698e-01 +8.60739169e-01 +8.75005399e-01 +8.87463386e-01 +8.98087798e-01 +9.06857098e-01 +9.13753609e-01 +9.18763531e-01 +9.21876953e-01 +9.23087898e-01 +9.22394253e-01 +9.19797878e-01 +9.15304748e-01 +9.08924605e-01 +9.00671062e-01 +8.90561541e-01 +8.78617279e-01 +8.64863277e-01 +8.49328212e-01 +8.32044356e-01 +8.13047609e-01 +7.92377543e-01 +7.70076987e-01 +7.46192051e-01 +7.20772056e-01 +6.93869427e-01 +6.65539582e-01 +6.35840801e-01 +6.04834099e-01 +5.72583304e-01 +5.39154686e-01 +5.04616797e-01 +4.69040402e-01 +4.32498324e-01 +3.95065306e-01 +3.56817857e-01 +3.17834069e-01 +2.78193593e-01 +2.37977328e-01 +1.97267216e-01 +1.56146158e-01 +1.14697824e-01 +7.30064999e-02 +3.11569089e-02 +-1.07659383e-02 +-5.26769474e-02 +-9.44911437e-02 +-1.36123811e-01 +-1.77490657e-01 +-2.18507976e-01 +-2.59092813e-01 +-2.99163097e-01 +-3.38637935e-01 +-3.77437755e-01 +-4.15484347e-01 +-4.52701068e-01 +-4.89012993e-01 +-5.24347048e-01 +-5.58632100e-01 +-5.91799307e-01 +-6.23782283e-01 +-6.54516924e-01 +-6.83941664e-01 +-7.11997596e-01 +-7.38628569e-01 +-7.63781221e-01 +-7.87405448e-01 +-8.09454401e-01 +-8.29884193e-01 +-8.48654213e-01 +-8.65727160e-01 +-8.81069112e-01 +-8.94649521e-01 +-9.06441887e-01 +-9.16423185e-01 +-9.24573854e-01 +-9.30877976e-01 +-9.35323306e-01 +-9.37901182e-01 +-9.38606867e-01 +-9.37439778e-01 +-9.34402684e-01 +-9.29502031e-01 +-9.22747944e-01 +-9.14154146e-01 +-9.03737965e-01 +-8.91520967e-01 +-8.77527964e-01 +-8.61787140e-01 +-8.44330109e-01 +-8.25191814e-01 +-8.04410401e-01 +-7.82027826e-01 +-7.58089021e-01 +-7.32641753e-01 +-7.05736723e-01 +-6.77427457e-01 +-6.47770117e-01 +-6.16824002e-01 +-5.84650760e-01 +-5.51314233e-01 +-5.16880499e-01 +-4.81417736e-01 +-4.44996067e-01 +-4.07687860e-01 +-3.69566973e-01 +-3.30708695e-01 +-2.91189728e-01 +-2.51088006e-01 +-2.10482614e-01 +-1.69453746e-01 +-1.28082194e-01 +-8.64493434e-02 +-4.46370534e-02 +-2.72751445e-03 +3.91968958e-02 +8.10538944e-02 +1.22761415e-01 +1.64237719e-01 +2.05401523e-01 +2.46172126e-01 +2.86469877e-01 +3.26216076e-01 +3.65333090e-01 +4.03744514e-01 +4.41375218e-01 +4.78151898e-01 +5.14003157e-01 +5.48859216e-01 +5.82652243e-01 +6.15316344e-01 +6.46787937e-01 +6.77006390e-01 +7.05913181e-01 +7.33452252e-01 +7.59570119e-01 +7.84215940e-01 +8.07342656e-01 +8.28905816e-01 +8.48863798e-01 +8.67177997e-01 +8.83812772e-01 +8.98736765e-01 +9.11921689e-01 +9.23342275e-01 +9.32976566e-01 +9.40805772e-01 +9.46815689e-01 +9.50995437e-01 +9.53337221e-01 +9.53836666e-01 +9.52492664e-01 +9.49308832e-01 +9.44292055e-01 +9.37452275e-01 +9.28802798e-01 +9.18360172e-01 +9.06145647e-01 +8.92183360e-01 +8.76500420e-01 +8.59127040e-01 +8.40096629e-01 +8.19446932e-01 +7.97218060e-01 +7.73452880e-01 +7.48196965e-01 +7.21499025e-01 +6.93411282e-01 +6.63987835e-01 +6.33285172e-01 +6.01362001e-01 +5.68280003e-01 +5.34103142e-01 +4.98896915e-01 +4.62728673e-01 +4.25667524e-01 +3.87784947e-01 +3.49153527e-01 +3.09847051e-01 +2.69940497e-01 +2.29510180e-01 +1.88633554e-01 +1.47388536e-01 +1.05853695e-01 +6.41081579e-02 +2.22315702e-02 +-1.96963936e-02 +-6.15960420e-02 +-1.03387684e-01 +-1.44991840e-01 +-1.86329645e-01 +-2.27322729e-01 +-2.67893304e-01 +-3.07964250e-01 +-3.47459945e-01 +-3.86305791e-01 +-4.24428276e-01 +-4.61754987e-01 +-4.98215557e-01 +-5.33741596e-01 +-5.68266047e-01 +-6.01723490e-01 +-6.34050686e-01 +-6.65187531e-01 +-6.95075495e-01 +-7.23658116e-01 +-7.50881152e-01 +-7.76694413e-01 +-8.01049723e-01 +-8.23901218e-01 +-8.45205386e-01 +-8.64923172e-01 +-8.83018287e-01 +-8.99456762e-01 +-9.14207193e-01 +-9.27242621e-01 +-9.38539731e-01 +-9.48077421e-01 +-9.55837313e-01 +-9.61805310e-01 +-9.65971680e-01 +-9.68328733e-01 +-9.68871625e-01 +-9.67599587e-01 +-9.64516580e-01 +-9.59628559e-01 +-9.52944244e-01 +-9.44476243e-01 +-9.34242025e-01 +-9.22260883e-01 +-9.08554798e-01 +-8.93149396e-01 +-8.76075037e-01 +-8.57363717e-01 +-8.37049909e-01 +-8.15171558e-01 +-7.91770909e-01 +-7.66891626e-01 +-7.40579592e-01 +-7.12883961e-01 +-6.83857525e-01 +-6.53554252e-01 +-6.22030027e-01 +-5.89343759e-01 +-5.55557131e-01 +-5.20732778e-01 +-4.84934915e-01 +-4.48230418e-01 +-4.10687972e-01 +-3.72377007e-01 +-3.33368183e-01 +-2.93734264e-01 +-2.53548882e-01 +-2.12886223e-01 +-1.71821348e-01 +-1.30430566e-01 +-8.87903547e-02 +-4.69775039e-02 +-5.06925387e-03 +3.68569826e-02 +7.87239981e-02 +1.20454584e-01 +1.61971755e-01 +2.03199313e-01 +2.44061455e-01 +2.84482728e-01 +3.24388981e-01 +3.63707297e-01 +4.02365371e-01 +4.40291755e-01 +4.77417576e-01 +5.13675043e-01 +5.48997304e-01 +5.83319405e-01 +6.16579591e-01 +6.48716997e-01 +6.79672051e-01 +7.09388788e-01 +7.37813809e-01 +7.64894822e-01 +7.90581607e-01 +8.14828863e-01 +8.37592668e-01 +8.58830648e-01 +8.78504334e-01 +8.96579484e-01 +9.13022899e-01 +9.27803535e-01 +9.40896298e-01 +9.52278015e-01 +9.61927125e-01 +9.69826073e-01 +9.75962535e-01 +9.80325158e-01 +9.82904800e-01 +9.83698681e-01 +9.82706187e-01 +9.79928188e-01 +9.75369758e-01 +9.69041315e-01 +9.60954038e-01 +9.51121392e-01 +9.39563257e-01 +9.26301216e-01 +9.11358236e-01 +8.94761777e-01 +8.76543716e-01 +8.56736493e-01 +8.35375024e-01 +8.12499999e-01 +7.88152953e-01 +7.62376784e-01 +7.35219033e-01 +7.06729834e-01 +6.76959876e-01 +6.45962603e-01 +6.13795531e-01 +5.80516376e-01 +5.46184279e-01 +5.10862408e-01 +4.74614574e-01 +4.37505306e-01 +3.99601842e-01 +3.60973039e-01 +3.21687858e-01 +2.81816784e-01 +2.41432193e-01 +2.00606350e-01 +1.59412259e-01 +1.17924312e-01 +7.62168149e-02 +3.43643692e-02 +-7.55786596e-03 +-4.94748983e-02 +-9.13117225e-02 +-1.32993372e-01 +-1.74445597e-01 +-2.15594274e-01 +-2.56365577e-01 +-2.96687292e-01 +-3.36487490e-01 +-3.75694552e-01 +-4.14239363e-01 +-4.52053486e-01 +-4.89068713e-01 +-5.25219846e-01 +-5.60443209e-01 +-5.94675222e-01 +-6.27855327e-01 +-6.59925772e-01 +-6.90828696e-01 +-7.20508995e-01 +-7.48915744e-01 +-7.75997814e-01 +-8.01706382e-01 +-8.25998046e-01 +-8.48829304e-01 +-8.70158411e-01 +-8.89950025e-01 +-9.08168994e-01 +-9.24781417e-01 +-9.39760360e-01 +-9.53079625e-01 +-9.64713778e-01 +-9.74644548e-01 +-9.82855115e-01 +-9.89328983e-01 +-9.94056713e-01 +-9.97031102e-01 +-9.98244893e-01 +-9.97697576e-01 +-9.95391619e-01 +-9.91329107e-01 +-9.85518489e-01 +-9.77971772e-01 +-9.68700327e-01 +-9.57721480e-01 +-9.45056480e-01 +-9.30659921e-01 +-9.14519898e-01 +-8.96777961e-01 +-8.77469189e-01 +-8.56629252e-01 +-8.34296427e-01 +-8.10511526e-01 +-7.85317835e-01 +-7.58761016e-01 +-7.30889010e-01 +-7.01751986e-01 +-6.71402210e-01 +-6.39893953e-01 +-6.07283421e-01 +-5.73628618e-01 +-5.38989244e-01 +-5.03426621e-01 +-4.67003536e-01 +-4.29784149e-01 +-3.91833901e-01 +-3.53219348e-01 +-3.14008077e-01 +-2.74268599e-01 +-2.34070175e-01 +-1.93482748e-01 +-1.52576807e-01 +-1.11423228e-01 +-7.00932094e-02 +-2.86581113e-02 +1.28106815e-02 +5.42418250e-02 +9.55641975e-02 +1.36707005e-01 +1.77599862e-01 +2.18172978e-01 +2.58357229e-01 +2.98084268e-01 +3.37286695e-01 +3.75898099e-01 +4.13853212e-01 +4.51088029e-01 +4.87539855e-01 +5.23147475e-01 +5.57851222e-01 +5.91593057e-01 +6.24316715e-01 +6.55967743e-01 +6.86493610e-01 +7.15843813e-01 +7.43969904e-01 +7.70825622e-01 +7.96366938e-01 +8.20552109e-01 +8.43341789e-01 +8.64699039e-01 +8.84589412e-01 +9.02981007e-01 +9.19844489e-01 +9.35153167e-01 +9.48883005e-01 +9.61012665e-01 +9.71523546e-01 +9.80399785e-01 +9.87628300e-01 +9.93198792e-01 +9.97103755e-01 +9.99338489e-01 +9.99901093e-01 +9.98792464e-01 +9.96016288e-01 +9.91579030e-01 +9.85489908e-01 +9.77760882e-01 +9.68406616e-01 +9.57444449e-01 +9.44894373e-01 +9.30778966e-01 +9.15123379e-01 +8.97955263e-01 +8.79304725e-01 +8.59204287e-01 +8.37688788e-01 +8.14795373e-01 +7.90563374e-01 +7.65034274e-01 +7.38251626e-01 +7.10260952e-01 +6.81109715e-01 +6.50847170e-01 +6.19524337e-01 +5.87193878e-01 +5.53910008e-01 +5.19728437e-01 +4.84706206e-01 +4.48901680e-01 +4.12374360e-01 +3.75184848e-01 +3.37394719e-01 +2.99066399e-01 +2.60263121e-01 +2.21048731e-01 +1.81487679e-01 +1.41644831e-01 +1.01585410e-01 +6.13748838e-02 +2.10788202e-02 +-1.92371454e-02 +-5.95075167e-02 +-9.96669337e-02 +-1.39650377e-01 +-1.79393202e-01 +-2.18831272e-01 +-2.57901076e-01 +-2.96539776e-01 +-3.34685390e-01 +-3.72276787e-01 +-4.09253895e-01 +-4.45557691e-01 +-4.81130375e-01 +-5.15915413e-01 +-5.49857632e-01 +-5.82903337e-01 +-6.15000332e-01 +-6.46098079e-01 +-6.76147690e-01 +-7.05102086e-01 +-7.32915989e-01 +-7.59546058e-01 +-7.84950902e-01 +-8.09091171e-01 +-8.31929611e-01 +-8.53431097e-01 +-8.73562720e-01 +-8.92293792e-01 +-9.09595934e-01 +-9.25443070e-01 +-9.39811506e-01 +-9.52679925e-01 +-9.64029446e-01 +-9.73843620e-01 +-9.82108475e-01 +-9.88812516e-01 +-9.93946741e-01 +-9.97504654e-01 +-9.99482262e-01 +-9.99878083e-01 +-9.98693134e-01 +-9.95930930e-01 +-9.91597469e-01 +-9.85701216e-01 +-9.78253090e-01 +-9.69266427e-01 +-9.58756973e-01 +-9.46742832e-01 +-9.33244451e-01 +-9.18284567e-01 +-9.01888177e-01 +-8.84082486e-01 +-8.64896863e-01 +-8.44362788e-01 +-8.22513796e-01 +-7.99385429e-01 +-7.75015156e-01 +-7.49442339e-01 +-7.22708129e-01 +-6.94855445e-01 +-6.65928844e-01 +-6.35974519e-01 +-6.05040141e-01 +-5.73174871e-01 +-5.40429185e-01 +-5.06854893e-01 +-4.72504948e-01 +-4.37433474e-01 +-4.01695565e-01 +-3.65347310e-01 +-3.28445591e-01 +-2.91048110e-01 +-2.53213175e-01 +-2.14999736e-01 +-1.76467163e-01 +-1.37675281e-01 +-9.86841533e-02 +-5.95541089e-02 +-2.03455269e-02 +1.88811308e-02 +5.80655408e-02 +9.71474819e-02 +1.36067056e-01 +1.74764651e-01 +2.13181159e-01 +2.51257940e-01 +2.88937033e-01 +3.26161126e-01 +3.62873755e-01 +3.99019277e-01 +4.34543063e-01 +4.69391472e-01 +5.03512034e-01 +5.36853430e-01 +5.69365655e-01 +6.01000014e-01 +6.31709261e-01 +6.61447608e-01 +6.90170841e-01 +7.17836345e-01 +7.44403192e-01 +7.69832183e-01 +7.94085908e-01 +8.17128806e-01 +8.38927197e-01 +8.59449354e-01 +8.78665512e-01 +8.96547952e-01 +9.13070988e-01 +9.28211056e-01 +9.41946687e-01 +9.54258590e-01 +9.65129626e-01 +9.74544873e-01 +9.82491606e-01 +9.88959340e-01 +9.93939820e-01 +9.97427040e-01 +9.99417243e-01 +9.99908923e-01 +9.98902818e-01 +9.96401910e-01 +9.92411408e-01 +9.86938744e-01 +9.79993547e-01 +9.71587634e-01 +9.61734974e-01 +9.50451682e-01 +9.37755963e-01 +9.23668111e-01 +9.08210444e-01 +8.91407293e-01 +8.73284942e-01 +8.53871588e-01 +8.33197312e-01 +8.11293993e-01 +7.88195312e-01 +7.63936627e-01 +7.38554997e-01 +7.12089044e-01 +6.84578961e-01 +6.56066397e-01 +6.26594424e-01 +5.96207465e-01 +5.64951197e-01 +5.32872543e-01 +5.00019514e-01 +4.66441233e-01 +4.32187763e-01 +3.97310117e-01 +3.61860120e-01 +3.25890359e-01 +2.89454111e-01 +2.52605220e-01 +2.15398096e-01 +1.77887531e-01 +1.40128726e-01 +1.02177113e-01 +6.40883444e-02 +2.59181775e-02 +-1.22776179e-02 +-5.04432853e-02 +-8.85232544e-02 +-1.26462110e-01 +-1.64204784e-01 +-2.01696543e-01 +-2.38883122e-01 +-2.75710796e-01 +-3.12126412e-01 +-3.48077549e-01 +-3.83512490e-01 +-4.18380394e-01 +-4.52631294e-01 +-4.86216198e-01 +-5.19087177e-01 +-5.51197370e-01 +-5.82501138e-01 +-6.12954032e-01 +-6.42512934e-01 +-6.71136071e-01 +-6.98783074e-01 +-7.25415073e-01 +-7.50994680e-01 +-7.75486117e-01 +-7.98855202e-01 +-8.21069426e-01 +-8.42098001e-01 +-8.61911861e-01 +-8.80483760e-01 +-8.97788247e-01 +-9.13801740e-01 +-9.28502543e-01 +-9.41870857e-01 +-9.53888839e-01 +-9.64540582e-01 +-9.73812171e-01 +-9.81691672e-01 +-9.88169154e-01 +-9.93236707e-01 +-9.96888432e-01 +-9.99120459e-01 +-9.99930942e-01 +-9.99320057e-01 +-9.97289999e-01 +-9.93844977e-01 +-9.88991195e-01 +-9.82736848e-01 +-9.75092105e-01 +-9.66069080e-01 +-9.55681829e-01 +-9.43946308e-01 +-9.30880353e-01 +-9.16503661e-01 +-9.00837733e-01 +-8.83905874e-01 +-8.65733122e-01 +-8.46346229e-01 +-8.25773627e-01 +-8.04045350e-01 +-7.81193032e-01 +-7.57249830e-01 +-7.32250372e-01 +-7.06230741e-01 +-6.79228367e-01 +-6.51282016e-01 +-6.22431723e-01 +-5.92718702e-01 +-5.62185344e-01 +-5.30875100e-01 +-4.98832437e-01 +-4.66102807e-01 +-4.32732508e-01 +-3.98768697e-01 +-3.64259277e-01 +-3.29252815e-01 +-2.93798538e-01 +-2.57946186e-01 +-2.21745984e-01 +-1.85248589e-01 +-1.48504950e-01 +-1.11566319e-01 +-7.44841293e-02 +-3.73099117e-02 +-9.52898650e-05 +3.71081704e-02 +7.42489932e-02 +1.11275837e-01 +1.48137641e-01 +1.84783617e-01 +2.21163352e-01 +2.57226908e-01 +2.92924818e-01 +3.28208215e-01 +3.63028889e-01 +3.97339303e-01 +4.31092728e-01 +4.64243264e-01 +4.96745886e-01 +5.28556560e-01 +5.59632249e-01 +5.89930979e-01 +6.19411935e-01 +6.48035455e-01 +6.75763117e-01 +7.02557801e-01 +7.28383690e-01 +7.53206361e-01 +7.76992821e-01 +7.99711515e-01 +8.21332416e-01 +8.41827033e-01 +8.61168438e-01 +8.79331335e-01 +8.96292057e-01 +9.12028603e-01 +9.26520685e-01 +9.39749723e-01 +9.51698880e-01 +9.62353089e-01 +9.71699055e-01 +9.79725274e-01 +9.86422055e-01 +9.91781512e-01 +9.95797586e-01 +9.98466042e-01 +9.99784471e-01 +9.99752291e-01 +9.98370744e-01 +9.95642892e-01 +9.91573607e-01 +9.86169557e-01 +9.79439203e-01 +9.71392777e-01 +9.62042262e-01 +9.51401382e-01 +9.39485572e-01 +9.26311950e-01 +9.11899308e-01 +8.96268065e-01 +8.79440238e-01 +8.61439428e-01 +8.42290763e-01 +8.22020863e-01 +8.00657824e-01 +7.78231153e-01 +7.54771727e-01 +7.30311770e-01 +7.04884792e-01 +6.78525526e-01 +6.51269917e-01 +6.23155048e-01 +5.94219074e-01 +5.64501205e-01 +5.34041634e-01 +5.02881462e-01 +4.71062676e-01 +4.38628082e-01 +4.05621218e-01 +3.72086329e-01 +3.38068311e-01 +3.03612607e-01 +2.68765181e-01 +2.33572470e-01 +1.98081274e-01 +1.62338718e-01 +1.26392219e-01 +9.02893721e-02 +5.40779010e-02 +1.78056310e-02 +-1.84796138e-02 +-5.47300775e-02 +-9.08980969e-02 +-1.26936184e-01 +-1.62797114e-01 +-1.98433947e-01 +-2.33800093e-01 +-2.68849405e-01 +-3.03536219e-01 +-3.37815385e-01 +-3.71642374e-01 +-4.04973317e-01 +-4.37765038e-01 +-4.69975131e-01 +-5.01562030e-01 +-5.32485025e-01 +-5.62704322e-01 +-5.92181126e-01 +-6.20877655e-01 +-6.48757183e-01 +-6.75784117e-01 +-7.01924028e-01 +-7.27143672e-01 +-7.51411056e-01 +-7.74695478e-01 +-7.96967549e-01 +-8.18199227e-01 +-8.38363872e-01 +-8.57436265e-01 +-8.75392624e-01 +-8.92210655e-01 +-9.07869574e-01 +-9.22350114e-01 +-9.35634560e-01 +-9.47706774e-01 +-9.58552203e-01 +-9.68157891e-01 +-9.76512505e-01 +-9.83606341e-01 +-9.89431329e-01 +-9.93981044e-01 +-9.97250713e-01 +-9.99237215e-01 +-9.99939080e-01 +-9.99356493e-01 +-9.97491286e-01 +-9.94346934e-01 +-9.89928547e-01 +-9.84242861e-01 +-9.77298224e-01 +-9.69104587e-01 +-9.59673483e-01 +-9.49018009e-01 +-9.37152809e-01 +-9.24094057e-01 +-9.09859423e-01 +-8.94468048e-01 +-8.77940528e-01 +-8.60298882e-01 +-8.41566504e-01 +-8.21768150e-01 +-8.00929903e-01 +-7.79079129e-01 +-7.56244435e-01 +-7.32455642e-01 +-7.07743751e-01 +-6.82140879e-01 +-6.55680224e-01 +-6.28396036e-01 +-6.00323563e-01 +-5.71498990e-01 +-5.41959402e-01 +-5.11742751e-01 +-4.80887788e-01 +-4.49434007e-01 +-4.17421602e-01 +-3.84891436e-01 +-3.51884954e-01 +-3.18444140e-01 +-2.84611468e-01 +-2.50429863e-01 +-2.15942618e-01 +-1.81193341e-01 +-1.46225918e-01 +-1.11084463e-01 +-7.58132283e-02 +-4.04565682e-02 +-5.05888916e-03 +3.03354012e-02 +6.56819757e-02 +1.00936630e-01 +1.36055329e-01 +1.70994255e-01 +2.05709895e-01 +2.40159072e-01 +2.74298995e-01 +3.08087309e-01 +3.41482170e-01 +3.74442282e-01 +4.06926939e-01 +4.38896078e-01 +4.70310341e-01 +5.01131120e-01 +5.31320586e-01 +5.60841742e-01 +5.89658481e-01 +6.17735621e-01 +6.45038942e-01 +6.71535220e-01 +6.97192286e-01 +7.21979058e-01 +7.45865568e-01 +7.68822995e-01 +7.90823714e-01 +8.11841322e-01 +8.31850662e-01 +8.50827851e-01 +8.68750317e-01 +8.85596818e-01 +9.01347471e-01 +9.15983761e-01 +9.29488571e-01 +9.41846205e-01 +9.53042397e-01 +9.63064325e-01 +9.71900625e-01 +9.79541409e-01 +9.85978267e-01 +9.91204276e-01 +9.95214006e-01 +9.98003525e-01 +9.99570402e-01 +9.99913702e-01 +9.99033990e-01 +9.96933324e-01 +9.93615252e-01 +9.89084803e-01 +9.83348479e-01 +9.76414244e-01 +9.68291514e-01 +9.58991137e-01 +9.48525381e-01 +9.36907919e-01 +9.24153805e-01 +9.10279456e-01 +8.95302626e-01 +8.79242384e-01 +8.62119094e-01 +8.43954380e-01 +8.24771097e-01 +8.04593306e-01 +7.83446241e-01 +7.61356281e-01 +7.38350904e-01 +7.14458660e-01 +6.89709130e-01 +6.64132901e-01 +6.37761514e-01 +6.10627425e-01 +5.82763964e-01 +5.54205301e-01 +5.24986402e-01 +4.95142980e-01 +4.64711448e-01 +4.33728877e-01 +4.02232957e-01 +3.70261950e-01 +3.37854632e-01 +3.05050248e-01 +2.71888469e-01 +2.38409349e-01 +2.04653270e-01 +1.70660888e-01 +1.36473085e-01 +1.02130927e-01 +6.76756127e-02 +3.31484264e-02 +-1.40932364e-03 +-3.59563472e-02 +-7.04514209e-02 +-1.04853432e-01 +-1.39121429e-01 +-1.73214683e-01 +-2.07092725e-01 +-2.40715396e-01 +-2.74042887e-01 +-3.07035792e-01 +-3.39655157e-01 +-3.71862526e-01 +-4.03619981e-01 +-4.34890184e-01 +-4.65636420e-01 +-4.95822649e-01 +-5.25413542e-01 +-5.54374520e-01 +-5.82671794e-01 +-6.10272399e-01 +-6.37144240e-01 +-6.63256129e-01 +-6.88577813e-01 +-7.13080012e-01 +-7.36734447e-01 +-7.59513876e-01 +-7.81392128e-01 +-8.02344126e-01 +-8.22345917e-01 +-8.41374694e-01 +-8.59408822e-01 +-8.76427869e-01 +-8.92412621e-01 +-9.07345104e-01 +-9.21208599e-01 +-9.33987665e-01 +-9.45668151e-01 +-9.56237215e-01 +-9.65683330e-01 +-9.73996303e-01 +-9.81167276e-01 +-9.87188739e-01 +-9.92054536e-01 +-9.95759871e-01 +-9.98301307e-01 +-9.99676771e-01 +-9.99885553e-01 +-9.98928304e-01 +-9.96807034e-01 +-9.93525106e-01 +-9.89087230e-01 +-9.83499454e-01 +-9.76769159e-01 +-9.68905042e-01 +-9.59917107e-01 +-9.49816652e-01 +-9.38616248e-01 +-9.26329729e-01 +-9.12972173e-01 +-8.98559877e-01 +-8.83110340e-01 +-8.66642240e-01 +-8.49175407e-01 +-8.30730805e-01 +-8.11330501e-01 +-7.90997640e-01 +-7.69756411e-01 +-7.47632022e-01 +-7.24650668e-01 +-7.00839498e-01 +-6.76226587e-01 +-6.50840898e-01 +-6.24712244e-01 +-5.97871254e-01 +-5.70349341e-01 +-5.42178659e-01 +-5.13392070e-01 +-4.84023103e-01 +-4.54105909e-01 +-4.23675226e-01 +-3.92766337e-01 +-3.61415030e-01 +-3.29657553e-01 +-2.97530579e-01 +-2.65071154e-01 +-2.32316658e-01 +-1.99304758e-01 +-1.66073373e-01 +-1.32660621e-01 +-9.91047852e-02 +-6.54442617e-02 +-3.17175168e-02 +2.03695629e-03 +3.57806809e-02 +6.94752407e-02 +1.03082322e-01 +1.36563757e-01 +1.69881569e-01 +2.02998015e-01 +2.35875631e-01 +2.68477268e-01 +3.00766137e-01 +3.32705850e-01 +3.64260455e-01 +3.95394485e-01 +4.26072995e-01 +4.56261598e-01 +4.85926503e-01 +5.15034554e-01 +5.43553266e-01 +5.71450856e-01 +5.98696285e-01 +6.25259287e-01 +6.51110406e-01 +6.76221024e-01 +7.00563392e-01 +7.24110661e-01 +7.46836909e-01 +7.68717169e-01 +7.89727460e-01 +8.09844805e-01 +8.29047263e-01 +8.47313944e-01 +8.64625034e-01 +8.80961817e-01 +8.96306690e-01 +9.10643187e-01 +9.23955988e-01 +9.36230943e-01 +9.47455076e-01 +9.57616607e-01 +9.66704953e-01 +9.74710748e-01 +9.81625844e-01 +9.87443322e-01 +9.92157496e-01 +9.95763917e-01 +9.98259377e-01 +9.99641910e-01 +9.99910792e-01 +9.99066537e-01 +9.97110900e-01 +9.94046870e-01 +9.89878661e-01 +9.84611712e-01 +9.78252674e-01 +9.70809402e-01 +9.62290944e-01 +9.52707531e-01 +9.42070559e-01 +9.30392581e-01 +9.17687284e-01 +9.03969476e-01 +8.89255069e-01 +8.73561055e-01 +8.56905488e-01 +8.39307465e-01 +8.20787098e-01 +8.01365494e-01 +7.81064728e-01 +7.59907817e-01 +7.37918692e-01 +7.15122174e-01 +6.91543943e-01 +6.67210506e-01 +6.42149170e-01 +6.16388010e-01 +5.89955836e-01 +5.62882159e-01 +5.35197158e-01 +5.06931648e-01 +4.78117043e-01 +4.48785320e-01 +4.18968985e-01 +3.88701037e-01 +3.58014927e-01 +3.26944528e-01 +2.95524087e-01 +2.63788195e-01 +2.31771747e-01 +1.99509900e-01 +1.67038038e-01 +1.34391734e-01 +1.01606705e-01 +6.87187785e-02 +3.57638530e-02 +2.77785462e-03 +-3.02032990e-02 +-6.31437386e-02 +-9.60076818e-02 +-1.28759472e-01 +-1.61363617e-01 +-1.93784826e-01 +-2.25988051e-01 +-2.57938519e-01 +-2.89601774e-01 +-3.20943711e-01 +-3.51930616e-01 +-3.82529197e-01 +-4.12706623e-01 +-4.42430558e-01 +-4.71669192e-01 +-5.00391279e-01 +-5.28566168e-01 +-5.56163833e-01 +-5.83154909e-01 +-6.09510717e-01 +-6.35203298e-01 +-6.60205441e-01 +-6.84490711e-01 +-7.08033474e-01 +-7.30808927e-01 +-7.52793121e-01 +-7.73962986e-01 +-7.94296352e-01 +-8.13771975e-01 +-8.32369557e-01 +-8.50069764e-01 +-8.66854249e-01 +-8.82705668e-01 +-8.97607695e-01 +-9.11545042e-01 +-9.24503471e-01 +-9.36469807e-01 +-9.47431953e-01 +-9.57378897e-01 +-9.66300726e-01 +-9.74188634e-01 +-9.81034927e-01 +-9.86833032e-01 +-9.91577502e-01 +-9.95264019e-01 +-9.97889396e-01 +-9.99451582e-01 +-9.99949657e-01 +-9.99383837e-01 +-9.97755467e-01 +-9.95067021e-01 +-9.91322095e-01 +-9.86525405e-01 +-9.80682774e-01 +-9.73801131e-01 +-9.65888497e-01 +-9.56953979e-01 +-9.47007753e-01 +-9.36061055e-01 +-9.24126169e-01 +-9.11216407e-01 +-8.97346099e-01 +-8.82530573e-01 +-8.66786136e-01 +-8.50130060e-01 +-8.32580557e-01 +-8.14156760e-01 +-7.94878705e-01 +-7.74767303e-01 +-7.53844317e-01 +-7.32132344e-01 +-7.09654783e-01 +-6.86435809e-01 +-6.62500353e-01 +-6.37874068e-01 +-6.12583303e-01 +-5.86655077e-01 +-5.60117043e-01 +-5.32997465e-01 +-5.05325184e-01 +-4.77129586e-01 +-4.48440572e-01 +-4.19288526e-01 +-3.89704281e-01 +-3.59719089e-01 +-3.29364581e-01 +-2.98672743e-01 +-2.67675873e-01 +-2.36406553e-01 +-2.04897610e-01 +-1.73182085e-01 +-1.41293196e-01 +-1.09264304e-01 +-7.71288772e-02 +-4.49204576e-02 +-1.26726242e-02 +1.95810411e-02 +5.18069888e-02 +8.39717362e-02 +1.16041903e-01 +1.47984243e-01 +1.79765684e-01 +2.11353356e-01 +2.42714627e-01 +2.73817138e-01 +3.04628835e-01 +3.35118001e-01 +3.65253289e-01 +3.95003754e-01 +4.24338884e-01 +4.53228631e-01 +4.81643442e-01 +5.09554287e-01 +5.36932690e-01 +5.63750756e-01 +5.89981200e-01 +6.15597373e-01 +6.40573292e-01 +6.64883660e-01 +6.88503894e-01 +7.11410151e-01 +7.33579347e-01 +7.54989184e-01 +7.75618169e-01 +7.95445635e-01 +8.14451762e-01 +8.32617595e-01 +8.49925062e-01 +8.66356993e-01 +8.81897133e-01 +8.96530162e-01 +9.10241702e-01 +9.23018338e-01 +9.34847625e-01 +9.45718102e-01 +9.55619300e-01 +9.64541753e-01 +9.72477004e-01 +9.79417615e-01 +9.85357170e-01 +9.90290283e-01 +9.94212599e-01 +9.97120797e-01 +9.99012595e-01 +9.99886747e-01 +9.99743045e-01 +9.98582316e-01 +9.96406420e-01 +9.93218248e-01 +9.89021715e-01 +9.83821756e-01 +9.77624320e-01 +9.70436360e-01 +9.62265826e-01 +9.53121656e-01 +9.43013764e-01 +9.31953030e-01 +9.19951285e-01 +9.07021300e-01 +8.93176771e-01 +8.78432303e-01 +8.62803394e-01 +8.46306418e-01 +8.28958610e-01 +8.10778040e-01 +7.91783601e-01 +7.71994986e-01 +7.51432666e-01 +7.30117869e-01 +7.08072556e-01 +6.85319401e-01 +6.61881765e-01 +6.37783669e-01 +6.13049775e-01 +5.87705354e-01 +5.61776264e-01 +5.35288921e-01 +5.08270272e-01 +4.80747766e-01 +4.52749329e-01 +4.24303334e-01 +3.95438567e-01 +3.66184206e-01 +3.36569785e-01 +3.06625165e-01 +2.76380507e-01 +2.45866236e-01 +2.15113016e-01 +1.84151712e-01 +1.53013367e-01 +1.21729165e-01 +9.03304009e-02 +5.88484499e-02 +2.73147362e-02 +-4.23929893e-03 +-3.57822284e-02 +-6.72826704e-02 +-9.87093195e-02 +-1.30030978e-01 +-1.61216586e-01 +-1.92235254e-01 +-2.23056290e-01 +-2.53649232e-01 +-2.83983879e-01 +-3.14030317e-01 +-3.43758951e-01 +-3.73140534e-01 +-4.02146192e-01 +-4.30747456e-01 +-4.58916290e-01 +-4.86625112e-01 +-5.13846827e-01 +-5.40554852e-01 +-5.66723137e-01 +-5.92326196e-01 +-6.17339127e-01 +-6.41737636e-01 +-6.65498065e-01 +-6.88597406e-01 +-7.11013329e-01 +-7.32724203e-01 +-7.53709111e-01 +-7.73947876e-01 +-7.93421074e-01 +-8.12110056e-01 +-8.29996964e-01 +-8.47064746e-01 +-8.63297173e-01 +-8.78678854e-01 +-8.93195248e-01 +-9.06832679e-01 +-9.19578348e-01 +-9.31420340e-01 +-9.42347642e-01 +-9.52350145e-01 +-9.61418658e-01 +-9.69544912e-01 +-9.76721568e-01 +-9.82942224e-01 +-9.88201417e-01 +-9.92494631e-01 +-9.95818294e-01 +-9.98169788e-01 +-9.99547441e-01 +-9.99950537e-01 +-9.99379306e-01 +-9.97834930e-01 +-9.95319533e-01 +-9.91836187e-01 +-9.87388897e-01 +-9.81982603e-01 +-9.75623174e-01 +-9.68317394e-01 +-9.60072963e-01 +-9.50898480e-01 +-9.40803441e-01 +-9.29798221e-01 +-9.17894068e-01 +-9.05103090e-01 +-8.91438239e-01 +-8.76913301e-01 +-8.61542877e-01 +-8.45342374e-01 +-8.28327983e-01 +-8.10516664e-01 +-7.91926130e-01 +-7.72574827e-01 +-7.52481918e-01 +-7.31667257e-01 +-7.10151377e-01 +-6.87955463e-01 +-6.65101334e-01 +-6.41611419e-01 +-6.17508736e-01 +-5.92816870e-01 +-5.67559944e-01 +-5.41762603e-01 +-5.15449983e-01 +-4.88647689e-01 +-4.61381770e-01 +-4.33678692e-01 +-4.05565313e-01 +-3.77068856e-01 +-3.48216882e-01 +-3.19037266e-01 +-2.89558165e-01 +-2.59807994e-01 +-2.29815399e-01 +-1.99609227e-01 +-1.69218497e-01 +-1.38672377e-01 +-1.08000152e-01 +-7.72311960e-02 +-4.63949453e-02 +-1.55208694e-02 +1.53615568e-02 +4.62228815e-02 +7.70337035e-02 +1.07764701e-01 +1.38386657e-01 +1.68870492e-01 +1.99187285e-01 +2.29308306e-01 +2.59205040e-01 +2.88849217e-01 +3.18212833e-01 +3.47268182e-01 +3.75987879e-01 +4.04344884e-01 +4.32312533e-01 +4.59864555e-01 +4.86975102e-01 +5.13618770e-01 +5.39770626e-01 +5.65406224e-01 +5.90501635e-01 +6.15033465e-01 +6.38978877e-01 +6.62315610e-01 +6.85022004e-01 +7.07077013e-01 +7.28460229e-01 +7.49151901e-01 +7.69132947e-01 +7.88384976e-01 +8.06890303e-01 +8.24631963e-01 +8.41593730e-01 +8.57760126e-01 +8.73116438e-01 +8.87648731e-01 +9.01343855e-01 +9.14189464e-01 +9.26174021e-01 +9.37286809e-01 +9.47517939e-01 +9.56858361e-01 +9.65299866e-01 +9.72835100e-01 +9.79457563e-01 +9.85161616e-01 +9.89942486e-01 +9.93796268e-01 +9.96719930e-01 +9.98711310e-01 +9.99769119e-01 +9.99892945e-01 +9.99083244e-01 +9.97341346e-01 +9.94669446e-01 +9.91070607e-01 +9.86548752e-01 +9.81108660e-01 +9.74755958e-01 +9.67497120e-01 +9.59339455e-01 +9.50291102e-01 +9.40361017e-01 +9.29558970e-01 +9.17895527e-01 +9.05382048e-01 +8.92030667e-01 +8.77854284e-01 +8.62866551e-01 +8.47081858e-01 +8.30515321e-01 +8.13182763e-01 +7.95100701e-01 +7.76286329e-01 +7.56757501e-01 +7.36532713e-01 +7.15631087e-01 +6.94072350e-01 +6.71876817e-01 +6.49065369e-01 +6.25659437e-01 +6.01680975e-01 +5.77152447e-01 +5.52096798e-01 +5.26537438e-01 +5.00498215e-01 +4.74003396e-01 +4.47077645e-01 +4.19745994e-01 +3.92033826e-01 +3.63966845e-01 +3.35571059e-01 +3.06872748e-01 +2.77898446e-01 +2.48674912e-01 +2.19229109e-01 +1.89588174e-01 +1.59779396e-01 +1.29830193e-01 +9.97680816e-02 +6.96206542e-02 +3.94155551e-02 +9.18045308e-03 +-2.10569837e-02 +-5.12691127e-02 +-8.14283421e-02 +-1.11507156e-01 +-1.41478140e-01 +-1.71314005e-01 +-2.00987612e-01 +-2.30471999e-01 +-2.59740400e-01 +-2.88766277e-01 +-3.17523335e-01 +-3.45985553e-01 +-3.74127203e-01 +-4.01922874e-01 +-4.29347495e-01 +-4.56376360e-01 +-4.82985143e-01 +-5.09149927e-01 +-5.34847222e-01 +-5.60053982e-01 +-5.84747633e-01 +-6.08906087e-01 +-6.32507764e-01 +-6.55531608e-01 +-6.77957109e-01 +-6.99764317e-01 +-7.20933865e-01 +-7.41446980e-01 +-7.61285501e-01 +-7.80431895e-01 +-7.98869272e-01 +-8.16581401e-01 +-8.33552718e-01 +-8.49768347e-01 +-8.65214105e-01 +-8.79876520e-01 +-8.93742837e-01 +-9.06801033e-01 +-9.19039825e-01 +-9.30448678e-01 +-9.41017814e-01 +-9.50738222e-01 +-9.59601660e-01 +-9.67600669e-01 +-9.74728570e-01 +-9.80979474e-01 +-9.86348288e-01 +-9.90830712e-01 +-9.94423249e-01 +-9.97123200e-01 +-9.98928672e-01 +-9.99838574e-01 +-9.99852618e-01 +-9.98971321e-01 +-9.97195996e-01 +-9.94528760e-01 +-9.90972523e-01 +-9.86530986e-01 +-9.81208640e-01 +-9.75010757e-01 +-9.67943386e-01 +-9.60013347e-01 +-9.51228222e-01 +-9.41596349e-01 +-9.31126811e-01 +-9.19829432e-01 +-9.07714761e-01 +-8.94794066e-01 +-8.81079323e-01 +-8.66583199e-01 +-8.51319048e-01 +-8.35300891e-01 +-8.18543406e-01 +-8.01061913e-01 +-7.82872363e-01 +-7.63991317e-01 +-7.44435934e-01 +-7.24223956e-01 +-7.03373691e-01 +-6.81903992e-01 +-6.59834244e-01 +-6.37184344e-01 +-6.13974684e-01 +-5.90226131e-01 +-5.65960009e-01 +-5.41198079e-01 +-5.15962518e-01 +-4.90275905e-01 +-4.64161189e-01 +-4.37641679e-01 +-4.10741018e-01 +-3.83483159e-01 +-3.55892351e-01 +-3.27993112e-01 +-2.99810206e-01 +-2.71368626e-01 +-2.42693570e-01 +-2.13810412e-01 +-1.84744690e-01 +-1.55522074e-01 +-1.26168347e-01 +-9.67093852e-02 +-6.71711300e-02 +-3.75795681e-02 +-7.96070935e-03 +2.16594371e-02 +5.12548874e-02 +8.07997047e-02 +1.10268021e-01 +1.39634061e-01 +1.68872163e-01 +1.97956803e-01 +2.26862613e-01 +2.55564408e-01 +2.84037203e-01 +3.12256240e-01 +3.40197005e-01 +3.67835253e-01 +3.95147023e-01 +4.22108666e-01 +4.48696857e-01 +4.74888621e-01 +5.00661348e-01 +5.25992817e-01 +5.50861214e-01 +5.75245147e-01 +5.99123667e-01 +6.22476285e-01 +6.45282989e-01 +6.67524261e-01 +6.89181090e-01 +7.10234993e-01 +7.30668029e-01 +7.50462814e-01 +7.69602532e-01 +7.88070954e-01 +8.05852446e-01 +8.22931987e-01 +8.39295173e-01 +8.54928240e-01 +8.69818068e-01 +8.83952190e-01 +8.97318810e-01 +9.09906802e-01 +9.21705726e-01 +9.32705833e-01 +9.42898074e-01 +9.52274104e-01 +9.60826295e-01 +9.68547733e-01 +9.75432230e-01 +9.81474324e-01 +9.86669284e-01 +9.91013114e-01 +9.94502555e-01 +9.97135087e-01 +9.98908928e-01 +9.99823038e-01 +9.99877119e-01 +9.99071609e-01 +9.97407687e-01 +9.94887267e-01 +9.91512996e-01 +9.87288255e-01 +9.82217148e-01 +9.76304502e-01 +9.69555860e-01 +9.61977479e-01 +9.53576319e-01 +9.44360040e-01 +9.34336990e-01 +9.23516203e-01 +9.11907382e-01 +8.99520900e-01 +8.86367781e-01 +8.72459696e-01 +8.57808951e-01 +8.42428474e-01 +8.26331801e-01 +8.09533070e-01 +7.92047002e-01 +7.73888890e-01 +7.55074587e-01 +7.35620492e-01 +7.15543532e-01 +6.94861149e-01 +6.73591280e-01 +6.51752349e-01 +6.29363245e-01 +6.06443308e-01 +5.83012313e-01 +5.59090450e-01 +5.34698303e-01 +5.09856840e-01 +4.84587388e-01 +4.58911618e-01 +4.32851526e-01 +4.06429416e-01 +3.78298490e-01 +3.42189750e-01 +3.06283181e-01 +2.72263415e-01 +2.40277257e-01 +2.10432400e-01 +1.82799535e-01 +1.57415030e-01 +1.34283875e-01 +1.13382963e-01 +9.46644222e-02 +7.80588691e-02 +6.34786147e-02 +5.08206408e-02 +3.99693355e-02 +3.07989458e-02 +2.31757423e-02 +1.69598645e-02 +1.20068991e-02 +8.16915332e-03 +5.29668892e-03 +3.23792782e-03 +1.84037921e-03 +9.50725995e-04 +4.12370929e-04 +2.06185465e-04 +0.00000000e+00 +-0.00000000e+00 +-3.91914656e-02 +-8.28679559e-02 +-1.25094913e-01 +-1.67149012e-01 +-2.09150169e-01 +-2.51127726e-01 +-2.93092587e-01 +-3.35049794e-01 +-3.77002015e-01 +-4.18950800e-01 +-4.60897115e-01 +-5.02841591e-01 +-5.44784663e-01 +-5.86726637e-01 +-6.28667735e-01 +-6.70608124e-01 +-7.12547932e-01 +-7.54487255e-01 +-7.96426171e-01 +-8.38364741e-01 +-8.80303016e-01 +-9.22241036e-01 +-9.64178834e-01 +-9.97369514e-01 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-1.00000000e+00 +-9.99968409e-01 +-9.77416184e-01 +-9.35478441e-01 +-8.93540494e-01 +-8.51602304e-01 +-8.09663831e-01 +-7.67725030e-01 +-7.25785843e-01 +-6.83846198e-01 +-6.41906005e-01 +-5.99965146e-01 +-5.58023470e-01 +-5.16080773e-01 +-4.74136780e-01 +-4.32191102e-01 +-3.90243182e-01 +-3.48292178e-01 +-3.06336765e-01 +-2.64374713e-01 +-2.22401949e-01 +-1.80410081e-01 +-1.38378309e-01 +-9.62348465e-02 +-5.34309759e-02 +-2.67154879e-02 +-0.00000000e+00 +0.00000000e+00 +-6.60950883e-03 +-3.98860155e-02 +-7.18446490e-02 +-8.75483750e-02 +-8.55736464e-02 +-6.72426990e-02 +-3.63143010e-02 +2.37996636e-03 +4.39658627e-02 +8.41267001e-02 +1.19378529e-01 +1.47150103e-01 +1.65758319e-01 +1.74330710e-01 +1.72702447e-01 +1.61302504e-01 +1.41037079e-01 +1.13177036e-01 +7.92500710e-02 +4.09427032e-02 +1.17695239e-05 +-4.17930314e-02 +-8.27950981e-02 +-1.21445430e-01 +-1.56365786e-01 +-1.86381060e-01 +-2.10541393e-01 +-2.28134963e-01 +-2.38692204e-01 +-2.41982557e-01 +-2.38004675e-01 +-2.26971159e-01 +-2.09288806e-01 +-1.85535421e-01 +-1.56434055e-01 +-1.22825629e-01 +-8.56407277e-02 +-4.58713195e-02 +-4.54306185e-03 +3.73112615e-02 +7.86765268e-02 +1.18578230e-01 +1.56102732e-01 +1.90415199e-01 +2.20774469e-01 +2.46545215e-01 +2.67207050e-01 +2.82360811e-01 +2.91732001e-01 +2.95171511e-01 +2.92653875e-01 +2.84273162e-01 +2.70236799e-01 +2.50857528e-01 +2.26543825e-01 +1.97788962e-01 +1.65159032e-01 +1.29280277e-01 +9.08258146e-02 +5.05022237e-02 +9.03605188e-03 +-3.28393885e-02 +-7.43968231e-02 +-1.14927176e-01 +-1.53750940e-01 +-1.90228615e-01 +-2.23770079e-01 +-2.53842787e-01 +-2.79978864e-01 +-3.01780709e-01 +-3.18925445e-01 +-3.31168131e-01 +-3.38343280e-01 +-3.40365791e-01 +-3.37229937e-01 +-3.29007687e-01 +-3.15845751e-01 +-2.97961645e-01 +-2.75638869e-01 +-2.49221400e-01 +-2.19107263e-01 +-1.85741835e-01 +-1.49610431e-01 +-1.11230761e-01 +-7.11450335e-02 +-2.99120603e-02 +1.19007217e-02 +5.37250318e-02 +9.49993804e-02 +1.35176351e-01 +1.73729531e-01 +2.10159974e-01 +2.44002097e-01 +2.74829034e-01 +3.02257349e-01 +3.25951074e-01 +3.45625028e-01 +3.61047473e-01 +3.72041967e-01 +3.78488586e-01 +3.80324346e-01 +3.77543021e-01 +3.70194091e-01 +3.58381445e-01 +3.42260927e-01 +3.22037802e-01 +2.97963539e-01 +2.70332000e-01 +2.39475423e-01 +2.05759976e-01 +1.69581038e-01 +1.31358245e-01 +9.15303636e-02 +5.05500664e-02 +8.87872642e-03 +-3.30188630e-02 +-7.46796459e-02 +-1.15647321e-01 +-1.55477244e-01 +-1.93740979e-01 +-2.30030777e-01 +-2.63963515e-01 +-2.95184485e-01 +-3.23370723e-01 +-3.48233895e-01 +-3.69522927e-01 +-3.87025971e-01 +-4.00572137e-01 +-4.10032704e-01 +-4.15321687e-01 +-4.16396480e-01 +-4.13257259e-01 +-4.05946816e-01 +-3.94549390e-01 +-3.79189165e-01 +-3.60028831e-01 +-3.37267257e-01 +-3.11137079e-01 +-2.81902131e-01 +-2.49854464e-01 +-2.15311087e-01 +-1.78610658e-01 +-1.40110047e-01 +-1.00180662e-01 +-5.92047402e-02 +-1.75716540e-02 +2.43258327e-02 +6.60952742e-02 +1.07348170e-01 +1.47703531e-01 +1.86791286e-01 +2.24255540e-01 +2.59757666e-01 +2.92979172e-01 +3.23624370e-01 +3.51422752e-01 +3.76131160e-01 +3.97535626e-01 +4.15452974e-01 +4.29732086e-01 +4.40254894e-01 +4.46937051e-01 +4.49728304e-01 +4.48612588e-01 +4.43607779e-01 +4.34765200e-01 +4.22168829e-01 +4.05934235e-01 +3.86207271e-01 +3.63162526e-01 +3.37001564e-01 +3.07950973e-01 +2.76260216e-01 +2.42199281e-01 +2.06056254e-01 +1.68134761e-01 +1.28751350e-01 +8.82327286e-02 +4.69129722e-02 +5.13076709e-03 +-3.67733693e-02 +-7.84599036e-02 +-1.19592975e-01 +-1.59843043e-01 +-1.98889550e-01 +-2.36423276e-01 +-2.72148672e-01 +-3.05786313e-01 +-3.37074614e-01 +-3.65771874e-01 +-3.91658186e-01 +-4.14536413e-01 +-4.34234197e-01 +-4.50604566e-01 +-4.63526917e-01 +-4.72908114e-01 +-4.78682168e-01 +-4.80811524e-01 +-4.79286035e-01 +-4.74123753e-01 +-4.65369778e-01 +-4.53096296e-01 +-4.37401323e-01 +-4.18408150e-01 +-3.96263859e-01 +-3.71138401e-01 +-3.43222707e-01 +-3.12727652e-01 +-2.79881691e-01 +-2.44929763e-01 +-2.08130639e-01 +-1.69755575e-01 +-1.30085764e-01 +-8.94104793e-02 +-4.80248844e-02 +-6.22776732e-03 +3.56804941e-02 +7.74001907e-02 +1.18634330e-01 +1.59090831e-01 +1.98484405e-01 +2.36538598e-01 +2.72987771e-01 +3.07578605e-01 +3.40071977e-01 +3.70244623e-01 +3.97890242e-01 +4.22820964e-01 +4.44868693e-01 +4.63885862e-01 +4.79746244e-01 +4.92345899e-01 +5.01603669e-01 +5.07461420e-01 +5.09884286e-01 +5.08860818e-01 +5.04402978e-01 +4.96545718e-01 +4.85346588e-01 +4.70885258e-01 +4.53262802e-01 +4.32601015e-01 +4.09041202e-01 +3.82743262e-01 +3.53884472e-01 +3.22658215e-01 +2.89272607e-01 +2.53949030e-01 +2.16920571e-01 +1.78430445e-01 +1.38730347e-01 +9.80787742e-02 +5.67393169e-02 +1.49789216e-02 +-2.69338407e-02 +-6.87305029e-02 +-1.10144414e-01 +-1.50912422e-01 +-1.90776520e-01 +-2.29485440e-01 +-2.66796202e-01 +-3.02475580e-01 +-3.36301509e-01 +-3.68064399e-01 +-3.97568365e-01 +-4.24632359e-01 +-4.49091199e-01 +-4.70796488e-01 +-4.89617430e-01 +-5.05441521e-01 +-5.18175124e-01 +-5.27743931e-01 +-5.34093285e-01 +-5.37188408e-01 +-5.37014468e-01 +-5.33576561e-01 +-5.26899553e-01 +-5.17027805e-01 +-5.04024787e-01 +-4.87972590e-01 +-4.68971297e-01 +-4.47138301e-01 +-4.22607498e-01 +-3.95528351e-01 +-3.66064949e-01 +-3.34394951e-01 +-3.00708414e-01 +-2.65206629e-01 +-2.28100866e-01 +-1.89611084e-01 +-1.49964582e-01 +-1.09394611e-01 +-6.81390039e-02 +-2.64387428e-02 +1.54634375e-02 +5.73244648e-02 +9.89023385e-02 +1.39957538e-01 +1.80254377e-01 +2.19562318e-01 +2.57657255e-01 +2.94322759e-01 +3.29351337e-01 +3.62545518e-01 +3.93718871e-01 +4.22696990e-01 +4.49318456e-01 +4.73435809e-01 +4.94916117e-01 +5.13641600e-01 +5.29510248e-01 +5.42436551e-01 +5.52351692e-01 +5.59203654e-01 +5.62957546e-01 +5.63596051e-01 +5.61119059e-01 +5.55543424e-01 +5.46903055e-01 +5.35248936e-01 +5.20648107e-01 +5.03183363e-01 +4.82953245e-01 +4.60070981e-01 +4.34663541e-01 +4.06871467e-01 +3.76847896e-01 +3.44757176e-01 +3.10774479e-01 +2.75084793e-01 +2.37881349e-01 +1.99365090e-01 +1.59743451e-01 +1.19228885e-01 +7.80381501e-02 +3.63908882e-02 +-5.49155787e-03 +-4.73871938e-02 +-8.90746894e-02 +-1.30334387e-01 +-1.70949686e-01 +-2.10707832e-01 +-2.49401321e-01 +-2.86828885e-01 +-3.22796151e-01 +-3.57117452e-01 +-3.89615653e-01 +-4.20124011e-01 +-4.48486472e-01 +-4.74558244e-01 +-4.98207438e-01 +-5.19314073e-01 +-5.37772662e-01 +-5.53490549e-01 +-5.66390260e-01 +-5.76408336e-01 +-5.83496458e-01 +-5.87621449e-01 +-5.88764860e-01 +-5.86924111e-01 +-5.82110820e-01 +-5.74352662e-01 +-5.63690893e-01 +-5.50182534e-01 +-5.33897437e-01 +-5.14920501e-01 +-4.93348564e-01 +-4.69292413e-01 +-4.42873719e-01 +-4.14226707e-01 +-3.83495256e-01 +-3.50834132e-01 +-3.16406411e-01 +-2.80384129e-01 +-2.42946200e-01 +-2.04278377e-01 +-1.64571765e-01 +-1.24022091e-01 +-8.28287566e-02 +-4.11936393e-02 +6.79625677e-04 +4.25868819e-02 +8.43243328e-02 +1.25689490e-01 +1.66482291e-01 +2.06505932e-01 +2.45567733e-01 +2.83480469e-01 +3.20062428e-01 +3.55139349e-01 +3.88544168e-01 +4.20118399e-01 +4.49713021e-01 +4.77188141e-01 +5.02415162e-01 +5.25275878e-01 +5.45663677e-01 +5.63484532e-01 +5.78655812e-01 +5.91108416e-01 +6.00786075e-01 +6.07645108e-01 +6.11656180e-01 +6.12802693e-01 +6.11081370e-01 +6.06503174e-01 +5.99091535e-01 +5.88883143e-01 +5.75928302e-01 +5.60289052e-01 +5.42039997e-01 +5.21268162e-01 +4.98071270e-01 +4.72558185e-01 +4.44848648e-01 +4.15071630e-01 +3.83365335e-01 +3.49876890e-01 +3.14760873e-01 +2.78178836e-01 +2.40298911e-01 +2.01294661e-01 +1.61344160e-01 +1.20629490e-01 +7.93358255e-02 +3.76503772e-02 +-4.23826810e-03 +-4.61410183e-02 +-8.78692251e-02 +-1.29235439e-01 +-1.70054233e-01 +-2.10143155e-01 +-2.49323460e-01 +-2.87420763e-01 +-3.24265918e-01 +-3.59695905e-01 +-3.93554341e-01 +-4.25692028e-01 +-4.55967754e-01 +-4.84249040e-01 +-5.10412553e-01 +-5.34344372e-01 +-5.55940679e-01 +-5.75108245e-01 +-5.91764913e-01 +-6.05839507e-01 +-6.17272246e-01 +-6.26015080e-01 +-6.32031912e-01 +-6.35298720e-01 +-6.35803268e-01 +-6.33545364e-01 +-6.28536808e-01 +-6.20801391e-01 +-6.10374720e-01 +-5.97303826e-01 +-5.81646962e-01 +-5.63473441e-01 +-5.42863275e-01 +-5.19906825e-01 +-4.94704318e-01 +-4.67365266e-01 +-4.38008088e-01 +-4.06759577e-01 +-3.73754325e-01 +-3.39134144e-01 +-3.03047405e-01 +-2.65648327e-01 +-2.27096362e-01 +-1.87555499e-01 +-1.47193567e-01 +-1.06181503e-01 +-6.46926183e-02 +-2.29018587e-02 +1.90149486e-02 +6.08818228e-02 +1.02523360e-01 +1.43765470e-01 +1.84436096e-01 +2.24365931e-01 +2.63389109e-01 +3.01343895e-01 +3.38073340e-01 +3.73425903e-01 +4.07256052e-01 +4.39424862e-01 +4.69800557e-01 +4.98259037e-01 +5.24684359e-01 +5.48969185e-01 +5.71015192e-01 +5.90733449e-01 +6.08044746e-01 +6.22879891e-01 +6.35179948e-01 +6.44896446e-01 +6.51991533e-01 +6.56438107e-01 +6.58219884e-01 +6.57331425e-01 +6.53778135e-01 +6.47576183e-01 +6.38752420e-01 +6.27344225e-01 +6.13399320e-01 +5.96975543e-01 +5.78140585e-01 +5.56971684e-01 +5.33555281e-01 +5.07986646e-01 +4.80369471e-01 +4.50815420e-01 +4.19443661e-01 +3.86380374e-01 +3.51758219e-01 +3.15715777e-01 +2.78397016e-01 +2.39950654e-01 +2.00529600e-01 +1.60290313e-01 +1.19392171e-01 +7.79968455e-02 +3.62676522e-02 +-5.63109717e-03 +-4.75347428e-02 +-8.92789227e-02 +-1.30700215e-01 +-1.71636772e-01 +-2.11928955e-01 +-2.51419946e-01 +-2.89956336e-01 +-3.27388741e-01 +-3.63572336e-01 +-3.98367434e-01 +-4.31639980e-01 +-4.63262082e-01 +-4.93112466e-01 +-5.21076930e-01 +-5.47048760e-01 +-5.70929125e-01 +-5.92627422e-01 +-6.12061605e-01 +-6.29158471e-01 +-6.43853914e-01 +-6.56093139e-01 +-6.65830850e-01 +-6.73031402e-01 +-6.77668887e-01 +-6.79727206e-01 +-6.79200108e-01 +-6.76091179e-01 +-6.70413794e-01 +-6.62191048e-01 +-6.51455627e-01 +-6.38249661e-01 +-6.22624535e-01 +-6.04640663e-01 +-5.84367246e-01 +-5.61882003e-01 +-5.37270819e-01 +-5.10627394e-01 +-4.82052875e-01 +-4.51655462e-01 +-4.19549981e-01 +-3.85857431e-01 +-3.50704522e-01 +-3.14223177e-01 +-2.76550056e-01 +-2.37826017e-01 +-1.98195544e-01 +-1.57806222e-01 +-1.16808191e-01 +-7.53535797e-02 +-3.35959406e-02 +8.31031672e-03 +5.02105006e-02 +9.19502289e-02 +1.33375986e-01 +1.74335678e-01 +2.14679178e-01 +2.54258870e-01 +2.92930174e-01 +3.30552116e-01 +3.66987843e-01 +4.02105043e-01 +4.35776408e-01 +4.67880113e-01 +4.98300212e-01 +5.26927096e-01 +5.53657988e-01 +5.78397076e-01 +6.01055890e-01 +6.21553607e-01 +6.39817296e-01 +6.55782304e-01 +6.69392540e-01 +6.80600339e-01 +6.89366676e-01 +6.95661359e-01 +6.99463061e-01 +7.00759759e-01 +6.99548272e-01 +6.95834294e-01 +6.89632390e-01 +6.80965932e-01 +6.69867374e-01 +6.56377702e-01 +6.40546156e-01 +6.22430162e-01 +6.02095146e-01 +5.79614657e-01 +5.55069548e-01 +5.28547686e-01 +5.00143728e-01 +4.69958947e-01 +4.38100966e-01 +4.04682855e-01 +3.69822924e-01 +3.33644357e-01 +2.96275032e-01 +2.57846675e-01 +2.18494379e-01 +1.78356256e-01 +1.37573089e-01 +9.62876705e-02 +5.46441963e-02 +1.27879142e-02 +-2.91353549e-02 +-7.09798443e-02 +-1.12600323e-01 +-1.53852487e-01 +-1.94593543e-01 +-2.34682847e-01 +-2.73982128e-01 +-3.12355916e-01 +-3.49672303e-01 +-3.85803423e-01 +-4.20625428e-01 +-4.54018975e-01 +-4.85870281e-01 +-5.16071013e-01 +-5.44518276e-01 +-5.71115293e-01 +-5.95772489e-01 +-6.18406591e-01 +-6.38940966e-01 +-6.57306764e-01 +-6.73442969e-01 +-6.87295526e-01 +-6.98818093e-01 +-7.07973390e-01 +-7.14731538e-01 +-7.19070297e-01 +-7.20976527e-01 +-7.20445432e-01 +-7.17479549e-01 +-7.12089947e-01 +-7.04296766e-01 +-6.94127152e-01 +-6.81616035e-01 +-6.66807416e-01 +-6.49752089e-01 +-6.30507798e-01 +-6.09140731e-01 +-5.85723635e-01 +-5.60335249e-01 +-5.33061775e-01 +-5.03995484e-01 +-4.73233635e-01 +-4.40879807e-01 +-4.07042771e-01 +-3.71835299e-01 +-3.35375182e-01 +-2.97784283e-01 +-2.59187393e-01 +-2.19712979e-01 +-1.79492223e-01 +-1.38658164e-01 +-9.73460664e-02 +-5.56924630e-02 +-1.38346729e-02 +2.80893279e-02 +6.99416970e-02 +1.11584884e-01 +1.52882382e-01 +1.93699001e-01 +2.33901033e-01 +2.73357523e-01 +3.11939711e-01 +3.49521784e-01 +3.85982092e-01 +4.21201874e-01 +4.55067122e-01 +4.87468728e-01 +5.18301333e-01 +5.47466230e-01 +5.74869521e-01 +6.00422633e-01 +6.24044710e-01 +6.45659461e-01 +6.65198184e-01 +6.82599374e-01 +6.97806795e-01 +7.10773640e-01 +7.21458680e-01 +7.29828317e-01 +7.35857798e-01 +7.39527543e-01 +7.40827989e-01 +7.39755748e-01 +7.36314822e-01 +7.30518527e-01 +7.22385094e-01 +7.11942698e-01 +6.99225307e-01 +6.84274095e-01 +6.67138732e-01 +6.47873401e-01 +6.26541521e-01 +6.03211021e-01 +5.77956897e-01 +5.50860573e-01 +5.22007698e-01 +4.91491455e-01 +4.59408018e-01 +4.25860038e-01 +3.90953744e-01 +3.54799547e-01 +3.17512305e-01 +2.79209140e-01 +2.40011515e-01 +2.00042325e-01 +1.59427628e-01 +1.18294789e-01 +7.67728162e-02 +3.49917983e-02 +-6.91767538e-03 +-4.88247009e-02 +-9.05985288e-02 +-1.32109190e-01 +-1.73227401e-01 +-2.13825628e-01 +-2.53777844e-01 +-2.92960287e-01 +-3.31251959e-01 +-3.68534208e-01 +-4.04692647e-01 +-4.39615143e-01 +-4.73195267e-01 +-5.05328862e-01 +-5.35918573e-01 +-5.64869672e-01 +-5.92094793e-01 +-6.17510011e-01 +-6.41038751e-01 +-6.62609055e-01 +-6.82155895e-01 +-6.99620188e-01 +-7.14949172e-01 +-7.28097297e-01 +-7.39024683e-01 +-7.47699764e-01 +-7.54096037e-01 +-7.58196164e-01 +-7.59987366e-01 +-7.59466605e-01 +-7.56634984e-01 +-7.51503679e-01 +-7.44087674e-01 +-7.34412087e-01 +-7.22505592e-01 +-7.08406852e-01 +-6.92157860e-01 +-6.73810260e-01 +-6.53418832e-01 +-6.31047494e-01 +-6.06763122e-01 +-5.80641064e-01 +-5.52759464e-01 +-5.23204109e-01 +-4.92063456e-01 +-4.59432634e-01 +-4.25409332e-01 +-3.90096819e-01 +-3.53600822e-01 +-3.16031477e-01 +-2.77501245e-01 +-2.38125803e-01 +-1.98022946e-01 +-1.57312544e-01 +-1.16116221e-01 +-7.45566947e-02 +-3.27578455e-02 +9.15610509e-03 +5.10606316e-02 +9.28313628e-02 +1.34344706e-01 +1.75477552e-01 +2.16108704e-01 +2.56117828e-01 +2.95387410e-01 +3.33801482e-01 +3.71247353e-01 +4.07615040e-01 +4.42797696e-01 +4.76692839e-01 +5.09200532e-01 +5.40226990e-01 +5.69680507e-01 +5.97476694e-01 +6.23533600e-01 +6.47776585e-01 +6.70135026e-01 +6.90544263e-01 +7.08946206e-01 +7.25286737e-01 +7.39520719e-01 +7.51605783e-01 +7.61509247e-01 +7.69202035e-01 +7.74663210e-01 +7.77878090e-01 +7.78837227e-01 +7.77540385e-01 +7.73990397e-01 +7.68200121e-01 +7.60186067e-01 +7.49972636e-01 +7.37590714e-01 +7.23075640e-01 +7.06471775e-01 +6.87826180e-01 +6.67194433e-01 +6.44636291e-01 +6.20216853e-01 +5.94008090e-01 +5.66084522e-01 +5.36528040e-01 +5.05423280e-01 +4.72859801e-01 +4.38931945e-01 +4.03736220e-01 +3.67374487e-01 +3.29950385e-01 +2.91571009e-01 +2.52346420e-01 +2.12387996e-01 +1.71810117e-01 +1.30728049e-01 +8.92585957e-02 +4.75196881e-02 +5.62956486e-03 +-3.62930036e-02 +-7.81294327e-02 +-1.19761359e-01 +-1.61071453e-01 +-2.01943005e-01 +-2.42260968e-01 +-2.81912135e-01 +-3.20784611e-01 +-3.58769855e-01 +-3.95761145e-01 +-4.31654628e-01 +-4.66350738e-01 +-4.99751804e-01 +-5.31764997e-01 +-5.62301627e-01 +-5.91275819e-01 +-6.18608086e-01 +-6.44222430e-01 +-6.68047269e-01 +-6.90018087e-01 +-7.10073438e-01 +-7.28157994e-01 +-7.44223350e-01 +-7.58224312e-01 +-7.70123165e-01 +-7.79888407e-01 +-7.87492427e-01 +-7.92915869e-01 +-7.96144748e-01 +-7.97169779e-01 +-7.95990167e-01 +-7.92609777e-01 +-7.87037832e-01 +-7.79291876e-01 +-7.69393556e-01 +-7.57370228e-01 +-7.43257147e-01 +-7.27093239e-01 +-7.08923178e-01 +-6.88798879e-01 +-6.66775623e-01 +-6.42914100e-01 +-6.17281536e-01 +-5.89948157e-01 +-5.60989049e-01 +-5.30484994e-01 +-4.98519419e-01 +-4.65179834e-01 +-4.30558523e-01 +-3.94750021e-01 +-3.57852038e-01 +-3.19966039e-01 +-2.81195292e-01 +-2.41645279e-01 +-2.01424117e-01 +-1.60641210e-01 +-1.19407227e-01 +-7.78343038e-02 +-3.60352023e-02 +5.87691455e-03 +4.77885428e-02 +8.95864477e-02 +1.31157719e-01 +1.72390122e-01 +2.13172789e-01 +2.53395845e-01 +2.92950943e-01 +3.31732184e-01 +3.69635550e-01 +4.06559128e-01 +4.42404300e-01 +4.77075623e-01 +5.10480054e-01 +5.42528403e-01 +5.73136053e-01 +6.02221227e-01 +6.29706270e-01 +6.55518894e-01 +6.79590955e-01 +7.01858202e-01 +7.22261916e-01 +7.40749266e-01 +7.57271117e-01 +7.71783773e-01 +7.84250061e-01 +7.94637783e-01 +8.02919390e-01 +8.09073596e-01 +8.13085803e-01 +8.14945617e-01 +8.14648380e-01 +8.12196070e-01 +8.07596493e-01 +8.00861853e-01 +7.92010394e-01 +7.81067001e-01 +7.68061240e-01 +7.53027504e-01 +7.36006037e-01 +7.17043111e-01 +6.96188888e-01 +6.73498405e-01 +6.49031986e-01 +6.22855067e-01 +5.95036402e-01 +5.65649164e-01 +5.34771027e-01 +5.02483709e-01 +4.68871688e-01 +4.34023057e-01 +3.98029409e-01 +3.60985290e-01 +3.22987323e-01 +2.84134727e-01 +2.44529066e-01 +2.04273778e-01 +1.63473535e-01 +1.22234469e-01 +8.06638581e-02 +3.88696997e-02 +-3.03967874e-03 +-4.49556596e-02 +-8.67696850e-02 +-1.28373698e-01 +-1.69660234e-01 +-2.10522678e-01 +-2.50855616e-01 +-2.90555356e-01 +-3.29519802e-01 +-3.67648686e-01 +-4.04844019e-01 +-4.41010575e-01 +-4.76055942e-01 +-5.09890249e-01 +-5.42426889e-01 +-5.73582807e-01 +-6.03279023e-01 +-6.31439795e-01 +-6.57993312e-01 +-6.82872047e-01 +-7.06013228e-01 +-7.27358587e-01 +-7.46853894e-01 +-7.64449846e-01 +-7.80102162e-01 +-7.93772117e-01 +-8.05425501e-01 +-8.15033034e-01 +-8.22570828e-01 +-8.28020485e-01 +-8.31369391e-01 +-8.32609489e-01 +-8.31738105e-01 +-8.28758039e-01 +-8.23677695e-01 +-8.16511073e-01 +-8.07276700e-01 +-7.95998416e-01 +-7.82705307e-01 +-7.67431750e-01 +-7.50217319e-01 +-7.31105792e-01 +-7.10145789e-01 +-6.87390632e-01 +-6.62898253e-01 +-6.36731163e-01 +-6.08955485e-01 +-5.79641356e-01 +-5.48862800e-01 +-5.16697507e-01 +-4.83226810e-01 +-4.48534923e-01 +-4.12708942e-01 +-3.75838818e-01 +-3.38017060e-01 +-2.99338562e-01 +-2.59900255e-01 +-2.19800665e-01 +-1.79139959e-01 +-1.38019636e-01 +-9.65422635e-02 +-5.48112202e-02 +-1.29303358e-02 +2.89962857e-02 +7.08644899e-02 +1.12570352e-01 +1.54010453e-01 +1.95082217e-01 +2.35684039e-01 +2.75715526e-01 +3.15077791e-01 +3.53673692e-01 +3.91408093e-01 +4.28188242e-01 +4.63923685e-01 +4.98526554e-01 +5.31911898e-01 +5.63997832e-01 +5.94705772e-01 +6.23960779e-01 +6.51691475e-01 +6.77830109e-01 +7.02312964e-01 +7.25080444e-01 +7.46077241e-01 +7.65252515e-01 +7.82560104e-01 +7.97958161e-01 +8.11409537e-01 +8.22881919e-01 +8.32347878e-01 +8.39784916e-01 +8.45175626e-01 +8.48507694e-01 +8.49773531e-01 +8.48970628e-01 +8.46101546e-01 +8.41173890e-01 +8.34200265e-01 +8.25198309e-01 +8.14190692e-01 +8.01204659e-01 +7.86272231e-01 +7.69430162e-01 +7.50719808e-01 +7.30187017e-01 +7.07882019e-01 +6.83859384e-01 +6.58177716e-01 +6.30899431e-01 +6.02090793e-01 +5.71821709e-01 +5.40165557e-01 +5.07198990e-01 +4.73001747e-01 +4.37656521e-01 +4.01248630e-01 +3.63865798e-01 +3.25598039e-01 +2.86537421e-01 +2.46777836e-01 +2.06414768e-01 +1.65545062e-01 +1.24266692e-01 +8.26785188e-02 +4.08800204e-02 +-1.02890677e-03 +-4.29481835e-02 +-8.47777921e-02 +-1.26418018e-01 +-1.67769687e-01 +-2.08734401e-01 +-2.49214777e-01 +-2.89114709e-01 +-3.28339536e-01 +-3.66796272e-01 +-4.04393831e-01 +-4.41043259e-01 +-4.76657923e-01 +-5.11153720e-01 +-5.44449285e-01 +-5.76466154e-01 +-6.07128969e-01 +-6.36365701e-01 +-6.64107713e-01 +-6.90289918e-01 +-7.14850977e-01 +-7.37733439e-01 +-7.58883859e-01 +-7.78252926e-01 +-7.95795564e-01 +-8.11471038e-01 +-8.25243040e-01 +-8.37079777e-01 +-8.46954074e-01 +-8.54843347e-01 +-8.60729651e-01 +-8.64599778e-01 +-8.66445236e-01 +-8.66262294e-01 +-8.64051993e-01 +-8.59820077e-01 +-8.53577055e-01 +-8.45338085e-01 +-8.35123011e-01 +-8.22956236e-01 +-8.08866729e-01 +-7.92887928e-01 +-7.75057600e-01 +-7.55417782e-01 +-7.34014690e-01 +-7.10898604e-01 +-6.86123740e-01 +-6.59748122e-01 +-6.31833440e-01 +-6.02444900e-01 +-5.71651069e-01 +-5.39523710e-01 +-5.06137612e-01 +-4.71570411e-01 +-4.35902409e-01 +-3.99216384e-01 +-3.61597397e-01 +-3.23132582e-01 +-2.83910943e-01 +-2.44023152e-01 +-2.03561346e-01 +-1.62618899e-01 +-1.21290214e-01 +-7.96705037e-02 +-3.78555636e-02 +4.05844204e-03 +4.59752051e-02 +8.77984942e-02 +1.29432375e-01 +1.70781431e-01 +2.11750979e-01 +2.52247289e-01 +2.92177791e-01 +3.31451292e-01 +3.69978180e-01 +4.07670627e-01 +4.44442787e-01 +4.80210986e-01 +5.14893910e-01 +5.48412789e-01 +5.80691572e-01 +6.11657099e-01 +6.41239259e-01 +6.69371150e-01 +6.95989220e-01 +7.21033414e-01 +7.44447303e-01 +7.66178207e-01 +7.86177300e-01 +8.04399731e-01 +8.20804717e-01 +8.35355606e-01 +8.48020003e-01 +8.58769773e-01 +8.67581170e-01 +8.74434807e-01 +8.79315775e-01 +8.82213601e-01 +8.83122297e-01 +8.82040385e-01 +8.78970854e-01 +8.73921165e-01 +8.66903235e-01 +8.57933404e-01 +8.47032382e-01 +8.34225198e-01 +8.19541141e-01 +8.03013689e-01 +7.84680427e-01 +7.64582957e-01 +7.42766800e-01 +7.19281289e-01 +6.94179447e-01 +6.67517869e-01 +6.39356593e-01 +6.09758967e-01 +5.78791481e-01 +5.46523623e-01 +5.13027745e-01 +4.78378858e-01 +4.42654488e-01 +4.05934495e-01 +3.68300881e-01 +3.29837621e-01 +2.90630462e-01 +2.50766731e-01 +2.10335150e-01 +1.69425618e-01 +1.28129027e-01 +8.65370534e-02 +4.47419500e-02 +2.83634531e-03 +-3.90869628e-02 +-8.09352131e-02 +-1.22615886e-01 +-1.64036909e-01 +-2.05106855e-01 +-2.45735150e-01 +-2.85832265e-01 +-3.25309916e-01 +-3.64081258e-01 +-4.02061071e-01 +-4.39165944e-01 +-4.75314463e-01 +-5.10427380e-01 +-5.44427793e-01 +-5.77241296e-01 +-6.08796160e-01 +-6.39023470e-01 +-6.67857278e-01 +-6.95234750e-01 +-7.21096283e-01 +-7.45385654e-01 +-7.68050116e-01 +-7.89040522e-01 +-8.08311430e-01 +-8.25821182e-01 +-8.41532006e-01 +-8.55410088e-01 +-8.67425636e-01 +-8.77552943e-01 +-8.85770440e-01 +-8.92060735e-01 +-8.96410643e-01 +-8.98811214e-01 +-8.99257743e-01 +-8.97749777e-01 +-8.94291109e-01 +-8.88889763e-01 +-8.81557976e-01 +-8.72312157e-01 +-8.61172854e-01 +-8.48164704e-01 +-8.33316369e-01 +-8.16660466e-01 +-7.98233505e-01 +-7.78075791e-01 +-7.56231341e-01 +-7.32747796e-01 +-7.07676269e-01 +-6.81071288e-01 +-6.52990613e-01 +-6.23495168e-01 +-5.92648858e-01 +-5.60518448e-01 +-5.27173429e-01 +-4.92685833e-01 +-4.57130096e-01 +-4.20582895e-01 +-3.83122977e-01 +-3.44830982e-01 +-3.05789275e-01 +-2.66081761e-01 +-2.25793711e-01 +-1.85011571e-01 +-1.43822778e-01 +-1.02315574e-01 +-6.05788140e-02 +-1.87017772e-02 +2.32260333e-02 +6.51150752e-02 +1.06875957e-01 +1.48419632e-01 +1.89657585e-01 +2.30502017e-01 +2.70866039e-01 +3.10663851e-01 +3.49810917e-01 +3.88224160e-01 +4.25822113e-01 +4.62525116e-01 +4.98255452e-01 +5.32937532e-01 +5.66498052e-01 +5.98866164e-01 +6.29973599e-01 +6.59754794e-01 +6.88147047e-01 +7.15090640e-01 +7.40528967e-01 +7.64408643e-01 +7.86679615e-01 +8.07295265e-01 +8.26212500e-01 +8.43391839e-01 +8.58797486e-01 +8.72397394e-01 +8.84163405e-01 +8.94071257e-01 +9.02100576e-01 +9.08234949e-01 +9.12461963e-01 +9.14773210e-01 +9.15164317e-01 +9.13634944e-01 +9.10188768e-01 +9.04833486e-01 +8.97580778e-01 +8.88446266e-01 +8.77449585e-01 +8.64614269e-01 +8.49967627e-01 +8.33540715e-01 +8.15368300e-01 +7.95488757e-01 +7.73943994e-01 +7.50779361e-01 +7.26043552e-01 +6.99788485e-01 +6.72069189e-01 +6.42943791e-01 +6.12473302e-01 +5.80721426e-01 +5.47754481e-01 +5.13641261e-01 +4.78452887e-01 +4.42262660e-01 +4.05145905e-01 +3.67179809e-01 +3.28443256e-01 +2.89016718e-01 +2.48982042e-01 +2.08422229e-01 +1.67421299e-01 +1.26064129e-01 +8.44362678e-02 +4.26237611e-02 +7.12979198e-04 +-4.12095615e-02 +-8.30573702e-02 +-1.24744195e-01 +-1.66184188e-01 +-2.07292075e-01 +-2.47983321e-01 +-2.88174306e-01 +-3.27782502e-01 +-3.66726622e-01 +-4.04926773e-01 +-4.42304659e-01 +-4.78783837e-01 +-5.14289709e-01 +-5.48749711e-01 +-5.82093472e-01 +-6.14252952e-01 +-6.45162571e-01 +-6.74759328e-01 +-7.02982900e-01 +-7.29776013e-01 +-7.55084343e-01 +-7.78856561e-01 +-8.01044504e-01 +-8.21603256e-01 +-8.40491244e-01 +-8.57670315e-01 +-8.73105735e-01 +-8.86766614e-01 +-8.98625717e-01 +-9.08659319e-01 +-9.16847457e-01 +-9.23173886e-01 +-9.27626172e-01 +-9.30195603e-01 +-9.30877313e-01 +-9.29670617e-01 +-9.26578477e-01 +-9.21607598e-01 +-9.14768471e-01 +-9.06075349e-01 +-8.95546196e-01 +-8.83202588e-01 +-8.69070058e-01 +-8.53177783e-01 +-8.35558268e-01 +-8.16247471e-01 +-7.95284727e-01 +-7.72712652e-01 +-7.48577003e-01 +-7.22926862e-01 +-6.95814473e-01 +-6.67294757e-01 +-6.37425411e-01 +-6.06266799e-01 +-5.73881814e-01 +-5.40335721e-01 +-5.05696277e-01 +-4.70033442e-01 +-4.33418994e-01 +-3.95926573e-01 +-3.57631519e-01 +-3.18610723e-01 +-2.78942469e-01 +-2.38706457e-01 +-1.97983374e-01 +-1.56854760e-01 +-1.15402913e-01 +-7.37107281e-02 +-3.18615399e-02 +1.00610197e-02 +5.19732569e-02 +9.37915988e-02 +1.35432712e-01 +1.76813657e-01 +2.17852033e-01 +2.58466124e-01 +2.98575282e-01 +3.38099896e-01 +3.76961528e-01 +4.15083092e-01 +4.52388975e-01 +4.88805124e-01 +5.24259627e-01 +5.58682503e-01 +5.92005738e-01 +6.24163513e-01 +6.55092306e-01 +6.84730910e-01 +7.13021210e-01 +7.39907727e-01 +7.65337611e-01 +7.89260878e-01 +8.11630476e-01 +8.32402287e-01 +8.51536082e-01 +8.68994655e-01 +8.84743911e-01 +8.98753122e-01 +9.10994851e-01 +9.21445181e-01 +9.30084488e-01 +9.36896251e-01 +9.41867423e-01 +9.44988518e-01 +9.46253460e-01 +9.45660323e-01 +9.43211166e-01 +9.38911167e-01 +9.32769073e-01 +9.24797109e-01 +9.15010978e-01 +9.03430830e-01 +8.90079880e-01 +8.74984559e-01 +8.58174615e-01 +8.39682929e-01 +8.19546235e-01 +7.97804646e-01 +7.74500882e-01 +7.49680657e-01 +7.23392439e-01 +6.95687720e-01 +6.66621313e-01 +6.36250133e-01 +6.04633482e-01 +5.71832993e-01 +5.37912527e-01 +5.02938717e-01 +4.66979819e-01 +4.30105806e-01 +3.92388352e-01 +3.53900688e-01 +3.14717933e-01 +2.74916285e-01 +2.34572944e-01 +1.93766108e-01 +1.52574836e-01 +1.11079100e-01 +6.93592688e-02 +2.74960123e-02 +-1.44297455e-02 +-5.63369316e-02 +-9.81445819e-02 +-1.39772070e-01 +-1.81139146e-01 +-2.22166046e-01 +-2.62773573e-01 +-3.02883706e-01 +-3.42419407e-01 +-3.81304681e-01 +-4.19464699e-01 +-4.56825962e-01 +-4.93317171e-01 +-5.28868483e-01 +-5.63411747e-01 +-5.96880559e-01 +-6.29210748e-01 +-6.60341086e-01 +-6.90212158e-01 +-7.18766829e-01 +-7.45950183e-01 +-7.71710674e-01 +-7.95999819e-01 +-8.18771373e-01 +-8.39981817e-01 +-8.59590372e-01 +-8.77560683e-01 +-8.93859003e-01 +-9.08454389e-01 +-9.21318797e-01 +-9.32427968e-01 +-9.41761986e-01 +-9.49303364e-01 +-9.55037790e-01 +-9.58954004e-01 +-9.61045766e-01 +-9.61309857e-01 +-9.59745928e-01 +-9.56356700e-01 +-9.51148962e-01 +-9.44133945e-01 +-9.35325246e-01 +-9.24739528e-01 +-9.12396604e-01 +-8.98321235e-01 +-8.82540664e-01 +-8.65084856e-01 +-8.45986509e-01 +-8.25282535e-01 +-8.03013109e-01 +-7.79220435e-01 +-7.53949289e-01 +-7.27247565e-01 +-6.99166887e-01 +-6.69760447e-01 +-6.39083650e-01 +-6.07194190e-01 +-5.74153241e-01 +-5.40023365e-01 +-5.04868824e-01 +-4.68755596e-01 +-4.31752366e-01 +-3.93929135e-01 +-3.55357001e-01 +-3.16108320e-01 +-2.76257232e-01 +-2.35878946e-01 +-1.95049228e-01 +-1.53844625e-01 +-1.12342626e-01 +-7.06212539e-02 +-2.87586418e-02 +1.31667856e-02 +5.50764036e-02 +9.68918009e-02 +1.38534830e-01 +1.79927548e-01 +2.20992475e-01 +2.61653194e-01 +3.01833882e-01 +3.41459395e-01 +3.80455674e-01 +4.18750588e-01 +4.56272887e-01 +4.92952420e-01 +5.28720769e-01 +5.63512215e-01 +5.97262159e-01 +6.29907475e-01 +6.61387466e-01 +6.91644730e-01 +7.20623173e-01 +7.48268498e-01 +7.74529613e-01 +7.99359047e-01 +8.22710799e-01 +8.44540926e-01 +8.64809589e-01 +8.83480495e-01 +9.00519018e-01 +9.15892820e-01 +9.29574617e-01 +9.41540164e-01 +9.51767133e-01 +9.60235817e-01 +9.66932284e-01 +9.71844871e-01 +9.74964086e-01 +9.76283676e-01 +9.75803202e-01 +9.73523864e-01 +9.69449167e-01 +9.63586810e-01 +9.55949430e-01 +9.46551046e-01 +9.35408054e-01 +9.22542068e-01 +9.07977985e-01 +8.91742242e-01 +8.73863900e-01 +8.54377595e-01 +8.33319570e-01 +8.10727862e-01 +7.86643868e-01 +7.61113426e-01 +7.34183262e-01 +7.05901951e-01 +6.76322220e-01 +6.45499125e-01 +6.13488700e-01 +5.80349043e-01 +5.46142091e-01 +5.10930496e-01 +4.74778070e-01 +4.37751145e-01 +3.99918157e-01 +3.61347910e-01 +3.22110396e-01 +2.82277920e-01 +2.41923183e-01 +2.01119434e-01 +1.59941096e-01 +1.18463496e-01 +7.67619544e-02 +3.49122616e-02 +-7.00930699e-03 +-4.89266625e-02 +-9.07636732e-02 +-1.32444257e-01 +-1.73893017e-01 +-2.15034828e-01 +-2.55794756e-01 +-2.96099334e-01 +-3.35875832e-01 +-3.75051864e-01 +-4.13556526e-01 +-4.51320966e-01 +-4.88276729e-01 +-5.24356381e-01 +-5.59495876e-01 +-5.93632001e-01 +-6.26702297e-01 +-6.58647701e-01 +-6.89411613e-01 +-7.18937972e-01 +-7.47173116e-01 +-7.74067945e-01 +-7.99573906e-01 +-8.23643874e-01 +-8.46236316e-01 +-8.67311180e-01 +-8.86829372e-01 +-9.04756501e-01 +-9.21062028e-01 +-9.35715796e-01 +-9.48690920e-01 +-9.59966526e-01 +-9.69522095e-01 +-9.77339062e-01 +-9.83405788e-01 +-9.87711893e-01 +-9.90248086e-01 +-9.91011238e-01 +-9.90001470e-01 +-9.87219289e-01 +-9.82669798e-01 +-9.76363452e-01 +-9.68310678e-01 +-9.58524961e-01 +-9.47026424e-01 +-9.33835322e-01 +-9.18973727e-01 +-9.02470540e-01 +-8.84355552e-01 +-8.64659490e-01 +-8.43419098e-01 +-8.20673219e-01 +-7.96460986e-01 +-7.70826234e-01 +-7.43816112e-01 +-7.15477571e-01 +-6.85861005e-01 +-6.55020824e-01 +-6.23011050e-01 +-5.89888070e-01 +-5.55712414e-01 +-5.20544273e-01 +-4.84445344e-01 +-4.47481134e-01 +-4.09716946e-01 +-3.71219000e-01 +-3.32056611e-01 +-2.92299070e-01 +-2.52016172e-01 +-2.11279924e-01 +-1.70162389e-01 +-1.28735885e-01 +-8.70740143e-02 +-4.52503576e-02 +-3.33862000e-03 +3.85870774e-02 +8.04529116e-02 +1.22184959e-01 +1.63709664e-01 +2.04954214e-01 +2.45845640e-01 +2.86312047e-01 +3.26282837e-01 +3.65659669e-01 +4.04342484e-01 +4.42299554e-01 +4.79465898e-01 +5.15777246e-01 +5.51170964e-01 +5.85586154e-01 +6.18963724e-01 +6.51246523e-01 +6.82379428e-01 +7.12309410e-01 +7.40985651e-01 +7.68359622e-01 +7.94385134e-01 +8.19018449e-01 +8.42218334e-01 +8.63946110e-01 +8.84165740e-01 +9.02843873e-01 +9.19949881e-01 +9.35455930e-01 +9.49337004e-01 +9.61570938e-01 +9.72138468e-01 +9.81023236e-01 +9.88211817e-01 +9.93693743e-01 +9.97461501e-01 +9.99510546e-01 +9.99839296e-01 +9.98449132e-01 +9.95344384e-01 +9.90532315e-01 +9.84023106e-01 +9.75829826e-01 +9.65968401e-01 +9.54457590e-01 +9.41318926e-01 +9.26576692e-01 +9.10257863e-01 +8.92392044e-01 +8.73011438e-01 +8.52150757e-01 +8.29847165e-01 +8.06140229e-01 +7.81071805e-01 +7.54685999e-01 +7.27029071e-01 +6.98149334e-01 +6.68097110e-01 +6.36924593e-01 +6.04685776e-01 +5.71436378e-01 +5.37233686e-01 +5.02136524e-01 +4.66205103e-01 +4.29500914e-01 +3.92086673e-01 +3.54026139e-01 +3.15384058e-01 +2.76226043e-01 +2.36618422e-01 +1.96628196e-01 +1.56322853e-01 +1.15770293e-01 +7.50387262e-02 +3.41964954e-02 +-6.68795150e-03 +-4.75462509e-02 +-8.83102067e-02 +-1.28911878e-01 +-1.69283763e-01 +-2.09358821e-01 +-2.49070657e-01 +-2.88353599e-01 +-3.27142784e-01 +-3.65374329e-01 +-4.02985347e-01 +-4.39914129e-01 +-4.76100200e-01 +-5.11484408e-01 +-5.46009071e-01 +-5.79617991e-01 +-6.12256623e-01 +-6.43872104e-01 +-6.74413351e-01 +-7.03831169e-01 +-7.32078271e-01 +-7.59109415e-01 +-7.84881419e-01 +-8.09353260e-01 +-8.32486131e-01 +-8.54243473e-01 +-8.74591079e-01 +-8.93497088e-01 +-9.10932080e-01 +-9.26869085e-01 +-9.41283633e-01 +-9.54153796e-01 +-9.65460194e-01 +-9.75186054e-01 +-9.83317195e-01 +-9.89842072e-01 +-9.94751774e-01 +-9.98040036e-01 +-9.99703243e-01 +-9.99740429e-01 +-9.98153270e-01 +-9.94946078e-01 +-9.90125784e-01 +-9.83701925e-01 +-9.75686616e-01 +-9.66094526e-01 +-9.54942857e-01 +-9.42251288e-01 +-9.28041968e-01 +-9.12339438e-01 +-8.95170623e-01 +-8.76564751e-01 +-8.56553318e-01 +-8.35170033e-01 +-8.12450736e-01 +-7.88433377e-01 +-7.63157893e-01 +-7.36666205e-01 +-7.09002076e-01 +-6.80211104e-01 +-6.50340587e-01 +-6.19439483e-01 +-5.87558309e-01 +-5.54749051e-01 +-5.21065110e-01 +-4.86561155e-01 +-4.51293109e-01 +-4.15317969e-01 +-3.78693809e-01 +-3.41479584e-01 +-3.03735133e-01 +-2.65520991e-01 +-2.26898366e-01 +-1.87928989e-01 +-1.48675040e-01 +-1.09199048e-01 +-6.95637658e-02 +-2.98321222e-02 +9.93295406e-03 +4.96685394e-02 +8.93119226e-02 +1.28800586e-01 +1.68072426e-01 +2.07065727e-01 +2.45719378e-01 +2.83972852e-01 +3.21766406e-01 +3.59041082e-01 +3.95738870e-01 +4.31802744e-01 +4.67176782e-01 +5.01806237e-01 +5.35637620e-01 +5.68618789e-01 +6.00699011e-01 +6.31829065e-01 +6.61961278e-01 +6.91049642e-01 +7.19049826e-01 +7.45919304e-01 +7.71617353e-01 +7.96105174e-01 +8.19345886e-01 +8.41304643e-01 +8.61948617e-01 +8.81247109e-01 +8.99171530e-01 +9.15695501e-01 +9.30794829e-01 +9.44447593e-01 +9.56634127e-01 +9.67337084e-01 +9.76541423e-01 +9.84234459e-01 +9.90405845e-01 +9.95047612e-01 +9.98154153e-01 +9.99722239e-01 +9.99751014e-01 +9.98241990e-01 +9.95199043e-01 +9.90628394e-01 +9.84538606e-01 +9.76940548e-01 +9.67847394e-01 +9.57274575e-01 +9.45239774e-01 +9.31762866e-01 +9.16865916e-01 +9.00573100e-01 +8.82910707e-01 +8.63907050e-01 +8.43592463e-01 +8.21999203e-01 +7.99161442e-01 +7.75115170e-01 +7.49898172e-01 +7.23549933e-01 +6.96111605e-01 +6.67625914e-01 +6.38137110e-01 +6.07690892e-01 +5.76334323e-01 +5.44115781e-01 +5.11084848e-01 +4.77292279e-01 +4.42789860e-01 +4.07630406e-01 +3.71867585e-01 +3.35555944e-01 +2.98750705e-01 +2.61507805e-01 +2.23883685e-01 +1.85935324e-01 +1.47720044e-01 +1.09295517e-01 +7.07195970e-02 +3.20502977e-02 +-6.65433692e-03 +-4.53363055e-02 +-8.39377218e-02 +-1.22400942e-01 +-1.60668584e-01 +-1.98683702e-01 +-2.36389762e-01 +-2.73730846e-01 +-3.10651609e-01 +-3.47097482e-01 +-3.83014640e-01 +-4.18350172e-01 +-4.53052096e-01 +-4.87069460e-01 +-5.20352424e-01 +-5.52852293e-01 +-5.84521650e-01 +-6.15314341e-01 +-6.45185633e-01 +-6.74092184e-01 +-7.01992189e-01 +-7.28845368e-01 +-7.54613074e-01 +-7.79258314e-01 +-8.02745810e-01 +-8.25042063e-01 +-8.46115356e-01 +-8.65935860e-01 +-8.84475600e-01 +-9.01708562e-01 +-9.17610673e-01 +-9.32159865e-01 +-9.45336087e-01 +-9.57121332e-01 +-9.67499670e-01 +-9.76457245e-01 +-9.83982317e-01 +-9.90065249e-01 +-9.94698535e-01 +-9.97876798e-01 +-9.99596794e-01 +-9.99857412e-01 +-9.98659673e-01 +-9.96006718e-01 +-9.91903808e-01 +-9.86358303e-01 +-9.79379650e-01 +-9.70979366e-01 +-9.61171012e-01 +-9.49970179e-01 +-9.37394441e-01 +-9.23463356e-01 +-9.08198396e-01 +-8.91622944e-01 +-8.73762239e-01 +-8.54643332e-01 +-8.34295069e-01 +-8.12747998e-01 +-7.90034378e-01 +-7.66188080e-01 +-7.41244560e-01 +-7.15240812e-01 +-6.88215269e-01 +-6.60207812e-01 +-6.31259635e-01 +-6.01413244e-01 +-5.70712361e-01 +-5.39201854e-01 +-5.06927711e-01 +-4.73936904e-01 +-4.40277394e-01 +-4.05998003e-01 +-3.71148361e-01 +-3.35778864e-01 +-2.99940525e-01 +-2.63684999e-01 +-2.27064415e-01 +-1.90131356e-01 +-1.52938785e-01 +-1.15539910e-01 +-7.79882013e-02 +-4.03372215e-02 +-2.64060771e-03 +3.50480079e-02 +7.26751277e-02 +1.10187373e-01 +1.47531655e-01 +1.84655187e-01 +2.21505562e-01 +2.58030884e-01 +2.94179745e-01 +3.29901389e-01 +3.65145730e-01 +3.99863416e-01 +4.34005953e-01 +4.67525692e-01 +5.00375962e-01 +5.32511108e-01 +5.63886524e-01 +5.94458785e-01 +6.24185626e-01 +6.53026047e-01 +6.80940374e-01 +7.07890257e-01 +7.33838795e-01 +7.58750528e-01 +7.82591498e-01 +8.05329324e-01 +8.26933185e-01 +8.47373919e-01 +8.66624027e-01 +8.84657705e-01 +9.01450904e-01 +9.16981328e-01 +9.31228482e-01 +9.44173694e-01 +9.55800123e-01 +9.66092798e-01 +9.75038627e-01 +9.82626399e-01 +9.88846820e-01 +9.93692500e-01 +9.97157970e-01 +9.99239684e-01 +9.99936019e-01 +9.99247271e-01 +9.97175654e-01 +9.93725294e-01 +9.88902212e-01 +9.82714320e-01 +9.75171403e-01 +9.66285095e-01 +9.56068873e-01 +9.44538025e-01 +9.31709618e-01 +9.17602494e-01 +9.02237215e-01 +8.85636041e-01 +8.67822910e-01 +8.48823370e-01 +8.28664570e-01 +8.07375214e-01 +7.84985492e-01 +7.61527078e-01 +7.37033054e-01 +7.11537857e-01 +6.85077265e-01 +6.57688306e-01 +6.29409213e-01 +6.00279407e-01 +5.70339379e-01 +5.39630673e-01 +5.08195838e-01 +4.76078318e-01 +4.43322435e-01 +4.09973329e-01 +3.76076847e-01 +3.41679534e-01 +3.06828550e-01 +2.71571574e-01 +2.35956788e-01 +2.00032792e-01 +1.63848500e-01 +1.27453140e-01 +9.08961455e-02 +5.42270704e-02 +1.74955811e-02 +-1.92486592e-02 +-5.59560624e-02 +-9.25771291e-02 +-1.29062567e-01 +-1.65363356e-01 +-2.01430760e-01 +-2.37216453e-01 +-2.72672570e-01 +-3.07751725e-01 +-3.42407132e-01 +-3.76592651e-01 +-4.10262812e-01 +-4.43372921e-01 +-4.75879111e-01 +-5.07738360e-01 +-5.38908591e-01 +-5.69348724e-01 +-5.99018687e-01 +-6.27879509e-01 +-6.55893372e-01 +-6.83023617e-01 +-7.09234829e-01 +-7.34492881e-01 +-7.58764947e-01 +-7.82019568e-01 +-8.04226696e-01 +-8.25357707e-01 +-8.45385448e-01 +-8.64284285e-01 +-8.82030110e-01 +-8.98600375e-01 +-9.13974137e-01 +-9.28132063e-01 +-9.41056453e-01 +-9.52731275e-01 +-9.63142172e-01 +-9.72276470e-01 +-9.80123212e-01 +-9.86673152e-01 +-9.91918768e-01 +-9.95854273e-01 +-9.98475613e-01 +-9.99780474e-01 +-9.99768277e-01 +-9.98440178e-01 +-9.95799063e-01 +-9.91849540e-01 +-9.86597928e-01 +-9.80052247e-01 +-9.72222208e-01 +-9.63119187e-01 +-9.52756213e-01 +-9.41147953e-01 +-9.28310679e-01 +-9.14262243e-01 +-8.99022065e-01 +-8.82611094e-01 +-8.65051769e-01 +-8.46368004e-01 +-8.26585150e-01 +-8.05729946e-01 +-7.83830489e-01 +-7.60916211e-01 +-7.37017812e-01 +-7.12167222e-01 +-6.86397581e-01 +-6.59743169e-01 +-6.32239357e-01 +-6.03922577e-01 +-5.74830274e-01 +-5.45000828e-01 +-5.14473518e-01 +-4.83288493e-01 +-4.51486683e-01 +-4.19109748e-01 +-3.86200046e-01 +-3.52800570e-01 +-3.18954867e-01 +-2.84706999e-01 +-2.50101508e-01 +-2.15183313e-01 +-1.79997669e-01 +-1.44590124e-01 +-1.09006455e-01 +-7.32925793e-02 +-3.74945204e-02 +-1.65836660e-03 +3.41698266e-02 +6.99440869e-02 +1.05618562e-01 +1.41147584e-01 +1.76485756e-01 +2.11587988e-01 +2.46409534e-01 +2.80906084e-01 +3.15033814e-01 +3.48749424e-01 +3.82010188e-01 +4.14774040e-01 +4.46999607e-01 +4.78646246e-01 +5.09674109e-01 +5.40044206e-01 +5.69718436e-01 +5.98659620e-01 +6.26831575e-01 +6.54199151e-01 +6.80728264e-01 +7.06385930e-01 +7.31140331e-01 +7.54960839e-01 +7.77818043e-01 +7.99683793e-01 +8.20531240e-01 +8.40334861e-01 +8.59070481e-01 +8.76715308e-01 +8.93247968e-01 +9.08648516e-01 +9.22898458e-01 +9.35980780e-01 +9.47879968e-01 +9.58582014e-01 +9.68074434e-01 +9.76346288e-01 +9.83388185e-01 +9.89192292e-01 +9.93752340e-01 +9.97063632e-01 +9.99123045e-01 +9.99929028e-01 +9.99481604e-01 +9.97782367e-01 +9.94834475e-01 +9.90642642e-01 +9.85213135e-01 +9.78553757e-01 +9.70673837e-01 +9.61584213e-01 +9.51297224e-01 +9.39826678e-01 +9.27187843e-01 +9.13397418e-01 +8.98473523e-01 +8.82435652e-01 +8.65304662e-01 +8.47102740e-01 +8.27853379e-01 +8.07581335e-01 +7.86312596e-01 +7.64074355e-01 +7.40894975e-01 +7.16803942e-01 +6.91831825e-01 +6.66010246e-01 +6.39371843e-01 +6.11950214e-01 +5.83779872e-01 +5.54896212e-01 +5.25335470e-01 +4.95134663e-01 +4.64331543e-01 +4.32964550e-01 +4.01072779e-01 +3.68695916e-01 +3.35874183e-01 +3.02648293e-01 +2.69059407e-01 +2.35149082e-01 +2.00959206e-01 +1.66531950e-01 +1.31909720e-01 +9.71351175e-02 +6.22508645e-02 +2.72997551e-02 +-7.67539238e-03 +-4.26317792e-02 +-7.75266845e-02 +-1.12317530e-01 +-1.46961922e-01 +-1.81417699e-01 +-2.15642976e-01 +-2.49596215e-01 +-2.83236267e-01 +-3.16522421e-01 +-3.49414441e-01 +-3.81872624e-01 +-4.13857856e-01 +-4.45331650e-01 +-4.76256190e-01 +-5.06594368e-01 +-5.36309842e-01 +-5.65367080e-01 +-5.93731393e-01 +-6.21368972e-01 +-6.48246930e-01 +-6.74333351e-01 +-6.99597317e-01 +-7.24008947e-01 +-7.47539421e-01 +-7.70161024e-01 +-7.91847180e-01 +-8.12572475e-01 +-8.32312685e-01 +-8.51044802e-01 +-8.68747065e-01 +-8.85398983e-01 +-9.00981358e-01 +-9.15476297e-01 +-9.28867238e-01 +-9.41138970e-01 +-9.52277646e-01 +-9.62270796e-01 +-9.71107338e-01 +-9.78777592e-01 +-9.85273288e-01 +-9.90587575e-01 +-9.94715023e-01 +-9.97651627e-01 +-9.99394814e-01 +-9.99943440e-01 +-9.99297786e-01 +-9.97459561e-01 +-9.94431894e-01 +-9.90219328e-01 +-9.84827811e-01 +-9.78264689e-01 +-9.70538692e-01 +-9.61659922e-01 +-9.51639841e-01 +-9.40491251e-01 +-9.28228277e-01 +-9.14866350e-01 +-9.00422184e-01 +-8.84913759e-01 +-8.68360289e-01 +-8.50782202e-01 +-8.32201113e-01 +-8.12639794e-01 +-7.92122155e-01 +-7.70673199e-01 +-7.48318999e-01 +-7.25086662e-01 +-7.01004295e-01 +-6.76100979e-01 +-6.50406722e-01 +-6.23952424e-01 +-5.96769841e-01 +-5.68891542e-01 +-5.40350879e-01 +-5.11181941e-01 +-4.81419510e-01 +-4.51099015e-01 +-4.20256498e-01 +-3.88928568e-01 +-3.57152361e-01 +-3.24965489e-01 +-2.92405992e-01 +-2.59512299e-01 +-2.26323181e-01 +-1.92877708e-01 +-1.59215203e-01 +-1.25375186e-01 +-9.13973351e-02 +-5.73214359e-02 +-2.31873399e-02 +1.09650810e-02 +4.50959843e-02 +7.91656080e-02 +1.13134312e-01 +1.46962625e-01 +1.80611288e-01 +2.14041297e-01 +2.47213953e-01 +2.80090910e-01 +3.12634214e-01 +3.44806344e-01 +3.76570260e-01 +4.07889436e-01 +4.38727911e-01 +4.69050329e-01 +4.98821977e-01 +5.28008822e-01 +5.56577551e-01 +5.84495602e-01 +6.11731213e-01 +6.38253447e-01 +6.64032233e-01 +6.89038394e-01 +7.13243681e-01 +7.36620801e-01 +7.59143450e-01 +7.80786345e-01 +8.01525245e-01 +8.21336981e-01 +8.40199476e-01 +8.58091773e-01 +8.74994055e-01 +8.90887667e-01 +9.05755136e-01 +9.19580186e-01 +9.32347758e-01 +9.44044021e-01 +9.54656389e-01 +9.64173532e-01 +9.72585389e-01 +9.79883172e-01 +9.86059381e-01 +9.91107804e-01 +9.95023523e-01 +9.97802921e-01 +9.99443680e-01 +9.99944785e-01 +9.99306517e-01 +9.97530457e-01 +9.94619479e-01 +9.90577742e-01 +9.85410689e-01 +9.79125032e-01 +9.71728748e-01 +9.63231062e-01 +9.53642440e-01 +9.42974570e-01 +9.31240352e-01 +9.18453877e-01 +9.04630408e-01 +8.89786365e-01 +8.73939303e-01 +8.57107886e-01 +8.39311871e-01 +8.20572080e-01 +8.00910374e-01 +7.80349628e-01 +7.58913702e-01 +7.36627412e-01 +7.13516503e-01 +6.89607618e-01 +6.64928264e-01 +6.39506785e-01 +6.13372320e-01 +5.86554774e-01 +5.59084785e-01 +5.30993683e-01 +5.02313458e-01 +4.73076722e-01 +4.43316674e-01 +4.13067055e-01 +3.82362113e-01 +3.51236564e-01 +3.19725553e-01 +2.87864612e-01 +2.55689621e-01 +2.23236768e-01 +1.90542509e-01 +1.57643521e-01 +1.24576667e-01 +9.13789489e-02 +5.80874722e-02 +2.47394002e-02 +-8.62808580e-03 +-4.19778263e-02 +-7.52727277e-02 +-1.08475804e-01 +-1.41550215e-01 +-1.74459311e-01 +-2.07166668e-01 +-2.39636131e-01 +-2.71831854e-01 +-3.03718335e-01 +-3.35260458e-01 +-3.66423534e-01 +-3.97173335e-01 +-4.27476130e-01 +-4.57298727e-01 +-4.86608503e-01 +-5.15373440e-01 +-5.43562163e-01 +-5.71143969e-01 +-5.98088860e-01 +-6.24367582e-01 +-6.49951648e-01 +-6.74813371e-01 +-6.98925894e-01 +-7.22263215e-01 +-7.44800218e-01 +-7.66512697e-01 +-7.87377380e-01 +-8.07371956e-01 +-8.26475097e-01 +-8.44666478e-01 +-8.61926800e-01 +-8.78237806e-01 +-8.93582304e-01 +-9.07944180e-01 +-9.21308415e-01 +-9.33661100e-01 +-9.44989449e-01 +-9.55281814e-01 +-9.64527690e-01 +-9.72717729e-01 +-9.79843747e-01 +-9.85898732e-01 +-9.90876846e-01 +-9.94773434e-01 +-9.97585026e-01 +-9.99309335e-01 +-9.99945263e-01 +-9.99492898e-01 +-9.97953509e-01 +-9.95329548e-01 +-9.91624641e-01 +-9.86843584e-01 +-9.80992335e-01 +-9.74078009e-01 +-9.66108862e-01 +-9.57094285e-01 +-9.47044792e-01 +-9.35972003e-01 +-9.23888634e-01 +-9.10808478e-01 +-8.96746390e-01 +-8.81718268e-01 +-8.65741038e-01 +-8.48832627e-01 +-8.31011948e-01 +-8.12298876e-01 +-7.92714225e-01 +-7.72279724e-01 +-7.51017991e-01 +-7.28952508e-01 +-7.06107596e-01 +-6.82508384e-01 +-6.58180783e-01 +-6.33151458e-01 +-6.07447794e-01 +-5.81097870e-01 +-5.54130425e-01 +-5.26574827e-01 +-4.98461039e-01 +-4.69819588e-01 +-4.40681530e-01 +-4.11078418e-01 +-3.81042263e-01 +-3.50605503e-01 +-3.19800966e-01 +-2.88661836e-01 +-2.57221613e-01 +-2.25514083e-01 +-1.93573274e-01 +-1.61433426e-01 +-1.29128950e-01 +-9.66943919e-02 +-6.41643962e-02 +-3.15736686e-02 +1.04306141e-03 +3.36510768e-02 +6.62157104e-02 +9.87023817e-02 +1.31076633e-01 +1.63304166e-01 +1.95350879e-01 +2.27182900e-01 +2.58766625e-01 +2.90068753e-01 +3.21056317e-01 +3.51696726e-01 +3.81957791e-01 +4.11807762e-01 +4.41215361e-01 +4.70149815e-01 +4.98580884e-01 +5.26478896e-01 +5.53814777e-01 +5.80560077e-01 +6.06687004e-01 +6.32168448e-01 +6.56978012e-01 +6.81090036e-01 +7.04479623e-01 +7.27122667e-01 +7.48995873e-01 +7.70076783e-01 +7.90343797e-01 +8.09776194e-01 +8.28354154e-01 +8.46058776e-01 +8.62872094e-01 +8.78777101e-01 +8.93757759e-01 +9.07799016e-01 +9.20886821e-01 +9.33008137e-01 +9.44150952e-01 +9.54304293e-01 +9.63458229e-01 +9.71603889e-01 +9.78733461e-01 +9.84840203e-01 +9.89918449e-01 +9.93963609e-01 +9.96972178e-01 +9.98941731e-01 +9.99870930e-01 +9.99759519e-01 +9.98608327e-01 +9.96419262e-01 +9.93195306e-01 +9.88940516e-01 +9.83660013e-01 +9.77359977e-01 +9.70047636e-01 +9.61731264e-01 +9.52420161e-01 +9.42124651e-01 +9.30856062e-01 +9.18626719e-01 +9.05449926e-01 +8.91339950e-01 +8.76312008e-01 +8.60382246e-01 +8.43567727e-01 +8.25886403e-01 +8.07357102e-01 +7.87999506e-01 +7.67834126e-01 +7.46882286e-01 +7.25166091e-01 +7.02708410e-01 +6.79532851e-01 +6.55663730e-01 +6.31126051e-01 +6.05945475e-01 +5.80148296e-01 +5.53761411e-01 +5.26812290e-01 +4.99328952e-01 +4.71339928e-01 +4.42874239e-01 +4.13961360e-01 +3.84631189e-01 +3.54914020e-01 +3.24840509e-01 +2.94441639e-01 +2.63748694e-01 +2.32793222e-01 +2.01607002e-01 +1.70222017e-01 +1.38670414e-01 +1.06984473e-01 +7.51965784e-02 +4.33391793e-02 +1.14447606e-02 +-2.04541915e-02 +-5.23252226e-02 +-8.41359428e-02 +-1.15854059e-01 +-1.47447410e-01 +-1.78883995e-01 +-2.10132008e-01 +-2.41159872e-01 +-2.71936266e-01 +-3.02430160e-01 +-3.32610843e-01 +-3.62447958e-01 +-3.91911528e-01 +-4.20971986e-01 +-4.49600208e-01 +-4.77767538e-01 +-5.05445818e-01 +-5.32607413e-01 +-5.59225244e-01 +-5.85272808e-01 +-6.10724208e-01 +-6.35554175e-01 +-6.59738097e-01 +-6.83252036e-01 +-7.06072760e-01 +-7.28177756e-01 +-7.49545259e-01 +-7.70154268e-01 +-7.89984568e-01 +-8.09016749e-01 +-8.27232224e-01 +-8.44613245e-01 +-8.61142922e-01 +-8.76805239e-01 +-8.91585063e-01 +-9.05468166e-01 +-9.18441233e-01 +-9.30491872e-01 +-9.41608632e-01 +-9.51781006e-01 +-9.60999443e-01 +-9.69255357e-01 +-9.76541132e-01 +-9.82850130e-01 +-9.88176694e-01 +-9.92516155e-01 +-9.95864833e-01 +-9.98220039e-01 +-9.99580077e-01 +-9.99944244e-01 +-9.99312831e-01 +-9.97687116e-01 +-9.95069369e-01 +-9.91462839e-01 +-9.86871759e-01 +-9.81301330e-01 +-9.74757726e-01 +-9.67248075e-01 +-9.58780457e-01 +-9.49363896e-01 +-9.39008343e-01 +-9.27724671e-01 +-9.15524660e-01 +-9.02420982e-01 +-8.88427193e-01 +-8.73557712e-01 +-8.57827811e-01 +-8.41253591e-01 +-8.23851975e-01 +-8.05640680e-01 +-7.86638207e-01 +-7.66863815e-01 +-7.46337503e-01 +-7.25079991e-01 +-7.03112696e-01 +-6.80457712e-01 +-6.57137785e-01 +-6.33176292e-01 +-6.08597214e-01 +-5.83425114e-01 +-5.57685112e-01 +-5.31402859e-01 +-5.04604509e-01 +-4.77316696e-01 +-4.49566506e-01 +-4.21381446e-01 +-3.92789424e-01 +-3.63818714e-01 +-3.34497931e-01 +-3.04856003e-01 +-2.74922140e-01 +-2.44725805e-01 +-2.14296690e-01 +-1.83664680e-01 +-1.52859825e-01 +-1.21912314e-01 +-9.08524416e-02 +-5.97105805e-02 +-2.85171502e-02 +2.69741184e-03 +3.39026802e-02 +6.50682707e-02 +9.61638706e-02 +1.27159267e-01 +1.58024378e-01 +1.88729278e-01 +2.19244232e-01 +2.49539719e-01 +2.79586463e-01 +3.09355460e-01 +3.38818009e-01 +3.67945733e-01 +3.96710612e-01 +4.25085007e-01 +4.53041686e-01 +4.80553851e-01 +5.07595161e-01 +5.34139761e-01 +5.60162301e-01 +5.85637963e-01 +6.10542486e-01 +6.34852184e-01 +6.58543969e-01 +6.81595376e-01 +7.03984581e-01 +7.25690420e-01 +7.46692411e-01 +7.66970771e-01 +7.86506436e-01 +8.05281074e-01 +8.23277107e-01 +8.40477723e-01 +8.56866893e-01 +8.72429383e-01 +8.87150771e-01 +9.01017456e-01 +9.14016672e-01 +9.26136499e-01 +9.37365870e-01 +9.47694587e-01 +9.57113323e-01 +9.65613632e-01 +9.73187956e-01 +9.79829632e-01 +9.85532895e-01 +9.90292883e-01 +9.94105641e-01 +9.96968122e-01 +9.98878190e-01 +9.99834620e-01 +9.99837098e-01 +9.98886220e-01 +9.96983490e-01 +9.94131317e-01 +9.90333012e-01 +9.85592783e-01 +9.79915730e-01 +9.73307838e-01 +9.65775973e-01 +9.57327869e-01 +9.47972123e-01 +9.37718187e-01 +9.26576353e-01 +9.14557747e-01 +9.01674313e-01 +8.87938804e-01 +8.73364766e-01 +8.57966525e-01 +8.41759173e-01 +8.24758553e-01 +8.06981240e-01 +7.88444528e-01 +7.69166411e-01 +7.49165563e-01 +7.28461322e-01 +7.07073671e-01 +6.85023216e-01 +6.62331168e-01 +6.39019320e-01 +6.15110027e-01 +5.90626185e-01 +5.65591204e-01 +5.40028993e-01 +5.13963929e-01 +4.87420839e-01 +4.60424972e-01 +4.33001978e-01 +4.05177881e-01 +3.76979056e-01 +3.48432201e-01 +3.19564313e-01 +2.90402664e-01 +2.60974772e-01 +2.31308377e-01 +2.01431414e-01 +1.71371984e-01 +1.41158334e-01 +1.10818823e-01 +8.03819001e-02 +4.98760764e-02 +1.93298976e-02 +-1.12280818e-02 +-4.17693258e-02 +-7.22653428e-02 +-1.02687713e-01 +-1.33008113e-01 +-1.63198346e-01 +-1.93230362e-01 +-2.23076290e-01 +-2.52708459e-01 +-2.82099425e-01 +-3.11221998e-01 +-3.40049263e-01 +-3.68554608e-01 +-3.96711749e-01 +-4.24494748e-01 +-4.51878045e-01 +-4.78836474e-01 +-5.05345289e-01 +-5.31380188e-01 +-5.56917331e-01 +-5.81933363e-01 +-6.06405437e-01 +-6.30311231e-01 +-6.53628971e-01 +-6.76337447e-01 +-6.98416037e-01 +-7.19844719e-01 +-7.40604093e-01 +-7.60675397e-01 +-7.80040522e-01 +-7.98682029e-01 +-8.16583165e-01 +-8.33727876e-01 +-8.50100821e-01 +-8.65687385e-01 +-8.80473694e-01 +-8.94446621e-01 +-9.07593803e-01 +-9.19903649e-01 +-9.31365349e-01 +-9.41968882e-01 +-9.51705028e-01 +-9.60565370e-01 +-9.68542305e-01 +-9.75629048e-01 +-9.81819637e-01 +-9.87108936e-01 +-9.91492643e-01 +-9.94967287e-01 +-9.97530235e-01 +-9.99179690e-01 +-9.99914692e-01 +-9.99735118e-01 +-9.98641685e-01 +-9.96635938e-01 +-9.93720260e-01 +-9.89897858e-01 +-9.85172766e-01 +-9.79549835e-01 +-9.73034732e-01 +-9.65633931e-01 +-9.57354706e-01 +-9.48205126e-01 +-9.38194041e-01 +-9.27331079e-01 +-9.15626632e-01 +-9.03091848e-01 +-8.89738618e-01 +-8.75579565e-01 +-8.60628030e-01 +-8.44898063e-01 +-8.28404404e-01 +-8.11162473e-01 +-7.93188351e-01 +-7.74498770e-01 +-7.55111090e-01 +-7.35043290e-01 +-7.14313945e-01 +-6.92942209e-01 +-6.70947801e-01 +-6.48350981e-01 +-6.25172534e-01 +-6.01433751e-01 +-5.77156408e-01 +-5.52362744e-01 +-5.27075444e-01 +-5.01317615e-01 +-4.75112766e-01 +-4.48484786e-01 +-4.21457922e-01 +-3.94056753e-01 +-3.66306176e-01 +-3.38231373e-01 +-3.09857797e-01 +-2.81211140e-01 +-2.52317319e-01 +-2.23202444e-01 +-1.93892800e-01 +-1.64414820e-01 +-1.34795063e-01 +-1.05060190e-01 +-7.52369363e-02 +-4.53520911e-02 +-1.54324728e-02 +1.44950956e-02 +4.44038101e-02 +7.42669104e-02 +1.04057703e-01 +1.33749584e-01 +1.63316065e-01 +1.92730796e-01 +2.21967586e-01 +2.51000433e-01 +2.79803540e-01 +3.08351339e-01 +3.36618517e-01 +3.64580036e-01 +3.92211153e-01 +4.19487444e-01 +4.46384826e-01 +4.72879574e-01 +4.98948348e-01 +5.24568208e-01 +5.49716636e-01 +5.74371554e-01 +5.98511345e-01 +6.22114872e-01 +6.45161491e-01 +6.67631075e-01 +6.89504027e-01 +7.10761299e-01 +7.31384406e-01 +7.51355445e-01 +7.70657107e-01 +7.89272692e-01 +8.07186125e-01 +8.24381966e-01 +8.40845424e-01 +8.56562373e-01 +8.71519355e-01 +8.85703601e-01 +8.99103036e-01 +9.11706289e-01 +9.23502700e-01 +9.34482335e-01 +9.44635988e-01 +9.53955189e-01 +9.62432211e-01 +9.70060077e-01 +9.76832565e-01 +9.82744210e-01 +9.87790311e-01 +9.91966931e-01 +9.95270902e-01 +9.97699826e-01 +9.99252075e-01 +9.99926793e-01 +9.99723893e-01 +9.98644061e-01 +9.96688749e-01 +9.93860175e-01 +9.90161322e-01 +9.85595930e-01 +9.80168495e-01 +9.73884264e-01 +9.66749227e-01 +9.58770114e-01 +9.49954386e-01 +9.40310226e-01 +9.29846536e-01 +9.18572922e-01 +9.06499690e-01 +8.93637831e-01 +8.79999017e-01 +8.65595585e-01 +8.50440526e-01 +8.34547473e-01 +8.17930689e-01 +8.00605054e-01 +7.82586050e-01 +7.63889746e-01 +7.44532787e-01 +7.24532377e-01 +7.03906261e-01 +6.82672710e-01 +6.60850507e-01 +6.38458926e-01 +6.15517716e-01 +5.92047085e-01 +5.68067682e-01 +5.43600577e-01 +5.18667242e-01 +4.93289532e-01 +4.67489666e-01 +4.41290206e-01 +4.14714039e-01 +3.87784355e-01 +3.60524630e-01 +3.32958604e-01 +3.05110256e-01 +2.77003787e-01 +2.48663598e-01 +2.20114266e-01 +1.91380527e-01 +1.62487254e-01 +1.33459432e-01 +1.04322141e-01 +7.51005315e-02 +4.58197989e-02 +1.65051676e-02 +-1.28181330e-02 +-4.21248899e-02 +-7.13899274e-02 +-1.00588127e-01 +-1.29694453e-01 +-1.58683972e-01 +-1.87531878e-01 +-2.16213505e-01 +-2.44704357e-01 +-2.72980121e-01 +-3.01016692e-01 +-3.28790191e-01 +-3.56276987e-01 +-3.83453719e-01 +-4.10297314e-01 +-4.36785003e-01 +-4.62894345e-01 +-4.88603239e-01 +-5.13889947e-01 +-5.38733115e-01 +-5.63111788e-01 +-5.87005425e-01 +-6.10393919e-01 +-6.33257613e-01 +-6.55577314e-01 +-6.77334309e-01 +-6.98510383e-01 +-7.19087835e-01 +-7.39049488e-01 +-7.58378706e-01 +-7.77059406e-01 +-7.95076071e-01 +-8.12413758e-01 +-8.29058122e-01 +-8.44995416e-01 +-8.60212508e-01 +-8.74696889e-01 +-8.88436683e-01 +-9.01420655e-01 +-9.13638221e-01 +-9.21600117e-01 +-9.06598683e-01 +-8.84977766e-01 +-8.60491908e-01 +-8.33400490e-01 +-8.03964080e-01 +-7.72439460e-01 +-7.39075357e-01 +-7.04108996e-01 +-6.67763293e-01 +-6.30244788e-01 +-5.91742253e-01 +-5.52425847e-01 +-5.12446805e-01 +-4.71937572e-01 +-4.31012290e-01 +-3.89767573e-01 +-3.48283469e-01 +-3.06624530e-01 +-2.64840806e-01 +-2.22968419e-01 +-1.81028725e-01 +-1.39022002e-01 +-9.68916163e-02 +-5.41204844e-02 +-2.70602422e-02 +0.00000000e+00 +-0.00000000e+00 +1.24470142e-05 +2.63184500e-05 +3.97295213e-05 +5.30856936e-05 +6.64250519e-05 +7.97569147e-05 +9.30847457e-05 +1.06410146e-04 +1.19733962e-04 +1.33056687e-04 +1.46378628e-04 +1.59699985e-04 +1.73020895e-04 +1.86341457e-04 +1.99661741e-04 +2.12981800e-04 +2.26301674e-04 +2.39621394e-04 +2.52940985e-04 +2.66260466e-04 +2.79579853e-04 +2.92899159e-04 +3.06218395e-04 +3.16759589e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17595019e-04 +3.17584985e-04 +3.10422511e-04 +2.97103293e-04 +2.83784010e-04 +2.70464650e-04 +2.57145200e-04 +2.43825645e-04 +2.30505968e-04 +2.17186146e-04 +2.03866150e-04 +1.90545942e-04 +1.77225474e-04 +1.63904683e-04 +1.50583479e-04 +1.37261741e-04 +1.23939291e-04 +1.10615861e-04 +9.72910306e-05 +8.39640919e-05 +7.06337512e-05 +5.72973432e-05 +4.39482617e-05 +3.05637079e-05 +1.69694118e-05 +8.48470589e-06 +-0.00000000e+00 +-0.00000000e+00 +-3.75894696e-02 +-5.41560073e-02 +-2.95835980e-02 +8.70411943e-03 +5.00911446e-02 +8.73083514e-02 +1.15036766e-01 +1.30269729e-01 +1.32053160e-01 +1.20990646e-01 +9.87467118e-02 +6.76333901e-02 +3.02898900e-02 +-1.05583227e-02 +-5.22773787e-02 +-9.24531424e-02 +-1.28979264e-01 +-1.60113819e-01 +-1.84508910e-01 +-2.01219804e-01 +-2.09696810e-01 +-2.09763641e-01 +-2.01585619e-01 +-1.85630373e-01 +-1.62623319e-01 +-1.33500301e-01 +-9.93589388e-02 +-6.14104577e-02 +-2.09331343e-02 +2.07714714e-02 +6.24187235e-02 +1.02776896e-01 +1.40698472e-01 +1.75146527e-01 +2.05215986e-01 +2.30149830e-01 +2.49350314e-01 +2.62385426e-01 +2.68990985e-01 +2.69068324e-01 +2.62678554e-01 +2.50033875e-01 +2.31485030e-01 +2.07507710e-01 +1.78686246e-01 +1.45696380e-01 +1.09286934e-01 +7.02611030e-02 +2.94576468e-02 +-1.22676087e-02 +-5.40596119e-02 +-9.50809915e-02 +-1.34527761e-01 +-1.71643601e-01 +-2.05732566e-01 +-2.36170062e-01 +-2.62411987e-01 +-2.84002057e-01 +-3.00577154e-01 +-3.11870911e-01 +-3.17715324e-01 +-3.18040743e-01 +-3.12874101e-01 +-3.02335615e-01 +-2.86634098e-01 +-2.66060979e-01 +-2.40983210e-01 +-2.11835222e-01 +-1.79110219e-01 +-1.43350654e-01 +-1.05138483e-01 +-6.50851022e-02 +-2.38211104e-02 +1.80136981e-02 +5.97803026e-02 +1.00849969e-01 +1.40613336e-01 +1.78488910e-01 +2.13930854e-01 +2.46436109e-01 +2.75550517e-01 +3.00874285e-01 +3.22066287e-01 +3.38847639e-01 +3.51004124e-01 +3.58387871e-01 +3.60917821e-01 +3.58579610e-01 +3.51424287e-01 +3.39566323e-01 +3.23180918e-01 +3.02500479e-01 +2.77810470e-01 +2.49444762e-01 +2.17780462e-01 +1.83232319e-01 +1.46246805e-01 +1.07295983e-01 +6.68711827e-02 +2.54766276e-02 +-1.63769532e-02 +-5.81786332e-02 +-9.94234227e-02 +-1.39618246e-01 +-1.78287538e-01 +-2.14978579e-01 +-2.49266463e-01 +-2.80758507e-01 +-3.09098300e-01 +-3.33969201e-01 +-3.55097333e-01 +-3.72254011e-01 +-3.85257608e-01 +-3.93974752e-01 +-3.98321236e-01 +-3.98262138e-01 +-3.93811339e-01 +-3.85030774e-01 +-3.72029074e-01 +-3.54959465e-01 +-3.34017806e-01 +-3.09439576e-01 +-2.81496989e-01 +-2.50495535e-01 +-2.16770269e-01 +-1.80681983e-01 +-1.42613005e-01 +-1.02963025e-01 +-6.21447308e-02 +-2.05793883e-02 +2.13074978e-02 +6.30905927e-02 +1.04348973e-01 +1.44670310e-01 +1.83654789e-01 +2.20919008e-01 +2.56099479e-01 +2.88855895e-01 +3.18874232e-01 +3.45869477e-01 +3.69587935e-01 +3.89809263e-01 +4.06348296e-01 +4.19056316e-01 +4.27821951e-01 +4.32571840e-01 +4.33270894e-01 +4.29922087e-01 +4.22566030e-01 +4.11280202e-01 +3.96177735e-01 +3.77405983e-01 +3.55144809e-01 +3.29604567e-01 +3.01023877e-01 +2.69667134e-01 +2.35821879e-01 +1.99795962e-01 +1.61914601e-01 +1.22517307e-01 +8.19547487e-02 +4.05855556e-02 +-1.22689239e-03 +-4.31176730e-02 +-8.47234958e-02 +-1.25685814e-01 +-1.65653855e-01 +-2.04287531e-01 +-2.41260222e-01 +-2.76261404e-01 +-3.08999101e-01 +-3.39202169e-01 +-3.66622370e-01 +-3.91036174e-01 +-4.12246366e-01 +-4.30083417e-01 +-4.44406678e-01 +-4.55105238e-01 +-4.62098443e-01 +-4.65336272e-01 +-4.64799611e-01 +-4.60500042e-01 +-4.52479260e-01 +-4.40808664e-01 +-4.25588631e-01 +-4.06947078e-01 +-3.85038355e-01 +-3.60042093e-01 +-3.32161009e-01 +-3.01619434e-01 +-2.68661467e-01 +-2.33548453e-01 +-1.96557349e-01 +-1.57978033e-01 +-1.18111090e-01 +-7.72655131e-02 +-3.57560444e-02 +6.09905073e-03 +4.79805945e-02 +8.95708455e-02 +1.30555886e-01 +1.70628002e-01 +2.09487853e-01 +2.46846744e-01 +2.82428549e-01 +3.15971849e-01 +3.47231449e-01 +3.75980488e-01 +4.02011341e-01 +4.25137777e-01 +4.45195210e-01 +4.62042680e-01 +4.75562879e-01 +4.85663241e-01 +4.92276512e-01 +4.95360404e-01 +4.94898622e-01 +4.90899956e-01 +4.83398333e-01 +4.72452727e-01 +4.58145815e-01 +4.40583759e-01 +4.19895326e-01 +3.96230283e-01 +3.69758665e-01 +3.40669438e-01 +3.09168678e-01 +2.75478278e-01 +2.39834384e-01 +2.02485449e-01 +1.63690475e-01 +1.23717284e-01 +8.28405618e-02 +4.13398945e-02 +-5.02122253e-04 +-4.24017956e-02 +-8.40762839e-02 +-1.25245500e-01 +-1.65633941e-01 +-2.04972501e-01 +-2.43000209e-01 +-2.79465990e-01 +-3.14130138e-01 +-3.46765884e-01 +-3.77160773e-01 +-4.05117975e-01 +-4.30457480e-01 +-4.53017158e-01 +-4.72653669e-01 +-4.89243264e-01 +-5.02682454e-01 +-5.12888555e-01 +-5.19800079e-01 +-5.23376984e-01 +-5.23600779e-01 +-5.20474510e-01 +-5.14022591e-01 +-5.04290501e-01 +-4.91344361e-01 +-4.75270374e-01 +-4.56174159e-01 +-4.34179953e-01 +-4.09429713e-01 +-3.82082112e-01 +-3.52311438e-01 +-3.20306408e-01 +-2.86268908e-01 +-2.50412650e-01 +-2.12961783e-01 +-1.74149441e-01 +-1.34216253e-01 +-9.34088200e-02 +-5.19781704e-02 +-1.01781988e-02 +3.17358982e-02 +7.35091781e-02 +1.14888497e-01 +1.55624025e-01 +1.95470737e-01 +2.34189853e-01 +2.71550234e-01 +3.07329717e-01 +3.41316405e-01 +3.73309829e-01 +4.03122097e-01 +4.30578949e-01 +4.55520662e-01 +4.77802924e-01 +4.97297598e-01 +5.13893390e-01 +5.27496417e-01 +5.38030585e-01 +5.45438013e-01 +5.49679179e-01 +5.50733094e-01 +5.48597272e-01 +5.43287733e-01 +5.34838785e-01 +5.23302636e-01 +5.08749014e-01 +4.91264680e-01 +4.70952847e-01 +4.47932604e-01 +4.22338020e-01 +3.94317269e-01 +3.64031741e-01 +3.31655124e-01 +2.97372416e-01 +2.61378654e-01 +2.23877788e-01 +1.85081548e-01 +1.45208303e-01 +1.04481672e-01 +6.31292447e-02 +2.13813784e-02 +-2.05300884e-02 +-6.23732104e-02 +-1.03917148e-01 +-1.44933406e-01 +-1.85197207e-01 +-2.24488580e-01 +-2.62593467e-01 +-2.99305108e-01 +-3.34425014e-01 +-3.67763755e-01 +-3.99142295e-01 +-4.28392947e-01 +-4.55359686e-01 +-4.79899413e-01 +-5.01882846e-01 +-5.21194311e-01 +-5.37733028e-01 +-5.51413680e-01 +-5.62165806e-01 +-5.69935231e-01 +-5.74683884e-01 +-5.76389196e-01 +-5.75045542e-01 +-5.70663050e-01 +-5.63267538e-01 +-5.52901411e-01 +-5.39621635e-01 +-5.23500876e-01 +-5.04626394e-01 +-4.83099041e-01 +-4.59034084e-01 +-4.32558732e-01 +-4.03812956e-01 +-3.72947863e-01 +-3.40124880e-01 +-3.05515571e-01 +-2.69299533e-01 +-2.31664779e-01 +-1.92805478e-01 +-1.52921933e-01 +-1.12218849e-01 +-7.09046404e-02 +-2.91902196e-02 +1.27120897e-02 +5.45895963e-02 +9.62303057e-02 +1.37424120e-01 +1.77963589e-01 +2.17645436e-01 +2.56270854e-01 +2.93647397e-01 +3.29588796e-01 +3.63917166e-01 +3.96462374e-01 +4.27064486e-01 +4.55572750e-01 +4.81848153e-01 +5.05762174e-01 +5.27199201e-01 +5.46055369e-01 +5.62240408e-01 +5.75677061e-01 +5.86301800e-01 +5.94065366e-01 +5.98931900e-01 +6.00880845e-01 +5.99904591e-01 +5.96011168e-01 +5.89221470e-01 +5.79571299e-01 +5.67109783e-01 +5.51899292e-01 +5.34016050e-01 +5.13547815e-01 +4.90595689e-01 +4.65271562e-01 +4.37698691e-01 +4.08011046e-01 +3.76351639e-01 +3.42873293e-01 +3.07736519e-01 +2.71109416e-01 +2.33167004e-01 +1.94089588e-01 +1.54062765e-01 +1.13276007e-01 +7.19217746e-02 +3.01949021e-02 +-1.17086670e-02 +-5.35925845e-02 +-9.52611279e-02 +-1.36520043e-01 +-1.77177401e-01 +-2.17044759e-01 +-2.55937573e-01 +-2.93676289e-01 +-3.30087435e-01 +-3.65003733e-01 +-3.98265240e-01 +-4.29720424e-01 +-4.59226006e-01 +-4.86647946e-01 +-5.11862575e-01 +-5.34756278e-01 +-5.55226091e-01 +-5.73180789e-01 +-5.88540826e-01 +-6.01238171e-01 +-6.11217257e-01 +-6.18435390e-01 +-6.22861953e-01 +-6.24478945e-01 +-6.23281446e-01 +-6.19277282e-01 +-6.12486421e-01 +-6.02941404e-01 +-5.90687393e-01 +-5.75781404e-01 +-5.58291890e-01 +-5.38298796e-01 +-5.15893293e-01 +-4.91176922e-01 +-4.64261042e-01 +-4.35266600e-01 +-4.04323630e-01 +-3.71570448e-01 +-3.37152848e-01 +-3.01223684e-01 +-2.63942174e-01 +-2.25473181e-01 +-1.85986270e-01 +-1.45655074e-01 +-1.04656566e-01 +-6.31702590e-02 +-2.13773711e-02 +2.05399918e-02 +6.23995691e-02 +1.04019739e-01 +1.45220331e-01 +1.85823427e-01 +2.25654077e-01 +2.64541016e-01 +3.02317420e-01 +3.38821613e-01 +3.73897781e-01 +4.07396608e-01 +4.39175787e-01 +4.69100666e-01 +4.97044806e-01 +5.22890488e-01 +5.46529232e-01 +5.67862210e-01 +5.86800516e-01 +6.03265589e-01 +6.17189485e-01 +6.28515167e-01 +6.37196694e-01 +6.43199363e-01 +6.46499873e-01 +6.47086289e-01 +6.44958049e-01 +6.40125977e-01 +6.32612195e-01 +6.22449985e-01 +6.09683611e-01 +5.94368094e-01 +5.76568964e-01 +5.56361933e-01 +5.33832524e-01 +5.09075692e-01 +4.82195416e-01 +4.53304232e-01 +4.22522743e-01 +3.89979091e-01 +3.55808405e-01 +3.20152217e-01 +2.83157866e-01 +2.44977870e-01 +2.05769287e-01 +1.65693051e-01 +1.24913310e-01 +8.35967396e-02 +4.19118636e-02 +2.83603840e-05 +-4.18836291e-02 +-8.36541927e-02 +-1.25114333e-01 +-1.66096650e-01 +-2.06436008e-01 +-2.45970194e-01 +-2.84540562e-01 +-3.21992661e-01 +-3.58176836e-01 +-3.92948814e-01 +-4.26170265e-01 +-4.57709337e-01 +-4.87441155e-01 +-5.15248297e-01 +-5.41021246e-01 +-5.64658797e-01 +-5.86068404e-01 +-6.05166583e-01 +-6.21879127e-01 +-6.36141449e-01 +-6.47898771e-01 +-6.57106284e-01 +-6.63729334e-01 +-6.67743514e-01 +-6.69134718e-01 +-6.67899168e-01 +-6.64043392e-01 +-6.57584167e-01 +-6.48548421e-01 +-6.36973114e-01 +-6.22905034e-01 +-6.06400570e-01 +-5.87525532e-01 +-5.66354775e-01 +-5.42971960e-01 +-5.17469137e-01 +-4.89946411e-01 +-4.60511505e-01 +-4.29279319e-01 +-3.96371477e-01 +-3.61915828e-01 +-3.26045939e-01 +-2.88900563e-01 +-2.50623088e-01 +-2.11360979e-01 +-1.71265194e-01 +-1.30489604e-01 +-8.91903904e-02 +-4.75254421e-02 +-5.65374831e-03 +3.62652080e-02 +7.80720575e-02 +1.19608148e-01 +1.60716145e-01 +2.01240623e-01 +2.41028643e-01 +2.79930326e-01 +3.17799406e-01 +3.54493773e-01 +3.89876011e-01 +4.23813890e-01 +4.56180834e-01 +4.86856384e-01 +5.15726632e-01 +5.42684630e-01 +5.67630757e-01 +5.90473078e-01 +6.11127650e-01 +6.29518861e-01 +6.45579694e-01 +6.59251862e-01 +6.70486035e-01 +6.79242007e-01 +6.85488805e-01 +6.89204777e-01 +6.90377639e-01 +6.89004587e-01 +6.85092236e-01 +6.78656460e-01 +6.69722381e-01 +6.58324231e-01 +6.44505201e-01 +6.28317275e-01 +6.09821093e-01 +5.89085673e-01 +5.66188000e-01 +5.41212771e-01 +5.14252118e-01 +4.85405216e-01 +4.54777970e-01 +4.22482669e-01 +3.88637348e-01 +3.53365431e-01 +3.16795286e-01 +2.79059746e-01 +2.40295687e-01 +2.00643504e-01 +1.60246466e-01 +1.19250262e-01 +7.78025092e-02 +3.60522149e-02 +-5.85075311e-03 +-4.77562824e-02 +-8.95145068e-02 +-1.30976313e-01 +-1.71993852e-01 +-2.12421169e-01 +-2.52114689e-01 +-2.90933638e-01 +-3.28740536e-01 +-3.65401669e-01 +-4.00787811e-01 +-4.34774428e-01 +-4.67242034e-01 +-4.98076620e-01 +-5.27170188e-01 +-5.54421350e-01 +-5.79735147e-01 +-6.03023469e-01 +-6.24205372e-01 +-6.43207873e-01 +-6.59965673e-01 +-6.74421178e-01 +-6.86524791e-01 +-6.96235582e-01 +-7.03521245e-01 +-7.08357565e-01 +-7.10728723e-01 +-7.10627801e-01 +-7.08056873e-01 +-7.03026078e-01 +-6.95553861e-01 +-6.85667441e-01 +-6.73402737e-01 +-6.58803284e-01 +-6.41920403e-01 +-6.22813697e-01 +-6.01550543e-01 +-5.78205091e-01 +-5.52858411e-01 +-5.25598971e-01 +-4.96521490e-01 +-4.65726363e-01 +-4.33319796e-01 +-3.99413906e-01 +-3.64125291e-01 +-3.27574913e-01 +-2.89888208e-01 +-2.51194359e-01 +-2.11625427e-01 +-1.71316313e-01 +-1.30404526e-01 +-8.90291276e-02 +-4.73305318e-02 +-5.45018461e-03 +3.64701732e-02 +7.82888826e-02 +1.19864753e-01 +1.61057802e-01 +2.01729446e-01 +2.41742895e-01 +2.80964173e-01 +3.19261983e-01 +3.56507986e-01 +3.92578130e-01 +4.27352381e-01 +4.60714642e-01 +4.92554359e-01 +5.22766315e-01 +5.51250034e-01 +5.77911668e-01 +6.02663828e-01 +6.25424548e-01 +6.46119373e-01 +6.64681204e-01 +6.81048838e-01 +6.95169367e-01 +7.06997766e-01 +7.16495224e-01 +7.23631896e-01 +7.28385903e-01 +7.30741797e-01 +7.30693624e-01 +7.28242997e-01 +7.23398165e-01 +7.16177116e-01 +7.06604600e-01 +6.94712310e-01 +6.80541382e-01 +6.64138724e-01 +6.45558628e-01 +6.24863726e-01 +6.02121650e-01 +5.77407696e-01 +5.50803706e-01 +5.22396172e-01 +4.92278970e-01 +4.60550446e-01 +4.27313748e-01 +3.92677962e-01 +3.56755200e-01 +3.19662342e-01 +2.81519947e-01 +2.42451048e-01 +2.02582448e-01 +1.62042632e-01 +1.20962276e-01 +7.94738050e-02 +3.77103990e-02 +-4.19374843e-03 +-4.61043847e-02 +-8.78872877e-02 +-1.29409031e-01 +-1.70536889e-01 +-2.11139962e-01 +-2.51088972e-01 +-2.90256771e-01 +-3.28519495e-01 +-3.65755292e-01 +-4.01846960e-01 +-4.36680098e-01 +-4.70144834e-01 +-5.02136246e-01 +-5.32552906e-01 +-5.61300448e-01 +-5.88287794e-01 +-6.13431314e-01 +-6.36652344e-01 +-6.57878258e-01 +-6.77044075e-01 +-6.94089164e-01 +-7.08962439e-01 +-7.21616822e-01 +-7.32014698e-01 +-7.40124009e-01 +-7.45920304e-01 +-7.49387213e-01 +-7.50513785e-01 +-7.49299090e-01 +-7.45746287e-01 +-7.39869174e-01 +-7.31685671e-01 +-7.21223315e-01 +-7.08515086e-01 +-6.93601508e-01 +-6.76530242e-01 +-6.57354366e-01 +-6.36135293e-01 +-6.12938278e-01 +-5.87837315e-01 +-5.60909337e-01 +-5.32239594e-01 +-5.01916013e-01 +-4.70033750e-01 +-4.36690774e-01 +-4.01990834e-01 +-3.66040716e-01 +-3.28951498e-01 +-2.90837340e-01 +-2.51815386e-01 +-2.12005602e-01 +-1.71529875e-01 +-1.30512360e-01 +-8.90782965e-02 +-4.73543939e-02 +-5.46779601e-03 +3.64538621e-02 +7.82830264e-02 +1.19892735e-01 +1.61156538e-01 +2.01949707e-01 +2.42148408e-01 +2.81631653e-01 +3.20279705e-01 +3.57976764e-01 +3.94608620e-01 +4.30066022e-01 +4.64241656e-01 +4.97034090e-01 +5.28344194e-01 +5.58079495e-01 +5.86150253e-01 +6.12473970e-01 +6.36971401e-01 +6.59570882e-01 +6.80204663e-01 +6.98812614e-01 +7.15339364e-01 +7.29736851e-01 +7.41962831e-01 +7.51981695e-01 +7.59764895e-01 +7.65289539e-01 +7.68541139e-01 +7.69509704e-01 +7.68194874e-01 +7.64599765e-01 +7.58737863e-01 +7.50625576e-01 +7.40289699e-01 +7.27760065e-01 +7.13075982e-01 +6.96280675e-01 +6.77425158e-01 +6.56565721e-01 +6.33764275e-01 +6.09089481e-01 +5.82613520e-01 +5.54416246e-01 +5.24579718e-01 +4.93193405e-01 +4.60348812e-01 +4.26143437e-01 +3.90677520e-01 +3.54055198e-01 +3.16384241e-01 +2.77774399e-01 +2.38339295e-01 +1.98193490e-01 +1.57454612e-01 +1.16241058e-01 +7.46729003e-02 +3.28709624e-02 +-9.04344693e-03 +-5.09487765e-02 +-9.27236112e-02 +-1.34247246e-01 +-1.75399595e-01 +-2.16061945e-01 +-2.56117285e-01 +-2.95449906e-01 +-3.33947369e-01 +-3.71498479e-01 +-4.07996085e-01 +-4.43335524e-01 +-4.77415382e-01 +-5.10139185e-01 +-5.41412524e-01 +-5.71147384e-01 +-5.99258644e-01 +-6.25666384e-01 +-6.50296663e-01 +-6.73078487e-01 +-6.93948925e-01 +-7.12848369e-01 +-7.29723665e-01 +-7.44528560e-01 +-7.57220222e-01 +-7.67764875e-01 +-7.76132638e-01 +-7.82300284e-01 +-7.86252489e-01 +-7.87977283e-01 +-7.87471909e-01 +-7.84738383e-01 +-7.79784445e-01 +-7.72626556e-01 +-7.63284335e-01 +-7.51785544e-01 +-7.38163987e-01 +-7.22457527e-01 +-7.04712572e-01 +-6.84979133e-01 +-6.63312991e-01 +-6.39776969e-01 +-6.14436592e-01 +-5.87364081e-01 +-5.58636375e-01 +-5.28333510e-01 +-4.96541776e-01 +-4.63350293e-01 +-4.28851800e-01 +-3.93143926e-01 +-3.56326077e-01 +-3.18501226e-01 +-2.79775581e-01 +-2.40256649e-01 +-2.00054790e-01 +-1.59282084e-01 +-1.18051593e-01 +-7.64780411e-02 +-3.46767256e-02 +7.23658345e-03 +4.91458214e-02 +9.09351819e-02 +1.32489137e-01 +1.73693234e-01 +2.14433913e-01 +2.54598811e-01 +2.94077922e-01 +3.32762669e-01 +3.70546661e-01 +4.07327005e-01 +4.43002761e-01 +4.77476093e-01 +5.10653714e-01 +5.42444775e-01 +5.72762341e-01 +6.01524942e-01 +6.28654058e-01 +6.54075675e-01 +6.77722053e-01 +6.99528926e-01 +7.19436900e-01 +7.37393490e-01 +7.53350284e-01 +7.67263839e-01 +7.79098024e-01 +7.88821506e-01 +7.96407753e-01 +8.01837640e-01 +8.05097711e-01 +8.06178922e-01 +8.05079403e-01 +8.01803833e-01 +7.96360873e-01 +7.88765843e-01 +7.79041149e-01 +7.67213060e-01 +7.53313706e-01 +7.37382213e-01 +7.19462001e-01 +6.99601250e-01 +6.77854465e-01 +6.54281186e-01 +6.28944531e-01 +6.01912984e-01 +5.73260360e-01 +5.43063404e-01 +5.11403080e-01 +4.78365054e-01 +4.44038093e-01 +4.08513796e-01 +3.71887393e-01 +3.34257312e-01 +2.95723744e-01 +2.56389404e-01 +2.16359436e-01 +1.75740434e-01 +1.34640253e-01 +9.31681575e-02 +5.14343463e-02 +9.54935920e-03 +-3.23758526e-02 +-7.42303241e-02 +-1.15903521e-01 +-1.57285380e-01 +-1.98266656e-01 +-2.38739544e-01 +-2.78597597e-01 +-3.17735847e-01 +-3.56051440e-01 +-3.93444248e-01 +-4.29816190e-01 +-4.65071827e-01 +-4.99119016e-01 +-5.31869372e-01 +-5.63237205e-01 +-5.93140552e-01 +-6.21501782e-01 +-6.48247776e-01 +-6.73308770e-01 +-6.96619601e-01 +-7.18120255e-01 +-7.37755799e-01 +-7.55475222e-01 +-7.71232753e-01 +-7.84988281e-01 +-7.96707288e-01 +-8.06359526e-01 +-8.13920322e-01 +-8.19370959e-01 +-8.22698658e-01 +-8.23895066e-01 +-8.22957502e-01 +-8.19889165e-01 +-8.14699435e-01 +-8.07402105e-01 +-7.98016409e-01 +-7.86567215e-01 +-7.73085381e-01 +-7.57606281e-01 +-7.40170090e-01 +-7.20822228e-01 +-6.99613464e-01 +-6.76599244e-01 +-6.51838915e-01 +-6.25396484e-01 +-5.97340419e-01 +-5.67743654e-01 +-5.36682321e-01 +-5.04236245e-01 +-4.70488867e-01 +-4.35527150e-01 +-3.99440972e-01 +-3.62322625e-01 +-3.24267112e-01 +-2.85371819e-01 +-2.45736349e-01 +-2.05461813e-01 +-1.64650826e-01 +-1.23407359e-01 +-8.18364300e-02 +-4.00437810e-02 +1.86450583e-03 +4.37820996e-02 +8.56027091e-02 +1.27220412e-01 +1.68530008e-01 +2.09427090e-01 +2.49808357e-01 +2.89571906e-01 +3.28617572e-01 +3.66847258e-01 +4.04164772e-01 +4.40476299e-01 +4.75690671e-01 +5.09719651e-01 +5.42478335e-01 +5.73884721e-01 +6.03860258e-01 +6.32330106e-01 +6.59223317e-01 +6.84473322e-01 +7.08017416e-01 +7.29797044e-01 +7.49758207e-01 +7.67851537e-01 +7.84032600e-01 +7.98261908e-01 +8.10504365e-01 +8.20729978e-01 +8.28913857e-01 +8.35036257e-01 +8.39082934e-01 +8.41044539e-01 +8.40916667e-01 +8.38700223e-01 +8.34401330e-01 +8.28031349e-01 +8.19607071e-01 +8.09149951e-01 +7.96686370e-01 +7.82247739e-01 +7.65870356e-01 +7.47595335e-01 +7.27468694e-01 +7.05540627e-01 +6.81865642e-01 +6.56502609e-01 +6.29514503e-01 +6.00968278e-01 +5.70934822e-01 +5.39488471e-01 +5.06706805e-01 +4.72670693e-01 +4.37464022e-01 +4.01173496e-01 +3.63888432e-01 +3.25700550e-01 +2.86703527e-01 +2.46992952e-01 +2.06666102e-01 +1.65821683e-01 +1.24559580e-01 +8.29806157e-02 +4.11862686e-02 +-7.21592729e-04 +-4.26408936e-02 +-8.44696137e-02 +-1.26106042e-01 +-1.67449027e-01 +-2.08398241e-01 +-2.48854459e-01 +-2.88719695e-01 +-3.27897467e-01 +-3.66293054e-01 +-4.03813711e-01 +-4.40368898e-01 +-4.75870503e-01 +-5.10233120e-01 +-5.43374163e-01 +-5.75213966e-01 +-6.05676094e-01 +-6.34687513e-01 +-6.62178758e-01 +-6.88084087e-01 +-7.12341640e-01 +-7.34893688e-01 +-7.55686615e-01 +-7.74670952e-01 +-7.91801651e-01 +-8.07038162e-01 +-8.20344523e-01 +-8.31689431e-01 +-8.41046311e-01 +-8.48393409e-01 +-8.53713891e-01 +-8.56995627e-01 +-8.58231349e-01 +-8.57418706e-01 +-8.54560241e-01 +-8.49663385e-01 +-8.42740425e-01 +-8.33808452e-01 +-8.22889352e-01 +-8.10009796e-01 +-7.95200983e-01 +-7.78498642e-01 +-7.59942962e-01 +-7.39578536e-01 +-7.17454184e-01 +-6.93622867e-01 +-6.68141555e-01 +-6.41071052e-01 +-6.12475884e-01 +-5.82424174e-01 +-5.50987367e-01 +-5.18240078e-01 +-4.84259967e-01 +-4.49127540e-01 +-4.12925955e-01 +-3.75740810e-01 +-3.37659949e-01 +-2.98773243e-01 +-2.59172380e-01 +-2.18950644e-01 +-1.78202704e-01 +-1.37024360e-01 +-9.55123305e-02 +-5.37640371e-02 +-1.18773698e-02 +3.00495407e-02 +7.19185565e-02 +1.13631760e-01 +1.55091687e-01 +1.96201547e-01 +2.36865457e-01 +2.76988655e-01 +3.16477733e-01 +3.55240853e-01 +3.93187939e-01 +4.30230886e-01 +4.66283774e-01 +5.01263057e-01 +5.35087758e-01 +5.67679654e-01 +5.98963451e-01 +6.28866956e-01 +6.57321240e-01 +6.84260792e-01 +7.09623666e-01 +7.33351619e-01 +7.55390242e-01 +7.75689083e-01 +7.94201765e-01 +8.10886066e-01 +8.25704005e-01 +8.38621938e-01 +8.49610639e-01 +8.58645346e-01 +8.65705818e-01 +8.70776383e-01 +8.73845944e-01 +8.74908029e-01 +8.73960769e-01 +8.71006920e-01 +8.66053833e-01 +8.59113438e-01 +8.50202215e-01 +8.39341138e-01 +8.26555624e-01 +8.11875479e-01 +7.95334810e-01 +7.76971954e-01 +7.56829373e-01 +7.34953551e-01 +7.11394883e-01 +6.86207560e-01 +6.59449439e-01 +6.31181904e-01 +6.01469725e-01 +5.70380901e-01 +5.37986503e-01 +5.04360510e-01 +4.69579634e-01 +4.33723145e-01 +3.96872682e-01 +3.59112071e-01 +3.20527131e-01 +2.81205468e-01 +2.41236293e-01 +2.00710194e-01 +1.59718952e-01 +1.18355313e-01 +7.67127923e-02 +3.48854529e-02 +-7.03230382e-03 +-4.89459514e-02 +-9.07610532e-02 +-1.32383472e-01 +-1.73719583e-01 +-2.14676486e-01 +-2.55162209e-01 +-2.95085917e-01 +-3.34358112e-01 +-3.72890831e-01 +-4.10597845e-01 +-4.47394849e-01 +-4.83199646e-01 +-5.17932328e-01 +-5.51515455e-01 +-5.83874217e-01 +-6.14936608e-01 +-6.44633585e-01 +-6.72899202e-01 +-6.99670754e-01 +-7.24888945e-01 +-7.48497969e-01 +-7.70445659e-01 +-7.90683598e-01 +-8.09167200e-01 +-8.25855833e-01 +-8.40712880e-01 +-8.53705822e-01 +-8.64806321e-01 +-8.73990245e-01 +-8.81237743e-01 +-8.86533277e-01 +-8.89865641e-01 +-8.91227987e-01 +-8.90617835e-01 +-8.88037072e-01 +-8.83491941e-01 +-8.76993018e-01 +-8.68555190e-01 +-8.58197610e-01 +-8.45943651e-01 +-8.31820851e-01 +-8.15860844e-01 +-7.98099284e-01 +-7.78575764e-01 +-7.57333721e-01 +-7.34420338e-01 +-7.09886435e-01 +-6.83786344e-01 +-6.56177801e-01 +-6.27121801e-01 +-5.96682464e-01 +-5.64926897e-01 +-5.31925027e-01 +-4.97749463e-01 +-4.62475321e-01 +-4.26180057e-01 +-3.88943304e-01 +-3.50846683e-01 +-3.11973630e-01 +-2.72409208e-01 +-2.32239921e-01 +-1.91553524e-01 +-1.50438825e-01 +-1.08985500e-01 +-6.72838848e-02 +-2.54247876e-02 +1.65007148e-02 +5.84014733e-02 +1.00186465e-01 +1.41764990e-01 +1.83046870e-01 +2.23942640e-01 +2.64363741e-01 +3.04222717e-01 +3.43433395e-01 +3.81911071e-01 +4.19572696e-01 +4.56337051e-01 +4.92124917e-01 +5.26859262e-01 +5.60465367e-01 +5.92871028e-01 +6.24006665e-01 +6.53805509e-01 +6.82203711e-01 +7.09140484e-01 +7.34558254e-01 +7.58402739e-01 +7.80623083e-01 +8.01171966e-01 +8.20005697e-01 +8.37084295e-01 +8.52371575e-01 +8.65835219e-01 +8.77446844e-01 +8.87182053e-01 +8.95020485e-01 +9.00945846e-01 +9.04945959e-01 +9.07012794e-01 +9.07142442e-01 +9.05335120e-01 +9.01595180e-01 +8.95931108e-01 +8.88355478e-01 +8.78884907e-01 +8.67540064e-01 +8.54345580e-01 +8.39329988e-01 +8.22525702e-01 +8.03968876e-01 +7.83699392e-01 +7.61760705e-01 +7.38199797e-01 +7.13067055e-01 +6.86416196e-01 +6.58304090e-01 +6.28790645e-01 +5.97938687e-01 +5.65813832e-01 +5.32484333e-01 +4.98020940e-01 +4.62496739e-01 +4.25987006e-01 +3.88569036e-01 +3.50321981e-01 +3.11326682e-01 +2.71665492e-01 +2.31422129e-01 +1.90681467e-01 +1.49529346e-01 +1.08052405e-01 +6.63379010e-02 +2.44735242e-02 +-1.74527862e-02 +-5.93530267e-02 +-1.01139313e-01 +-1.42724064e-01 +-1.84020182e-01 +-2.24941227e-01 +-2.65401627e-01 +-3.05316853e-01 +-3.44603574e-01 +-3.83179827e-01 +-4.20965200e-01 +-4.57880987e-01 +-4.93850356e-01 +-5.28798502e-01 +-5.62652802e-01 +-5.95342953e-01 +-6.26801103e-01 +-6.56962094e-01 +-6.85763537e-01 +-7.13145868e-01 +-7.39052518e-01 +-7.63430019e-01 +-7.86228121e-01 +-8.07399881e-01 +-8.26901759e-01 +-8.44693698e-01 +-8.60739169e-01 +-8.75005399e-01 +-8.87463386e-01 +-8.98087798e-01 +-9.06857098e-01 +-9.13753609e-01 +-9.18763531e-01 +-9.21876953e-01 +-9.23087898e-01 +-9.22394253e-01 +-9.19797878e-01 +-9.15304748e-01 +-9.08924605e-01 +-9.00671062e-01 +-8.90561541e-01 +-8.78617279e-01 +-8.64863277e-01 +-8.49328212e-01 +-8.32044356e-01 +-8.13047609e-01 +-7.92377543e-01 +-7.70076987e-01 +-7.46192051e-01 +-7.20772056e-01 +-6.93869427e-01 +-6.65539582e-01 +-6.35840801e-01 +-6.04834099e-01 +-5.72583304e-01 +-5.39154686e-01 +-5.04616797e-01 +-4.69040402e-01 +-4.32498324e-01 +-3.95065306e-01 +-3.56817857e-01 +-3.17834069e-01 +-2.78193593e-01 +-2.37977328e-01 +-1.97267216e-01 +-1.56146158e-01 +-1.14697824e-01 +-7.30064999e-02 +-3.11569089e-02 +1.07659383e-02 +5.26769474e-02 +9.44911437e-02 +1.36123811e-01 +1.77490657e-01 +2.18507976e-01 +2.59092813e-01 +2.99163097e-01 +3.38637935e-01 +3.77437755e-01 +4.15484347e-01 +4.52701068e-01 +4.89012993e-01 +5.24347048e-01 +5.58632100e-01 +5.91799307e-01 +6.23782283e-01 +6.54516924e-01 +6.83941664e-01 +7.11997596e-01 +7.38628569e-01 +7.63781221e-01 +7.87405448e-01 +8.09454401e-01 +8.29884193e-01 +8.48654213e-01 +8.65727160e-01 +8.81069112e-01 +8.94649521e-01 +9.06441887e-01 +9.16423185e-01 +9.24573854e-01 +9.30877976e-01 +9.35323306e-01 +9.37901182e-01 +9.38606867e-01 +9.37439778e-01 +9.34402684e-01 +9.29502031e-01 +9.22747944e-01 +9.14154146e-01 +9.03737965e-01 +8.91520967e-01 +8.77527964e-01 +8.61787140e-01 +8.44330109e-01 +8.25191814e-01 +8.04410401e-01 +7.82027826e-01 +7.58089021e-01 +7.32641753e-01 +7.05736723e-01 +6.77427457e-01 +6.47770117e-01 +6.16824002e-01 +5.84650760e-01 +5.51314233e-01 +5.16880499e-01 +4.81417736e-01 +4.44996067e-01 +4.07687860e-01 +3.69566973e-01 +3.30708695e-01 +2.91189728e-01 +2.51088006e-01 +2.10482614e-01 +1.69453746e-01 +1.28082194e-01 +8.64493434e-02 +4.46370534e-02 +2.72751445e-03 +-3.91968958e-02 +-8.10538944e-02 +-1.22761415e-01 +-1.64237719e-01 +-2.05401523e-01 +-2.46172126e-01 +-2.86469877e-01 +-3.26216076e-01 +-3.65333090e-01 +-4.03744514e-01 +-4.41375218e-01 +-4.78151898e-01 +-5.14003157e-01 +-5.48859216e-01 +-5.82652243e-01 +-6.15316344e-01 +-6.46787937e-01 +-6.77006390e-01 +-7.05913181e-01 +-7.33452252e-01 +-7.59570119e-01 +-7.84215940e-01 +-8.07342656e-01 +-8.28905816e-01 +-8.48863798e-01 +-8.67177997e-01 +-8.83812772e-01 +-8.98736765e-01 +-9.11921689e-01 +-9.23342275e-01 +-9.32976566e-01 +-9.40805772e-01 +-9.46815689e-01 +-9.50995437e-01 +-9.53337221e-01 +-9.53836666e-01 +-9.52492664e-01 +-9.49308832e-01 +-9.44292055e-01 +-9.37452275e-01 +-9.28802798e-01 +-9.18360172e-01 +-9.06145647e-01 +-8.92183360e-01 +-8.76500420e-01 +-8.59127040e-01 +-8.40096629e-01 +-8.19446932e-01 +-7.97218060e-01 +-7.73452880e-01 +-7.48196965e-01 +-7.21499025e-01 +-6.93411282e-01 +-6.63987835e-01 +-6.33285172e-01 +-6.01362001e-01 +-5.68280003e-01 +-5.34103142e-01 +-4.98896915e-01 +-4.62728673e-01 +-4.25667524e-01 +-3.87784947e-01 +-3.49153527e-01 +-3.09847051e-01 +-2.69940497e-01 +-2.29510180e-01 +-1.88633554e-01 +-1.47388536e-01 +-1.05853695e-01 +-6.41081579e-02 +-2.22315702e-02 +1.96963936e-02 +6.15960420e-02 +1.03387684e-01 +1.44991840e-01 +1.86329645e-01 +2.27322729e-01 +2.67893304e-01 +3.07964250e-01 +3.47459945e-01 +3.86305791e-01 +4.24428276e-01 +4.61754987e-01 +4.98215557e-01 +5.33741596e-01 +5.68266047e-01 +6.01723490e-01 +6.34050686e-01 +6.65187531e-01 +6.95075495e-01 +7.23658116e-01 +7.50881152e-01 +7.76694413e-01 +8.01049723e-01 +8.23901218e-01 +8.45205386e-01 +8.64923172e-01 +8.83018287e-01 +8.99456762e-01 +9.14207193e-01 +9.27242621e-01 +9.38539731e-01 +9.48077421e-01 +9.55837313e-01 +9.61805310e-01 +9.65971680e-01 +9.68328733e-01 +9.68871625e-01 +9.67599587e-01 +9.64516580e-01 +9.59628559e-01 +9.52944244e-01 +9.44476243e-01 +9.34242025e-01 +9.22260883e-01 +9.08554798e-01 +8.93149396e-01 +8.76075037e-01 +8.57363717e-01 +8.37049909e-01 +8.15171558e-01 +7.91770909e-01 +7.66891626e-01 +7.40579592e-01 +7.12883961e-01 +6.83857525e-01 +6.53554252e-01 +6.22030027e-01 +5.89343759e-01 +5.55557131e-01 +5.20732778e-01 +4.84934915e-01 +4.48230418e-01 +4.10687972e-01 +3.72377007e-01 +3.33368183e-01 +2.93734264e-01 +2.53548882e-01 +2.12886223e-01 +1.71821348e-01 +1.30430566e-01 +8.87903547e-02 +4.69775039e-02 +5.06925387e-03 +-3.68569826e-02 +-7.87239981e-02 +-1.20454584e-01 +-1.61971755e-01 +-2.03199313e-01 +-2.44061455e-01 +-2.84482728e-01 +-3.24388981e-01 +-3.63707297e-01 +-4.02365371e-01 +-4.40291755e-01 +-4.77417576e-01 +-5.13675043e-01 +-5.48997304e-01 +-5.83319405e-01 +-6.16579591e-01 +-6.48716997e-01 +-6.79672051e-01 +-7.09388788e-01 +-7.37813809e-01 +-7.64894822e-01 +-7.90581607e-01 +-8.14828863e-01 +-8.37592668e-01 +-8.58830648e-01 +-8.78504334e-01 +-8.96579484e-01 +-9.13022899e-01 +-9.27803535e-01 +-9.40896298e-01 +-9.52278015e-01 +-9.61927125e-01 +-9.69826073e-01 +-9.75962535e-01 +-9.80325158e-01 +-9.82904800e-01 +-9.83698681e-01 +-9.82706187e-01 +-9.79928188e-01 +-9.75369758e-01 +-9.69041315e-01 +-9.60954038e-01 +-9.51121392e-01 +-9.39563257e-01 +-9.26301216e-01 +-9.11358236e-01 +-8.94761777e-01 +-8.76543716e-01 +-8.56736493e-01 +-8.35375024e-01 +-8.12499999e-01 +-7.88152953e-01 +-7.62376784e-01 +-7.35219033e-01 +-7.06729834e-01 +-6.76959876e-01 +-6.45962603e-01 +-6.13795531e-01 +-5.80516376e-01 +-5.46184279e-01 +-5.10862408e-01 +-4.74614574e-01 +-4.37505306e-01 +-3.99601842e-01 +-3.60973039e-01 +-3.21687858e-01 +-2.81816784e-01 +-2.41432193e-01 +-2.00606350e-01 +-1.59412259e-01 +-1.17924312e-01 +-7.62168149e-02 +-3.43643692e-02 +7.55786596e-03 +4.94748983e-02 +9.13117225e-02 +1.32993372e-01 +1.74445597e-01 +2.15594274e-01 +2.56365577e-01 +2.96687292e-01 +3.36487490e-01 +3.75694552e-01 +4.14239363e-01 +4.52053486e-01 +4.89068713e-01 +5.25219846e-01 +5.60443209e-01 +5.94675222e-01 +6.27855327e-01 +6.59925772e-01 +6.90828696e-01 +7.20508995e-01 +7.48915744e-01 +7.75997814e-01 +8.01706382e-01 +8.25998046e-01 +8.48829304e-01 +8.70158411e-01 +8.89950025e-01 +9.08168994e-01 +9.24781417e-01 +9.39760360e-01 +9.53079625e-01 +9.64713778e-01 +9.74644548e-01 +9.82855115e-01 +9.89328983e-01 +9.94056713e-01 +9.97031102e-01 +9.98244893e-01 +9.97697576e-01 +9.95391619e-01 +9.91329107e-01 +9.85518489e-01 +9.77971772e-01 +9.68700327e-01 +9.57721480e-01 +9.45056480e-01 +9.30659921e-01 +9.14519898e-01 +8.96777961e-01 +8.77469189e-01 +8.56629252e-01 +8.34296427e-01 +8.10511526e-01 +7.85317835e-01 +7.58761016e-01 +7.30889010e-01 +7.01751986e-01 +6.71402210e-01 +6.39893953e-01 +6.07283421e-01 +5.73628618e-01 +5.38989244e-01 +5.03426621e-01 +4.67003536e-01 +4.29784149e-01 +3.91833901e-01 +3.53219348e-01 +3.14008077e-01 +2.74268599e-01 +2.34070175e-01 +1.93482748e-01 +1.52576807e-01 +1.11423228e-01 +7.00932094e-02 +2.86581113e-02 +-1.28106815e-02 +-5.42418250e-02 +-9.55641975e-02 +-1.36707005e-01 +-1.77599862e-01 +-2.18172978e-01 +-2.58357229e-01 +-2.98084268e-01 +-3.37286695e-01 +-3.75898099e-01 +-4.13853212e-01 +-4.51088029e-01 +-4.87539855e-01 +-5.23147475e-01 +-5.57851222e-01 +-5.91593057e-01 +-6.24316715e-01 +-6.55967743e-01 +-6.86493610e-01 +-7.15843813e-01 +-7.43969904e-01 +-7.70825622e-01 +-7.96366938e-01 +-8.20552109e-01 +-8.43341789e-01 +-8.64699039e-01 +-8.84589412e-01 +-9.02981007e-01 +-9.19844489e-01 +-9.35153167e-01 +-9.48883005e-01 +-9.61012665e-01 +-9.71523546e-01 +-9.80399785e-01 +-9.87628300e-01 +-9.93198792e-01 +-9.97103755e-01 +-9.99338489e-01 +-9.99901093e-01 +-9.98792464e-01 +-9.96016288e-01 +-9.91579030e-01 +-9.85489908e-01 +-9.77760882e-01 +-9.68406616e-01 +-9.57444449e-01 +-9.44894373e-01 +-9.30778966e-01 +-9.15123379e-01 +-8.97955263e-01 +-8.79304725e-01 +-8.59204287e-01 +-8.37688788e-01 +-8.14795373e-01 +-7.90563374e-01 +-7.65034274e-01 +-7.38251626e-01 +-7.10260952e-01 +-6.81109715e-01 +-6.50847170e-01 +-6.19524337e-01 +-5.87193878e-01 +-5.53910008e-01 +-5.19728437e-01 +-4.84706206e-01 +-4.48901680e-01 +-4.12374360e-01 +-3.75184848e-01 +-3.37394719e-01 +-2.99066399e-01 +-2.60263121e-01 +-2.21048731e-01 +-1.81487679e-01 +-1.41644831e-01 +-1.01585410e-01 +-6.13748838e-02 +-2.10788202e-02 +1.92371454e-02 +5.95075167e-02 +9.96669337e-02 +1.39650377e-01 +1.79393202e-01 +2.18831272e-01 +2.57901076e-01 +2.96539776e-01 +3.34685390e-01 +3.72276787e-01 +4.09253895e-01 +4.45557691e-01 +4.81130375e-01 +5.15915413e-01 +5.49857632e-01 +5.82903337e-01 +6.15000332e-01 +6.46098079e-01 +6.76147690e-01 +7.05102086e-01 +7.32915989e-01 +7.59546058e-01 +7.84950902e-01 +8.09091171e-01 +8.31929611e-01 +8.53431097e-01 +8.73562720e-01 +8.92293792e-01 +9.09595934e-01 +9.25443070e-01 +9.39811506e-01 +9.52679925e-01 +9.64029446e-01 +9.73843620e-01 +9.82108475e-01 +9.88812516e-01 +9.93946741e-01 +9.97504654e-01 +9.99482262e-01 +9.99878083e-01 +9.98693134e-01 +9.95930930e-01 +9.91597469e-01 +9.85701216e-01 +9.78253090e-01 +9.69266427e-01 +9.58756973e-01 +9.46742832e-01 +9.33244451e-01 +9.18284567e-01 +9.01888177e-01 +8.84082486e-01 +8.64896863e-01 +8.44362788e-01 +8.22513796e-01 +7.99385429e-01 +7.75015156e-01 +7.49442339e-01 +7.22708129e-01 +6.94855445e-01 +6.65928844e-01 +6.35974519e-01 +6.05040141e-01 +5.73174871e-01 +5.40429185e-01 +5.06854893e-01 +4.72504948e-01 +4.37433474e-01 +4.01695565e-01 +3.65347310e-01 +3.28445591e-01 +2.91048110e-01 +2.53213175e-01 +2.14999736e-01 +1.76467163e-01 +1.37675281e-01 +9.86841533e-02 +5.95541089e-02 +2.03455269e-02 +-1.88811308e-02 +-5.80655408e-02 +-9.71474819e-02 +-1.36067056e-01 +-1.74764651e-01 +-2.13181159e-01 +-2.51257940e-01 +-2.88937033e-01 +-3.26161126e-01 +-3.62873755e-01 +-3.99019277e-01 +-4.34543063e-01 +-4.69391472e-01 +-5.03512034e-01 +-5.36853430e-01 +-5.69365655e-01 +-6.01000014e-01 +-6.31709261e-01 +-6.61447608e-01 +-6.90170841e-01 +-7.17836345e-01 +-7.44403192e-01 +-7.69832183e-01 +-7.94085908e-01 +-8.17128806e-01 +-8.38927197e-01 +-8.59449354e-01 +-8.78665512e-01 +-8.96547952e-01 +-9.13070988e-01 +-9.28211056e-01 +-9.41946687e-01 +-9.54258590e-01 +-9.65129626e-01 +-9.74544873e-01 +-9.82491606e-01 +-9.88959340e-01 +-9.93939820e-01 +-9.97427040e-01 +-9.99417243e-01 +-9.99908923e-01 +-9.98902818e-01 +-9.96401910e-01 +-9.92411408e-01 +-9.86938744e-01 +-9.79993547e-01 +-9.71587634e-01 +-9.61734974e-01 +-9.50451682e-01 +-9.37755963e-01 +-9.23668111e-01 +-9.08210444e-01 +-8.91407293e-01 +-8.73284942e-01 +-8.53871588e-01 +-8.33197312e-01 +-8.11293993e-01 +-7.88195312e-01 +-7.63936627e-01 +-7.38554997e-01 +-7.12089044e-01 +-6.84578961e-01 +-6.56066397e-01 +-6.26594424e-01 +-5.96207465e-01 +-5.64951197e-01 +-5.32872543e-01 +-5.00019514e-01 +-4.66441233e-01 +-4.32187763e-01 +-3.97310117e-01 +-3.61860120e-01 +-3.25890359e-01 +-2.89454111e-01 +-2.52605220e-01 +-2.15398096e-01 +-1.77887531e-01 +-1.40128726e-01 +-1.02177113e-01 +-6.40883444e-02 +-2.59181775e-02 +1.22776179e-02 +5.04432853e-02 +8.85232544e-02 +1.26462110e-01 +1.64204784e-01 +2.01696543e-01 +2.38883122e-01 +2.75710796e-01 +3.12126412e-01 +3.48077549e-01 +3.83512490e-01 +4.18380394e-01 +4.52631294e-01 +4.86216198e-01 +5.19087177e-01 +5.51197370e-01 +5.82501138e-01 +6.12954032e-01 +6.42512934e-01 +6.71136071e-01 +6.98783074e-01 +7.25415073e-01 +7.50994680e-01 +7.75486117e-01 +7.98855202e-01 +8.21069426e-01 +8.42098001e-01 +8.61911861e-01 +8.80483760e-01 +8.97788247e-01 +9.13801740e-01 +9.28502543e-01 +9.41870857e-01 +9.53888839e-01 +9.64540582e-01 +9.73812171e-01 +9.81691672e-01 +9.88169154e-01 +9.93236707e-01 +9.96888432e-01 +9.99120459e-01 +9.99930942e-01 +9.99320057e-01 +9.97289999e-01 +9.93844977e-01 +9.88991195e-01 +9.82736848e-01 +9.75092105e-01 +9.66069080e-01 +9.55681829e-01 +9.43946308e-01 +9.30880353e-01 +9.16503661e-01 +9.00837733e-01 +8.83905874e-01 +8.65733122e-01 +8.46346229e-01 +8.25773627e-01 +8.04045350e-01 +7.81193032e-01 +7.57249830e-01 +7.32250372e-01 +7.06230741e-01 +6.79228367e-01 +6.51282016e-01 +6.22431723e-01 +5.92718702e-01 +5.62185344e-01 +5.30875100e-01 +4.98832437e-01 +4.66102807e-01 +4.32732508e-01 +3.98768697e-01 +3.64259277e-01 +3.29252815e-01 +2.93798538e-01 +2.57946186e-01 +2.21745984e-01 +1.85248589e-01 +1.48504950e-01 +1.11566319e-01 +7.44841293e-02 +3.73099117e-02 +9.52898650e-05 +-3.71081704e-02 +-7.42489932e-02 +-1.11275837e-01 +-1.48137641e-01 +-1.84783617e-01 +-2.21163352e-01 +-2.57226908e-01 +-2.92924818e-01 +-3.28208215e-01 +-3.63028889e-01 +-3.97339303e-01 +-4.31092728e-01 +-4.64243264e-01 +-4.96745886e-01 +-5.28556560e-01 +-5.59632249e-01 +-5.89930979e-01 +-6.19411935e-01 +-6.48035455e-01 +-6.75763117e-01 +-7.02557801e-01 +-7.28383690e-01 +-7.53206361e-01 +-7.76992821e-01 +-7.99711515e-01 +-8.21332416e-01 +-8.41827033e-01 +-8.61168438e-01 +-8.79331335e-01 +-8.96292057e-01 +-9.12028603e-01 +-9.26520685e-01 +-9.39749723e-01 +-9.51698880e-01 +-9.62353089e-01 +-9.71699055e-01 +-9.79725274e-01 +-9.86422055e-01 +-9.91781512e-01 +-9.95797586e-01 +-9.98466042e-01 +-9.99784471e-01 +-9.99752291e-01 +-9.98370744e-01 +-9.95642892e-01 +-9.91573607e-01 +-9.86169557e-01 +-9.79439203e-01 +-9.71392777e-01 +-9.62042262e-01 +-9.51401382e-01 +-9.39485572e-01 +-9.26311950e-01 +-9.11899308e-01 +-8.96268065e-01 +-8.79440238e-01 +-8.61439428e-01 +-8.42290763e-01 +-8.22020863e-01 +-8.00657824e-01 +-7.78231153e-01 +-7.54771727e-01 +-7.30311770e-01 +-7.04884792e-01 +-6.78525526e-01 +-6.51269917e-01 +-6.23155048e-01 +-5.94219074e-01 +-5.64501205e-01 +-5.34041634e-01 +-5.02881462e-01 +-4.71062676e-01 +-4.38628082e-01 +-4.05621218e-01 +-3.72086329e-01 +-3.38068311e-01 +-3.03612607e-01 +-2.68765181e-01 +-2.33572470e-01 +-1.98081274e-01 +-1.62338718e-01 +-1.26392219e-01 +-9.02893721e-02 +-5.40779010e-02 +-1.78056310e-02 +1.84796138e-02 +5.47300775e-02 +9.08980969e-02 +1.26936184e-01 +1.62797114e-01 +1.98433947e-01 +2.33800093e-01 +2.68849405e-01 +3.03536219e-01 +3.37815385e-01 +3.71642374e-01 +4.04973317e-01 +4.37765038e-01 +4.69975131e-01 +5.01562030e-01 +5.32485025e-01 +5.62704322e-01 +5.92181126e-01 +6.20877655e-01 +6.48757183e-01 +6.75784117e-01 +7.01924028e-01 +7.27143672e-01 +7.51411056e-01 +7.74695478e-01 +7.96967549e-01 +8.18199227e-01 +8.38363872e-01 +8.57436265e-01 +8.75392624e-01 +8.92210655e-01 +9.07869574e-01 +9.22350114e-01 +9.35634560e-01 +9.47706774e-01 +9.58552203e-01 +9.68157891e-01 +9.76512505e-01 +9.83606341e-01 +9.89431329e-01 +9.93981044e-01 +9.97250713e-01 +9.99237215e-01 +9.99939080e-01 +9.99356493e-01 +9.97491286e-01 +9.94346934e-01 +9.89928547e-01 +9.84242861e-01 +9.77298224e-01 +9.69104587e-01 +9.59673483e-01 +9.49018009e-01 +9.37152809e-01 +9.24094057e-01 +9.09859423e-01 +8.94468048e-01 +8.77940528e-01 +8.60298882e-01 +8.41566504e-01 +8.21768150e-01 +8.00929903e-01 +7.79079129e-01 +7.56244435e-01 +7.32455642e-01 +7.07743751e-01 +6.82140879e-01 +6.55680224e-01 +6.28396036e-01 +6.00323563e-01 +5.71498990e-01 +5.41959402e-01 +5.11742751e-01 +4.80887788e-01 +4.49434007e-01 +4.17421602e-01 +3.84891436e-01 +3.51884954e-01 +3.18444140e-01 +2.84611468e-01 +2.50429863e-01 +2.15942618e-01 +1.81193341e-01 +1.46225918e-01 +1.11084463e-01 +7.58132283e-02 +4.04565682e-02 +5.05888916e-03 +-3.03354012e-02 +-6.56819757e-02 +-1.00936630e-01 +-1.36055329e-01 +-1.70994255e-01 +-2.05709895e-01 +-2.40159072e-01 +-2.74298995e-01 +-3.08087309e-01 +-3.41482170e-01 +-3.74442282e-01 +-4.06926939e-01 +-4.38896078e-01 +-4.70310341e-01 +-5.01131120e-01 +-5.31320586e-01 +-5.60841742e-01 +-5.89658481e-01 +-6.17735621e-01 +-6.45038942e-01 +-6.71535220e-01 +-6.97192286e-01 +-7.21979058e-01 +-7.45865568e-01 +-7.68822995e-01 +-7.90823714e-01 +-8.11841322e-01 +-8.31850662e-01 +-8.50827851e-01 +-8.68750317e-01 +-8.85596818e-01 +-9.01347471e-01 +-9.15983761e-01 +-9.29488571e-01 +-9.41846205e-01 +-9.53042397e-01 +-9.63064325e-01 +-9.71900625e-01 +-9.79541409e-01 +-9.85978267e-01 +-9.91204276e-01 +-9.95214006e-01 +-9.98003525e-01 +-9.99570402e-01 +-9.99913702e-01 +-9.99033990e-01 +-9.96933324e-01 +-9.93615252e-01 +-9.89084803e-01 +-9.83348479e-01 +-9.76414244e-01 +-9.68291514e-01 +-9.58991137e-01 +-9.48525381e-01 +-9.36907919e-01 +-9.24153805e-01 +-9.10279456e-01 +-8.95302626e-01 +-8.79242384e-01 +-8.62119094e-01 +-8.43954380e-01 +-8.24771097e-01 +-8.04593306e-01 +-7.83446241e-01 +-7.61356281e-01 +-7.38350904e-01 +-7.14458660e-01 +-6.89709130e-01 +-6.64132901e-01 +-6.37761514e-01 +-6.10627425e-01 +-5.82763964e-01 +-5.54205301e-01 +-5.24986402e-01 +-4.95142980e-01 +-4.64711448e-01 +-4.33728877e-01 +-4.02232957e-01 +-3.70261950e-01 +-3.37854632e-01 +-3.05050248e-01 +-2.71888469e-01 +-2.38409349e-01 +-2.04653270e-01 +-1.70660888e-01 +-1.36473085e-01 +-1.02130927e-01 +-6.76756127e-02 +-3.31484264e-02 +1.40932364e-03 +3.59563472e-02 +7.04514209e-02 +1.04853432e-01 +1.39121429e-01 +1.73214683e-01 +2.07092725e-01 +2.40715396e-01 +2.74042887e-01 +3.07035792e-01 +3.39655157e-01 +3.71862526e-01 +4.03619981e-01 +4.34890184e-01 +4.65636420e-01 +4.95822649e-01 +5.25413542e-01 +5.54374520e-01 +5.82671794e-01 +6.10272399e-01 +6.37144240e-01 +6.63256129e-01 +6.88577813e-01 +7.13080012e-01 +7.36734447e-01 +7.59513876e-01 +7.81392128e-01 +8.02344126e-01 +8.22345917e-01 +8.41374694e-01 +8.59408822e-01 +8.76427869e-01 +8.92412621e-01 +9.07345104e-01 +9.21208599e-01 +9.33987665e-01 +9.45668151e-01 +9.56237215e-01 +9.65683330e-01 +9.73996303e-01 +9.81167276e-01 +9.87188739e-01 +9.92054536e-01 +9.95759871e-01 +9.98301307e-01 +9.99676771e-01 +9.99885553e-01 +9.98928304e-01 +9.96807034e-01 +9.93525106e-01 +9.89087230e-01 +9.83499454e-01 +9.76769159e-01 +9.68905042e-01 +9.59917107e-01 +9.49816652e-01 +9.38616248e-01 +9.26329729e-01 +9.12972173e-01 +8.98559877e-01 +8.83110340e-01 +8.66642240e-01 +8.49175407e-01 +8.30730805e-01 +8.11330501e-01 +7.90997640e-01 +7.69756411e-01 +7.47632022e-01 +7.24650668e-01 +7.00839498e-01 +6.76226587e-01 +6.50840898e-01 +6.24712244e-01 +5.97871254e-01 +5.70349341e-01 +5.42178659e-01 +5.13392070e-01 +4.84023103e-01 +4.54105909e-01 +4.23675226e-01 +3.92766337e-01 +3.61415030e-01 +3.29657553e-01 +2.97530579e-01 +2.65071154e-01 +2.32316658e-01 +1.99304758e-01 +1.66073373e-01 +1.32660621e-01 +9.91047852e-02 +6.54442617e-02 +3.17175168e-02 +-2.03695629e-03 +-3.57806809e-02 +-6.94752407e-02 +-1.03082322e-01 +-1.36563757e-01 +-1.69881569e-01 +-2.02998015e-01 +-2.35875631e-01 +-2.68477268e-01 +-3.00766137e-01 +-3.32705850e-01 +-3.64260455e-01 +-3.95394485e-01 +-4.26072995e-01 +-4.56261598e-01 +-4.85926503e-01 +-5.15034554e-01 +-5.43553266e-01 +-5.71450856e-01 +-5.98696285e-01 +-6.25259287e-01 +-6.51110406e-01 +-6.76221024e-01 +-7.00563392e-01 +-7.24110661e-01 +-7.46836909e-01 +-7.68717169e-01 +-7.89727460e-01 +-8.09844805e-01 +-8.29047263e-01 +-8.47313944e-01 +-8.64625034e-01 +-8.80961817e-01 +-8.96306690e-01 +-9.10643187e-01 +-9.23955988e-01 +-9.36230943e-01 +-9.47455076e-01 +-9.57616607e-01 +-9.66704953e-01 +-9.74710748e-01 +-9.81625844e-01 +-9.87443322e-01 +-9.92157496e-01 +-9.95763917e-01 +-9.98259377e-01 +-9.99641910e-01 +-9.99910792e-01 +-9.99066537e-01 +-9.97110900e-01 +-9.94046870e-01 +-9.89878661e-01 +-9.84611712e-01 +-9.78252674e-01 +-9.70809402e-01 +-9.62290944e-01 +-9.52707531e-01 +-9.42070559e-01 +-9.30392581e-01 +-9.17687284e-01 +-9.03969476e-01 +-8.89255069e-01 +-8.73561055e-01 +-8.56905488e-01 +-8.39307465e-01 +-8.20787098e-01 +-8.01365494e-01 +-7.81064728e-01 +-7.59907817e-01 +-7.37918692e-01 +-7.15122174e-01 +-6.91543943e-01 +-6.67210506e-01 +-6.42149170e-01 +-6.16388010e-01 +-5.89955836e-01 +-5.62882159e-01 +-5.35197158e-01 +-5.06931648e-01 +-4.78117043e-01 +-4.48785320e-01 +-4.18968985e-01 +-3.88701037e-01 +-3.58014927e-01 +-3.26944528e-01 +-2.95524087e-01 +-2.63788195e-01 +-2.31771747e-01 +-1.99509900e-01 +-1.67038038e-01 +-1.34391734e-01 +-1.01606705e-01 +-6.87187785e-02 +-3.57638530e-02 +-2.77785462e-03 +3.02032990e-02 +6.31437386e-02 +9.60076818e-02 +1.28759472e-01 +1.61363617e-01 +1.93784826e-01 +2.25988051e-01 +2.57938519e-01 +2.89601774e-01 +3.20943711e-01 +3.51930616e-01 +3.82529197e-01 +4.12706623e-01 +4.42430558e-01 +4.71669192e-01 +5.00391279e-01 +5.28566168e-01 +5.56163833e-01 +5.83154909e-01 +6.09510717e-01 +6.35203298e-01 +6.60205441e-01 +6.84490711e-01 +7.08033474e-01 +7.30808927e-01 +7.52793121e-01 +7.73962986e-01 +7.94296352e-01 +8.13771975e-01 +8.32369557e-01 +8.50069764e-01 +8.66854249e-01 +8.82705668e-01 +8.97607695e-01 +9.11545042e-01 +9.24503471e-01 +9.36469807e-01 +9.47431953e-01 +9.57378897e-01 +9.66300726e-01 +9.74188634e-01 +9.81034927e-01 +9.86833032e-01 +9.91577502e-01 +9.95264019e-01 +9.97889396e-01 +9.99451582e-01 +9.99949657e-01 +9.99383837e-01 +9.97755467e-01 +9.95067021e-01 +9.91322095e-01 +9.86525405e-01 +9.80682774e-01 +9.73801131e-01 +9.65888497e-01 +9.56953979e-01 +9.47007753e-01 +9.36061055e-01 +9.24126169e-01 +9.11216407e-01 +8.97346099e-01 +8.82530573e-01 +8.66786136e-01 +8.50130060e-01 +8.32580557e-01 +8.14156760e-01 +7.94878705e-01 +7.74767303e-01 +7.53844317e-01 +7.32132344e-01 +7.09654783e-01 +6.86435809e-01 +6.62500353e-01 +6.37874068e-01 +6.12583303e-01 +5.86655077e-01 +5.60117043e-01 +5.32997465e-01 +5.05325184e-01 +4.77129586e-01 +4.48440572e-01 +4.19288526e-01 +3.89704281e-01 +3.59719089e-01 +3.29364581e-01 +2.98672743e-01 +2.67675873e-01 +2.36406553e-01 +2.04897610e-01 +1.73182085e-01 +1.41293196e-01 +1.09264304e-01 +7.71288772e-02 +4.49204576e-02 +1.26726242e-02 +-1.95810411e-02 +-5.18069888e-02 +-8.39717362e-02 +-1.16041903e-01 +-1.47984243e-01 +-1.79765684e-01 +-2.11353356e-01 +-2.42714627e-01 +-2.73817138e-01 +-3.04628835e-01 +-3.35118001e-01 +-3.65253289e-01 +-3.95003754e-01 +-4.24338884e-01 +-4.53228631e-01 +-4.81643442e-01 +-5.09554287e-01 +-5.36932690e-01 +-5.63750756e-01 +-5.89981200e-01 +-6.15597373e-01 +-6.40573292e-01 +-6.64883660e-01 +-6.88503894e-01 +-7.11410151e-01 +-7.33579347e-01 +-7.54989184e-01 +-7.75618169e-01 +-7.95445635e-01 +-8.14451762e-01 +-8.32617595e-01 +-8.49925062e-01 +-8.66356993e-01 +-8.81897133e-01 +-8.96530162e-01 +-9.10241702e-01 +-9.23018338e-01 +-9.34847625e-01 +-9.45718102e-01 +-9.55619300e-01 +-9.64541753e-01 +-9.72477004e-01 +-9.79417615e-01 +-9.85357170e-01 +-9.90290283e-01 +-9.94212599e-01 +-9.97120797e-01 +-9.99012595e-01 +-9.99886747e-01 +-9.99743045e-01 +-9.98582316e-01 +-9.96406420e-01 +-9.93218248e-01 +-9.89021715e-01 +-9.83821756e-01 +-9.77624320e-01 +-9.70436360e-01 +-9.62265826e-01 +-9.53121656e-01 +-9.43013764e-01 +-9.31953030e-01 +-9.19951285e-01 +-9.07021300e-01 +-8.93176771e-01 +-8.78432303e-01 +-8.62803394e-01 +-8.46306418e-01 +-8.28958610e-01 +-8.10778040e-01 +-7.91783601e-01 +-7.71994986e-01 +-7.51432666e-01 +-7.30117869e-01 +-7.08072556e-01 +-6.85319401e-01 +-6.61881765e-01 +-6.37783669e-01 +-6.13049775e-01 +-5.87705354e-01 +-5.61776264e-01 +-5.35288921e-01 +-5.08270272e-01 +-4.80747766e-01 +-4.52749329e-01 +-4.24303334e-01 +-3.95438567e-01 +-3.66184206e-01 +-3.36569785e-01 +-3.06625165e-01 +-2.76380507e-01 +-2.45866236e-01 +-2.15113016e-01 +-1.84151712e-01 +-1.53013367e-01 +-1.21729165e-01 +-9.03304009e-02 +-5.88484499e-02 +-2.73147362e-02 +4.23929893e-03 +3.57822284e-02 +6.72826704e-02 +9.87093195e-02 +1.30030978e-01 +1.61216586e-01 +1.92235254e-01 +2.23056290e-01 +2.53649232e-01 +2.83983879e-01 +3.14030317e-01 +3.43758951e-01 +3.73140534e-01 +4.02146192e-01 +4.30747456e-01 +4.58916290e-01 +4.86625112e-01 +5.13846827e-01 +5.40554852e-01 +5.66723137e-01 +5.92326196e-01 +6.17339127e-01 +6.41737636e-01 +6.65498065e-01 +6.88597406e-01 +7.11013329e-01 +7.32724203e-01 +7.53709111e-01 +7.73947876e-01 +7.93421074e-01 +8.12110056e-01 +8.29996964e-01 +8.47064746e-01 +8.63297173e-01 +8.78678854e-01 +8.93195248e-01 +9.06832679e-01 +9.19578348e-01 +9.31420340e-01 +9.42347642e-01 +9.52350145e-01 +9.61418658e-01 +9.69544912e-01 +9.76721568e-01 +9.82942224e-01 +9.88201417e-01 +9.92494631e-01 +9.95818294e-01 +9.98169788e-01 +9.99547441e-01 +9.99950537e-01 +9.99379306e-01 +9.97834930e-01 +9.95319533e-01 +9.91836187e-01 +9.87388897e-01 +9.81982603e-01 +9.75623174e-01 +9.68317394e-01 +9.60072963e-01 +9.50898480e-01 +9.40803441e-01 +9.29798221e-01 +9.17894068e-01 +9.05103090e-01 +8.91438239e-01 +8.76913301e-01 +8.61542877e-01 +8.45342374e-01 +8.28327983e-01 +8.10516664e-01 +7.91926130e-01 +7.72574827e-01 +7.52481918e-01 +7.31667257e-01 +7.10151377e-01 +6.87955463e-01 +6.65101334e-01 +6.41611419e-01 +6.17508736e-01 +5.92816870e-01 +5.67559944e-01 +5.41762603e-01 +5.15449983e-01 +4.88647689e-01 +4.61381770e-01 +4.33678692e-01 +4.05565313e-01 +3.77068856e-01 +3.48216882e-01 +3.19037266e-01 +2.89558165e-01 +2.59807994e-01 +2.29815399e-01 +1.99609227e-01 +1.69218497e-01 +1.38672377e-01 +1.08000152e-01 +7.72311960e-02 +4.63949453e-02 +1.55208694e-02 +-1.53615568e-02 +-4.62228815e-02 +-7.70337035e-02 +-1.07764701e-01 +-1.38386657e-01 +-1.68870492e-01 +-1.99187285e-01 +-2.29308306e-01 +-2.59205040e-01 +-2.88849217e-01 +-3.18212833e-01 +-3.47268182e-01 +-3.75987879e-01 +-4.04344884e-01 +-4.32312533e-01 +-4.59864555e-01 +-4.86975102e-01 +-5.13618770e-01 +-5.39770626e-01 +-5.65406224e-01 +-5.90501635e-01 +-6.15033465e-01 +-6.38978877e-01 +-6.62315610e-01 +-6.85022004e-01 +-7.07077013e-01 +-7.28460229e-01 +-7.49151901e-01 +-7.69132947e-01 +-7.88384976e-01 +-8.06890303e-01 +-8.24631963e-01 +-8.41593730e-01 +-8.57760126e-01 +-8.73116438e-01 +-8.87648731e-01 +-9.01343855e-01 +-9.14189464e-01 +-9.26174021e-01 +-9.37286809e-01 +-9.47517939e-01 +-9.56858361e-01 +-9.65299866e-01 +-9.72835100e-01 +-9.79457563e-01 +-9.85161616e-01 +-9.89942486e-01 +-9.93796268e-01 +-9.96719930e-01 +-9.98711310e-01 +-9.99769119e-01 +-9.99892945e-01 +-9.99083244e-01 +-9.97341346e-01 +-9.94669446e-01 +-9.91070607e-01 +-9.86548752e-01 +-9.81108660e-01 +-9.74755958e-01 +-9.67497120e-01 +-9.59339455e-01 +-9.50291102e-01 +-9.40361017e-01 +-9.29558970e-01 +-9.17895527e-01 +-9.05382048e-01 +-8.92030667e-01 +-8.77854284e-01 +-8.62866551e-01 +-8.47081858e-01 +-8.30515321e-01 +-8.13182763e-01 +-7.95100701e-01 +-7.76286329e-01 +-7.56757501e-01 +-7.36532713e-01 +-7.15631087e-01 +-6.94072350e-01 +-6.71876817e-01 +-6.49065369e-01 +-6.25659437e-01 +-6.01680975e-01 +-5.77152447e-01 +-5.52096798e-01 +-5.26537438e-01 +-5.00498215e-01 +-4.74003396e-01 +-4.47077645e-01 +-4.19745994e-01 +-3.92033826e-01 +-3.63966845e-01 +-3.35571059e-01 +-3.06872748e-01 +-2.77898446e-01 +-2.48674912e-01 +-2.19229109e-01 +-1.89588174e-01 +-1.59779396e-01 +-1.29830193e-01 +-9.97680816e-02 +-6.96206542e-02 +-3.94155551e-02 +-9.18045308e-03 +2.10569837e-02 +5.12691127e-02 +8.14283421e-02 +1.11507156e-01 +1.41478140e-01 +1.71314005e-01 +2.00987612e-01 +2.30471999e-01 +2.59740400e-01 +2.88766277e-01 +3.17523335e-01 +3.45985553e-01 +3.74127203e-01 +4.01922874e-01 +4.29347495e-01 +4.56376360e-01 +4.82985143e-01 +5.09149927e-01 +5.34847222e-01 +5.60053982e-01 +5.84747633e-01 +6.08906087e-01 +6.32507764e-01 +6.55531608e-01 +6.77957109e-01 +6.99764317e-01 +7.20933865e-01 +7.41446980e-01 +7.61285501e-01 +7.80431895e-01 +7.98869272e-01 +8.16581401e-01 +8.33552718e-01 +8.49768347e-01 +8.65214105e-01 +8.79876520e-01 +8.93742837e-01 +9.06801033e-01 +9.19039825e-01 +9.30448678e-01 +9.41017814e-01 +9.50738222e-01 +9.59601660e-01 +9.67600669e-01 +9.74728570e-01 +9.80979474e-01 +9.86348288e-01 +9.90830712e-01 +9.94423249e-01 +9.97123200e-01 +9.98928672e-01 +9.99838574e-01 +9.99852618e-01 +9.98971321e-01 +9.97195996e-01 +9.94528760e-01 +9.90972523e-01 +9.86530986e-01 +9.81208640e-01 +9.75010757e-01 +9.67943386e-01 +9.60013347e-01 +9.51228222e-01 +9.41596349e-01 +9.31126811e-01 +9.19829432e-01 +9.07714761e-01 +8.94794066e-01 +8.81079323e-01 +8.66583199e-01 +8.51319048e-01 +8.35300891e-01 +8.18543406e-01 +8.01061913e-01 +7.82872363e-01 +7.63991317e-01 +7.44435934e-01 +7.24223956e-01 +7.03373691e-01 +6.81903992e-01 +6.59834244e-01 +6.37184344e-01 +6.13974684e-01 +5.90226131e-01 +5.65960009e-01 +5.41198079e-01 +5.15962518e-01 +4.90275905e-01 +4.64161189e-01 +4.37641679e-01 +4.10741018e-01 +3.83483159e-01 +3.55892351e-01 +3.27993112e-01 +2.99810206e-01 +2.71368626e-01 +2.42693570e-01 +2.13810412e-01 +1.84744690e-01 +1.55522074e-01 +1.26168347e-01 +9.67093852e-02 +6.71711300e-02 +3.75795681e-02 +7.96070935e-03 +-2.16594371e-02 +-5.12548874e-02 +-8.07997047e-02 +-1.10268021e-01 +-1.39634061e-01 +-1.68872163e-01 +-1.97956803e-01 +-2.26862613e-01 +-2.55564408e-01 +-2.84037203e-01 +-3.12256240e-01 +-3.40197005e-01 +-3.67835253e-01 +-3.95147023e-01 +-4.22108666e-01 +-4.48696857e-01 +-4.74888621e-01 +-5.00661348e-01 +-5.25992817e-01 +-5.50861214e-01 +-5.75245147e-01 +-5.99123667e-01 +-6.22476285e-01 +-6.45282989e-01 +-6.67524261e-01 +-6.89181090e-01 +-7.10234993e-01 +-7.30668029e-01 +-7.50462814e-01 +-7.69602532e-01 +-7.88070954e-01 +-8.05852446e-01 +-8.22931987e-01 +-8.39295173e-01 +-8.54928240e-01 +-8.69818068e-01 +-8.83952190e-01 +-8.97318810e-01 +-9.09906802e-01 +-9.21705726e-01 +-9.32705833e-01 +-9.42898074e-01 +-9.52274104e-01 +-9.60826295e-01 +-9.68547733e-01 +-9.75432230e-01 +-9.81474324e-01 +-9.86669284e-01 +-9.91013114e-01 +-9.94502555e-01 +-9.97135087e-01 +-9.98908928e-01 +-9.99823038e-01 +-9.99877119e-01 +-9.99071609e-01 +-9.97407687e-01 +-9.94887267e-01 +-9.91512996e-01 +-9.87288255e-01 +-9.82217148e-01 +-9.76304502e-01 +-9.69555860e-01 +-9.61977479e-01 +-9.53576319e-01 +-9.44360040e-01 +-9.34336990e-01 +-9.23516203e-01 +-9.11907382e-01 +-8.99520900e-01 +-8.86367781e-01 +-8.72459696e-01 +-8.57808951e-01 +-8.42428474e-01 +-8.26331801e-01 +-8.09533070e-01 +-7.92047002e-01 +-7.73888890e-01 +-7.55074587e-01 +-7.35620492e-01 +-7.15543532e-01 +-6.94861149e-01 +-6.73591280e-01 +-6.51752349e-01 +-6.29363245e-01 +-6.06443308e-01 +-5.83012313e-01 +-5.59090450e-01 +-5.34698303e-01 +-5.09856840e-01 +-4.84587388e-01 +-4.58911618e-01 +-4.32851526e-01 +-4.06429416e-01 +-3.78298490e-01 +-3.42189750e-01 +-3.06283181e-01 +-2.72263415e-01 +-2.40277257e-01 +-2.10432400e-01 +-1.82799535e-01 +-1.57415030e-01 +-1.34283875e-01 +-1.13382963e-01 +-9.46644222e-02 +-7.80588691e-02 +-6.34786147e-02 +-5.08206408e-02 +-3.99693355e-02 +-3.07989458e-02 +-2.31757423e-02 +-1.69598645e-02 +-1.20068991e-02 +-8.16915332e-03 +-5.29668892e-03 +-3.23792782e-03 +-1.84037921e-03 +-9.50725995e-04 +-4.12370929e-04 +-2.06185465e-04 +-0.00000000e+00 +-0.00000000e+00 +3.91914656e-02 +8.28679559e-02 +1.25094913e-01 +1.67149012e-01 +2.09150169e-01 +2.51127726e-01 +2.93092587e-01 +3.35049794e-01 +3.77002015e-01 +4.18950800e-01 +4.60897115e-01 +5.02841591e-01 +5.44784663e-01 +5.86726637e-01 +6.28667735e-01 +6.70608124e-01 +7.12547932e-01 +7.54487255e-01 +7.96426171e-01 +8.38364741e-01 +8.80303016e-01 +9.22241036e-01 +9.64178834e-01 +9.97369514e-01 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +1.00000000e+00 +9.99968409e-01 +9.77416184e-01 +9.35478441e-01 +8.93540494e-01 +8.51602304e-01 +8.09663831e-01 +7.67725030e-01 +7.25785843e-01 +6.83846198e-01 +6.41906005e-01 +5.99965146e-01 +5.58023470e-01 +5.16080773e-01 +4.74136780e-01 +4.32191102e-01 +3.90243182e-01 +3.48292178e-01 +3.06336765e-01 +2.64374713e-01 +2.22401949e-01 +1.80410081e-01 +1.38378309e-01 +9.62348465e-02 +5.34309759e-02 +2.67154879e-02 +-0.00000000e+00 diff --git a/test/runtests.jl b/test/runtests.jl new file mode 100644 index 0000000..ed9204f --- /dev/null +++ b/test/runtests.jl @@ -0,0 +1,16 @@ +using GIRFReco +using MRISimulation +using MRIReco +using MRIFiles +using ImageUtils +using Test +using Scratch +using Statistics +using JLD2 + +global const tmpdir = @get_scratch!("temp") +@info "For the output of tests, please refer to the directory $tmpdir" + +include("testio.jl") +include("testutils.jl") +include("testintegration.jl") \ No newline at end of file diff --git a/test/testintegration.jl b/test/testintegration.jl new file mode 100644 index 0000000..cbf0328 --- /dev/null +++ b/test/testintegration.jl @@ -0,0 +1,98 @@ +function test_merge_raw_interleaves() + + N = 32 + I_slice = shepp_logan(N) + I = I_slice .* ones(N,N,10) + + # simulation parameters + params = Dict{Symbol, Any}() + params[:simulation] = "fast" + params[:trajName] = "Spiral" + params[:numProfiles] = 4 + params[:numSamplingPerProfile] = 15650 + + acqData = simulation(I, params) + acqData.encodingSize = (N,N) + + rawData = RawAcquisitionData(acqData) + rawData.params["encodedSize"] = [N,N,1] + + # Set up raw data splitting + rawData_il1 = deepcopy(rawData) + rawData_il2 = deepcopy(rawData) + rawData_il3 = deepcopy(rawData) + rawData_il4 = deepcopy(rawData) + + deleteat!(rawData_il1.profiles,1:4:40) + deleteat!(rawData_il2.profiles,2:4:40) + deleteat!(rawData_il3.profiles,3:4:40) + deleteat!(rawData_il4.profiles,4:4:40) + + fout_il1 = ISMRMRDFile("$tmpdir/temp_il1") + fout_il2 = ISMRMRDFile("$tmpdir/temp_il2") + fout_il3 = ISMRMRDFile("$tmpdir/temp_il3") + fout_il4 = ISMRMRDFile("$tmpdir/temp_il4") + + save(fout_il1,rawData_il1) + save(fout_il2,rawData_il2) + save(fout_il3,rawData_il3) + save(fout_il4,rawData_il4) + + filenames_interleaves = ["$tmpdir/temp_il1","$tmpdir/temp_il2","$tmpdir/temp_il3","$tmpdir/temp_il4"] + is_single_interleave = false + + params_spiral = Dict{Symbol,Any}() + params_spiral[:recon_size] = (N,N,1) + params_spiral[:interleave] = 1 + params_spiral[:num_samples] = 15650 + params_spiral[:delay] = 0.00000 # naive delay correction + params_spiral[:interleave_data_filenames] = filenames_interleaves + params_spiral[:traj_filename] = "data/gradients508.txt" + params_spiral[:excitations] = [1,2,3,4,5,6,7,8,9,10] + params_spiral[:do_multi_interleave] = !is_single_interleave + params_spiral[:do_odd_interleave] = false + params_spiral[:num_interleaves] = is_single_interleave ? 1 : length(params_spiral[:interleave_data_filenames]) # one interleaf per file, count files, if filenames are array of strings (not only one string) + params_spiral[:single_slice] = false + + acq_out = merge_raw_interleaves(params_spiral,false) + + @test size(acq_out.traj[1].nodes,2) == 62600 + @test √(sum(abs2,acq_out.traj[1].nodes[:,62600] - [-1.1819346;-2.884264])) < 1e-6 # known gt + +end + +function test_apply_girf!(acq_data,girf_applier) + + acq_data_ref = deepcopy(acq_data) + apply_girf!(acq_data,girf_applier) + + # these should be pretty unique checks against ground-truth + @test mean(abs2.(fft(acq_data.traj[1].nodes[1,:]))./abs2.(fft(acq_data_ref.traj[1].nodes[1,:]))) - 0.98 < 1e-4 + +end + +function test_apply_k0!(acq_data,girf_applier) + + acq_data_ref = deepcopy(acq_data) + apply_k0!(acq_data,girf_applier) + + # these should be pretty unique checks against ground-truth + @test mean(angle.(acq_data_ref.kdata[1]) .- angle.(acq_data.kdata[1])) - 0.00118 < 1e-5 +end + +function test_integration() + + # load generated AcquisitionData objects and GirfApplier objects to run the test set + acq_data = load_object("data/acq_data.jld2") + girf_applier_k1 = load_object("data/girf_app_k1.jld2") + girf_applier_k0 = load_object("data/girf_app_k0.jld2") + + @testset "Integration" begin + test_merge_raw_interleaves() + test_apply_girf!(acq_data,girf_applier_k1) + test_apply_k0!(acq_data,girf_applier_k0) + end + +end + +test_integration() \ No newline at end of file diff --git a/test/testio.jl b/test/testio.jl new file mode 100644 index 0000000..9ebb180 --- /dev/null +++ b/test/testio.jl @@ -0,0 +1,17 @@ +function test_gradient_reader() + + grad_filename = "data/gradients508.txt" + read_gradient_text_file(grad_filename,[200,200],0.0) + @test true + +end + +function test_io() + @testset "I/O" begin + + test_gradient_reader() + + end +end + +test_io() \ No newline at end of file diff --git a/test/testutils.jl b/test/testutils.jl new file mode 100644 index 0000000..1775b48 --- /dev/null +++ b/test/testutils.jl @@ -0,0 +1,348 @@ +function test_get_slice_order() + + slice_positions = [-7, -3, 1, 5, 9, -9, -5, -1, 3, 7] + + N = 32 + I_slice = shepp_logan(N) + I = I_slice .* ones(N,N,10) + + # simulation parameters + params = Dict{Symbol, Any}() + params[:simulation] = "fast" + params[:trajName] = "Radial" + params[:numProfiles] = floor(Int64, pi/2*N) + params[:numSamplingPerProfile] = 2*N + + acqData = simulation(I, params) + rawData = RawAcquisitionData(acqData) + + tempNum = 0 + for ii = 1:params[:numProfiles]:500 + tempNum = tempNum + 1 + for jj = 1:params[:numProfiles] + + rawData.profiles[ii + jj - 1].head.position = (0.0,0.0,slice_positions[tempNum]) + + end + + end + + @test get_slice_order(rawData, 10,1,50) == [6,1,7,2,8,3,9,4,10,5] + +end + +function test_sync_traj_and_data!() + + # General strategy for this test: Get traj from simulated object, interpolate it onto different grid then reinterpolate and verify that things still work + traj_input = trajectory(Float64,"Spiral",10,400) + + N = 32 + I_slice = shepp_logan(N) + I = I_slice .* ones(N,N,10) + + # simulation parameters + params = Dict{Symbol, Any}() + params[:simulation] = "fast" + params[:trajName] = "Spiral" + params[:numProfiles] = 10 + params[:numSamplingPerProfile] = 2000 + + acqData = simulation(I, params) + rawData = RawAcquisitionData(acqData) + rawData_old = deepcopy(rawData) + + sampTimes = sync_traj_and_data!(rawData,traj_input,2000,1) + + @test mean(√,abs2.(rawData.profiles[1].traj[:] .- rawData_old.profiles[1].traj[:])) < 1e-2 + +end + +function test_calculate_b0_maps() + + N = 32 + T = ComplexF32 + nCh = 4 + slices = 5 + nEchos = 2 + TE = 7.0 + + medata = ones(ComplexF32,N,N,slices,2,nCh) + medata[:,:,:,1,:] .*= exp(-1im .* 2*pi * 0.01) + medata[:,:,:,2,:] .*= exp(-1im .* 2*pi * 0.02) + + b0_maps = calculate_b0_maps(medata,1:slices,2.0,4.0) + + @test median(b0_maps) + 2*pi*0.01 ./ 2e-3 < 1e-5 + +end + +function test_do_k0_correction!() + + N = 32 + I = shepp_logan(N) + + # simulation parameters + params = Dict{Symbol, Any}() + params[:simulation] = "fast" + params[:trajName] = "Radial" + params[:numProfiles] = floor(Int64, pi/2*N) + params[:numSamplingPerProfile] = 2*N + + acqData = simulation(I, params) + rawData = RawAcquisitionData(acqData) + rawData.params["encodedSize"] = [rawData.params["encodedSize"][1],rawData.params["encodedSize"][2],1] + rawData_orig = deepcopy(rawData) + phase_mod = pi .* 0.1 .* ones(ComplexF32, length(rawData.profiles[1].data),2) + do_k0_correction!(rawData,phase_mod,1) + acqData2 = AcquisitionData(rawData) + + @test median(angle.(acqData2.kdata[1]) .- angle.(acqData.kdata[1])) .- pi .* 0.1 < 1e-4 + +end + +function test_adjust_header!() + + N = 32 + I = shepp_logan(N) + + # simulation parameters + params = Dict{Symbol, Any}() + params[:simulation] = "fast" + params[:trajName] = "Radial" + params[:numProfiles] = floor(Int64, pi/2*N) + params[:numSamplingPerProfile] = 2*N + + # do simulation + acqData = simulation(I, params) + + rawData = RawAcquisitionData(acqData) + + adjust_header!(rawData,[N,N,1],2*N,1,true) + + @test rawData.profiles[1].head.discard_post == 0 + @test rawData.profiles[1].head.discard_pre == 0 + +end + +function test_check_acquisition_nodes!() + + N = 256 + I = shepp_logan(N) + + # simulation parameters + params = Dict{Symbol, Any}() + params[:simulation] = "fast" + params[:trajName] = "Radial" + params[:numProfiles] = floor(Int64, pi/2*N) + params[:numSamplingPerProfile] = 2*N + + # do simulation + acqData = simulation(I, params) + + acqData.traj[1].nodes .*= 1.5 + + check_acquisition_nodes!(acqData) + + @test abs.(maximum(acqData.traj[1].nodes,dims = [1,2]))[1] .< 0.51 + +end + +function test_validate_siemens_mrd!() + + N = 32 + I = shepp_logan(N) + + # simulation parameters + params = Dict{Symbol, Any}() + params[:simulation] = "fast" + params[:trajName] = "Radial" + params[:numProfiles] = floor(Int64, pi/2*N) + params[:numSamplingPerProfile] = 2*N + + # do simulation + acqData = simulation(I, params) + + rawData = RawAcquisitionData(acqData) + + rawData.params["encodedFOV"] = 800 + + validate_siemens_mrd!(rawData) + + @test rawData.params["encodedFOV"] == 0.8 + +end + +function test_validate_acq_data!() + + N = 128 + T = ComplexF32 + nCh = 4 + nEchos = 2 + TE = 7.0 + + x = T.(shepp_logan(N)) + + rmap = 0.05*abs.(x) + TEnum = Float64.(collect(TE:TE:TE*nEchos)) + + coilsens = T.(birdcageSensitivity(N, nCh, 4.)) + params = Dict{Symbol,Any}() + params[:simulation] = "fast" + params[:trajName] = "Cartesian" + params[:numProfiles] = floor(Int64, N) + params[:numSamplingPerProfile] = N + params[:r2map] = rmap + params[:T_echo] = TEnum + params[:seqName] = "ME" + params[:refocusingAngles] = Float64.(repeat([pi], length(TEnum))) + params[:senseMaps] = coilsens + + acqData = simulation(real(x), params) + + validate_acq_data!(acqData) + + @test size(acqData.kdata) == (2,1,1) + +end + +function test_preprocess_cartesian_data() + + N = 32 + I = shepp_logan(N) + + # simulation parameters + params = Dict{Symbol, Any}() + params[:simulation] = "fast" + params[:trajName] = "Cartesian" + params[:numProfiles] = floor(Int64, N) + params[:numSamplingPerProfile] = N + + # do simulation + acqData = simulation(I, params) + acqData.traj[1].nodes .*= 1.5 + + rawData = RawAcquisitionData(acqData) + rawData.params["encodedSize"] = [rawData.params["encodedSize"][1],rawData.params["encodedSize"][2],1] + + acqData2 = preprocess_cartesian_data(rawData,false) + + @test length(acqData2.kdata[1]) == length(acqData.kdata[1])÷2 + @test maximum(abs.(acqData2.traj[1].nodes),dims=[1,2])[1] <= 0.5 + +end + +function test_remove_oversampling!() + + N = 32 + I = shepp_logan(N) + + # simulation parameters + params = Dict{Symbol, Any}() + params[:simulation] = "fast" + params[:trajName] = "Cartesian" + params[:numProfiles] = floor(Int64, N) + params[:numSamplingPerProfile] = N + + # do simulation + acqData = simulation(I, params) + + rawData = RawAcquisitionData(acqData) + + remove_oversampling!(rawData) + + @test rawData.params["encodedSize"] == [N÷2,N] + @test length(rawData.profiles[1].data) == N÷2 + +end + +function test_save_and_load_map() + N = 128 + I = shepp_logan(N) + + # simulation parameters + params = Dict{Symbol, Any}() + params[:simulation] = "fast" + params[:trajName] = "Radial" + params[:numProfiles] = floor(Int64, pi/2*N) + params[:numSamplingPerProfile] = 2*N + + # do simulation + acqData = simulation(I, params) + + # reco parameters + params = Dict{Symbol, Any}() + params[:reco] = "direct" + params[:reconSize] = (N,N) + params[:alpha] = 1.75 + params[:m] = 4.0 + params[:K] = 28 + Ireco = reconstruction(acqData, params) + + res_x = fieldOfView(acqData)[1] ./ encodingSize(acqData)[1] + res_y = fieldOfView(acqData)[2] ./ encodingSize(acqData)[2] + res_z = fieldOfView(acqData)[3] + resolution_mm =(res_x, res_y, res_z) + + # Complex image save & load + save_map(joinpath(tmpdir, "testComplexIO.nii"), Ireco, resolution_mm; do_split_phase = true, do_normalize = false) + IrecoLoaded = load_map(joinpath(tmpdir, "testComplexIO.nii"), do_split_phase = true ) + @test (norm(vec(Ireco)-vec(IrecoLoaded))/norm(vec(Ireco))) < 1e-5 + + # Magnitude image save & load + save_map( joinpath(tmpdir, "testMagIO.nii"), abs.(Ireco), resolution_mm; do_split_phase = false, do_normalize = false) + IrecoLoadedMag = load_map(joinpath(tmpdir, "testMagIO.nii"), do_split_phase = false ) + @test (norm(vec(abs.(Ireco))-vec(IrecoLoadedMag))/norm(vec(abs.(Ireco)))) < 1e-5 +end + +function test_shift_kspace!() + N = 32 + I = shepp_logan(N) + I[16,16] = 500 + + # simulation parameters + params = Dict{Symbol, Any}() + params[:simulation] = "fast" + params[:trajName] = "Radial" + params[:numProfiles] = floor(Int64, pi/2*N) + params[:numSamplingPerProfile] = 2*N + + acqData = simulation(I, params) + + # reco parameters + params = Dict{Symbol, Any}() + params[:reco] = "direct" + params[:reconSize] = (N,N) + params[:alpha] = 1.75 + params[:m] = 4.0 + params[:K] = 28 + Ireco = reconstruction(acqData, params) + + shift_kspace!(acqData,[5,5]) + + Ireco_shifted = reconstruction(acqData,params) + + @test (abs.(Ireco[16,16]) > 300) & (abs.(Ireco[21,21]) < 300) + @test (abs.(Ireco_shifted[16,16]) < 300) & (abs.(Ireco_shifted[21,21]) > 300) + @test abs.(Ireco_shifted[21,21]) .- abs.(Ireco[16,16]) < 1e1 +end + +function test_utils(N=32) + @testset "Utilities" begin + + test_adjust_header!() + test_calculate_b0_maps() + test_check_acquisition_nodes!() + test_do_k0_correction!() + test_get_slice_order() + test_preprocess_cartesian_data() + test_remove_oversampling!() + test_save_and_load_map() + test_shift_kspace!() + test_sync_traj_and_data!() + test_validate_acq_data!() + test_validate_siemens_mrd!() + + end +end + +test_utils() diff --git a/utils/Utils.jl b/utils/Utils.jl deleted file mode 100644 index 1787abd..0000000 --- a/utils/Utils.jl +++ /dev/null @@ -1,874 +0,0 @@ -export plotReconstruction, plotSenseMaps, calculateB0Maps, getSliceOrder, syncTrajAndData!, do_k0_correction!, adjustHeader!, checkAcquisitionNodes!, validateSiemensMRD!, validateAcqData!, preprocessCartesianData, removeOversampling!, mergeRawInterleaves, applyGIRF!, applyK0!, saveMap, loadMap, shiftksp! - -## Choose plotting backend to be PlotlyJS! -# plotlyjs() - -## General Plotting function for the reconstruction - -# "Mosaic-plots reconstruction for selected slices and corresponding B0 map" -""" - plotReconstruction(images, slicesIndex, b0; figHandles = [], isSliceInterleaved = false) -Plots the magnitude and phase of the reconstructed images for a given slice or slices, along with a B₀ map if applicable - -# Arguments -* `images` - Complex-valued images reconstructed using MRIReco.jl -* `slicesIndex::Vector{Int}` - slices to plot -* `b0` - off-resonance map to plot along with images -* `figHandles` - String vectors in size of [3,1] for titles of three figures (Magnitude & Phase of reconstructed images, and B0 maps) -* `isSliceInterleaved::Bool` - for 2D scanning, indicate this value as `true` to make sure the slice order on the displayed results is correct -* `rotateAngle::Int` - Counterclock-wise rotation angle for each slice, should be a value from 0, 90, 180, 270 degrees -""" -function plotReconstruction(images, slicesIndex, b0; figHandles = [], isSliceInterleaved = false, rotateAngle = 0) - # plot() - ## If we need to re-order all slices - sliceNum = length(slicesIndex) - reorderSliceIndex = zeros(Int16, size(slicesIndex)) - - if isSliceInterleaved && sliceNum > 1 - reorderSliceIndex[1:2:end] = slicesIndex[1:Int(ceil(sliceNum / 2))] - reorderSliceIndex[2:2:end] = slicesIndex[Int(ceil(sliceNum / 2) + 1) : end] - else - reorderSliceIndex = slicesIndex - end - - ## If we need to rotate each slice - if mod(rotateAngle, 90) != 0 || rotateAngle < 0 || rotateAngle > 270 - error("rotateAngle must be 0, 90, 180 or 270 degrees.") - end - - # Plot magnitude images (normalize) - # if length(figHandles) < 1 - # figure("Magnitude Images") - # else - # figure(figHandles[1]) - # end - - # clf() - - absData = mapslices(x -> abs.(x) ./ maximum(abs.(x)), images[:, :, reorderSliceIndex], dims = [1,2]) - if rotateAngle == 90 - absData = mapslices(x -> rotr90(x), absData, dims = [1,2]) - elseif rotateAngle == 180 - absData = mapslices(x -> rot180(x), absData, dims = [1,2]) - else - absData = mapslices(x -> rotl90(x), absData, dims = [1,2]) - end - absMosaic = mosaicview(absData, nrow = Int(floor(sqrt(sliceNum))), npad = 5, rowmajor = true, fillvalue = 0) - - heatmap(absMosaic,show=true, plot_title="|Images|",plot_titlevspan=0.1,color=:grays,aspectratio=:equal) - # display(plot!()) - - phaseData = angle.(images[:, :, reorderSliceIndex, 1, 1]) - if rotateAngle == 90 - phaseData = mapslices(x -> rotr90(x), phaseData, dims = [1,2]) - elseif rotateAngle == 180 - phaseData = mapslices(x -> rot180(x), phaseData, dims = [1,2]) - else - phaseData = mapslices(x -> rotl90(x), phaseData, dims = [1,2]) - end - phaseMosaic = mosaicview(phaseData, nrow = Int(floor(sqrt(sliceNum))), npad = 5, rowmajor = true, fillvalue = 0) - - heatmap(phaseMosaic,show=true,plot_title="∠ Images",plot_titlevspan=0.1,color=:plasma,aspectratio=:equal) - #colorbar() - # display(plot!()) - - #gcf().suptitle("∠Images") - - # # Plot B0 maps - # if length(figHandles) < 3 - # figure("B₀ Map Images") - # else - # figure(figHandles[3]) - # end - - # clf() - # plot() - b0Data = mapslices(x -> x, b0, dims = [1,2]) - if rotateAngle == 90 - b0Data = mapslices(x -> rotr90(x), b0, dims = [1,2]) - elseif rotateAngle == 180 - b0Data = mapslices(x -> rot180(x), b0, dims = [1,2]) - else - b0Data = mapslices(x -> rotl90(x), b0, dims = [1,2]) - end - b0Mosaic = mosaicview(b0Data[:, :, reorderSliceIndex], nrow = Int(floor(sqrt(sliceNum))), npad = 5, rowmajor = true, fillvalue = 0) - - heatmap(b0Mosaic,show=true, plot_title="B₀ Map Images",plot_titlevspan=0.1,color=:plasma) - # colorbar() - # display(plot!()) - - # gcf().suptitle("B₀ Maps [rad/s]") - - 1 - -end - -"Function plots all profiles in the acquisition to check consistency with ISMRMRD file" -function checkProfiles(rawData) - - numProfiles2 = 128 # Set to the number of profiles that you would like to see - - for l = 1:numProfiles2 - p1 = plot(abs.(rawData.profiles[l].data[:,1])) - p2 = plot(angle.(rawData.profiles[l].data[:,1])) - end - -end - -""" - plotSenseMaps!(sense, n_channels) -Plots coil sensitivity maps from the channels, for a total of n_channels plots - -# Arguments -* `sense` - sensitivity maps -* `n_channels::Int` - number of coils (usually last dimension of sense) -* `sliceIndex::Int` - The index of the slice to be displayed (if multislice) -""" -function plotSenseMaps(sense,n_channels; sliceIndex = 1) - sliceNum = size(sense, 3) - if sliceIndex > sliceNum - errMsg = @sprintf("The index of slice to be displayed is %d, but total slice number is %d.", sliceIndex, sliceNum) - error(errMsg) - end - - # # Magnitude maps - # figure(@sprintf("Sensitivity Map Magnitude of Slice %d / %d", sliceIndex, sliceNum)); clf(); for ch in 1:n_channels; subplot(8,4,ch); imshow((abs.(sense[:,:,sliceIndex,ch])), cmap = "gray"); end; - # subplots_adjust(wspace=0.05,hspace=0.05,left=0.05,bottom=0.0,right=1.0,top=0.95) - # gcf() - - magMosaic = mosaicview((abs.(sense[:,:,sliceIndex,:])), nrow = Int(floor(sqrt(n_channels))), npad = 5, rowmajor = true, fillvalue = 0) - heatmap(magMosaic, show=true, plot_title="|Sensitivity|",plot_titlevspan=0.1,color=:gnuplot2) - - # # Phase maps - # figure(@sprintf("Sensitivity Map Phase of Slice %d / %d", sliceIndex, sliceNum)); clf(); for ch in 1:n_channels; subplot(8,4,ch); imshow(angle.(sense[:,:,sliceIndex,ch]), cmap = "gray"); end; - # subplots_adjust(wspace=0.05,hspace=0.05,left=0.05,bottom=0.0,right=1.0,top=0.95) - # gcf() - - phaseMosaic = mosaicview((angle.(sense[:,:,sliceIndex,:])), nrow = Int(floor(sqrt(n_channels))), npad = 5, rowmajor = true, fillvalue = 0) - heatmap(phaseMosaic,show=true, plot_title="∠ Sensitivity",plot_titlevspan=0.1,color=:plasma) - -end - -# "WIP: Plots trajectory and Data, doesn't work currently" -function plotTrajAndData(acq) - - for l in 1:length(acq.traj) - - freqEncode[l,:] = acq.traj[l].nodes[1,:] - phaseEncode[l,:] = acq.traj[l].nodes[2,:] - kSignal[l,:] = acq.kdata[l,:,1] - - end - -end - -## PREPROCESSING - -""" - calculateB0Maps(imData,slices,echoTime1,echoTime2) - -Calculate B0 map from the two images with different echo times via their phase difference (obtained from imTE2.*conj(imTE1)) -TODO have the b0 map calculation be capable of handling variable echo times -TODO2: Do we need this basic B0 map calculation or is it superseded by estimateB0Maps? - -# Arguments -* `imdata` - [nX nY nZ 2 nCoils] 5D image array, 4th dim echo time -* `slices::NTuple{nSlices,Int}` - slice index vector (tuple?) for which map is computed -* `echoTime1::AbstractFloat` - TE1 [ms] -* `echoTime2::AbstractFloat` - TE2 [ms] -""" -function calculateB0Maps(imData,slices,echoTime1,echoTime2) - - # b0Maps = mapslices(x -> rotl90(x),ROMEO.unwrap(angle.(imData[:,:,slices,2,1].*conj(imData[:,:,slices,1,1]))),dims=(1,2))./((7.38-4.92)/1000) - b0Maps = mapslices(x -> x, ROMEO.unwrap(angle.(imData[:,:,slices,2,1].*conj(imData[:,:,slices,1,1]))),dims=(1,2))./((echoTime2-echoTime1)/1000) - -end - -""" - getSliceOrder(nSlices, isSliceInterleaved) - -Returns array mapping from acquisition number to slice number (geometric position) (indexArray[slice = 1:9] = [acquisitionNumbers]) -TODO: Add ascending/descending options - -# Arguments -* `nSlices::Int` - number of slices in total acquired stack (FOV) -* `isSliceInterleaved::Bool=true` - if true, interleaved slice order is created, otherwise ascending slice order is returned -""" -function getSliceOrder(nSlices; isSliceInterleaved::Bool=true) - - sliceIndexArray = 1:nSlices - reorderedSliceIndexArray = zeros(Int16, size(sliceIndexArray)) - if isSliceInterleaved && nSlices > 1 - reorderedSliceIndexArray[1:2:end] = sliceIndexArray[1:Int(ceil(nSlices / 2))] - reorderedSliceIndexArray[2:2:end] = sliceIndexArray[Int(ceil(nSlices / 2) + 1) : end] - else - reorderedSliceIndexArray = sliceIndexArray - end - - return reorderedSliceIndexArray - -end - -""" - syncTrajAndData!(a::AcquisitionData) -Synchronizes k-space trajectory and sampled data as they do not usually have a common sampling rate - -# Arguments -* `rawData::RawAcquisitionData` - RawAcquisitionData object -* `traj::Trajectory` - Trajectory object to be synchronized with data contained in rawData -* `idx_crop::Int` - Trajectory and Data may contain samples we don't want in the recon, usually at the end of acquisition. Ignore samples after idx_crop -* `interleave::Int` - index of interleave -""" -function syncTrajAndData!(rawData, traj, idx_crop, interleave) - - # get number of gradient samples - numGradSamples = traj.numSamplingPerProfile - - # get vector of gradient samples which pertain to one interleave of the trajectory - ilExtractionVector = numGradSamples*(interleave-1) .+ (1:numGradSamples) - - # Read the trajectory nodes into the rawAcquisitionData type field (.traj) - for l = 1:length(rawData.profiles) - rawData.profiles[l].traj = traj.nodes[:,ilExtractionVector] - end - - # define dwell times for trajectory (dt_k) and signal sampling (dt_s) - dt_s = 2*10^(-6) # [s] - dt_k = 10*10^(-6) # [s] - - # Go through every profile (this means every slice in the MRIReco.jl convention for multislice, multiTE, and diffusion scans) - for l = 1:length(rawData.profiles) - - # Get size of trajectory and signal vectors - Ns = size(rawData.profiles[l].data,1) - Nk = size(rawData.profiles[l].traj,2) - - # Define time vectors for signal and trajectory - t_s = (0:Ns-1)*dt_s - t_k = (0:Nk-1)*dt_k - - # Interpolate trajectory onto the same sample times as the sampled signal - trajNodes_interpolated_X = Spline1D(t_k,rawData.profiles[l].traj[1,:], w=ones(length(rawData.profiles[l].traj[1,:])), k=3, bc = "zero") - trajNodes_interpolated_Y = Spline1D(t_k,rawData.profiles[l].traj[2,:], w=ones(length(rawData.profiles[l].traj[2,:])), k=3, bc = "zero") - - # Concatenate the trajectory node kx and ky positions - adjustedTraj = vcat(trajNodes_interpolated_X(t_s)',trajNodes_interpolated_Y(t_s)') - - # Crop the data and trajectory to avoid return-to-center of traj, and also set trajectory as upsampled trajectory adjustedTraj - rawData.profiles[l].traj = adjustedTraj[:,1:idx_crop] - rawData.profiles[l].data = rawData.profiles[l].data[1:idx_crop,:] - - end - - # Return the vector of sampling times - return dt_s*(0:idx_crop-1) - -end - - -""" - do_k0_correction!(rawData, k0_phase_modulation, interleave) -Applies phase modulation due to 0th-order field fluctuations during the acquisition - -# Arguments -* `rawData::RawAcquisitionData` - RawAcquisitionData object -* `k0_phase_modulation::Matrix{Complex{T}}` - Vector containing phase modulation measurements -* `interleave::Int` - index of interleave -""" -function do_k0_correction!(rawData,k0_phase_modulation, interleave) - - # Get number of samples for the k0 phase modulation (should be same size as the trajectory BEFORE resampling) - numk0_samples = size(k0_phase_modulation,1) - - # define dwell times for phase modulation (dt_k) and signal sampling (dt_s) - dt_s = 2*10^(-6) # [s] - dt_k = 10*10^(-6) # [s] - - # Go through every profile (this means every slice in the MRIReco.jl convention for multislice, multiTE, and diffusion scans) - for l = 1:length(rawData.profiles) - - # Get size of data (signal samples) and size of k0 modulation - Ns = size(rawData.profiles[l].data,1) - Nk = numk0_samples - - # Define time vectors for k0 and signal sampling times - t_s = (0:Ns-1)*dt_s - t_k = (0:Nk-1)*dt_k - - # interpolate k0 to the time basis of the signal - k0_interpolant = Spline1D(t_k,k0_phase_modulation[:,interleave], w=ones(numk0_samples), k=3, bc = "zero") - k0_interpolated = k0_interpolant(t_s) - - # modulate the data by the k0 modulation by multiplying with e^(i*k0) where k0 is in radians - rawData.profiles[l].data = rawData.profiles[l].data.* exp.(1im .* k0_interpolated) - - # # Visualization of Phase Modulation - # figure("Phase Modulation") - # plot(t_s, angle.(exp.(1im .* k0_interpolated))) - # xlabel("Time [s]") - # ylabel("k₀ [rad]") - # title("B₀ Eddy Current Fluctuation During Readout ") - - plot(t_s, angle.(exp.(1im .* k0_interpolated)),show=true,title="B₀ Eddy Current Fluctuation During Readout ") - - end - -end - - -""" - adjustHeader!(raw::RawAcquisitionData, reconSize, numSamples, interleaveNumber, singleSlice) -Adjusts the header data for each interleave and slice of spiral diffusion RawAcquisitionData - -# Arguments -* `raw::RawAcquisitionData` - RawAcquisitionData object -* `reconSize::Vector` - Reconstruction matrix size -* `numSamples::Int` - Number of samples per interleave -* `interleaveNumber::Int` - Index of interleave for multi-shot acquisitionNumbers -* `singleSlice::Bool` - flag for single-slice reconstruction/acquisition -""" -function adjustHeader!(raw, reconSize, numSamples, interleaveNumber, singleSlice) - - # For every profile in the acquisition - for l = 1:length(raw.profiles) - - # Set the discard post to 0 (don't discard any samples from the end of the acquisition) - raw.profiles[l].head.discard_post = 0 - - # Set the discard pre to 0 (don't discard any samples from the beginning of the acqusition) - raw.profiles[l].head.discard_pre = 0 - - # Set the contrast to 0 or raw.profiles[l].head.idx.repetition for diffusion directions - # raw.profiles[l].head.idx.contrast = raw.profiles[l].head.idx.repetition - raw.profiles[l].head.idx.contrast = 0 - - # Set the repetition to 0 - raw.profiles[l].head.idx.repetition = 0 - - # Set the number of samples properly - raw.profiles[l].head.number_of_samples = numSamples - - # Set the non-standard encode step (interleave dimension) into the encode step 1 field - # raw.profiles[l].head.idx.kspace_encode_step_1 = 0 - raw.profiles[l].head.idx.kspace_encode_step_1 = interleaveNumber - 1 # IF MULTI-INTERLEAVE - - # Set slice to 0 for singleslice, if it is not 0 then there will be an error - if singleSlice - raw.profiles[l].head.idx.slice = 0 - end - - # Set center sample to 0 (only for spiral scans) - raw.profiles[l].head.center_sample = 0 - - end - - # Set encoding size to the reconSize - raw.params["encodedSize"] = [reconSize[1],reconSize[2],1] - -end - -""" - checkAcquisitionNodes!(a::AcquisitionData) -Validates processed AcquisitionData object to make sure that |kᵢ| < 0.5 ∀ i ∈ [1, Nₛ] - -# Arguments -* `a::AcquisitionData` - AcquisitionData object -""" -function checkAcquisitionNodes!(a::AcquisitionData) - - a.traj[1].nodes[abs.(a.traj[1].nodes[:]) .> 0.5] .= 0.5 - -end - - -""" - validateSiemensMRD!(r::RawAcquisitionData) -Validates RawAcquisitionData object created from ISMRMRD format object - -# Arguments -* `r::RawAcquisitionData` - RawAcquisitionData object -""" -function validateSiemensMRD!(r::RawAcquisitionData) - - @info "Validating Siemens converted data" - - ## FOV CHECK: - - if maximum(r.params["encodedFOV"]) > 0.8 # FOV should never be greater than the bore size in [m] - - @info "FOV was recorded in [mm]!Changing to [m]" - r.params["encodedFOV"] = r.params["encodedFOV"]./1000 - - end - -end - -""" - validateAcqData!(a::AcquisitionData) -Validates processed AcquisitionData object after manipulation, etc... - -# Arguments -* `a::AcquisitionData` - AcquisitionData object -""" -function validateAcqData!(a::AcquisitionData) - - ## Dimensions CHECK: - - # TODO add dimension check that the k-space encoding counters are set properly: - # kdata dimensions: dim1:=contrast/echo | dim2:=slices | dim3:=repetitions - # kdata element dimensions: dim1:=kspace nodes | dim2:=channels/coils - - permutedims(a.kdata,[3,2,1]) - checkAcquisitionNodes!(a) - -end - -""" - preprocessCartesianData!(raw::RawAcquisitionData; dims = 1) -Prepares Cartesian for reconstruction - -# Arguments -* `r::RawAcquisitionData{T}` - RawAcquisitionData object -* `fname` - filename to save the preprocessed data to -""" -function preprocessCartesianData(r::RawAcquisitionData, doSave; fname = "data/testFile.h5") - - removeOversampling!(r) - - # Convert rawAcquisitionData object to an AcquisitionData object (these can be reconstructed) - acqDataCartesian = AcquisitionData(r,estimateProfileCenter=true) - - ## Properly arrange data from the converted siemens file - validateAcqData!(acqDataCartesian) - - if doSave - - raw = RawAcquisitionData(acqDataCartesian) - - # Since the data should generally have 3D information when saved, we make sure 2D data is appropriately stored as 3D data with a singleton dimension - if length(raw.params["encodedSize"]) == 2 - e_sz = raw.params["encodedSize"] - raw.params["encodedSize"] = [e_sz[1], e_sz[2], 1] - end - - # raw.params = headerCopy - fout = ISMRMRDFile(fname) - save(fout, raw) - - end - - return acqDataCartesian - -end - -""" - removeOversampling!(raw::RawAcquisitionData; dims = 1) -Removes 2x readout oversampling in specified raw data dimensions by iFFT, cropping FOV and FFT - -# Arguments -* `raw::RawAcquisitionData{T}` - RawAcquisitionData object -* `dims` - dimension alongside which oversampling is removed (default: 1) -""" -function removeOversampling!(raw::RawAcquisitionData; dims = [1]) - - idxDim = dims[1] - Ns = raw.params["encodedSize"][idxDim] - idxCropFov = convert(Vector{Int32}, [1:floor(Ns/4); ceil(3/4*Ns+1):Ns]) - - # For every profile in the acquisition - for iProfile = 1:length(raw.profiles) - - # IFFT to image space, crop, FFT back to k-space - ifft!(raw.profiles[iProfile].data, idxDim) - raw.profiles[iProfile].data = fft!(raw.profiles[iProfile].data[idxCropFov,:], idxDim) - - end - - # halve encoding size of first dimension - raw.params["encodedSize"][idxDim] /= 2 - raw.params["encodedFOV"][idxDim] /= 2 - -end - - -""" - mergeRawInterleaves(params) -Merges multiple interleave data together from individually acquired interleave scans - -# Arguments -* `params` - Dictionary -""" -function mergeRawInterleaves(params) - - # Get the other interleave indexes other than the one asked for - otherInterleaveIndices = [x for x ∈ 1:params[:numInterleaves] if x ∉ params[:interleave]] - - # @info "indices = $otherInterleaveIndices" #DEBUG - - # read in the data file from the ISMRMRD format - dataFile = ISMRMRDFile(params[:interleaveDataFileNames][params[:interleave]]) - - # Read in the gradient file - trajAll = read_gradient_txt_file(params[:trajFilename],params[:reconSize],params[:delay]) - - # Read in raw data from the dataFile - rawData = RawAcquisitionData(dataFile) - - # delete everything that is not a chosen excitation (for efficiency) - indices = 1:length(rawData.profiles) - ic = [x for x ∈ indices if x ∉ params[:excitations]] - deleteat!(rawData.profiles,ic) - - # @info "indices = $ic" #DEBUG - - # set up time vector for tracking all of the interleaves - timeTrack = [] - - # synchronize trajectory data and the kspace data - times = syncTrajAndData!(rawData, trajAll, params[:numSamples], params[:interleave]) - - # adjust the header so that each diffusion direction is considered as a contrast instead of a repetition - # adjustHeader!(rawData, params[:reconSize], params[:numSamples], params[:interleave],params[:singleSlice]) - adjustHeader!(rawData, params[:reconSize], params[:numSamples], 1, params[:singleSlice]) - - # add the times to the time tracking vector - append!(timeTrack,times) - - # Repeat the above steps for each interleave, adjusting the times and headers appropriately - if params[:doMultiInterleave] - - for l in otherInterleaveIndices - - # read in separate interleave data file - dataFileTemp = ISMRMRDFile(params[:interleaveDataFileNames][l]) - rawDataTemp = RawAcquisitionData(dataFileTemp) - deleteat!(rawDataTemp.profiles,ic) # delete profiles which aren't needed - - # synchronize the trajectory from the gradient file and the data from the raw data file for the interleave - timesTemp = syncTrajAndData!(rawDataTemp, trajAll, params[:numSamples], l) - - # adjust the header to reflect the arrangement of data expected by MRIReco.jl's reconstruction function - adjustHeader!(rawDataTemp,params[:reconSize], params[:numSamples], l, params[:singleSlice]) - - # append the important data (the profile and the sampling times) to the raw Data file created out of this look - append!(rawData.profiles,deepcopy(rawDataTemp.profiles)) - append!(timeTrack,deepcopy(timesTemp)) - - end - - # if there is the choice to do odd or opposing interleaves, add the 2nd interleave - elseif params[:doOddInterleave] - - dataFileTemp = ISMRMRDFile(params[:interleaveDataFileNames][3]) - rawDataTemp = RawAcquisitionData(dataFileTemp) - deleteat!(rawDataTemp.profiles,ic) - - timesTemp = syncTrajAndData!(rawDataTemp, trajAll, params[:numSamples], 3) - - adjustHeader!(rawDataTemp,params[:reconSize], params[:numSamples], 2, params[:singleSlice]) - - append!(rawData.profiles,copy(rawDataTemp.profiles)) - append!(timeTrack,timesTemp) - - end - - # converting rawData to AcquisitionData - @info "Converting RawAcquisitionData to AcquisitionData" - acqData = AcquisitionData(rawData,estimateProfileCenter=true) - - ## Assume all of the slices share a trajectory - for l = 1:length(acqData.traj) - - acqData.traj[l].times = timeTrack # set times to the total time vector - acqData.traj[l].TE = 0.00 # set the TE to 0 - acqData.traj[l].AQ = times[end] # set the acquisition time to the last element of the time vector (should be the latest time) - acqData.traj[l].circular = true # set whether to use a circular filter on the kspace data - - end - - for l = 1:length(acqData.subsampleIndices) - - acqData.subsampleIndices[l] = 1:size(acqData.traj[l].nodes,2) - - end - - # return the acquisition data object with everything corrected - return acqData - -end - -""" - applyGIRF!(raw::RawAcquisitionData, freq::AbstractVector, g_data::AbstractMatrix) -Applies the GIRF to the trajectories inside of a::AcquisitionData - -# Arguments -* `a::AcquisitionData{T}` - AcquisitionData object -* `freq::AbstractVector` - Vector containing frequencies of GIRF data -* `g_data::AbstractMatrix` - Matrix of size N x length(freq) containing complex GIRF data -""" -function applyGIRF!(a::AcquisitionData{T}, g::GirfApplier) where T - - # Read parameters for gradient and node conversion - S = a.encodingSize - F = a.fov - - # Check dimensions of the acquisition data and ensure encoding size and FOV are consistent - if length(S) == 2 - S = (S[1], S[2], 1) - end - - if length(F) == 2 - F = Float32.(F[1], F[2], 1.0) - end - - # loop over all contained trajectories - for l = 1:length(a.traj) - - nProfiles = a.traj[l].numProfiles - nSamples = a.traj[l].numSamplingPerProfile - nodes = a.traj[l].nodes - times = a.traj[l].times - oldNodes = a.traj[l].nodes - - # loop over all profiles in a trajectory - for profile = 1:nProfiles - - ilExtractor = nSamples*(profile-1) .+ (1:nSamples) - ilNodes = nodes[:,ilExtractor] - ilTimes = times[ilExtractor] - - DT = ilTimes[1] - ilTimes[2] - - ilGrads = nodes_to_gradients(ilNodes; dwellTime=DT, reconSize=S, FOV = F) - - # loop over trajectory dimensions - for dim = 1:size(ilGrads,1) - - correctedGrads = apply_girf(g,ilGrads[dim,:], ilTimes ,ilTimes, dim) # THESE ARE ALL VECTORS SO INPUT orientation (column/row major ordering) doesn't matter - ilGrads[dim,:] = correctedGrads' - - end - - ilNodes = gradients_to_nodes(ilGrads; dwellTime=DT, reconSize=S, FOV = F) - nodes[:,ilExtractor] = ilNodes - - end - - a.traj[l].nodes = nodes - - end - -end - -""" - applyK0!(raw::RawAcquisitionData, freq::AbstractVector, g_data::AbstractMatrix) -Applies the K0 modulation due to imaging gradients to the data inside of a::AcquisitionData - -# Arguments -* `a::AcquisitionData{T}` - AcquisitionData object -* `freq::AbstractVector` - Vector containing frequencies of GIRF data -* `k0_data::AbstractMatrix` - Matrix of size N x length(freq) containing complex k0 function data -""" -function applyK0!(a::AcquisitionData{T},g::GirfApplier) where T - - # Read parameters for gradient and node conversion - S = a.encodingSize - F = a.fov - - if length(S) == 2 - S = (S[1], S[2], 1) - end - if length(F) == 2 - F = (F[1], F[2], 1.0) - end - - # loop over all contained trajectories - for l = 1:length(a.traj) - - nProfiles = a.traj[l].numProfiles - nSamples = a.traj[l].numSamplingPerProfile - nodes = a.traj[l].nodes - times = a.traj[l].times - oldNodes = a.traj[l].nodes - - # loop over all profiles in a trajectory - for profile = 1:nProfiles - - ilExtractor = nSamples*(profile-1) .+ (1:nSamples) - ilNodes = nodes[:,ilExtractor] - ilTimes = times[ilExtractor] - - DT = ilTimes[1] - ilTimes[2] - - ilGrads = nodes_to_gradients(ilNodes; dwellTime=DT, reconSize=S, FOV = F) - - k0_correction = ones(size(ilGrads)) - - # loop over all trajectory dims - for dim = 1:size(ilGrads,1) - - k0_correction[dim,:] = apply_girf(g,ilGrads[dim,:], ilTimes, ilTimes, dim) # THESE ARE ALL VECTORS SO INPUT orientation (column/row major ordering) doesn't matter - - end - - finalCorrection = sum(k0_correction,dims=1) #back to radians! - - a.kdata[l][ilExtractor,:] = a.kdata[l][ilExtractor,:] .* exp.(-1im .*finalCorrection') - - # # Visualization of Phase Modulation - # figure("Phase Modulation 2") - # plot(vec(ilTimes), vec(angle.(exp.(1im .* finalCorrection)))) - # xlabel("Time [s]") - # ylabel("k₀ [rad]") - # title("B₀ Eddy Current Fluctuation During Readout ") - - # plot(ilTimes, angle.(exp.(1im .* finalCorrection')),show=true,title="B₀ Eddy Current Fluctuation During Readout ") #DEBUG - - end - - end - -end - -# ## Calibrate the phase from individual interleaves -# function calibrateAcquisitionPhase!(a::AcquisitionData) - -# for l = 1:length(a.traj) - -# nProfiles = a.traj[l].numProfiles -# nSamples = a.traj[l].numSamplingPerProfile -# nodes = a.traj[l].nodes -# times = a.traj[l].times -# oldNodes = a.traj[l].nodes - -# initialInterleavePhase = angle.(a.kdata[l][1,:])' - -# for profile = 2:nProfiles - -# ilExtractor = nSamples*(profile-1) .+ (1:nSamples) - -# initialProfilePhase = angle.(a.kdata[l][ilExtractor[1],:])' - -# @info size(initialInterleavePhase) -# @info size(a.kdata[l][ilExtractor,:]) - -# a.kdata[l][ilExtractor,:] .*= exp.(-1im * (initialInterleavePhase - initialProfilePhase)) - -# end -# end - -# end - -## Input/Output, File handling - -""" - saveMap(filename, calib_map, resolution_mm; offset_mm = [0.0, 0.0, 0.0]) -Saves calibration maps (sensitivity or B0) as 4D NIfTI file(s) - -For complex-valued data, magnitude and phase can be split into separate files -# Arguments -* `filename::String` - string filename with extension .nii, example "sensemap.nii" -* `calib_map` - [nX nY nZ {nChannels}] 4-D sensitivity or 3D B0 map array -* `resolution_mm` - resolution in mm, 3 element vector, e.g., [1.0, 1.0, 2.0] -* `offset_mm` - isocenter offset in mm, default: [0.0, 0.0, 0.0] -* `doSplitPhase::Bool=false` - if true, data is saved in two nifti files with suffix "_magn" and "_phase", respectively - to enable display in typical NIfTI viewers -""" -function saveMap(filename, calib_map, resolution_mm; offset_mm = [0.0, 0.0, 0.0], doSplitPhase::Bool=false, doNormalize::Bool=true) - - # multiplication with 1000 should no longer be necessary after MRIReco 0.7.1 - spacing = 1000.0 .*resolution_mm .*Unitful.mm - offset = 1000.0 .*offset_mm .*Unitful.mm - - if ndims(calib_map) >= 4 # multi-coil calib_map, e.g., sensitivity, or recon, but we can only store the first 4 dims in a Nifti - I = reshape(calib_map, size(calib_map,1), size(calib_map,2), size(calib_map,3), size(calib_map,4), 1, 1); - else - I = reshape(calib_map, size(calib_map,1), size(calib_map,2), size(calib_map,3), 1, 1, 1); - end - - # scale to max 1 - if doNormalize - I /= maximum(abs.(I)) - end - - # AxisArray Constructor - im = AxisArray(I, - Axis{:x}(range(offset[1], step=spacing[1], length=size(I, 1))), - Axis{:y}(range(offset[2], step=spacing[2], length=size(I, 2))), - Axis{:z}(range(offset[3], step=spacing[3], length=size(I, 3))), - Axis{:coils}(1:size(I, 4)), - Axis{:echos}(1:size(I, 5)), - Axis{:repetitions}(1:size(I, 6))) - - # if separate mag and phase are desired, save them separately - if doSplitPhase - - filename_magn = splitext(filename)[1] * "_magn.nii" - saveImage(filename_magn, map(abs,im)) # map is needed, because abs.(im) would convert AxisArray back into basic array - - filename_phase = splitext(filename)[1] * "_phase.nii" - saveImage(filename_phase, map(angle,im)) - - else - - saveImage(filename, im) - - end - -end - -""" - loadMap(filename, calib_map, resolution_mm; offset_mm = [0.0, 0.0, 0.0]) -Saves calibration maps (sensitivity or B0) as 4D NIfTI file(s) - -For complex-valued data, magnitude and phase can be split into separate files -# Arguments -* `filename::String` - string filename with extension .nii, example "sensemap.nii" -* `doSplitPhase::Bool=false` - if true, data is saved in two nifti files with suffix "_magn" and "_phase", respectively - to enable display in typical NIfTI viewers -# Output -* `calib_map` - [nX nY nZ {nChannels}] 4-D sensitivity or 3D B0 map array -""" -function loadMap(filename; doSplitPhase::Bool=false) - - # if separate mag and phase are saved, load and combine them - if doSplitPhase - - filename_magn = splitext(filename)[1] * "_magn.nii" - I_magn = loadImage(filename_magn) # map is needed, because abs.(im) would convert AxisArray back into basic array - - filename_phase = splitext(filename)[1] * "_phase.nii" - I_phase = loadImage(filename_phase) - - calib_map = (I_magn.data).*exp.(1im.*(I_phase.data)) - - else - - I = loadImage(filename) - calib_map = I.data - - end - - # squeeze singleton dimensions of 6-dim array - calib_map = dropdims(calib_map, dims = tuple(findall(size(calib_map) .== 1)...)) - - return calib_map - -end - -function shiftksp!(acqData,shift) - - numSl = numSlices(acqData) - numRep, numContr = numRepetitions(acqData), numContrasts(acqData) - - smat = prod(exp.(1im .* acqData.traj[1].nodes[:,acqData.subsampleIndices[1]] .* shift .* 2 .* pi),dims=1) - - for slice = 1:numSl - for contr = 1:numContr - for rep = 1:numRep - acqData.kdata[contr,slice,rep] = acqData.kdata[contr,slice,rep] .* smat' - end - end - end - -end \ No newline at end of file diff --git a/utils/shiftksp.jl b/utils/shiftksp.jl deleted file mode 100644 index d971c2b..0000000 --- a/utils/shiftksp.jl +++ /dev/null @@ -1,30 +0,0 @@ -function shiftksp!(acqData,shift) - - numSl = numSlices(acqData) - numRep, numContr = numRepetitions(acqData), numContrasts(acqData) - - smat = prod(exp.(1im .* acqData.traj[1].nodes[:,acqData.subsampleIndices[1]] .* shift .* 2 .* pi),dims=1) - - for slice = 1:numSl - for contr = 1:numContr - for rep = 1:numRep - acqData.kdata[contr,slice,rep] = acqData.kdata[contr,slice,rep] .* smat' - end - end - end - -end - -function changeFOV!(acqData,factor) - # assume vectorized nodes - - numTr = length(acqData.traj) - - for tr = 1:numTr - acqData.traj[tr].nodes .= acqData.traj[tr].nodes .* factor - - end - - -end - \ No newline at end of file